stillerman commited on
Commit
8de92d1
·
1 Parent(s): 1c04688

removed large file

Browse files
.gitignore CHANGED
@@ -22,3 +22,6 @@ dist-ssr
22
  *.njsproj
23
  *.sln
24
  *.sw?
 
 
 
 
22
  *.njsproj
23
  *.sln
24
  *.sw?
25
+
26
+ .env
27
+ tmp
Dockerfile ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.9
2
+
3
+ # Set up a new user named "user" with user ID 1000
4
+ RUN useradd -m -u 1000 user
5
+
6
+ # Switch to the "user" user
7
+ USER user
8
+
9
+ # Set home to the user's home directory
10
+ ENV HOME=/home/user \
11
+ PATH=/home/user/.local/bin:$PATH
12
+
13
+ # Set the working directory to the user's home directory
14
+ WORKDIR $HOME/app
15
+
16
+ # install nodejs
17
+ ENV PYTHONUNBUFFERED 1
18
+ RUN apt-get update && apt-get install nodejs
19
+
20
+ COPY requirements.txt .
21
+
22
+ # Try and run pip command after setting the user with `USER user` to avoid permission issues with Python
23
+ RUN pip install --no-cache-dir --upgrade pip
24
+
25
+ RUN pip install -r requirements.txt
26
+
27
+ # Copy the current directory contents into the container at $HOME/app setting the owner to the user
28
+ COPY --chown=user . $HOME/app
29
+
30
+ RUN npm install
31
+ RUN npm run build
32
+
33
+ CMD ["uvicorn", "api:app", "--host", "0.0.0.0", "--port", "7860"]
34
+
35
+
36
+ # # Download a checkpoint
37
+ # RUN mkdir content
38
+ # ADD --chown=user https://<SOME_ASSET_URL> content/<SOME_ASSET_NAME>
README.md CHANGED
@@ -1,54 +1,8 @@
1
- # React + TypeScript + Vite
2
-
3
- This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
-
5
- Currently, two official plugins are available:
6
-
7
- - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
8
- - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9
-
10
- ## Expanding the ESLint configuration
11
-
12
- If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
13
-
14
- ```js
15
- export default tseslint.config({
16
- extends: [
17
- // Remove ...tseslint.configs.recommended and replace with this
18
- ...tseslint.configs.recommendedTypeChecked,
19
- // Alternatively, use this for stricter rules
20
- ...tseslint.configs.strictTypeChecked,
21
- // Optionally, add this for stylistic rules
22
- ...tseslint.configs.stylisticTypeChecked,
23
- ],
24
- languageOptions: {
25
- // other options...
26
- parserOptions: {
27
- project: ['./tsconfig.node.json', './tsconfig.app.json'],
28
- tsconfigRootDir: import.meta.dirname,
29
- },
30
- },
31
- })
32
- ```
33
-
34
- You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
35
-
36
- ```js
37
- // eslint.config.js
38
- import reactX from 'eslint-plugin-react-x'
39
- import reactDom from 'eslint-plugin-react-dom'
40
-
41
- export default tseslint.config({
42
- plugins: {
43
- // Add the react-x and react-dom plugins
44
- 'react-x': reactX,
45
- 'react-dom': reactDom,
46
- },
47
- rules: {
48
- // other rules...
49
- // Enable its recommended typescript rules
50
- ...reactX.configs['recommended-typescript'].rules,
51
- ...reactDom.configs.recommended.rules,
52
- },
53
- })
54
- ```
 
1
+ ---
2
+ title: Wikispeedia
3
+ emoji: 🐳
4
+ colorFrom: purple
5
+ colorTo: gray
6
+ sdk: docker
7
+ app_port: 7860
8
+ ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
api.py ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sqlite3
2
+ import json
3
+ import os
4
+ from typing import Tuple, List, Optional
5
+ from functools import lru_cache
6
+ from fastapi import FastAPI, HTTPException
7
+ from fastapi.middleware.cors import CORSMiddleware
8
+ from fastapi.staticfiles import StaticFiles
9
+ from pydantic import BaseModel
10
+ import uvicorn
11
+ from fastapi.responses import FileResponse
12
+
13
+ app = FastAPI(title="WikiSpeedia API")
14
+
15
+ # Add CORS middleware
16
+ app.add_middleware(
17
+ CORSMiddleware,
18
+ allow_origins=["*"], # Allows all origins
19
+ allow_credentials=True,
20
+ allow_methods=["*"], # Allows all methods
21
+ allow_headers=["*"], # Allows all headers
22
+ )
23
+
24
+ class ArticleResponse(BaseModel):
25
+ title: str
26
+ links: List[str]
27
+
28
+ class HealthResponse(BaseModel):
29
+ status: str
30
+ article_count: int
31
+
32
+ class SQLiteDB:
33
+ def __init__(self, db_path: str):
34
+ """Initialize the database with path to SQLite database"""
35
+ self.db_path = db_path
36
+ self.conn = sqlite3.connect(db_path)
37
+ self.conn.row_factory = sqlite3.Row
38
+ self.cursor = self.conn.cursor()
39
+ self._article_count = self._get_article_count()
40
+ print(f"Connected to SQLite database with {self._article_count} articles")
41
+
42
+ def _get_article_count(self):
43
+ self.cursor.execute("SELECT COUNT(*) FROM core_articles")
44
+ return self.cursor.fetchone()[0]
45
+
46
+ @lru_cache(maxsize=8192)
47
+ def get_article_with_links(self, article_title: str) -> Tuple[str, List[str]]:
48
+ self.cursor.execute(
49
+ "SELECT title, links_json FROM core_articles WHERE title = ?",
50
+ (article_title,),
51
+ )
52
+ article = self.cursor.fetchone()
53
+ if not article:
54
+ return None, []
55
+
56
+ links = json.loads(article["links_json"])
57
+ return article["title"], links
58
+
59
+ # Initialize database connection
60
+ db = SQLiteDB(
61
+ os.getenv("WIKISPEEDIA_DB_PATH", "/Users/jts/daily/wikihop/db/data/wikihop.db")
62
+ )
63
+
64
+ @app.get("/health", response_model=HealthResponse)
65
+ async def health_check():
66
+ """Health check endpoint that returns the article count"""
67
+ return HealthResponse(
68
+ status="healthy",
69
+ article_count=db._article_count
70
+ )
71
+
72
+ @app.get("/get_article_with_links/{article_title}", response_model=ArticleResponse)
73
+ async def get_article(article_title: str):
74
+ """Get article and its links by title"""
75
+ title, links = db.get_article_with_links(article_title)
76
+ if title is None:
77
+ raise HTTPException(status_code=404, detail="Article not found")
78
+ return ArticleResponse(title=title, links=links)
79
+
80
+
81
+ # Mount the dist folder for static files
82
+ app.mount("/", StaticFiles(directory="dist", html=True), name="static")
83
+
84
+
85
+ if __name__ == "__main__":
86
+ uvicorn.run(app, host="0.0.0.0", port=8000)
package.json CHANGED
@@ -5,21 +5,29 @@
5
  "type": "module",
6
  "scripts": {
7
  "dev": "vite",
8
- "build": "tsc -b && vite build",
9
  "deploy": "yarn build && huggingface-cli upload --repo-type space --private HuggingFaceTB/Wikispeedia dist",
10
  "lint": "eslint .",
11
  "preview": "vite preview"
12
  },
13
  "dependencies": {
 
 
 
14
  "@radix-ui/react-select": "^2.2.2",
15
  "@radix-ui/react-slot": "^1.2.0",
16
  "@radix-ui/react-tabs": "^1.1.9",
17
  "@tailwindcss/vite": "^4.1.5",
18
  "class-variance-authority": "^0.7.1",
19
  "clsx": "^2.1.1",
 
 
20
  "lucide-react": "^0.503.0",
21
  "react": "^19.0.0",
22
  "react-dom": "^19.0.0",
 
 
 
23
  "tailwind-merge": "^3.2.0",
24
  "tailwindcss": "^4.1.5"
25
  },
 
5
  "type": "module",
6
  "scripts": {
7
  "dev": "vite",
8
+ "build": "vite build",
9
  "deploy": "yarn build && huggingface-cli upload --repo-type space --private HuggingFaceTB/Wikispeedia dist",
10
  "lint": "eslint .",
11
  "preview": "vite preview"
12
  },
13
  "dependencies": {
14
+ "@huggingface/hub": "^1.1.2",
15
+ "@huggingface/inference": "^3.10.0",
16
+ "@radix-ui/react-label": "^2.1.4",
17
  "@radix-ui/react-select": "^2.2.2",
18
  "@radix-ui/react-slot": "^1.2.0",
19
  "@radix-ui/react-tabs": "^1.1.9",
20
  "@tailwindcss/vite": "^4.1.5",
21
  "class-variance-authority": "^0.7.1",
22
  "clsx": "^2.1.1",
23
+ "d3": "^7.9.0",
24
+ "jwt-decode": "^4.0.0",
25
  "lucide-react": "^0.503.0",
26
  "react": "^19.0.0",
27
  "react-dom": "^19.0.0",
28
+ "react-force-graph-2d": "^1.27.1",
29
+ "react-force-graph-3d": "^1.26.1",
30
+ "react-vis-force": "^0.3.1",
31
  "tailwind-merge": "^3.2.0",
32
  "tailwindcss": "^4.1.5"
33
  },
requirements.txt ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ annotated-types==0.7.0
2
+ anyio==4.9.0
3
+ click==8.1.8
4
+ exceptiongroup==1.2.2
5
+ fastapi==0.115.12
6
+ h11==0.16.0
7
+ idna==3.10
8
+ pydantic==2.11.4
9
+ pydantic-core==2.33.2
10
+ sniffio==1.3.1
11
+ starlette==0.46.2
12
+ typing-extensions==4.13.2
13
+ typing-inspection==0.4.0
14
+ uvicorn==0.34.2
src/App.tsx CHANGED
@@ -1,11 +1,14 @@
1
  import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
2
  import ViewerTab from "@/components/viewer-tab";
3
  import PlayTab from "@/components/play-tab";
4
-
5
  export default function Home() {
6
  return (
7
  <div className="container mx-auto p-4">
8
- <h1 className="text-3xl font-bold mb-6">Wikispeedia</h1>
 
 
 
9
 
10
  <Tabs defaultValue="view" className="w-full">
11
  <TabsList className="mb-4">
 
1
  import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
2
  import ViewerTab from "@/components/viewer-tab";
3
  import PlayTab from "@/components/play-tab";
4
+ import { SignInWithHuggingFaceButton } from "@/components/sign-in-with-hf-button";
5
  export default function Home() {
6
  return (
7
  <div className="container mx-auto p-4">
8
+ <div className="flex flex-row justify-between">
9
+ <h1 className="text-3xl font-bold mb-6">Wikispeedia</h1>
10
+ <SignInWithHuggingFaceButton />
11
+ </div>
12
 
13
  <Tabs defaultValue="view" className="w-full">
14
  <TabsList className="mb-4">
src/components/force-directed-graph.tsx CHANGED
@@ -1,143 +1,109 @@
1
  "use client";
2
 
 
 
 
 
3
  // This is a placeholder component for the force-directed graph
4
  // In a real implementation, you would use a library like D3.js or react-force-graph
5
 
6
  interface ForceDirectedGraphProps {
7
  runId: number | null;
 
8
  }
9
 
10
- export default function ForceDirectedGraph({ runId }: ForceDirectedGraphProps) {
11
- if (!runId) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  return (
13
- <div className="w-full h-full flex items-center justify-center text-muted-foreground">
14
- Select a run to view the path graph
15
- </div>
 
 
 
 
 
 
 
 
 
 
16
  );
17
- }
18
-
19
- // This is just a placeholder SVG - in a real implementation,
20
- // you would render an actual force-directed graph
21
- return (
22
- <div className="w-full h-full flex items-center justify-center">
23
- <svg width="100%" height="100%" viewBox="0 0 800 600">
24
- {/* Center node */}
25
- <circle cx="400" cy="300" r="20" fill="#ff4d4f" />
26
-
27
- {/* Surrounding nodes */}
28
- <circle cx="200" cy="150" r="15" fill="#ff9c6e" />
29
- <circle cx="600" cy="150" r="15" fill="#ff9c6e" />
30
- <circle cx="200" cy="450" r="15" fill="#ff9c6e" />
31
- <circle cx="600" cy="450" r="15" fill="#ff9c6e" />
32
- <circle cx="300" cy="100" r="15" fill="#ff9c6e" />
33
- <circle cx="500" cy="100" r="15" fill="#ff9c6e" />
34
- <circle cx="300" cy="500" r="15" fill="#ff9c6e" />
35
- <circle cx="500" cy="500" r="15" fill="#ff9c6e" />
36
-
37
- {/* Lines connecting nodes */}
38
- <line
39
- x1="400"
40
- y1="300"
41
- x2="200"
42
- y2="150"
43
- stroke="#ffa39e"
44
- strokeWidth="2"
45
- />
46
- <line
47
- x1="400"
48
- y1="300"
49
- x2="600"
50
- y2="150"
51
- stroke="#ffa39e"
52
- strokeWidth="2"
53
- />
54
- <line
55
- x1="400"
56
- y1="300"
57
- x2="200"
58
- y2="450"
59
- stroke="#ffa39e"
60
- strokeWidth="2"
61
- />
62
- <line
63
- x1="400"
64
- y1="300"
65
- x2="600"
66
- y2="450"
67
- stroke="#ffa39e"
68
- strokeWidth="2"
69
- />
70
- <line
71
- x1="400"
72
- y1="300"
73
- x2="300"
74
- y2="100"
75
- stroke="#ffa39e"
76
- strokeWidth="2"
77
- />
78
- <line
79
- x1="400"
80
- y1="300"
81
- x2="500"
82
- y2="100"
83
- stroke="#ffa39e"
84
- strokeWidth="2"
85
- />
86
- <line
87
- x1="400"
88
- y1="300"
89
- x2="300"
90
- y2="500"
91
- stroke="#ffa39e"
92
- strokeWidth="2"
93
- />
94
- <line
95
- x1="400"
96
- y1="300"
97
- x2="500"
98
- y2="500"
99
- stroke="#ffa39e"
100
- strokeWidth="2"
101
- />
102
-
103
- {/* Secondary connections */}
104
- <line
105
- x1="200"
106
- y1="150"
107
- x2="300"
108
- y2="100"
109
- stroke="#ffa39e"
110
- strokeWidth="1"
111
- opacity="0.5"
112
- />
113
- <line
114
- x1="600"
115
- y1="150"
116
- x2="500"
117
- y2="100"
118
- stroke="#ffa39e"
119
- strokeWidth="1"
120
- opacity="0.5"
121
- />
122
- <line
123
- x1="200"
124
- y1="450"
125
- x2="300"
126
- y2="500"
127
- stroke="#ffa39e"
128
- strokeWidth="1"
129
- opacity="0.5"
130
- />
131
- <line
132
- x1="600"
133
- y1="450"
134
- x2="500"
135
- y2="500"
136
- stroke="#ffa39e"
137
- strokeWidth="1"
138
- opacity="0.5"
139
- />
140
- </svg>
141
- </div>
142
- );
143
  }
 
1
  "use client";
2
 
3
+ import { useEffect, useRef, useState } from "react";
4
+ import ForceGraph2D from "react-force-graph-2d";
5
+ import { Run } from "./reasoning-trace";
6
+
7
  // This is a placeholder component for the force-directed graph
8
  // In a real implementation, you would use a library like D3.js or react-force-graph
9
 
10
  interface ForceDirectedGraphProps {
11
  runId: number | null;
12
+ runs: Run[];
13
  }
14
 
15
+ export default function ForceDirectedGraph({runs, runId }: ForceDirectedGraphProps) {
16
+ const [graphData, setGraphData] = useState<{nodes: {id: string}[], links: {source: string, target: string}[]}>({nodes: [], links: []});
17
+ const [dimensions, setDimensions] = useState({ width: 300, height: 300 });
18
+ const containerRef = useRef<HTMLDivElement>(null);
19
+
20
+ useEffect(() => {
21
+
22
+ const newGraphData: {nodes: {id: string}[], links: {source: string, target: string}[]} = {nodes: [], links: []};
23
+ const nodesSet: Set<string> = new Set();
24
+ const mainNodeSet: Set<string> = new Set();
25
+
26
+ if(runs) {
27
+ runs.forEach((run) => {
28
+ // add in src and dst to nodes
29
+
30
+ mainNodeSet.add(run.start_article);
31
+ mainNodeSet.add(run.destination_article);
32
+
33
+ for(let i = 0; i < run.steps.length - 1; i++) {
34
+ const step = run.steps[i];
35
+ const nextStep = run.steps[i + 1];
36
+
37
+ if(!mainNodeSet.has(step.article)) {
38
+ nodesSet.add(step.article);
39
+ }
40
+
41
+ if(!mainNodeSet.has(nextStep.article)) {
42
+ nodesSet.add(nextStep.article);
43
+ }
44
+
45
+ newGraphData.links.push({source: step.article, target: nextStep.article});
46
+ }
47
+
48
+ const mainNodes = Array.from(mainNodeSet);
49
+ const radius = 200; // Radius of the circle
50
+ const centerX = 400; // Center X coordinate
51
+ const centerY = 300; // Center Y coordinate
52
+
53
+ newGraphData.nodes = mainNodes.map((id, index) => {
54
+ const angle = (index * 2 * Math.PI) / mainNodes.length;
55
+ return {
56
+ id,
57
+ fx: centerX + radius * Math.cos(angle),
58
+ fy: centerY + radius * Math.sin(angle),
59
+ color: "red"
60
+ };
61
+ });
62
+ newGraphData.nodes.push(...Array.from(nodesSet).map((id) => ({id})));
63
+ });
64
+
65
+ setGraphData(newGraphData);
66
+ }
67
+ }, [runs]);
68
+
69
+ // useEffect(() => {
70
+ // if (!containerRef.current) return;
71
+ // const observer = new window.ResizeObserver(entries => {
72
+ // for (const entry of entries) {
73
+ // const { width, height } = entry.contentRect;
74
+ // setDimensions({ width, height });
75
+ // }
76
+ // });
77
+ // observer.observe(containerRef.current);
78
+ // // Set initial size
79
+ // setDimensions({
80
+ // width: containerRef.current.offsetWidth,
81
+ // height: containerRef.current.offsetHeight
82
+ // });
83
+ // return () => observer.disconnect();
84
+ // }, []);
85
+
86
+ // if (!runId) {
87
+ // return (
88
+ // <div className="w-full h-full flex items-center justify-center text-muted-foreground">
89
+ // Select a run to view the path graph
90
+ // </div>
91
+ // );
92
+ // }
93
+
94
  return (
95
+ <div className="w-full h-full flex items-center justify-center">
96
+ <div ref={containerRef} className="w-full h-full">
97
+ <ForceGraph2D
98
+ graphData={graphData}
99
+ nodeLabel="id"
100
+ linkLabel="id"
101
+ nodeColor="color"
102
+ linkColor="gray"
103
+ width={dimensions.width}
104
+ height={dimensions.height}
105
+ />
106
+ </div>
107
+ </div>
108
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
  }
src/components/game-component.tsx ADDED
@@ -0,0 +1,424 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client";
2
+
3
+ import { useState, useEffect, useCallback, useMemo } from "react";
4
+ import { Card } from "@/components/ui/card";
5
+ import { Button } from "@/components/ui/button";
6
+ import { Flag, Clock, Hash, BarChart, ArrowRight, Bot } from "lucide-react";
7
+ import inference from "@/lib/inference";
8
+ import ReasoningTrace, { Run, Step } from "./reasoning-trace";
9
+ import ForceDirectedGraph from "./force-directed-graph";
10
+
11
+ const mockRun: Run = {
12
+ steps: [
13
+ {
14
+ type: "start",
15
+ article: "Dogs",
16
+ metadata: {
17
+ message: "Starting Node",
18
+ },
19
+ },
20
+ {
21
+ type: "step",
22
+ article: "Dogs",
23
+ links: ["Dogs", "Cats", "Birds"],
24
+ metadata: {
25
+ conversation: [
26
+ {
27
+ role: "user",
28
+ content: "I want to go to the moon",
29
+ },
30
+ {
31
+ role: "assistant",
32
+ content: "I want to go to the moon",
33
+ },
34
+ ],
35
+ },
36
+ },
37
+ ],
38
+ };
39
+ const buildPrompt = (
40
+ current: string,
41
+ target: string,
42
+ path_so_far: string[],
43
+ links: string[]
44
+ ) => {
45
+ const formatted_links = links
46
+ .map((link, index) => `${index + 1}. ${link}`)
47
+ .join("\n");
48
+ const path_so_far_str = path_so_far.join(" -> ");
49
+
50
+ return `You are playing WikiRun, trying to navigate from one Wikipedia article to another using only links.
51
+
52
+ IMPORTANT: You MUST put your final answer in <answer>NUMBER</answer> tags, where NUMBER is the link number.
53
+ For example, if you want to choose link 3, output <answer>3</answer>.
54
+
55
+ Current article: ${current}
56
+ Target article: ${target}
57
+ You have ${links.length} link(s) to choose from:
58
+ ${formatted_links}
59
+
60
+ Your path so far: ${path_so_far_str}
61
+
62
+ Think about which link is most likely to lead you toward the target article.
63
+ First, analyze each link briefly and how it connects to your goal, then select the most promising one.
64
+
65
+ Remember to format your final answer by explicitly writing out the xml number tags like this: <answer>NUMBER</answer>`;
66
+ };
67
+
68
+ const API_BASE = "http://localhost:8000";
69
+
70
+ interface GameComponentProps {
71
+ player: "me" | "model";
72
+ model?: string;
73
+ maxHops: number;
74
+ startPage: string;
75
+ targetPage: string;
76
+ onReset: () => void;
77
+ maxTokens: number;
78
+ maxLinks: number;
79
+ }
80
+
81
+ export default function GameComponent({
82
+ player,
83
+ model,
84
+ maxHops,
85
+ startPage,
86
+ targetPage,
87
+ onReset,
88
+ maxTokens,
89
+ maxLinks,
90
+ }: GameComponentProps) {
91
+ const [currentPage, setCurrentPage] = useState<string>(startPage);
92
+ const [currentPageLinks, setCurrentPageLinks] = useState<string[]>([]);
93
+ const [linksLoading, setLinksLoading] = useState<boolean>(false);
94
+ const [hops, setHops] = useState<number>(0);
95
+ const [timeElapsed, setTimeElapsed] = useState<number>(0);
96
+ const [visitedNodes, setVisitedNodes] = useState<string[]>([startPage]);
97
+ const [gameStatus, setGameStatus] = useState<"playing" | "won" | "lost">(
98
+ "playing"
99
+ );
100
+ const [reasoningTrace, setReasoningTrace] = useState<Run | null>({
101
+ start_article: startPage,
102
+ destination_article: targetPage,
103
+ steps: [
104
+ {
105
+ type: "start",
106
+ article: startPage,
107
+ metadata: {
108
+ message: "Starting Node",
109
+ },
110
+ },
111
+ ],
112
+ });
113
+ const [isModelThinking, setIsModelThinking] = useState<boolean>(false);
114
+
115
+ const runs = useMemo(() => {
116
+ return reasoningTrace ? [reasoningTrace] : [];
117
+ }, [reasoningTrace]);
118
+
119
+ const fetchCurrentPageLinks = useCallback(async () => {
120
+ setLinksLoading(true);
121
+ const response = await fetch(
122
+ `${API_BASE}/get_article_with_links/${currentPage}`
123
+ );
124
+ const data = await response.json();
125
+ setCurrentPageLinks(data.links.slice(0, maxLinks));
126
+ setLinksLoading(false);
127
+ }, [currentPage, maxLinks]);
128
+
129
+ useEffect(() => {
130
+ fetchCurrentPageLinks();
131
+ }, [fetchCurrentPageLinks]);
132
+
133
+ useEffect(() => {
134
+ if (gameStatus === "playing") {
135
+ const timer = setInterval(() => {
136
+ setTimeElapsed((prev) => prev + 1);
137
+ }, 1000);
138
+
139
+ return () => clearInterval(timer);
140
+ }
141
+ }, [gameStatus]);
142
+
143
+ // Check win condition
144
+ useEffect(() => {
145
+ if (currentPage === targetPage) {
146
+ setGameStatus("won");
147
+ } else if (hops >= maxHops) {
148
+ setGameStatus("lost");
149
+ }
150
+ }, [currentPage, targetPage, hops, maxHops]);
151
+
152
+ const addStepToReasoningTrace = (step: Step) => {
153
+ setReasoningTrace((prev) => {
154
+ if (!prev) return { steps: [step], start_article: startPage, destination_article: targetPage };
155
+ return { steps: [...prev.steps, step], start_article: startPage, destination_article: targetPage };
156
+ });
157
+ };
158
+
159
+ const handleLinkClick = (link: string, userClicked: boolean = true) => {
160
+ if (gameStatus !== "playing") return;
161
+
162
+ setCurrentPage(link);
163
+ setHops((prev) => prev + 1);
164
+ setVisitedNodes((prev) => [...prev, link]);
165
+ if (userClicked) {
166
+ addStepToReasoningTrace({
167
+ type: "step",
168
+ article: link,
169
+ links: currentPageLinks,
170
+ metadata: {
171
+ message: "User clicked link",
172
+ },
173
+ });
174
+ }
175
+ };
176
+
177
+ const makeModelMove = async () => {
178
+ setIsModelThinking(true);
179
+
180
+ const prompt = buildPrompt(
181
+ currentPage,
182
+ targetPage,
183
+ visitedNodes,
184
+ currentPageLinks
185
+ );
186
+
187
+ const modelResponse = await inference({
188
+ apiKey:
189
+ window.localStorage.getItem("huggingface_access_token") || undefined,
190
+ model: model,
191
+ prompt,
192
+ maxTokens: maxTokens,
193
+ });
194
+ console.log("Model response", modelResponse.content);
195
+
196
+ const answer = modelResponse.content?.match(/<answer>(.*?)<\/answer>/)?.[1];
197
+ if (!answer) {
198
+ console.error("No answer found in model response");
199
+ return;
200
+ }
201
+
202
+ // try parsing the answer as an integer
203
+ const answerInt = parseInt(answer);
204
+ if (isNaN(answerInt)) {
205
+ console.error("Invalid answer found in model response");
206
+ return;
207
+ }
208
+
209
+ if (answerInt < 1 || answerInt > currentPageLinks.length) {
210
+ console.error(
211
+ "Selected link out of bounds",
212
+ answerInt,
213
+ "from ",
214
+ currentPageLinks.length,
215
+ "links"
216
+ );
217
+ return;
218
+ }
219
+
220
+ const selectedLink = currentPageLinks[answerInt - 1];
221
+
222
+ console.log(
223
+ "Model picked selectedLink",
224
+ selectedLink,
225
+ "from ",
226
+ currentPageLinks
227
+ );
228
+
229
+ addStepToReasoningTrace({
230
+ type: "step",
231
+ article: selectedLink,
232
+ links: currentPageLinks,
233
+ metadata: {
234
+ message: "Model picked link",
235
+ conversation: [
236
+ {
237
+ role: "user",
238
+ content: prompt,
239
+ },
240
+ {
241
+ role: "assistant",
242
+ content: modelResponse.content || "",
243
+ },
244
+ ],
245
+ },
246
+ });
247
+
248
+ handleLinkClick(selectedLink, false);
249
+ setIsModelThinking(false);
250
+ };
251
+
252
+ const handleGiveUp = () => {
253
+ setGameStatus("lost");
254
+ };
255
+
256
+ const formatTime = (seconds: number) => {
257
+ const mins = Math.floor(seconds / 60);
258
+ const secs = seconds % 60;
259
+ return `${mins}:${secs < 10 ? "0" : ""}${secs}`;
260
+ };
261
+
262
+ return (
263
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
264
+ <Card className="p-4 flex col-span-2">
265
+ <h2 className="text-xl font-bold">Game Status</h2>
266
+ <div className="grid grid-cols-4 gap-4 mb-4">
267
+ <div className="bg-muted/30 p-3 rounded-md">
268
+ <div className="flex items-center gap-2 text-sm font-medium text-muted-foreground mb-1">
269
+ <ArrowRight className="h-4 w-4" /> Current
270
+ </div>
271
+ <div className="font-medium">{currentPage}</div>
272
+ </div>
273
+ <div className="bg-muted/30 p-3 rounded-md">
274
+ <div className="flex items-center gap-2 text-sm font-medium text-muted-foreground mb-1">
275
+ <Flag className="h-4 w-4" /> Target
276
+ </div>
277
+ <div className="font-medium">{targetPage}</div>
278
+ </div>
279
+
280
+ <div className="bg-muted/30 p-3 rounded-md">
281
+ <div className="flex items-center gap-2 text-sm font-medium text-muted-foreground mb-1">
282
+ <Hash className="h-4 w-4" /> Hops
283
+ </div>
284
+ <div className="font-medium">
285
+ {hops} / {maxHops}
286
+ </div>
287
+ </div>
288
+
289
+ <div className="bg-muted/30 p-3 rounded-md">
290
+ <div className="flex items-center gap-2 text-sm font-medium text-muted-foreground mb-1">
291
+ <Clock className="h-4 w-4" /> Time
292
+ </div>
293
+ <div className="font-medium">{formatTime(timeElapsed)}</div>
294
+ </div>
295
+ </div>
296
+
297
+ {player === "model" && (
298
+ <div className="mb-4 bg-blue-50 border border-blue-200 rounded-md p-3">
299
+ <div className="flex items-center gap-2">
300
+ <Bot className="h-4 w-4 text-blue-500" />
301
+ <span className="font-medium text-blue-700">
302
+ {model} {isModelThinking ? "is playing..." : "is playing"}
303
+ </span>
304
+ </div>
305
+ </div>
306
+ )}
307
+ </Card>
308
+ {/* Left pane - Current page and available links */}
309
+ <Card className="p-4 flex flex-col">
310
+ <h2 className="text-xl font-bold">Available Links</h2>
311
+ <div className="flex justify-between items-center mb-4">
312
+ {gameStatus !== "playing" && (
313
+ <Button onClick={onReset} variant="outline">
314
+ New Game
315
+ </Button>
316
+ )}
317
+ </div>
318
+
319
+ {/* Wikipedia iframe (mocked) */}
320
+ {/* <div className="bg-muted/30 rounded-md flex-1 mb-4 overflow-hidden">
321
+ <div className="bg-white p-4 border-b">
322
+ <h2 className="text-xl font-bold">{currentPage}</h2>
323
+ <p className="text-sm text-muted-foreground">
324
+ https://en.wikipedia.org/wiki/{currentPage.replace(/\s+/g, "_")}
325
+ </p>
326
+ </div>
327
+ <div className="p-4">
328
+ <p className="text-sm">
329
+ This is a mock Wikipedia page for {currentPage}. In the actual
330
+ implementation, this would be an iframe showing the real Wikipedia
331
+ page.
332
+ </p>
333
+ </div>
334
+ </div> */}
335
+
336
+ {/* Available links */}
337
+ {gameStatus === "playing" && (
338
+ <>
339
+ <div className="grid grid-cols-2 sm:grid-cols-3 gap-2 mb-4 overflow-y-auto max-h-[200px]">
340
+ {currentPageLinks
341
+ .sort((a, b) => a.localeCompare(b))
342
+ .map((link) => (
343
+ <Button
344
+ key={link}
345
+ variant="outline"
346
+ size="sm"
347
+ className="justify-start overflow-hidden text-ellipsis whitespace-nowrap"
348
+ onClick={() => handleLinkClick(link)}
349
+ disabled={player === "model" || isModelThinking}
350
+ >
351
+ {link}
352
+ </Button>
353
+ ))}
354
+ </div>
355
+
356
+ {player === "model" && (
357
+ <Button
358
+ onClick={makeModelMove}
359
+ disabled={isModelThinking || linksLoading}
360
+ >
361
+ Make Move
362
+ </Button>
363
+ )}
364
+ </>
365
+ )}
366
+
367
+ {player === "model" && isModelThinking && gameStatus === "playing" && (
368
+ <div className="flex items-center gap-2 text-sm animate-pulse mb-4">
369
+ <Bot className="h-4 w-4" />
370
+ <span>{model} is thinking...</span>
371
+ </div>
372
+ )}
373
+
374
+ {gameStatus === "playing" && player === "me" && (
375
+ <Button
376
+ onClick={handleGiveUp}
377
+ variant="destructive"
378
+ className="mt-auto"
379
+ >
380
+ Give Up
381
+ </Button>
382
+ )}
383
+
384
+ {gameStatus === "won" && (
385
+ <div className="bg-green-100 text-green-800 p-4 rounded-md mt-auto">
386
+ <h3 className="font-bold">
387
+ {player === "model" ? `${model} won!` : "You won!"}
388
+ </h3>
389
+ <p>
390
+ {player === "model" ? "It" : "You"} reached {targetPage} in {hops}{" "}
391
+ hops.
392
+ </p>
393
+ </div>
394
+ )}
395
+
396
+ {gameStatus === "lost" && (
397
+ <div className="bg-red-100 text-red-800 p-4 rounded-md mt-auto">
398
+ <h3 className="font-bold">Game Over</h3>
399
+ <p>
400
+ {player === "model" ? `${model} didn't` : "You didn't"} reach{" "}
401
+ {targetPage} within {maxHops} hops.
402
+ </p>
403
+ </div>
404
+ )}
405
+ </Card>
406
+
407
+ <Card className="p-4 flex flex-col max-h-[500px] overflow-y-auto">
408
+ <ReasoningTrace run={reasoningTrace} />
409
+ </Card>
410
+
411
+ {/* Right pane - Game stats and graph */}
412
+ <Card className="p-4 flex flex-col">
413
+ <div className="flex-1 bg-muted/30 rounded-md p-4">
414
+ <div className="flex items-center gap-2 text-sm font-medium text-muted-foreground mb-2">
415
+ <BarChart className="h-4 w-4" /> Path Visualization
416
+ </div>
417
+
418
+ <ForceDirectedGraph runs={runs} runId={null} />
419
+ </div>
420
+ </Card>
421
+ </div>
422
+ );
423
+ }
424
+
src/components/play-tab.tsx CHANGED
@@ -1,7 +1,266 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  export default function PlayTab() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  return (
3
- <div className="flex items-center justify-center h-[600px] bg-muted/30 rounded-md">
4
- <p className="text-muted-foreground">Play tab coming soon...</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  </div>
6
  );
7
  }
 
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+ import { Card } from "@/components/ui/card";
5
+ import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
6
+ import { Input } from "@/components/ui/input";
7
+ import { Label } from "@/components/ui/label";
8
+ import { Button } from "@/components/ui/button";
9
+ import { Sun } from "lucide-react";
10
+ import { Wifi, WifiOff } from "lucide-react";
11
+ import GameComponent from "@/components/game-component";
12
+ import {
13
+ Select,
14
+ SelectContent,
15
+ SelectGroup,
16
+ SelectItem,
17
+ SelectLabel,
18
+ SelectTrigger,
19
+ SelectValue,
20
+ } from "@/components/ui/select";
21
+
22
+ const API_BASE = "http://localhost:8000/";
23
+
24
+ // Available AI models
25
+ const aiModels = [
26
+ { id: "gpt-4o", name: "GPT-4o", category: "OpenAI" },
27
+ { id: "claude-3-5-sonnet", name: "Claude 3.5 Sonnet", category: "Anthropic" },
28
+ { id: "gemini-1.5-pro", name: "Gemini 1.5 Pro", category: "Google" },
29
+ { id: "llama-3-70b", name: "Llama 3 70B", category: "Meta" },
30
+ { id: "mistral-large", name: "Mistral Large", category: "Mistral AI" },
31
+ ];
32
+
33
  export default function PlayTab() {
34
+ const [player, setPlayer] = useState<"me" | "model">("me");
35
+ const [selectedModel, setSelectedModel] = useState<string | undefined>();
36
+ const [maxHops, setMaxHops] = useState<number>(20);
37
+ const [nodeList, setNodeList] = useState<string>("default");
38
+ const [isGameStarted, setIsGameStarted] = useState<boolean>(false);
39
+ const [startPage, setStartPage] = useState<string>("Dogs");
40
+ const [targetPage, setTargetPage] = useState<string>("Canada");
41
+ const [maxTokens, setMaxTokens] = useState<number>(1024);
42
+ const [maxLinks, setMaxLinks] = useState<number>(200);
43
+ const [isServerConnected, setIsServerConnected] = useState<boolean>(false);
44
+ const [modelList, setModelList] = useState<{id: string, name: string, author: string, likes: number, trendingScore: number}[]>([]);
45
+
46
+ // Server connection check
47
+ useEffect(() => {
48
+ fetchAvailableModels();
49
+ const checkServerConnection = async () => {
50
+ try {
51
+ const response = await fetch(API_BASE);
52
+ setIsServerConnected(response.ok);
53
+ } catch {
54
+ setIsServerConnected(false);
55
+ }
56
+ };
57
+
58
+ // Check immediately and then every 30 seconds
59
+ checkServerConnection();
60
+ const interval = setInterval(checkServerConnection, 30000);
61
+
62
+ return () => clearInterval(interval);
63
+ }, []);
64
+
65
+ const handleStartGame = () => {
66
+ setIsGameStarted(true);
67
+ };
68
+
69
+ const handleResetGame = () => {
70
+ setIsGameStarted(false);
71
+ };
72
+
73
+ const handlePlayerChange = (value: string) => {
74
+ setPlayer(value as "me" | "model");
75
+ };
76
+
77
+ const fetchAvailableModels = async () => {
78
+ const response = await fetch(
79
+ "https://huggingface.co/api/models?inference_provider=all&pipeline_tag=text-generation"
80
+ );
81
+ const models = await response.json()
82
+ const filteredModels = models.filter((m: any) => m.tags.includes('text-generation'))
83
+ const modelList = filteredModels.map((m: any) => ({
84
+ id: m.id,
85
+ likes: m.likes,
86
+ trendingScore: m.trendingScore,
87
+ author: m.id.split('/')[0],
88
+ name: m.id.split('/')[1],
89
+ }));
90
+ console.log("got model list", modelList);
91
+ setModelList(modelList);
92
+ }
93
+
94
  return (
95
+ <div className="space-y-4">
96
+ {!isGameStarted ? (
97
+ <Card className="p-6">
98
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-6">
99
+ <div className="space-y-4">
100
+ <div>
101
+ <Label htmlFor="player-select" className="block mb-2">
102
+ Player
103
+ </Label>
104
+ <Tabs
105
+ defaultValue="me"
106
+ value={player}
107
+ onValueChange={handlePlayerChange}
108
+ className="w-full"
109
+ >
110
+ <TabsList className="grid w-full grid-cols-2">
111
+ <TabsTrigger value="me">Me</TabsTrigger>
112
+ <TabsTrigger value="model">Model</TabsTrigger>
113
+ </TabsList>
114
+ </Tabs>
115
+ </div>
116
+
117
+ <div className="flex items-center gap-2">
118
+ <div className="flex items-center gap-1 text-sm">
119
+ {isServerConnected ? (
120
+ <Wifi className="h-4 w-4 text-green-500" />
121
+ ) : (
122
+ <WifiOff className="h-4 w-4 text-red-500" />
123
+ )}
124
+ <span
125
+ className={
126
+ isServerConnected ? "text-green-500" : "text-red-500"
127
+ }
128
+ >
129
+ {isServerConnected ? "Connected" : "Disconnected"}
130
+ </span>
131
+ </div>
132
+ </div>
133
+ </div>
134
+
135
+ <div>
136
+ <Label htmlFor="max-hops" className="block mb-2">
137
+ Max Hops
138
+ </Label>
139
+ <Input
140
+ id="max-hops"
141
+ type="number"
142
+ value={maxHops}
143
+ onChange={(e) => setMaxHops(Number.parseInt(e.target.value))}
144
+ min={1}
145
+ max={100}
146
+ />
147
+ </div>
148
+
149
+ <div>
150
+ <Label htmlFor="node-list" className="block mb-2">
151
+ Node List
152
+ </Label>
153
+ <Tabs
154
+ defaultValue="default"
155
+ value={nodeList}
156
+ onValueChange={setNodeList}
157
+ className="w-full"
158
+ >
159
+ <TabsList className="grid w-full grid-cols-2">
160
+ <TabsTrigger value="default">Default</TabsTrigger>
161
+ <TabsTrigger value="custom">Custom</TabsTrigger>
162
+ </TabsList>
163
+ </Tabs>
164
+ </div>
165
+
166
+ {player === "model" && (
167
+ <div className="md:col-span-3 animate-in fade-in slide-in-from-top-5 duration-300 grid grid-cols-1 md:grid-cols-3 gap-4 mt-2">
168
+ <div>
169
+ <Label htmlFor="model-select" className="block mb-2">
170
+ Select Model
171
+ </Label>
172
+ <Select
173
+ value={selectedModel}
174
+ onValueChange={setSelectedModel}
175
+ >
176
+ <SelectTrigger className="w-full">
177
+ <SelectValue placeholder={`Select a model (${modelList.length} models available)`} />
178
+ </SelectTrigger>
179
+ <SelectContent>
180
+ {modelList.map((model) => (
181
+ <SelectItem key={model.id} value={model.id}>
182
+ {model.id}
183
+ </SelectItem>
184
+ ))}
185
+ </SelectContent>
186
+ </Select>
187
+ </div>
188
+ <div>
189
+ <Label htmlFor="max-tokens" className="block mb-2">
190
+ Max Tokens
191
+ </Label>
192
+ <Input
193
+ id="max-tokens"
194
+ type="number"
195
+ value={maxTokens}
196
+ onChange={(e) => setMaxTokens(Number.parseInt(e.target.value))}
197
+ min={1}
198
+ max={10000}
199
+ />
200
+ </div>
201
+ <div>
202
+ <Label htmlFor="max-links" className="block mb-2">
203
+ Max Links
204
+ </Label>
205
+ <Input
206
+ id="max-links"
207
+ type="number"
208
+ value={maxLinks}
209
+ onChange={(e) => setMaxLinks(Number.parseInt(e.target.value))}
210
+ min={1}
211
+ max={1000}
212
+ />
213
+ </div>
214
+ </div>
215
+ )}
216
+ </div>
217
+
218
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6 mt-6">
219
+ <div>
220
+ <Label htmlFor="start-page" className="block mb-2">
221
+ Start Page
222
+ </Label>
223
+ <Input
224
+ id="start-page"
225
+ value={startPage}
226
+ onChange={(e) => setStartPage(e.target.value)}
227
+ placeholder="e.g. Dogs"
228
+ />
229
+ </div>
230
+
231
+ <div className="flex items-end gap-2">
232
+ <div className="flex-1">
233
+ <Label
234
+ htmlFor="target-page"
235
+ className="flex items-center gap-1 mb-2"
236
+ >
237
+ Target Page <Sun className="h-4 w-4 text-yellow-500" />
238
+ </Label>
239
+ <Input
240
+ id="target-page"
241
+ value={targetPage}
242
+ onChange={(e) => setTargetPage(e.target.value)}
243
+ placeholder="e.g. Canada"
244
+ />
245
+ </div>
246
+ <Button onClick={handleStartGame} className="mb-0.5">
247
+ Start Game
248
+ </Button>
249
+ </div>
250
+ </div>
251
+ </Card>
252
+ ) : (
253
+ <GameComponent
254
+ player={player}
255
+ model={player === "model" ? selectedModel : undefined}
256
+ maxHops={maxHops}
257
+ startPage={startPage}
258
+ targetPage={targetPage}
259
+ onReset={handleResetGame}
260
+ maxTokens={maxTokens}
261
+ maxLinks={maxLinks}
262
+ />
263
+ )}
264
  </div>
265
  );
266
  }
src/components/reasoning-trace.tsx CHANGED
@@ -1,67 +1,109 @@
1
  "use client";
2
 
3
  import { useState } from "react";
4
- import { Input } from "@/components/ui/input";
5
  import { Button } from "@/components/ui/button";
6
- import { Send } from "lucide-react";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
  interface ReasoningTraceProps {
9
- runId: number | null;
10
  }
11
 
12
- export default function ReasoningTrace({ runId }: ReasoningTraceProps) {
13
- const [userInput, setUserInput] = useState("");
 
 
 
14
 
15
- if (!runId) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  return (
17
  <div className="w-full h-full flex items-center justify-center text-muted-foreground">
18
- Select a run to view the reasoning trace
19
  </div>
20
  );
21
  }
22
 
23
  return (
24
  <div className="flex flex-col h-full">
25
- <h3 className="text-lg font-medium mb-4">LLM Reasoning Trace</h3>
26
 
27
- <div className="flex-1 overflow-y-auto mb-4 bg-muted/30 rounded-md p-4">
28
- <div className="space-y-4">
29
- <div className="bg-primary/10 p-3 rounded-lg max-w-[80%]">
30
- <p className="text-sm">Hello! How can I help you today?</p>
31
- </div>
 
 
 
 
32
 
33
- <div className="bg-primary/10 p-3 rounded-lg max-w-[80%] ml-auto">
34
- <p className="text-sm">How can I deploy a website to Vercel?</p>
35
- </div>
 
 
 
 
36
 
37
- <div className="bg-primary/10 p-3 rounded-lg max-w-[80%]">
38
- <p className="text-sm">
39
- To deploy a website to Vercel, follow these steps:
40
- <br />
41
- <br />
42
- 1. Sign up for a Vercel account: Go to https://vercel.com/signup
43
- and sign up using your GitHub, GitLab, or Bitbucket account, or
44
- with your email address.
45
- <br />
46
- <br />
47
- 2. Install the Vercel command-line interface (CLI) by running the
48
- following command in your terminal or command prompt:
49
- <br />
50
- <code className="bg-muted p-1 rounded">
51
- npm install -g vercel
52
- </code>
53
- <br />
54
- <br />
55
- Make sure you have Node.js and npm installed on your system before
56
- running this command.
57
- <br />
58
- <br />
59
- 3. Authenticate with Vercel: Run the following command:
60
- <br />
61
- <code className="bg-muted p-1 rounded">vercel login</code>
62
- </p>
63
  </div>
64
- </div>
65
  </div>
66
  </div>
67
  );
 
1
  "use client";
2
 
3
  import { useState } from "react";
 
4
  import { Button } from "@/components/ui/button";
5
+
6
+ interface Message {
7
+ role: "user" | "assistant";
8
+ content: string;
9
+ }
10
+
11
+ interface StepMetadata {
12
+ message?: string;
13
+ conversation?: Message[];
14
+ }
15
+
16
+ export interface Step {
17
+ type: string;
18
+ article: string;
19
+ links?: unknown[];
20
+ metadata?: StepMetadata;
21
+ }
22
+
23
+ export interface Run {
24
+ steps: Step[];
25
+ start_article: string;
26
+ destination_article: string;
27
+ }
28
 
29
  interface ReasoningTraceProps {
30
+ run: Run | null | undefined;
31
  }
32
 
33
+ const MAX_MESSAGE_LENGTH = 200;
34
+
35
+ function ExpandableMessage({ message }: { message: Message }) {
36
+ const [isExpanded, setIsExpanded] = useState(false);
37
+ const isLongMessage = message.content.length > MAX_MESSAGE_LENGTH;
38
 
39
+ const toggleExpand = () => setIsExpanded(!isExpanded);
40
+
41
+ return (
42
+ <div
43
+ className={`p-3 rounded-lg max-w-[80%] ${
44
+ message.role === "user"
45
+ ? "bg-primary/10 ml-auto"
46
+ : "bg-secondary/10 mr-auto"
47
+ }`}
48
+ >
49
+ <p className="text-xs font-semibold mb-1 capitalize text-muted-foreground">
50
+ {message.role}
51
+ </p>
52
+ <p className="text-sm whitespace-pre-wrap">
53
+ {isLongMessage && !isExpanded
54
+ ? `${message.content.substring(0, MAX_MESSAGE_LENGTH)}...`
55
+ : message.content}
56
+ </p>
57
+ {isLongMessage && (
58
+ <Button
59
+ variant="link"
60
+ size="sm"
61
+ className="p-0 h-auto text-xs mt-1"
62
+ onClick={toggleExpand}
63
+ >
64
+ {isExpanded ? "Show Less" : "Show More"}
65
+ </Button>
66
+ )}
67
+ </div>
68
+ );
69
+ }
70
+
71
+ export default function ReasoningTrace({ run }: ReasoningTraceProps) {
72
+ if (!run?.steps) {
73
  return (
74
  <div className="w-full h-full flex items-center justify-center text-muted-foreground">
75
+ {run === undefined ? "Loading..." : "Select a run to view the reasoning trace"}
76
  </div>
77
  );
78
  }
79
 
80
  return (
81
  <div className="flex flex-col h-full">
82
+ <h3 className="text-lg font-semibold mb-4 px-1">LLM Reasoning Trace</h3>
83
 
84
+ <div className="flex-1 overflow-y-auto space-y-4 p-1">
85
+ {run.steps.map((step, index) => (
86
+ <div key={index} className="py-4 px-2">
87
+ <div>
88
+ <h4 className="text-base font-semibold">Step {index + 1} - {step.article}</h4>
89
+ {step.metadata?.message && (
90
+ <p className="text-sm text-muted-foreground pt-1 italic">"{step.metadata.message}"</p>
91
+ )}
92
+ </div>
93
 
94
+ {step.metadata?.conversation && step.metadata.conversation.length > 0 && (
95
+ <div className="space-y-2 mt-3 pt-3">
96
+ {step.metadata.conversation.map((message, msgIndex) => (
97
+ <ExpandableMessage key={msgIndex} message={message} />
98
+ ))}
99
+ </div>
100
+ )}
101
 
102
+ {index < run.steps.length - 1 && (
103
+ <hr className="my-6" />
104
+ )}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  </div>
106
+ ))}
107
  </div>
108
  </div>
109
  );
src/components/runs-list.tsx CHANGED
@@ -4,10 +4,9 @@ import { Card } from "@/components/ui/card";
4
  import { cn } from "@/lib/utils";
5
 
6
  interface Run {
7
- id: number;
8
- start: string;
9
- end: string;
10
- hops: number;
11
  }
12
 
13
  interface RunsListProps {
@@ -23,21 +22,21 @@ export default function RunsList({
23
  }: RunsListProps) {
24
  return (
25
  <div className="h-[600px] overflow-y-auto space-y-2 pr-1">
26
- {runs.map((run) => (
27
  <Card
28
- key={run.id}
29
  className={cn(
30
  "p-3 cursor-pointer transition-all border",
31
- selectedRunId === run.id
32
  ? "bg-primary/10 border-primary/50 shadow-sm"
33
  : "hover:bg-muted/80 border-transparent"
34
  )}
35
- onClick={() => onSelectRun(run.id)}
36
  >
37
  <div className="flex items-center justify-between">
38
  <div>
39
  <p className="font-medium flex items-center">
40
- <span>{run.start}</span>
41
  <svg
42
  xmlns="http://www.w3.org/2000/svg"
43
  width="16"
@@ -53,11 +52,11 @@ export default function RunsList({
53
  <path d="M5 12h14" />
54
  <path d="m12 5 7 7-7 7" />
55
  </svg>
56
- <span>{run.end}</span>
57
  </p>
58
- <p className="text-sm text-muted-foreground">{run.hops} hops</p>
59
  </div>
60
- {selectedRunId === run.id && (
61
  <div
62
  className="h-2 w-2 rounded-full bg-primary"
63
  aria-hidden="true"
 
4
  import { cn } from "@/lib/utils";
5
 
6
  interface Run {
7
+ start_article: string;
8
+ destination_article: string;
9
+ steps: string[];
 
10
  }
11
 
12
  interface RunsListProps {
 
22
  }: RunsListProps) {
23
  return (
24
  <div className="h-[600px] overflow-y-auto space-y-2 pr-1">
25
+ {runs.map((run, index) => (
26
  <Card
27
+ key={index}
28
  className={cn(
29
  "p-3 cursor-pointer transition-all border",
30
+ selectedRunId === index
31
  ? "bg-primary/10 border-primary/50 shadow-sm"
32
  : "hover:bg-muted/80 border-transparent"
33
  )}
34
+ onClick={() => onSelectRun(index)}
35
  >
36
  <div className="flex items-center justify-between">
37
  <div>
38
  <p className="font-medium flex items-center">
39
+ <span>{run.start_article}</span>
40
  <svg
41
  xmlns="http://www.w3.org/2000/svg"
42
  width="16"
 
52
  <path d="M5 12h14" />
53
  <path d="m12 5 7 7-7 7" />
54
  </svg>
55
+ <span>{run.destination_article}</span>
56
  </p>
57
+ <p className="text-sm text-muted-foreground">{run.steps.length} hops</p>
58
  </div>
59
+ {selectedRunId === index && (
60
  <div
61
  className="h-2 w-2 rounded-full bg-primary"
62
  aria-hidden="true"
src/components/sign-in-with-hf-button.tsx ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Use the code query parameter to get an access token and id token from https://huggingface.co/oauth/token (POST request with client_id, code, grant_type=authorization_code and redirect_uri as form data, and with Authorization: Basic {base64(client_id:client_secret)} as a header).
2
+ import { useState } from "react";
3
+ import { useEffect } from "react";
4
+ import { jwtDecode } from "jwt-decode";
5
+
6
+ const CLIENT_ID = "a67ef241-fb7e-4300-a6bd-8430a7565c9a";
7
+ const REDIRECT_URI = "http://localhost:5173/auth/callback";
8
+ const SCOPE = "openid%20profile%20email%20inference-api";
9
+ const STATE = "1234567890";
10
+ const SSO_URL = `https://huggingface.co/oauth/authorize?client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&response_type=code&scope=${SCOPE}&prompt=consent&state=${STATE}`;
11
+ const API_BASE = "https://huggingface.co/oauth/token";
12
+ const CLIENT_SECRET = import.meta.env.VITE_HUGGINGFACE_CLIENT_SECRET; // THIS IS UNSAFE, must fix before real deploy
13
+
14
+ export const SignInWithHuggingFaceButton = () => {
15
+ const [isSignedIn, setIsSignedIn] = useState(false);
16
+ const [isLoading, setIsLoading] = useState(false);
17
+ const [name, setName] = useState<string | null>(null);
18
+
19
+ useEffect(() => {
20
+ const idToken = window.localStorage.getItem("huggingface_id_token");
21
+ const accessToken = window.localStorage.getItem("huggingface_access_token");
22
+
23
+ if (idToken && accessToken) {
24
+ const idTokenObject = JSON.parse(idToken);
25
+ if (idTokenObject.exp > Date.now() / 1000) {
26
+ setIsSignedIn(true);
27
+ setName(idTokenObject.name);
28
+
29
+ return;
30
+ }
31
+ }
32
+
33
+
34
+ async function fetchToken() {
35
+ const code = new URLSearchParams(window.location.search).get("code");
36
+ if (code) {
37
+ // remove the code from the url
38
+ window.history.replaceState({}, "", window.location.pathname);
39
+ setIsLoading(true);
40
+ const response = await fetch(`${API_BASE}`, {
41
+ method: "POST",
42
+ headers: {
43
+ "Content-Type": "application/x-www-form-urlencoded",
44
+ Authorization: `Basic ${btoa(`${CLIENT_ID}:${CLIENT_SECRET}`)}`,
45
+ },
46
+ body: new URLSearchParams({
47
+ client_id: CLIENT_ID,
48
+ code,
49
+ grant_type: "authorization_code",
50
+ redirect_uri: REDIRECT_URI
51
+ }).toString(),
52
+ });
53
+ const data = await response.json();
54
+ window.localStorage.setItem("huggingface_access_token", data.access_token);
55
+
56
+ // parse the id_token
57
+ const idToken = jwtDecode(data.id_token);
58
+ console.log(idToken);
59
+ window.localStorage.setItem("huggingface_id_token", JSON.stringify(idToken));
60
+ setName(idToken.name);
61
+ setIsSignedIn(true);
62
+ setIsLoading(false);
63
+ }
64
+ }
65
+
66
+ fetchToken();
67
+ }, []);
68
+
69
+ if (isLoading) {
70
+ return <div>Loading...</div>;
71
+ }
72
+
73
+ if (isSignedIn) {
74
+ return <div>Welcome, {name}</div>;
75
+ }
76
+
77
+ return (
78
+ <a href={SSO_URL} rel="nofollow">
79
+ <img
80
+ src="https://huggingface.co/datasets/huggingface/badges/resolve/main/sign-in-with-huggingface-xl.svg"
81
+ alt="Sign in with Hugging Face"
82
+ />
83
+ </a>
84
+ );
85
+ };
src/components/ui/label.tsx ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+ import * as LabelPrimitive from "@radix-ui/react-label"
3
+
4
+ import { cn } from "@/lib/utils"
5
+
6
+ function Label({
7
+ className,
8
+ ...props
9
+ }: React.ComponentProps<typeof LabelPrimitive.Root>) {
10
+ return (
11
+ <LabelPrimitive.Root
12
+ data-slot="label"
13
+ className={cn(
14
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
15
+ className
16
+ )}
17
+ {...props}
18
+ />
19
+ )
20
+ }
21
+
22
+ export { Label }
src/components/viewer-tab.tsx CHANGED
@@ -1,5 +1,10 @@
1
  "use client";
2
 
 
 
 
 
 
3
  import { useState } from "react";
4
  import {
5
  Select,
@@ -8,11 +13,19 @@ import {
8
  SelectTrigger,
9
  SelectValue,
10
  } from "@/components/ui/select";
 
11
  import { Card } from "@/components/ui/card";
12
  import ForceDirectedGraph from "@/components/force-directed-graph";
13
  import ReasoningTrace from "@/components/reasoning-trace";
14
  import RunsList from "@/components/runs-list";
15
 
 
 
 
 
 
 
 
16
  // Sample data - would be fetched from HuggingFace dataset in a real implementation
17
  const sampleRuns = [
18
  { id: 1, start: "Pokemon", end: "Canada", hops: 16 },
@@ -23,13 +36,45 @@ const sampleRuns = [
23
  ];
24
 
25
  const datasets = [
26
- { id: "dataset1", name: "Wikispeedia Paths" },
27
- { id: "dataset2", name: "LLM Generated Paths" },
28
  ];
29
 
30
  export default function ViewerTab() {
31
  const [selectedDataset, setSelectedDataset] = useState<string>("");
32
  const [selectedRun, setSelectedRun] = useState<number | null>(null);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
  const handleDatasetChange = (value: string) => {
35
  setSelectedDataset(value);
@@ -56,6 +101,8 @@ export default function ViewerTab() {
56
  ))}
57
  </SelectContent>
58
  </Select>
 
 
59
  </div>
60
 
61
  <div className="bg-card rounded-lg p-3 border">
@@ -63,7 +110,7 @@ export default function ViewerTab() {
63
  Available Runs
64
  </h3>
65
  <RunsList
66
- runs={sampleRuns}
67
  onSelectRun={handleRunSelect}
68
  selectedRunId={selectedRun}
69
  />
@@ -72,13 +119,13 @@ export default function ViewerTab() {
72
 
73
  <div className="md:col-span-5">
74
  <Card className="w-full h-[600px] flex items-center justify-center">
75
- <ForceDirectedGraph runId={selectedRun} />
76
  </Card>
77
  </div>
78
 
79
  <div className="md:col-span-4">
80
  <Card className="w-full h-[600px] p-4">
81
- <ReasoningTrace runId={selectedRun} />
82
  </Card>
83
  </div>
84
  </div>
 
1
  "use client";
2
 
3
+ import * as hub from "@huggingface/hub";
4
+ import type { RepoDesignation } from "@huggingface/hub";
5
+
6
+ import mockResults from "../../qwen3-final-results.json";
7
+
8
  import { useState } from "react";
9
  import {
10
  Select,
 
13
  SelectTrigger,
14
  SelectValue,
15
  } from "@/components/ui/select";
16
+ import { Button } from "@/components/ui/button";
17
  import { Card } from "@/components/ui/card";
18
  import ForceDirectedGraph from "@/components/force-directed-graph";
19
  import ReasoningTrace from "@/components/reasoning-trace";
20
  import RunsList from "@/components/runs-list";
21
 
22
+ type Run = {
23
+ id: number;
24
+ start: string;
25
+ end: string;
26
+ hops: number;
27
+ };
28
+
29
  // Sample data - would be fetched from HuggingFace dataset in a real implementation
30
  const sampleRuns = [
31
  { id: 1, start: "Pokemon", end: "Canada", hops: 16 },
 
36
  ];
37
 
38
  const datasets = [
39
+ { id: "dataset1", name: "Eureka-Lab/PHYBench" },
40
+ { id: "dataset2", name: "Eureka-Lab/PHYBench-LLM" },
41
  ];
42
 
43
  export default function ViewerTab() {
44
  const [selectedDataset, setSelectedDataset] = useState<string>("");
45
  const [selectedRun, setSelectedRun] = useState<number | null>(null);
46
+ const [runs, setRuns] = useState<Run[]>([]);
47
+ const [loading, setLoading] = useState<boolean>(false);
48
+
49
+ const fetchDataset = async () => {
50
+ console.log("Fetching dataset...");
51
+ console.log(Object.keys(mockResults));
52
+ setRuns(mockResults.runs.slice(0, 10));
53
+
54
+ return;
55
+ setLoading(true);
56
+
57
+ // https://huggingface.co/datasets/HuggingFaceTB/wikispeedia-traces/resolve/main/qwen3-final-results.json
58
+ // const response = await fetch("https://huggingface.co/datasets/HuggingFaceTB/wikispeedia-traces/resolve/main/qwen3-final-results.json");
59
+ // const json = await response.json();
60
+ // setRuns(json.runs);
61
+ // setLoading(false);
62
+
63
+ // const repo: RepoDesignation = {
64
+ // type: "dataset",
65
+ // name: "HuggingFaceTB/wikispeedia-traces",
66
+ // };
67
+ // const file = await hub.downloadFile({ repo, path: "qwen3-final-results.json" });
68
+ // if (!file) {
69
+ // console.error("Failed to download file");
70
+ // return;
71
+ // }
72
+ // const text = await file.text();
73
+ // console.log("GOT FILE!", text);
74
+ // const json = JSON.parse(text);
75
+ // setRuns(json.runs);
76
+ // setLoading(false);
77
+ };
78
 
79
  const handleDatasetChange = (value: string) => {
80
  setSelectedDataset(value);
 
101
  ))}
102
  </SelectContent>
103
  </Select>
104
+ <Button onClick={fetchDataset}>Fetch Dataset</Button>
105
+ {loading && <p>Loading...</p>}
106
  </div>
107
 
108
  <div className="bg-card rounded-lg p-3 border">
 
110
  Available Runs
111
  </h3>
112
  <RunsList
113
+ runs={runs}
114
  onSelectRun={handleRunSelect}
115
  selectedRunId={selectedRun}
116
  />
 
119
 
120
  <div className="md:col-span-5">
121
  <Card className="w-full h-[600px] flex items-center justify-center">
122
+ <ForceDirectedGraph runs={runs} runId={selectedRun} />
123
  </Card>
124
  </div>
125
 
126
  <div className="md:col-span-4">
127
  <Card className="w-full h-[600px] p-4">
128
+ <ReasoningTrace run={runs[selectedRun]} />
129
  </Card>
130
  </div>
131
  </div>
src/lib/inference.tsx ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { InferenceClient } from "@huggingface/inference";
2
+
3
+ export default async function inference({
4
+ prompt,
5
+ model = "Qwen/Qwen3-235B-A22B",
6
+ apiKey,
7
+ maxTokens = 512
8
+ }: {
9
+ prompt: string,
10
+ model?: string,
11
+ apiKey?: string,
12
+ maxTokens?: number
13
+ }) {
14
+ if (!apiKey) {
15
+ const token = window.localStorage.getItem("huggingface_access_token");
16
+ if (!token) {
17
+ throw new Error("You must be signed in to use the inference API!");
18
+ }
19
+ apiKey = token;
20
+ }
21
+
22
+ console.log("Inference", prompt, model, apiKey);
23
+ const client = new InferenceClient(apiKey);
24
+
25
+ const chatCompletion = await client.chatCompletion({
26
+ provider: "fireworks-ai",
27
+ model: model,
28
+ messages: [
29
+ {
30
+ role: "user",
31
+ content: prompt,
32
+ },
33
+ ],
34
+ max_tokens: maxTokens,
35
+ });
36
+
37
+ console.log("Inference response", chatCompletion.choices[0].message);
38
+ return chatCompletion.choices[0].message;
39
+ }
tsconfig.app.json CHANGED
@@ -23,7 +23,7 @@
23
  "jsx": "react-jsx",
24
 
25
  /* Linting */
26
- "strict": true,
27
  "noUnusedLocals": true,
28
  "noUnusedParameters": true,
29
  "noFallthroughCasesInSwitch": true,
 
23
  "jsx": "react-jsx",
24
 
25
  /* Linting */
26
+ "strict": false,
27
  "noUnusedLocals": true,
28
  "noUnusedParameters": true,
29
  "noFallthroughCasesInSwitch": true,
yarn.lock CHANGED
@@ -2,6 +2,17 @@
2
  # yarn lockfile v1
3
 
4
 
 
 
 
 
 
 
 
 
 
 
 
5
  "@ampproject/remapping@^2.2.0":
6
  version "2.3.0"
7
  resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
@@ -133,6 +144,11 @@
133
  dependencies:
134
  "@babel/helper-plugin-utils" "^7.27.1"
135
 
 
 
 
 
 
136
  "@babel/template@^7.27.1":
137
  version "7.27.1"
138
  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.1.tgz#b9e4f55c17a92312774dfbdde1b3c01c547bbae2"
@@ -403,6 +419,36 @@
403
  resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429"
404
  integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==
405
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
406
  "@humanfs/core@^0.19.1":
407
  version "0.19.1"
408
  resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77"
@@ -567,6 +613,13 @@
567
  dependencies:
568
  "@radix-ui/react-use-layout-effect" "1.1.1"
569
 
 
 
 
 
 
 
 
570
  "@radix-ui/[email protected]":
571
  version "1.2.4"
572
  resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.4.tgz#8fd6d954fca9e5d1341c7d9153cc88e05d5ed84e"
@@ -936,6 +989,11 @@
936
  "@tailwindcss/oxide" "4.1.5"
937
  tailwindcss "4.1.5"
938
 
 
 
 
 
 
939
  "@tybys/wasm-util@^0.9.0":
940
  version "0.9.0"
941
  resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355"
@@ -1097,6 +1155,11 @@
1097
  "@types/babel__core" "^7.20.5"
1098
  react-refresh "^0.17.0"
1099
 
 
 
 
 
 
1100
  acorn-jsx@^5.3.2:
1101
  version "5.3.2"
1102
  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
@@ -1141,6 +1204,11 @@ balanced-match@^1.0.0:
1141
  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
1142
  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
1143
 
 
 
 
 
 
1144
  brace-expansion@^1.1.7:
1145
  version "1.1.11"
1146
  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -1183,6 +1251,13 @@ caniuse-lite@^1.0.30001688:
1183
  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz#39220dfbc58c85d9d4519e7090b656aa11ca4b85"
1184
  integrity sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==
1185
 
 
 
 
 
 
 
 
1186
  chalk@^4.0.0:
1187
  version "4.1.2"
1188
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
@@ -1215,6 +1290,11 @@ color-name@~1.1.4:
1215
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
1216
  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
1217
 
 
 
 
 
 
1218
1219
  version "0.0.1"
1220
  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -1239,6 +1319,308 @@ csstype@^3.0.2:
1239
  resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
1240
  integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
1241
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1242
  debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
1243
  version "4.4.0"
1244
  resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
@@ -1251,6 +1633,13 @@ deep-is@^0.1.3:
1251
  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
1252
  integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
1253
 
 
 
 
 
 
 
 
1254
  detect-libc@^2.0.3:
1255
  version "2.0.4"
1256
  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.4.tgz#f04715b8ba815e53b4d8109655b6508a6865a7e8"
@@ -1261,6 +1650,11 @@ detect-node-es@^1.1.0:
1261
  resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493"
1262
  integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==
1263
 
 
 
 
 
 
1264
  electron-to-chromium@^1.5.73:
1265
  version "1.5.145"
1266
  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.145.tgz#abd50700ac2c809e40a4694584f66711ee937fb6"
@@ -1490,6 +1884,36 @@ flatted@^3.2.9:
1490
  resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358"
1491
  integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
1492
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1493
  fsevents@~2.3.2, fsevents@~2.3.3:
1494
  version "2.3.3"
1495
  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
@@ -1519,6 +1943,14 @@ glob-parent@^6.0.2:
1519
  dependencies:
1520
  is-glob "^4.0.3"
1521
 
 
 
 
 
 
 
 
 
1522
  globals@^11.1.0:
1523
  version "11.12.0"
1524
  resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
@@ -1549,6 +1981,13 @@ has-flag@^4.0.0:
1549
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
1550
  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
1551
 
 
 
 
 
 
 
 
1552
  ignore@^5.2.0, ignore@^5.3.1:
1553
  version "5.3.2"
1554
  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
@@ -1567,6 +2006,16 @@ imurmurhash@^0.1.4:
1567
  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
1568
  integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
1569
 
 
 
 
 
 
 
 
 
 
 
1570
  is-extglob@^2.1.1:
1571
  version "2.1.1"
1572
  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -1589,12 +2038,17 @@ isexe@^2.0.0:
1589
  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
1590
  integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
1591
 
 
 
 
 
 
1592
  jiti@^2.4.2:
1593
  version "2.4.2"
1594
  resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560"
1595
  integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==
1596
 
1597
- js-tokens@^4.0.0:
1598
  version "4.0.0"
1599
  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
1600
  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
@@ -1631,6 +2085,18 @@ json5@^2.2.3:
1631
  resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
1632
  integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
1633
 
 
 
 
 
 
 
 
 
 
 
 
 
1634
  keyv@^4.5.4:
1635
  version "4.5.4"
1636
  resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
@@ -1721,11 +2187,28 @@ locate-path@^6.0.0:
1721
  dependencies:
1722
  p-locate "^5.0.0"
1723
 
 
 
 
 
 
1724
  lodash.merge@^4.6.2:
1725
  version "4.6.2"
1726
  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
1727
  integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
1728
 
 
 
 
 
 
 
 
 
 
 
 
 
1729
  lru-cache@^5.1.1:
1730
  version "5.1.1"
1731
  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
@@ -1751,6 +2234,13 @@ micromatch@^4.0.8:
1751
  braces "^3.0.3"
1752
  picomatch "^2.3.1"
1753
 
 
 
 
 
 
 
 
1754
  minimatch@^3.1.2:
1755
  version "3.1.2"
1756
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
@@ -1780,11 +2270,47 @@ natural-compare@^1.4.0:
1780
  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
1781
  integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
1782
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1783
  node-releases@^2.0.19:
1784
  version "2.0.19"
1785
  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314"
1786
  integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==
1787
 
 
 
 
 
 
1788
  optionator@^0.9.3:
1789
  version "0.9.4"
1790
  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
@@ -1843,6 +2369,13 @@ picomatch@^4.0.2:
1843
  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab"
1844
  integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
1845
 
 
 
 
 
 
 
 
1846
  postcss@^8.5.3:
1847
  version "8.5.3"
1848
  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb"
@@ -1852,11 +2385,30 @@ postcss@^8.5.3:
1852
  picocolors "^1.1.1"
1853
  source-map-js "^1.2.1"
1854
 
 
 
 
 
 
1855
  prelude-ls@^1.2.1:
1856
  version "1.2.1"
1857
  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
1858
  integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
1859
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1860
  punycode@^2.1.0:
1861
  version "2.3.1"
1862
  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
@@ -1874,6 +2426,36 @@ react-dom@^19.0.0:
1874
  dependencies:
1875
  scheduler "^0.26.0"
1876
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1877
  react-refresh@^0.17.0:
1878
  version "0.17.0"
1879
  resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53"
@@ -1906,6 +2488,16 @@ react-style-singleton@^2.2.2, react-style-singleton@^2.2.3:
1906
  get-nonce "^1.0.0"
1907
  tslib "^2.0.0"
1908
 
 
 
 
 
 
 
 
 
 
 
1909
  react@^19.0.0:
1910
  version "19.1.0"
1911
  resolved "https://registry.yarnpkg.com/react/-/react-19.1.0.tgz#926864b6c48da7627f004795d6cce50e90793b75"
@@ -1921,6 +2513,11 @@ reusify@^1.0.4:
1921
  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f"
1922
  integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
1923
 
 
 
 
 
 
1924
  rollup@^4.34.9:
1925
  version "4.40.1"
1926
  resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.1.tgz#03d6c53ebb6a9c2c060ae686a61e72a2472b366f"
@@ -1957,6 +2554,16 @@ run-parallel@^1.1.9:
1957
  dependencies:
1958
  queue-microtask "^1.2.2"
1959
 
 
 
 
 
 
 
 
 
 
 
1960
  scheduler@^0.26.0:
1961
  version "0.26.0"
1962
  resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337"
@@ -2016,6 +2623,43 @@ tapable@^2.2.0:
2016
  resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
2017
  integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
2018
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2019
  tinyglobby@^0.2.13:
2020
  version "0.2.13"
2021
  resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e"
 
2
  # yarn lockfile v1
3
 
4
 
5
+ "3d-force-graph@^1.76":
6
+ version "1.77.0"
7
+ resolved "https://registry.yarnpkg.com/3d-force-graph/-/3d-force-graph-1.77.0.tgz#10a47db13179371409ee42d82dba59ec7315058b"
8
+ integrity sha512-w2MlrCeMJxXwhz5gtRZ7mLU4xW5DD2U6VSEfFv8pvnvSNPYPuAIKjbJoZekfv7yFmMaWnNy/2RfRcgC5oGr2KQ==
9
+ dependencies:
10
+ accessor-fn "1"
11
+ kapsule "^1.16"
12
+ three ">=0.118 <1"
13
+ three-forcegraph "1"
14
+ three-render-objects "^1.35"
15
+
16
  "@ampproject/remapping@^2.2.0":
17
  version "2.3.0"
18
  resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
 
144
  dependencies:
145
  "@babel/helper-plugin-utils" "^7.27.1"
146
 
147
+ "@babel/runtime@^7.17.8":
148
+ version "7.27.1"
149
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.1.tgz#9fce313d12c9a77507f264de74626e87fd0dc541"
150
+ integrity sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==
151
+
152
  "@babel/template@^7.27.1":
153
  version "7.27.1"
154
  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.1.tgz#b9e4f55c17a92312774dfbdde1b3c01c547bbae2"
 
419
  resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429"
420
  integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==
421
 
422
+ "@huggingface/hub@^1.1.2":
423
+ version "1.1.2"
424
+ resolved "https://registry.yarnpkg.com/@huggingface/hub/-/hub-1.1.2.tgz#390d3a6b7efe98acd146c6ccc6d178b7605cfc27"
425
+ integrity sha512-Jf4GhvVj9ABDw4Itb3BV1T7f22iewuZva476qTicQ4kOTbosuUuFDhsVH7ZH6rVNgg20Ll9kaNBF5CXjySIT+w==
426
+ dependencies:
427
+ "@huggingface/tasks" "^0.18.2"
428
+
429
+ "@huggingface/inference@^3.10.0":
430
+ version "3.10.0"
431
+ resolved "https://registry.yarnpkg.com/@huggingface/inference/-/inference-3.10.0.tgz#2fe1eb8a79198fdde56d00b6c2e540b0c7b060db"
432
+ integrity sha512-nouLdl5Tu4gdTzIKv9zAr7HPziXV8rXbVONjYKQ7u9F78KgWVsYmhEM+ZhTbhg4fV4N1gdgywOAHrd9uOV5tRQ==
433
+ dependencies:
434
+ "@huggingface/jinja" "^0.4.0"
435
+ "@huggingface/tasks" "^0.19.0"
436
+
437
+ "@huggingface/jinja@^0.4.0":
438
+ version "0.4.1"
439
+ resolved "https://registry.yarnpkg.com/@huggingface/jinja/-/jinja-0.4.1.tgz#a71deab443c4badb6498d28e784ea1cd5eb369e2"
440
+ integrity sha512-3WXbMFaPkk03LRCM0z0sylmn8ddDm4ubjU7X+Hg4M2GOuMklwoGAFXp9V2keq7vltoB/c7McE5aHUVVddAewsw==
441
+
442
+ "@huggingface/tasks@^0.18.2":
443
+ version "0.18.12"
444
+ resolved "https://registry.yarnpkg.com/@huggingface/tasks/-/tasks-0.18.12.tgz#44fc9de0cb77e36b7a724b9f1a1f1debf16d13e4"
445
+ integrity sha512-hUEYhXJzJCUhLSBNglW+Sji5fuzMnpBimp3kbdcGor+MaN9xb+qrcLnMC7X8aOcZaZdCErwYYIqz2oSP2EM4Bg==
446
+
447
+ "@huggingface/tasks@^0.19.0":
448
+ version "0.19.1"
449
+ resolved "https://registry.yarnpkg.com/@huggingface/tasks/-/tasks-0.19.1.tgz#03f133140e0de97bb28a1094e8cfe117dd821721"
450
+ integrity sha512-cocq5+jkmh8+qIvWDCyC9nkf7qCpmBRrJL/WPWhfIMXWEv2dMYMY62ylFv+dq/vRwpe+/5h0WlnZGOSIa+3OJg==
451
+
452
  "@humanfs/core@^0.19.1":
453
  version "0.19.1"
454
  resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77"
 
613
  dependencies:
614
  "@radix-ui/react-use-layout-effect" "1.1.1"
615
 
616
+ "@radix-ui/react-label@^2.1.4":
617
+ version "2.1.4"
618
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-label/-/react-label-2.1.4.tgz#e89607486b82381f2d28ce1ce022e7fb5f5a158c"
619
+ integrity sha512-wy3dqizZnZVV4ja0FNnUhIWNwWdoldXrneEyUcVtLYDAt8ovGS4ridtMAOGgXBBIfggL4BOveVWsjXDORdGEQg==
620
+ dependencies:
621
+ "@radix-ui/react-primitive" "2.1.0"
622
+
623
  "@radix-ui/[email protected]":
624
  version "1.2.4"
625
  resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.4.tgz#8fd6d954fca9e5d1341c7d9153cc88e05d5ed84e"
 
989
  "@tailwindcss/oxide" "4.1.5"
990
  tailwindcss "4.1.5"
991
 
992
+ "@tweenjs/tween.js@18 - 25":
993
+ version "25.0.0"
994
+ resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-25.0.0.tgz#7266baebcc3affe62a3a54318a3ea82d904cd0b9"
995
+ integrity sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==
996
+
997
  "@tybys/wasm-util@^0.9.0":
998
  version "0.9.0"
999
  resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355"
 
1155
  "@types/babel__core" "^7.20.5"
1156
  react-refresh "^0.17.0"
1157
 
1158
+ accessor-fn@1:
1159
+ version "1.5.3"
1160
+ resolved "https://registry.yarnpkg.com/accessor-fn/-/accessor-fn-1.5.3.tgz#5e2549d291d4ac022f532da9a554358dc525b0f7"
1161
+ integrity sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==
1162
+
1163
  acorn-jsx@^5.3.2:
1164
  version "5.3.2"
1165
  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
 
1204
  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
1205
  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
1206
 
1207
+ "bezier-js@3 - 6":
1208
+ version "6.1.4"
1209
+ resolved "https://registry.yarnpkg.com/bezier-js/-/bezier-js-6.1.4.tgz#c7828f6c8900562b69d5040afb881bcbdad82001"
1210
+ integrity sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==
1211
+
1212
  brace-expansion@^1.1.7:
1213
  version "1.1.11"
1214
  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
 
1251
  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz#39220dfbc58c85d9d4519e7090b656aa11ca4b85"
1252
  integrity sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==
1253
 
1254
+ canvas-color-tracker@^1.3:
1255
+ version "1.3.2"
1256
+ resolved "https://registry.yarnpkg.com/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz#b924cf94b33441b82692938fca5b936be971a46d"
1257
+ integrity sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg==
1258
+ dependencies:
1259
+ tinycolor2 "^1.6.0"
1260
+
1261
  chalk@^4.0.0:
1262
  version "4.1.2"
1263
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
 
1290
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
1291
  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
1292
 
1293
+ commander@7:
1294
+ version "7.2.0"
1295
+ resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
1296
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
1297
+
1298
1299
  version "0.0.1"
1300
  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
 
1319
  resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
1320
  integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
1321
 
1322
+ "d3-array@1 - 3", "d3-array@2 - 3", "[email protected] - 3", "[email protected] - 3", d3-array@3, d3-array@^3.2.0:
1323
+ version "3.2.4"
1324
+ resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5"
1325
+ integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
1326
+ dependencies:
1327
+ internmap "1 - 2"
1328
+
1329
+ d3-axis@3:
1330
+ version "3.0.0"
1331
+ resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322"
1332
+ integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==
1333
+
1334
+ d3-binarytree@1:
1335
+ version "1.0.2"
1336
+ resolved "https://registry.yarnpkg.com/d3-binarytree/-/d3-binarytree-1.0.2.tgz#ed43ebc13c70fbabfdd62df17480bc5a425753cc"
1337
+ integrity sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==
1338
+
1339
+ d3-brush@3:
1340
+ version "3.0.0"
1341
+ resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c"
1342
+ integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==
1343
+ dependencies:
1344
+ d3-dispatch "1 - 3"
1345
+ d3-drag "2 - 3"
1346
+ d3-interpolate "1 - 3"
1347
+ d3-selection "3"
1348
+ d3-transition "3"
1349
+
1350
+ d3-chord@3:
1351
+ version "3.0.1"
1352
+ resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966"
1353
+ integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==
1354
+ dependencies:
1355
+ d3-path "1 - 3"
1356
+
1357
+ d3-collection@1:
1358
+ version "1.0.7"
1359
+ resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e"
1360
+ integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==
1361
+
1362
+ "d3-color@1 - 3", d3-color@3:
1363
+ version "3.1.0"
1364
+ resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2"
1365
+ integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
1366
+
1367
+ d3-contour@4:
1368
+ version "4.0.2"
1369
+ resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc"
1370
+ integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==
1371
+ dependencies:
1372
+ d3-array "^3.2.0"
1373
+
1374
+ d3-delaunay@6:
1375
+ version "6.0.4"
1376
+ resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b"
1377
+ integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==
1378
+ dependencies:
1379
+ delaunator "5"
1380
+
1381
+ d3-dispatch@1:
1382
+ version "1.0.6"
1383
+ resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58"
1384
+ integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==
1385
+
1386
+ "d3-dispatch@1 - 3", d3-dispatch@3:
1387
+ version "3.0.1"
1388
+ resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e"
1389
+ integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==
1390
+
1391
+ "d3-drag@2 - 3", d3-drag@3:
1392
+ version "3.0.0"
1393
+ resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba"
1394
+ integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==
1395
+ dependencies:
1396
+ d3-dispatch "1 - 3"
1397
+ d3-selection "3"
1398
+
1399
+ "d3-dsv@1 - 3", d3-dsv@3:
1400
+ version "3.0.1"
1401
+ resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73"
1402
+ integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==
1403
+ dependencies:
1404
+ commander "7"
1405
+ iconv-lite "0.6"
1406
+ rw "1"
1407
+
1408
+ "d3-ease@1 - 3", d3-ease@3:
1409
+ version "3.0.1"
1410
+ resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4"
1411
+ integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==
1412
+
1413
+ d3-fetch@3:
1414
+ version "3.0.1"
1415
+ resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22"
1416
+ integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==
1417
+ dependencies:
1418
+ d3-dsv "1 - 3"
1419
+
1420
+ "d3-force-3d@2 - 3":
1421
+ version "3.0.6"
1422
+ resolved "https://registry.yarnpkg.com/d3-force-3d/-/d3-force-3d-3.0.6.tgz#7ea4c26d7937b82993bd9444f570ed52f661d4aa"
1423
+ integrity sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==
1424
+ dependencies:
1425
+ d3-binarytree "1"
1426
+ d3-dispatch "1 - 3"
1427
+ d3-octree "1"
1428
+ d3-quadtree "1 - 3"
1429
+ d3-timer "1 - 3"
1430
+
1431
+ d3-force@3:
1432
+ version "3.0.0"
1433
+ resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4"
1434
+ integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==
1435
+ dependencies:
1436
+ d3-dispatch "1 - 3"
1437
+ d3-quadtree "1 - 3"
1438
+ d3-timer "1 - 3"
1439
+
1440
+ d3-force@^1.0.2:
1441
+ version "1.2.1"
1442
+ resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b"
1443
+ integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==
1444
+ dependencies:
1445
+ d3-collection "1"
1446
+ d3-dispatch "1"
1447
+ d3-quadtree "1"
1448
+ d3-timer "1"
1449
+
1450
+ "d3-format@1 - 3", d3-format@3:
1451
+ version "3.1.0"
1452
+ resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641"
1453
+ integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
1454
+
1455
+ d3-geo@3:
1456
+ version "3.1.1"
1457
+ resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d"
1458
+ integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==
1459
+ dependencies:
1460
+ d3-array "2.5.0 - 3"
1461
+
1462
+ d3-hierarchy@3:
1463
+ version "3.1.2"
1464
+ resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6"
1465
+ integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==
1466
+
1467
+ "d3-interpolate@1 - 3", "[email protected] - 3", d3-interpolate@3:
1468
+ version "3.0.1"
1469
+ resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
1470
+ integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
1471
+ dependencies:
1472
+ d3-color "1 - 3"
1473
+
1474
+ d3-octree@1:
1475
+ version "1.1.0"
1476
+ resolved "https://registry.yarnpkg.com/d3-octree/-/d3-octree-1.1.0.tgz#f07e353b76df872644e7130ab1a74c5ef2f4287e"
1477
+ integrity sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==
1478
+
1479
+ "d3-path@1 - 3", d3-path@3, d3-path@^3.1.0:
1480
+ version "3.1.0"
1481
+ resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526"
1482
+ integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
1483
+
1484
+ d3-polygon@3:
1485
+ version "3.0.1"
1486
+ resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398"
1487
+ integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==
1488
+
1489
+ d3-quadtree@1:
1490
+ version "1.0.7"
1491
+ resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135"
1492
+ integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==
1493
+
1494
+ "d3-quadtree@1 - 3", d3-quadtree@3:
1495
+ version "3.0.1"
1496
+ resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f"
1497
+ integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==
1498
+
1499
+ d3-random@3:
1500
+ version "3.0.1"
1501
+ resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4"
1502
+ integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==
1503
+
1504
+ "d3-scale-chromatic@1 - 3", d3-scale-chromatic@3:
1505
+ version "3.1.0"
1506
+ resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314"
1507
+ integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==
1508
+ dependencies:
1509
+ d3-color "1 - 3"
1510
+ d3-interpolate "1 - 3"
1511
+
1512
+ "d3-scale@1 - 4", d3-scale@4:
1513
+ version "4.0.2"
1514
+ resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396"
1515
+ integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==
1516
+ dependencies:
1517
+ d3-array "2.10.0 - 3"
1518
+ d3-format "1 - 3"
1519
+ d3-interpolate "1.2.0 - 3"
1520
+ d3-time "2.1.1 - 3"
1521
+ d3-time-format "2 - 4"
1522
+
1523
+ "d3-selection@2 - 3", d3-selection@3:
1524
+ version "3.0.0"
1525
+ resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31"
1526
+ integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
1527
+
1528
+ d3-shape@3:
1529
+ version "3.2.0"
1530
+ resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5"
1531
+ integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==
1532
+ dependencies:
1533
+ d3-path "^3.1.0"
1534
+
1535
+ "d3-time-format@2 - 4", d3-time-format@4:
1536
+ version "4.1.0"
1537
+ resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a"
1538
+ integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==
1539
+ dependencies:
1540
+ d3-time "1 - 3"
1541
+
1542
+ "d3-time@1 - 3", "[email protected] - 3", d3-time@3:
1543
+ version "3.1.0"
1544
+ resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7"
1545
+ integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
1546
+ dependencies:
1547
+ d3-array "2 - 3"
1548
+
1549
+ d3-timer@1:
1550
+ version "1.0.10"
1551
+ resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5"
1552
+ integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==
1553
+
1554
+ "d3-timer@1 - 3", d3-timer@3:
1555
+ version "3.0.1"
1556
+ resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0"
1557
+ integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
1558
+
1559
+ "d3-transition@2 - 3", d3-transition@3:
1560
+ version "3.0.1"
1561
+ resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f"
1562
+ integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==
1563
+ dependencies:
1564
+ d3-color "1 - 3"
1565
+ d3-dispatch "1 - 3"
1566
+ d3-ease "1 - 3"
1567
+ d3-interpolate "1 - 3"
1568
+ d3-timer "1 - 3"
1569
+
1570
+ "d3-zoom@2 - 3", d3-zoom@3:
1571
+ version "3.0.0"
1572
+ resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3"
1573
+ integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==
1574
+ dependencies:
1575
+ d3-dispatch "1 - 3"
1576
+ d3-drag "2 - 3"
1577
+ d3-interpolate "1 - 3"
1578
+ d3-selection "2 - 3"
1579
+ d3-transition "2 - 3"
1580
+
1581
+ d3@^7.9.0:
1582
+ version "7.9.0"
1583
+ resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d"
1584
+ integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==
1585
+ dependencies:
1586
+ d3-array "3"
1587
+ d3-axis "3"
1588
+ d3-brush "3"
1589
+ d3-chord "3"
1590
+ d3-color "3"
1591
+ d3-contour "4"
1592
+ d3-delaunay "6"
1593
+ d3-dispatch "3"
1594
+ d3-drag "3"
1595
+ d3-dsv "3"
1596
+ d3-ease "3"
1597
+ d3-fetch "3"
1598
+ d3-force "3"
1599
+ d3-format "3"
1600
+ d3-geo "3"
1601
+ d3-hierarchy "3"
1602
+ d3-interpolate "3"
1603
+ d3-path "3"
1604
+ d3-polygon "3"
1605
+ d3-quadtree "3"
1606
+ d3-random "3"
1607
+ d3-scale "4"
1608
+ d3-scale-chromatic "3"
1609
+ d3-selection "3"
1610
+ d3-shape "3"
1611
+ d3-time "3"
1612
+ d3-time-format "4"
1613
+ d3-timer "3"
1614
+ d3-transition "3"
1615
+ d3-zoom "3"
1616
+
1617
+ data-bind-mapper@1:
1618
+ version "1.0.3"
1619
+ resolved "https://registry.yarnpkg.com/data-bind-mapper/-/data-bind-mapper-1.0.3.tgz#275e55fd170331b1146479f3c7eb4256b8239481"
1620
+ integrity sha512-QmU3lyEnbENQPo0M1F9BMu4s6cqNNp8iJA+b/HP2sSb7pf3dxwF3+EP1eO69rwBfH9kFJ1apmzrtogAmVt2/Xw==
1621
+ dependencies:
1622
+ accessor-fn "1"
1623
+
1624
  debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
1625
  version "4.4.0"
1626
  resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
 
1633
  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
1634
  integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
1635
 
1636
+ delaunator@5:
1637
+ version "5.0.1"
1638
+ resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278"
1639
+ integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==
1640
+ dependencies:
1641
+ robust-predicates "^3.0.2"
1642
+
1643
  detect-libc@^2.0.3:
1644
  version "2.0.4"
1645
  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.4.tgz#f04715b8ba815e53b4d8109655b6508a6865a7e8"
 
1650
  resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493"
1651
  integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==
1652
 
1653
+ dom-walk@^0.1.0:
1654
+ version "0.1.2"
1655
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
1656
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
1657
+
1658
  electron-to-chromium@^1.5.73:
1659
  version "1.5.145"
1660
  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.145.tgz#abd50700ac2c809e40a4694584f66711ee937fb6"
 
1884
  resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358"
1885
  integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
1886
 
1887
+ float-tooltip@^1.6, float-tooltip@^1.7:
1888
+ version "1.7.5"
1889
+ resolved "https://registry.yarnpkg.com/float-tooltip/-/float-tooltip-1.7.5.tgz#7083bf78f0de5a97f9c2d6aa8e90d2139f34047f"
1890
+ integrity sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==
1891
+ dependencies:
1892
+ d3-selection "2 - 3"
1893
+ kapsule "^1.16"
1894
+ preact "10"
1895
+
1896
+ force-graph@^1.49:
1897
+ version "1.49.5"
1898
+ resolved "https://registry.yarnpkg.com/force-graph/-/force-graph-1.49.5.tgz#8736402701838b119637c31ee55687702fecad8e"
1899
+ integrity sha512-mCTLxsaOPfp4Jq4FND8sHTpa8aZDLNXgkwAN98IDZ8Ve3nralz0gNsmE4Nx6NFm48olJ0gzCQYYLJrrYDqifew==
1900
+ dependencies:
1901
+ "@tweenjs/tween.js" "18 - 25"
1902
+ accessor-fn "1"
1903
+ bezier-js "3 - 6"
1904
+ canvas-color-tracker "^1.3"
1905
+ d3-array "1 - 3"
1906
+ d3-drag "2 - 3"
1907
+ d3-force-3d "2 - 3"
1908
+ d3-scale "1 - 4"
1909
+ d3-scale-chromatic "1 - 3"
1910
+ d3-selection "2 - 3"
1911
+ d3-zoom "2 - 3"
1912
+ float-tooltip "^1.6"
1913
+ index-array-by "1"
1914
+ kapsule "^1.16"
1915
+ lodash-es "4"
1916
+
1917
  fsevents@~2.3.2, fsevents@~2.3.3:
1918
  version "2.3.3"
1919
  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
 
1943
  dependencies:
1944
  is-glob "^4.0.3"
1945
 
1946
+ global@^4.3.0:
1947
+ version "4.4.0"
1948
+ resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
1949
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
1950
+ dependencies:
1951
+ min-document "^2.19.0"
1952
+ process "^0.11.10"
1953
+
1954
  globals@^11.1.0:
1955
  version "11.12.0"
1956
  resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
 
1981
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
1982
  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
1983
 
1984
1985
+ version "0.6.3"
1986
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
1987
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
1988
+ dependencies:
1989
+ safer-buffer ">= 2.1.2 < 3.0.0"
1990
+
1991
  ignore@^5.2.0, ignore@^5.3.1:
1992
  version "5.3.2"
1993
  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
 
2006
  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
2007
  integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
2008
 
2009
+ index-array-by@1:
2010
+ version "1.4.2"
2011
+ resolved "https://registry.yarnpkg.com/index-array-by/-/index-array-by-1.4.2.tgz#d6f82e9fbff3201c4dab64ba415d4d2923242fea"
2012
+ integrity sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==
2013
+
2014
+ "internmap@1 - 2":
2015
+ version "2.0.3"
2016
+ resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
2017
+ integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
2018
+
2019
  is-extglob@^2.1.1:
2020
  version "2.1.1"
2021
  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
 
2038
  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
2039
  integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
2040
 
2041
+ jerrypick@^1.1.1:
2042
+ version "1.1.2"
2043
+ resolved "https://registry.yarnpkg.com/jerrypick/-/jerrypick-1.1.2.tgz#eb5016304aeb9ac9b7dea6714aa5fe85b24cb8ad"
2044
+ integrity sha512-YKnxXEekXKzhpf7CLYA0A+oDP8V0OhICNCr5lv96FvSsDEmrb0GKM776JgQvHTMjr7DTTPEVv/1Ciaw0uEWzBA==
2045
+
2046
  jiti@^2.4.2:
2047
  version "2.4.2"
2048
  resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560"
2049
  integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==
2050
 
2051
+ "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
2052
  version "4.0.0"
2053
  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
2054
  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
2085
  resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
2086
  integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
2087
 
2088
+ jwt-decode@^4.0.0:
2089
+ version "4.0.0"
2090
+ resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b"
2091
+ integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==
2092
+
2093
+ kapsule@^1.16:
2094
+ version "1.16.3"
2095
+ resolved "https://registry.yarnpkg.com/kapsule/-/kapsule-1.16.3.tgz#5684ed89838b6658b30d0f2cc056dffc3ba68c30"
2096
+ integrity sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==
2097
+ dependencies:
2098
+ lodash-es "4"
2099
+
2100
  keyv@^4.5.4:
2101
  version "4.5.4"
2102
  resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
 
2187
  dependencies:
2188
  p-locate "^5.0.0"
2189
 
2190
+ lodash-es@4:
2191
+ version "4.17.21"
2192
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
2193
+ integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
2194
+
2195
  lodash.merge@^4.6.2:
2196
  version "4.6.2"
2197
  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
2198
  integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
2199
 
2200
+ lodash.reduce@^4.6.0:
2201
+ version "4.6.0"
2202
+ resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
2203
+ integrity sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==
2204
+
2205
+ loose-envify@^1.4.0:
2206
+ version "1.4.0"
2207
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
2208
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
2209
+ dependencies:
2210
+ js-tokens "^3.0.0 || ^4.0.0"
2211
+
2212
  lru-cache@^5.1.1:
2213
  version "5.1.1"
2214
  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
 
2234
  braces "^3.0.3"
2235
  picomatch "^2.3.1"
2236
 
2237
+ min-document@^2.19.0:
2238
+ version "2.19.0"
2239
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
2240
+ integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==
2241
+ dependencies:
2242
+ dom-walk "^0.1.0"
2243
+
2244
  minimatch@^3.1.2:
2245
  version "3.1.2"
2246
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
 
2270
  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
2271
  integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
2272
 
2273
+ ngraph.events@^1.0.0, ngraph.events@^1.2.1:
2274
+ version "1.2.2"
2275
+ resolved "https://registry.yarnpkg.com/ngraph.events/-/ngraph.events-1.2.2.tgz#3ceb92d676a04a4e7ce60a09fa8e17a4f0346d7f"
2276
+ integrity sha512-JsUbEOzANskax+WSYiAPETemLWYXmixuPAlmZmhIbIj6FH/WDgEGCGnRwUQBK0GjOnVm8Ui+e5IJ+5VZ4e32eQ==
2277
+
2278
+ ngraph.forcelayout@3:
2279
+ version "3.3.1"
2280
+ resolved "https://registry.yarnpkg.com/ngraph.forcelayout/-/ngraph.forcelayout-3.3.1.tgz#981e1baee5e0593c490bc27219169f9cedfa4f8b"
2281
+ integrity sha512-MKBuEh1wujyQHFTW57y5vd/uuEOK0XfXYxm3lC7kktjJLRdt/KEKEknyOlc6tjXflqBKEuYBBcu7Ax5VY+S6aw==
2282
+ dependencies:
2283
+ ngraph.events "^1.0.0"
2284
+ ngraph.merge "^1.0.0"
2285
+ ngraph.random "^1.0.0"
2286
+
2287
+ ngraph.graph@20:
2288
+ version "20.0.1"
2289
+ resolved "https://registry.yarnpkg.com/ngraph.graph/-/ngraph.graph-20.0.1.tgz#579470d1d805583239704dc913e2095540aaf371"
2290
+ integrity sha512-VFsQ+EMkT+7lcJO1QP8Ik3w64WbHJl27Q53EO9hiFU9CRyxJ8HfcXtfWz/U8okuoYKDctbciL6pX3vG5dt1rYA==
2291
+ dependencies:
2292
+ ngraph.events "^1.2.1"
2293
+
2294
+ ngraph.merge@^1.0.0:
2295
+ version "1.0.0"
2296
+ resolved "https://registry.yarnpkg.com/ngraph.merge/-/ngraph.merge-1.0.0.tgz#d763cdfa48b1bbd4270ea246f06c9c8ff5d3477c"
2297
+ integrity sha512-5J8YjGITUJeapsomtTALYsw7rFveYkM+lBj3QiYZ79EymQcuri65Nw3knQtFxQBU1r5iOaVRXrSwMENUPK62Vg==
2298
+
2299
+ ngraph.random@^1.0.0:
2300
+ version "1.2.0"
2301
+ resolved "https://registry.yarnpkg.com/ngraph.random/-/ngraph.random-1.2.0.tgz#3864ffbb9971e920db6c5f33ce5abc3d2439e3d2"
2302
+ integrity sha512-4EUeAGbB2HWX9njd6bP6tciN6ByJfoaAvmVL9QTaZSeXrW46eNGA9GajiXiPBbvFqxUWFkEbyo6x5qsACUuVfA==
2303
+
2304
  node-releases@^2.0.19:
2305
  version "2.0.19"
2306
  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314"
2307
  integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==
2308
 
2309
+ object-assign@^4.1.1:
2310
+ version "4.1.1"
2311
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
2312
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
2313
+
2314
  optionator@^0.9.3:
2315
  version "0.9.4"
2316
  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
 
2369
  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab"
2370
  integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
2371
 
2372
+ polished@4:
2373
+ version "4.3.1"
2374
+ resolved "https://registry.yarnpkg.com/polished/-/polished-4.3.1.tgz#5a00ae32715609f83d89f6f31d0f0261c6170548"
2375
+ integrity sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==
2376
+ dependencies:
2377
+ "@babel/runtime" "^7.17.8"
2378
+
2379
  postcss@^8.5.3:
2380
  version "8.5.3"
2381
  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb"
 
2385
  picocolors "^1.1.1"
2386
  source-map-js "^1.2.1"
2387
 
2388
+ preact@10:
2389
+ version "10.26.5"
2390
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.26.5.tgz#7e1e998af178f139e4c7cb53f441bf2179f44ad2"
2391
+ integrity sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==
2392
+
2393
  prelude-ls@^1.2.1:
2394
  version "1.2.1"
2395
  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
2396
  integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
2397
 
2398
+ process@^0.11.10:
2399
+ version "0.11.10"
2400
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
2401
+ integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
2402
+
2403
+ prop-types@15, prop-types@^15.5.10:
2404
+ version "15.8.1"
2405
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
2406
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
2407
+ dependencies:
2408
+ loose-envify "^1.4.0"
2409
+ object-assign "^4.1.1"
2410
+ react-is "^16.13.1"
2411
+
2412
  punycode@^2.1.0:
2413
  version "2.3.1"
2414
  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
 
2426
  dependencies:
2427
  scheduler "^0.26.0"
2428
 
2429
+ react-force-graph-2d@^1.27.1:
2430
+ version "1.27.1"
2431
+ resolved "https://registry.yarnpkg.com/react-force-graph-2d/-/react-force-graph-2d-1.27.1.tgz#3c8be8c3a3295f8f10c1489fe1369aa52254d6dd"
2432
+ integrity sha512-/b1k+HbW9QCzGILJibyzN2PVZdDWTFuEylqcJGkUTBs0uLcK0h2LgOUuVU+GpRGpuXmj9sBAt43zz+PTETFHGg==
2433
+ dependencies:
2434
+ force-graph "^1.49"
2435
+ prop-types "15"
2436
+ react-kapsule "^2.5"
2437
+
2438
+ react-force-graph-3d@^1.26.1:
2439
+ version "1.26.1"
2440
+ resolved "https://registry.yarnpkg.com/react-force-graph-3d/-/react-force-graph-3d-1.26.1.tgz#b138adc13412da6d0c89ea4e85a59ef85ae5ed49"
2441
+ integrity sha512-Ff520+ngcja441fAyop+oiPPEcXaRhzvTqA+4ve6Kr341g3TIg0+s/i7pafCtYhgpPXcbjiDet0wskzGaNhIlQ==
2442
+ dependencies:
2443
+ "3d-force-graph" "^1.76"
2444
+ prop-types "15"
2445
+ react-kapsule "^2.5"
2446
+
2447
+ react-is@^16.13.1:
2448
+ version "16.13.1"
2449
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
2450
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
2451
+
2452
+ react-kapsule@^2.5:
2453
+ version "2.5.7"
2454
+ resolved "https://registry.yarnpkg.com/react-kapsule/-/react-kapsule-2.5.7.tgz#dcd957ae8e897ff48055fc8ff48ed04ebe3c5bd2"
2455
+ integrity sha512-kifAF4ZPD77qZKc4CKLmozq6GY1sBzPEJTIJb0wWFK6HsePJatK3jXplZn2eeAt3x67CDozgi7/rO8fNQ/AL7A==
2456
+ dependencies:
2457
+ jerrypick "^1.1.1"
2458
+
2459
  react-refresh@^0.17.0:
2460
  version "0.17.0"
2461
  resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53"
 
2488
  get-nonce "^1.0.0"
2489
  tslib "^2.0.0"
2490
 
2491
+ react-vis-force@^0.3.1:
2492
+ version "0.3.1"
2493
+ resolved "https://registry.yarnpkg.com/react-vis-force/-/react-vis-force-0.3.1.tgz#c7bc96a4e872409f5d4c0fa93fe89c94554d47b7"
2494
+ integrity sha512-YmAe02LAwkxeWceyL6Kq8C7RLQBWtgXtrVgDV9Uq9vgfeyh8z9U2+gH/i4KDgaZdSd2bVxIwr2CgkVdEOOMygQ==
2495
+ dependencies:
2496
+ d3-force "^1.0.2"
2497
+ global "^4.3.0"
2498
+ lodash.reduce "^4.6.0"
2499
+ prop-types "^15.5.10"
2500
+
2501
  react@^19.0.0:
2502
  version "19.1.0"
2503
  resolved "https://registry.yarnpkg.com/react/-/react-19.1.0.tgz#926864b6c48da7627f004795d6cce50e90793b75"
 
2513
  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f"
2514
  integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
2515
 
2516
+ robust-predicates@^3.0.2:
2517
+ version "3.0.2"
2518
+ resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771"
2519
+ integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==
2520
+
2521
  rollup@^4.34.9:
2522
  version "4.40.1"
2523
  resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.1.tgz#03d6c53ebb6a9c2c060ae686a61e72a2472b366f"
 
2554
  dependencies:
2555
  queue-microtask "^1.2.2"
2556
 
2557
+ rw@1:
2558
+ version "1.3.3"
2559
+ resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
2560
+ integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==
2561
+
2562
+ "safer-buffer@>= 2.1.2 < 3.0.0":
2563
+ version "2.1.2"
2564
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
2565
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
2566
+
2567
  scheduler@^0.26.0:
2568
  version "0.26.0"
2569
  resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337"
 
2623
  resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
2624
  integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
2625
 
2626
+ three-forcegraph@1:
2627
+ version "1.42.13"
2628
+ resolved "https://registry.yarnpkg.com/three-forcegraph/-/three-forcegraph-1.42.13.tgz#4827338dece4b027532fe2f006d802b9271cf725"
2629
+ integrity sha512-BoG5fB3nlAFeIyiLuFquvWIjt8DA2gdPWlqW/8V8xQcEO7otMmeN2/WWHCP7cWzKEImULxpJ6bNLmmt7TTJaiw==
2630
+ dependencies:
2631
+ accessor-fn "1"
2632
+ d3-array "1 - 3"
2633
+ d3-force-3d "2 - 3"
2634
+ d3-scale "1 - 4"
2635
+ d3-scale-chromatic "1 - 3"
2636
+ data-bind-mapper "1"
2637
+ kapsule "^1.16"
2638
+ ngraph.forcelayout "3"
2639
+ ngraph.graph "20"
2640
+ tinycolor2 "1"
2641
+
2642
+ three-render-objects@^1.35:
2643
+ version "1.40.0"
2644
+ resolved "https://registry.yarnpkg.com/three-render-objects/-/three-render-objects-1.40.0.tgz#d4f48800cbce9061a90814c2e60346f55e4171d3"
2645
+ integrity sha512-Ub2IebRGrV+ctxkOe7lkLzIraJDTtz5s31Z2rvaQb7sHAXfofv02CwtEJmIPIkEy6jpGreuqJbCGEnQpvKKDFw==
2646
+ dependencies:
2647
+ "@tweenjs/tween.js" "18 - 25"
2648
+ accessor-fn "1"
2649
+ float-tooltip "^1.7"
2650
+ kapsule "^1.16"
2651
+ polished "4"
2652
+
2653
+ "three@>=0.118 <1":
2654
+ version "0.176.0"
2655
+ resolved "https://registry.yarnpkg.com/three/-/three-0.176.0.tgz#a30c1974e46db5745e4f96dd9ee2028d71e16ecf"
2656
+ integrity sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==
2657
+
2658
+ tinycolor2@1, tinycolor2@^1.6.0:
2659
+ version "1.6.0"
2660
+ resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e"
2661
+ integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==
2662
+
2663
  tinyglobby@^0.2.13:
2664
  version "0.2.13"
2665
  resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e"