blanchon commited on
Commit
ec2d8f0
·
1 Parent(s): 8aedc84
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .dockerignore +101 -50
  2. Dockerfile +73 -29
  3. client/js/README.md +3 -3
  4. client/js/bun.lock +0 -378
  5. client/js/package.json +9 -15
  6. client/js/src/video/producer.ts +1 -1
  7. client/js/tsconfig.json +25 -22
  8. client/js/vite.config.ts +0 -38
  9. client/python/README.md +5 -5
  10. client/python/examples/basic_consumer.py +2 -2
  11. client/python/examples/basic_producer.py +2 -2
  12. client/python/examples/consumer_first_recorder.py +5 -5
  13. client/python/examples/context_manager_example.py +6 -5
  14. client/python/examples/producer_consumer_demo.py +2 -2
  15. client/python/examples/room_management.py +2 -2
  16. client/python/examples/test_consumer_fix.py +4 -4
  17. client/python/examples/video_consumer_example.py +5 -5
  18. client/python/examples/video_producer_example.py +4 -4
  19. client/python/pyproject.toml +2 -2
  20. client/python/src/transport_server_client/__init__.py +2 -2
  21. client/python/src/transport_server_client/__pycache__/__init__.cpython-312.pyc +0 -0
  22. client/python/src/transport_server_client/__pycache__/client.cpython-312.pyc +0 -0
  23. client/python/src/transport_server_client/video/__pycache__/__init__.cpython-312.pyc +0 -0
  24. client/python/src/transport_server_client/video/__pycache__/consumer.cpython-312.pyc +0 -0
  25. client/python/src/transport_server_client/video/__pycache__/core.cpython-312.pyc +0 -0
  26. client/python/src/transport_server_client/video/__pycache__/factory.cpython-312.pyc +0 -0
  27. client/python/src/transport_server_client/video/__pycache__/producer.cpython-312.pyc +0 -0
  28. client/python/src/transport_server_client/video/__pycache__/types.cpython-312.pyc +0 -0
  29. client/python/tests/conftest.py +1 -1
  30. client/python/tests/test_consumer.py +7 -7
  31. client/python/tests/test_factory_functions.py +1 -1
  32. client/python/tests/test_integration.py +7 -11
  33. client/python/tests/test_producer.py +8 -10
  34. client/python/tests/test_rest_api.py +1 -1
  35. client/python/tests/test_video_client.py +3 -5
  36. demo/README.md +1 -1
  37. demo/bun.lock +2 -2
  38. demo/package.json +1 -1
  39. demo/src/routes/+page.svelte +2 -2
  40. demo/src/routes/[workspaceId]/+page.svelte +2 -2
  41. demo/src/routes/[workspaceId]/robotics/+page.svelte +2 -2
  42. demo/src/routes/[workspaceId]/robotics/consumer/+page.svelte +2 -2
  43. demo/src/routes/[workspaceId]/robotics/producer/+page.svelte +1 -1
  44. demo/src/routes/[workspaceId]/video/+page.svelte +2 -2
  45. demo/src/routes/[workspaceId]/video/consumer/+page.svelte +1 -1
  46. demo/src/routes/[workspaceId]/video/producer/+page.svelte +1 -1
  47. demo/test-demo.js +1 -1
  48. server/pyproject.toml +2 -2
  49. server/src/lerobot_arena_server.egg-info/PKG-INFO +0 -10
  50. server/src/lerobot_arena_server.egg-info/SOURCES.txt +0 -19
.dockerignore CHANGED
@@ -1,52 +1,103 @@
1
- # Git
2
- .git
3
- .gitignore
4
-
5
- # Node modules and build artifacts
6
- node_modules
7
- .svelte-kit
8
- demo/build
9
- demo/node_modules
10
- client/js/node_modules
11
- client/js/dist
12
-
13
- # Python cache and virtual environments
14
- __pycache__
15
- *.pyc
16
- *.pyo
17
- *.pyd
18
- .Python
19
- .venv
20
- .pytest_cache
21
- *.egg-info
22
-
23
- # Development files
24
- *.log
25
- logs/
26
- .DS_Store
27
- Thumbs.db
28
-
29
- # IDE files
30
- .vscode
31
- .idea
32
- *.swp
33
- *.swo
34
-
35
- # Temporary files
36
- *.tmp
37
- *.temp
38
-
39
- # Documentation
40
- *.md
41
- !README.md
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
  # Test files
44
- tests/
45
- test_*
46
-
47
- # Development configs
48
- .eslintrc*
49
- .prettierrc*
50
- *.config.js
51
- !svelte.config.js
52
- !vite.config.ts
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* # Node.js dependencies and cache */
2
+ **/node_modules/
3
+ **/.npm
4
+ **/npm-debug.log*
5
+ **/yarn-debug.log*
6
+ **/yarn-error.log*
7
+ **/.pnpm-debug.log*
8
+
9
+ # Bun runtime files
10
+ **/.bun
11
+
12
+ # Build outputs and generated files
13
+ **/dist/
14
+ **/build/
15
+ **/.next/
16
+ **/.svelte-kit/
17
+
18
+ # Environment and development files
19
+ **/.env
20
+ **/.env.local
21
+ **/.env.development.local
22
+ **/.env.test.local
23
+ **/.env.production.local
24
+
25
+ # Python cache and bytecode
26
+ **/__pycache__/
27
+ **/*.py[cod]
28
+ **/*$py.class
29
+ **/*.so
30
+ **/.Python
31
+ **/develop-eggs/
32
+ **/downloads/
33
+ **/eggs/
34
+ **/.eggs/
35
+ **/lib/
36
+ **/lib64/
37
+ **/parts/
38
+ **/sdist/
39
+ **/var/
40
+ **/wheels/
41
+ **/*.egg-info/
42
+ **/.installed.cfg
43
+ **/*.egg
44
+ **/MANIFEST
45
+
46
+ # Virtual environments
47
+ **/.venv/
48
+ **/venv/
49
+ **/ENV/
50
+ **/env/
51
+
52
+ # IDEs and editors
53
+ **/.vscode/
54
+ **/.idea/
55
+ **/*.swp
56
+ **/*.swo
57
+ **/*~
58
+
59
+ # Operating system files
60
+ **/.DS_Store
61
+ **/Thumbs.db
62
+
63
+ # Version control
64
+ **/.git/
65
+ **/.gitignore
66
+
67
+ # Docker related files
68
+ **/Dockerfile*
69
+ **/docker-compose*
70
+ **/.dockerignore
71
+
72
+ # Logs and temporary files
73
+ **/logs/
74
+ **/*.log
75
+ **/server.log
76
+ **/.cache/
77
+ **/tmp/
78
+ **/.tmp/
79
+ **/.pytest_cache/
80
+ **/.mypy_cache/
81
 
82
  # Test files
83
+ **/test*/
84
+ **/tests/
85
+ **/*test.py
86
+ **/*_test.py
87
+
88
+ # Lock files for other package managers
89
+ **/yarn.lock
90
+ **/package-lock.json
91
+ **/poetry.lock
92
+ **/Pipfile.lock
93
+
94
+ # Documentation files
95
+ **/README.md
96
+ **/CHANGELOG.md
97
+ **/docs/
98
+
99
+ # CI/CD configuration files
100
+ **/.github/
101
+ **/.gitlab-ci.yml
102
+ **/azure-pipelines.yml
103
+ **/.circleci/
Dockerfile CHANGED
@@ -7,70 +7,114 @@ WORKDIR /app
7
  # Install git for dependencies that might need it
8
  RUN apk add --no-cache git
9
 
10
- # Copy all JavaScript/TypeScript files
11
- COPY client/js/ ./client/js/
12
- COPY demo/ ./demo/
13
 
14
- # Build and link client library
15
  WORKDIR /app/client/js
16
- RUN bun install
 
 
 
 
 
 
17
  RUN bun run build
18
  RUN bun link
19
 
20
- # Build demo with linked client library
21
  WORKDIR /app/demo
22
- RUN bun link lerobot-arena-client
23
- RUN bun install
 
 
 
 
 
 
 
24
  RUN bun run build
25
 
26
  # Stage 2: Python backend with uv
27
  FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
28
 
 
 
 
 
 
 
 
29
  # Install system dependencies needed for video processing
30
  RUN apt-get update && apt-get install -y \
 
 
 
 
 
31
  libavformat-dev \
32
  libavcodec-dev \
33
  libavdevice-dev \
34
  libavutil-dev \
35
  libswscale-dev \
36
  libswresample-dev \
 
 
 
 
 
 
 
37
  pkg-config \
 
 
 
 
 
 
38
  && rm -rf /var/lib/apt/lists/*
39
 
40
- # Set up a new user named "user" with user ID 1000 (required for HF Spaces)
41
- RUN useradd -m -u 1000 user
42
-
43
- # Switch to the "user" user
44
- USER user
45
 
46
- # Set home to the user's home directory
47
- ENV HOME=/home/user \
48
- PATH=/home/user/.local/bin:$PATH
49
 
50
- # Set the working directory to the user's home directory
51
- WORKDIR $HOME/app
52
 
53
- # Copy Python project files for dependency resolution
54
- COPY --chown=user server/pyproject.toml server/uv.lock* ./server/
55
 
56
  # Install dependencies first (better caching)
57
- WORKDIR $HOME/app/server
58
- RUN uv sync --no-install-project
 
59
 
60
  # Copy the rest of the Python backend
61
- COPY --chown=user server/ ./
62
 
63
- # Install the project itself
64
- RUN uv sync
 
65
 
66
  # Copy built frontend from previous stage with proper ownership
67
- COPY --chown=user --from=frontend-builder /app/demo/build $HOME/app/static-frontend
68
 
69
  # Set working directory back to app root
70
- WORKDIR $HOME/app
 
 
 
71
 
72
- # Expose port 7860 (HF Spaces default)
73
  EXPOSE 7860
74
 
 
 
 
 
75
  # Start the FastAPI server (serves both frontend and backend)
76
- CMD ["sh", "-c", "cd server && SERVE_FRONTEND=true uv run python launch_with_ui.py"]
 
7
  # Install git for dependencies that might need it
8
  RUN apk add --no-cache git
9
 
10
+ # Copy package files for better caching
11
+ COPY client/js/package.json client/js/tsconfig.json* ./client/js/
12
+ COPY demo/package.json demo/tsconfig.json* demo/svelte.config.js* ./demo/
13
 
14
+ # Install client library dependencies first
15
  WORKDIR /app/client/js
16
+ RUN bun install --frozen-lockfile
17
+
18
+ # Copy client library source code
19
+ COPY client/js/src/ ./src/
20
+ COPY client/js/bun.lock* ./
21
+
22
+ # Build and link client library
23
  RUN bun run build
24
  RUN bun link
25
 
26
+ # Install demo dependencies with linked client library
27
  WORKDIR /app/demo
28
+ RUN bun link @robothub/transport-server-client
29
+ RUN bun install --frozen-lockfile
30
+
31
+ # Copy demo source code
32
+ COPY demo/src/ ./src/
33
+ COPY demo/static/ ./static/
34
+ COPY demo/vite.config.ts* demo/tailwind.config.* demo/.prettierrc* ./
35
+
36
+ # Build demo application
37
  RUN bun run build
38
 
39
  # Stage 2: Python backend with uv
40
  FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
41
 
42
+ # Set environment variables for Python and UV
43
+ ENV PYTHONUNBUFFERED=1 \
44
+ PYTHONDONTWRITEBYTECODE=1 \
45
+ UV_SYSTEM_PYTHON=1 \
46
+ UV_COMPILE_BYTECODE=1 \
47
+ UV_CACHE_DIR=/tmp/uv-cache
48
+
49
  # Install system dependencies needed for video processing
50
  RUN apt-get update && apt-get install -y \
51
+ # Build tools for compiling Python packages
52
+ build-essential \
53
+ gcc \
54
+ g++ \
55
+ # Video processing libraries
56
  libavformat-dev \
57
  libavcodec-dev \
58
  libavdevice-dev \
59
  libavutil-dev \
60
  libswscale-dev \
61
  libswresample-dev \
62
+ # Additional system libraries
63
+ libgl1-mesa-glx \
64
+ libglib2.0-0 \
65
+ libsm6 \
66
+ libxext6 \
67
+ libxrender-dev \
68
+ libgomp1 \
69
  pkg-config \
70
+ # FFmpeg for video processing
71
+ ffmpeg \
72
+ # Git for potential model downloads
73
+ git \
74
+ # Clean up
75
+ && apt-get clean \
76
  && rm -rf /var/lib/apt/lists/*
77
 
78
+ # Create a non-root user (required for HF Spaces)
79
+ RUN groupadd -r appuser && useradd -r -g appuser -m -s /bin/bash -u 1000 appuser
 
 
 
80
 
81
+ # Set working directory and ensure it's owned by appuser
82
+ WORKDIR /app
83
+ RUN chown -R appuser:appuser /app
84
 
85
+ # Switch to appuser before installing dependencies
86
+ USER appuser
87
 
88
+ # Copy dependency files for better layer caching
89
+ COPY --chown=appuser:appuser server/pyproject.toml server/uv.lock* ./server/
90
 
91
  # Install dependencies first (better caching)
92
+ WORKDIR /app/server
93
+ RUN --mount=type=cache,target=/tmp/uv-cache,uid=1000,gid=1000 \
94
+ uv sync --locked --no-install-project --no-dev
95
 
96
  # Copy the rest of the Python backend
97
+ COPY --chown=appuser:appuser server/ ./
98
 
99
+ # Install the project in non-editable mode for production
100
+ RUN --mount=type=cache,target=/tmp/uv-cache,uid=1000,gid=1000 \
101
+ uv sync --locked --no-editable --no-dev
102
 
103
  # Copy built frontend from previous stage with proper ownership
104
+ COPY --chown=appuser:appuser --from=frontend-builder /app/demo/build /app/static-frontend
105
 
106
  # Set working directory back to app root
107
+ WORKDIR /app
108
+
109
+ # Add virtual environment to PATH
110
+ ENV PATH="/app/server/.venv/bin:$PATH"
111
 
112
+ # Expose port 7860 (HuggingFace Spaces default)
113
  EXPOSE 7860
114
 
115
+ # Health check
116
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
117
+ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:7860/health')" || exit 1
118
+
119
  # Start the FastAPI server (serves both frontend and backend)
120
+ CMD ["sh", "-c", "cd server && SERVE_FRONTEND=true uv run python launch_with_ui.py --host 0.0.0.0 --port 7860"]
client/js/README.md CHANGED
@@ -30,7 +30,7 @@ bun run build
30
  ### Producer (Robot Controller)
31
 
32
  ```typescript
33
- import { RoboticsProducer, createProducerClient } from '@robohub/transport-server-client';
34
 
35
  // Method 1: Manual setup
36
  const producer = new RoboticsProducer('http://localhost:8000');
@@ -61,7 +61,7 @@ await producer.sendEmergencyStop('Safety stop triggered');
61
  ### Consumer (Robot Monitor)
62
 
63
  ```typescript
64
- import { RoboticsConsumer, createConsumerClient } from '@robohub/transport-server-client';
65
 
66
  // Connect to existing room
67
  const consumer = await createConsumerClient(roomId, 'http://localhost:8000');
@@ -152,7 +152,7 @@ const consumer = await RoboticsConsumer.createAndConnect(roomId, baseUrl, partic
152
  ### Factory Functions
153
 
154
  ```typescript
155
- import { createClient, createProducerClient, createConsumerClient } from '@robohub/transport-server-client';
156
 
157
  // Generic factory
158
  const client = createClient('producer', 'http://localhost:8000');
 
30
  ### Producer (Robot Controller)
31
 
32
  ```typescript
33
+ import { RoboticsProducer, createProducerClient } from '@robothub/transport-server-client';
34
 
35
  // Method 1: Manual setup
36
  const producer = new RoboticsProducer('http://localhost:8000');
 
61
  ### Consumer (Robot Monitor)
62
 
63
  ```typescript
64
+ import { RoboticsConsumer, createConsumerClient } from '@robothub/transport-server-client';
65
 
66
  // Connect to existing room
67
  const consumer = await createConsumerClient(roomId, 'http://localhost:8000');
 
152
  ### Factory Functions
153
 
154
  ```typescript
155
+ import { createClient, createProducerClient, createConsumerClient } from '@robothub/transport-server-client';
156
 
157
  // Generic factory
158
  const client = createClient('producer', 'http://localhost:8000');
client/js/bun.lock CHANGED
@@ -4,15 +4,11 @@
4
  "": {
5
  "name": "lerobot_arena_client",
6
  "dependencies": {
7
- "@hey-api/client-fetch": "^0.2.1",
8
  "eventemitter3": "^5.0.1",
9
  },
10
  "devDependencies": {
11
- "@hey-api/openapi-ts": "^0.53.8",
12
  "@types/bun": "^1.2.15",
13
  "typescript": "^5.3.3",
14
- "vite": "6.3.5",
15
- "vite-plugin-dts": "4.5.4",
16
  },
17
  "peerDependencies": {
18
  "typescript": ">=5.0.0",
@@ -20,390 +16,16 @@
20
  },
21
  },
22
  "packages": {
23
- "@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@11.7.2", "", { "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } }, "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA=="],
24
-
25
- "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
26
-
27
- "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="],
28
-
29
- "@babel/parser": ["@babel/parser@7.27.5", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg=="],
30
-
31
- "@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="],
32
-
33
- "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA=="],
34
-
35
- "@esbuild/android-arm": ["@esbuild/android-arm@0.25.5", "", { "os": "android", "cpu": "arm" }, "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA=="],
36
-
37
- "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.5", "", { "os": "android", "cpu": "arm64" }, "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg=="],
38
-
39
- "@esbuild/android-x64": ["@esbuild/android-x64@0.25.5", "", { "os": "android", "cpu": "x64" }, "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw=="],
40
-
41
- "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ=="],
42
-
43
- "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ=="],
44
-
45
- "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw=="],
46
-
47
- "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw=="],
48
-
49
- "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.5", "", { "os": "linux", "cpu": "arm" }, "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw=="],
50
-
51
- "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg=="],
52
-
53
- "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA=="],
54
-
55
- "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg=="],
56
-
57
- "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg=="],
58
-
59
- "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ=="],
60
-
61
- "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA=="],
62
-
63
- "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ=="],
64
-
65
- "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.5", "", { "os": "linux", "cpu": "x64" }, "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw=="],
66
-
67
- "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.5", "", { "os": "none", "cpu": "arm64" }, "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw=="],
68
-
69
- "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.5", "", { "os": "none", "cpu": "x64" }, "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ=="],
70
-
71
- "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.5", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw=="],
72
-
73
- "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg=="],
74
-
75
- "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA=="],
76
-
77
- "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw=="],
78
-
79
- "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ=="],
80
-
81
- "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g=="],
82
-
83
- "@hey-api/client-fetch": ["@hey-api/client-fetch@0.2.4", "", {}, "sha512-SGTVAVw3PlKDLw+IyhNhb/jCH3P1P2xJzLxA8Kyz1g95HrkYOJdRpl9F5I7LLwo9aCIB7nwR2NrSeX7QaQD7vQ=="],
84
-
85
- "@hey-api/openapi-ts": ["@hey-api/openapi-ts@0.53.12", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "11.7.2", "c12": "2.0.1", "commander": "12.1.0", "handlebars": "4.7.8" }, "peerDependencies": { "typescript": "^5.x" }, "bin": { "openapi-ts": "bin/index.cjs" } }, "sha512-cOm8AlUqJIWdLXq+Pk4mTXhEApRSc9xEWTVT8MZAyEqrN1Yhiisl2wyZGH9quzKpolq+oqvgcx61txtwHwi8vQ=="],
86
-
87
- "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
88
-
89
- "@jsdevtools/ono": ["@jsdevtools/ono@7.1.3", "", {}, "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="],
90
-
91
- "@microsoft/api-extractor": ["@microsoft/api-extractor@7.52.8", "", { "dependencies": { "@microsoft/api-extractor-model": "7.30.6", "@microsoft/tsdoc": "~0.15.1", "@microsoft/tsdoc-config": "~0.17.1", "@rushstack/node-core-library": "5.13.1", "@rushstack/rig-package": "0.5.3", "@rushstack/terminal": "0.15.3", "@rushstack/ts-command-line": "5.0.1", "lodash": "~4.17.15", "minimatch": "~3.0.3", "resolve": "~1.22.1", "semver": "~7.5.4", "source-map": "~0.6.1", "typescript": "5.8.2" }, "bin": { "api-extractor": "bin/api-extractor" } }, "sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg=="],
92
-
93
- "@microsoft/api-extractor-model": ["@microsoft/api-extractor-model@7.30.6", "", { "dependencies": { "@microsoft/tsdoc": "~0.15.1", "@microsoft/tsdoc-config": "~0.17.1", "@rushstack/node-core-library": "5.13.1" } }, "sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg=="],
94
-
95
- "@microsoft/tsdoc": ["@microsoft/tsdoc@0.15.1", "", {}, "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw=="],
96
-
97
- "@microsoft/tsdoc-config": ["@microsoft/tsdoc-config@0.17.1", "", { "dependencies": { "@microsoft/tsdoc": "0.15.1", "ajv": "~8.12.0", "jju": "~1.4.0", "resolve": "~1.22.2" } }, "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw=="],
98
-
99
- "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="],
100
-
101
- "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.41.1", "", { "os": "android", "cpu": "arm" }, "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw=="],
102
-
103
- "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.41.1", "", { "os": "android", "cpu": "arm64" }, "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA=="],
104
-
105
- "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.41.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w=="],
106
-
107
- "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.41.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg=="],
108
-
109
- "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.41.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg=="],
110
-
111
- "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.41.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA=="],
112
-
113
- "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.41.1", "", { "os": "linux", "cpu": "arm" }, "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg=="],
114
-
115
- "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.41.1", "", { "os": "linux", "cpu": "arm" }, "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA=="],
116
-
117
- "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.41.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA=="],
118
-
119
- "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.41.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg=="],
120
-
121
- "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.41.1", "", { "os": "linux", "cpu": "none" }, "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw=="],
122
-
123
- "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.41.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A=="],
124
-
125
- "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.41.1", "", { "os": "linux", "cpu": "none" }, "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw=="],
126
-
127
- "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.41.1", "", { "os": "linux", "cpu": "none" }, "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw=="],
128
-
129
- "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.41.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g=="],
130
-
131
- "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.41.1", "", { "os": "linux", "cpu": "x64" }, "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A=="],
132
-
133
- "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.41.1", "", { "os": "linux", "cpu": "x64" }, "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ=="],
134
-
135
- "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.41.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ=="],
136
-
137
- "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.41.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg=="],
138
-
139
- "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.41.1", "", { "os": "win32", "cpu": "x64" }, "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw=="],
140
-
141
- "@rushstack/node-core-library": ["@rushstack/node-core-library@5.13.1", "", { "dependencies": { "ajv": "~8.13.0", "ajv-draft-04": "~1.0.0", "ajv-formats": "~3.0.1", "fs-extra": "~11.3.0", "import-lazy": "~4.0.0", "jju": "~1.4.0", "resolve": "~1.22.1", "semver": "~7.5.4" }, "peerDependencies": { "@types/node": "*" }, "optionalPeers": ["@types/node"] }, "sha512-5yXhzPFGEkVc9Fu92wsNJ9jlvdwz4RNb2bMso+/+TH0nMm1jDDDsOIf4l8GAkPxGuwPw5DH24RliWVfSPhlW/Q=="],
142
-
143
- "@rushstack/rig-package": ["@rushstack/rig-package@0.5.3", "", { "dependencies": { "resolve": "~1.22.1", "strip-json-comments": "~3.1.1" } }, "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow=="],
144
-
145
- "@rushstack/terminal": ["@rushstack/terminal@0.15.3", "", { "dependencies": { "@rushstack/node-core-library": "5.13.1", "supports-color": "~8.1.1" }, "peerDependencies": { "@types/node": "*" }, "optionalPeers": ["@types/node"] }, "sha512-DGJ0B2Vm69468kZCJkPj3AH5nN+nR9SPmC0rFHtzsS4lBQ7/dgOwtwVxYP7W9JPDMuRBkJ4KHmWKr036eJsj9g=="],
146
-
147
- "@rushstack/ts-command-line": ["@rushstack/ts-command-line@5.0.1", "", { "dependencies": { "@rushstack/terminal": "0.15.3", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" } }, "sha512-bsbUucn41UXrQK7wgM8CNM/jagBytEyJqXw/umtI8d68vFm1Jwxh1OtLrlW7uGZgjCWiiPH6ooUNa1aVsuVr3Q=="],
148
-
149
- "@types/argparse": ["@types/argparse@1.0.38", "", {}, "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA=="],
150
-
151
  "@types/bun": ["@types/bun@1.2.15", "", { "dependencies": { "bun-types": "1.2.15" } }, "sha512-U1ljPdBEphF0nw1MIk0hI7kPg7dFdPyM7EenHsp6W5loNHl7zqy6JQf/RKCgnUn2KDzUpkBwHPnEJEjII594bA=="],
152
 
153
- "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="],
154
-
155
- "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
156
-
157
  "@types/node": ["@types/node@22.15.30", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA=="],
158
 
159
- "@volar/language-core": ["@volar/language-core@2.4.14", "", { "dependencies": { "@volar/source-map": "2.4.14" } }, "sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w=="],
160
-
161
- "@volar/source-map": ["@volar/source-map@2.4.14", "", {}, "sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ=="],
162
-
163
- "@volar/typescript": ["@volar/typescript@2.4.14", "", { "dependencies": { "@volar/language-core": "2.4.14", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-p8Z6f/bZM3/HyCdRNFZOEEzts51uV8WHeN8Tnfnm2EBv6FDB2TQLzfVx7aJvnl8ofKAOnS64B2O8bImBFaauRw=="],
164
-
165
- "@vue/compiler-core": ["@vue/compiler-core@3.5.16", "", { "dependencies": { "@babel/parser": "^7.27.2", "@vue/shared": "3.5.16", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ=="],
166
-
167
- "@vue/compiler-dom": ["@vue/compiler-dom@3.5.16", "", { "dependencies": { "@vue/compiler-core": "3.5.16", "@vue/shared": "3.5.16" } }, "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ=="],
168
-
169
- "@vue/compiler-vue2": ["@vue/compiler-vue2@2.7.16", "", { "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A=="],
170
-
171
- "@vue/language-core": ["@vue/language-core@2.2.0", "", { "dependencies": { "@volar/language-core": "~2.4.11", "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.5.0", "alien-signals": "^0.4.9", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw=="],
172
-
173
- "@vue/shared": ["@vue/shared@3.5.16", "", {}, "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg=="],
174
-
175
- "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="],
176
-
177
- "ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
178
-
179
- "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="],
180
-
181
- "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
182
-
183
- "alien-signals": ["alien-signals@0.4.14", "", {}, "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q=="],
184
-
185
- "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
186
-
187
- "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
188
-
189
- "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
190
-
191
  "bun-types": ["bun-types@1.2.15", "", { "dependencies": { "@types/node": "*" } }, "sha512-NarRIaS+iOaQU1JPfyKhZm4AsUOrwUOqRNHY0XxI8GI8jYxiLXLcdjYMG9UKS+fwWasc1uw1htV9AX24dD+p4w=="],
192
 
193
- "c12": ["c12@2.0.1", "", { "dependencies": { "chokidar": "^4.0.1", "confbox": "^0.1.7", "defu": "^6.1.4", "dotenv": "^16.4.5", "giget": "^1.2.3", "jiti": "^2.3.0", "mlly": "^1.7.1", "ohash": "^1.1.4", "pathe": "^1.1.2", "perfect-debounce": "^1.0.0", "pkg-types": "^1.2.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A=="],
194
-
195
- "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
196
-
197
- "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="],
198
-
199
- "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="],
200
-
201
- "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
202
-
203
- "compare-versions": ["compare-versions@6.1.1", "", {}, "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg=="],
204
-
205
- "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
206
-
207
- "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
208
-
209
- "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
210
-
211
- "de-indent": ["de-indent@1.0.2", "", {}, "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg=="],
212
-
213
- "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
214
-
215
- "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
216
-
217
- "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
218
-
219
- "dotenv": ["dotenv@16.5.0", "", {}, "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg=="],
220
-
221
- "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
222
-
223
- "esbuild": ["esbuild@0.25.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.5", "@esbuild/android-arm": "0.25.5", "@esbuild/android-arm64": "0.25.5", "@esbuild/android-x64": "0.25.5", "@esbuild/darwin-arm64": "0.25.5", "@esbuild/darwin-x64": "0.25.5", "@esbuild/freebsd-arm64": "0.25.5", "@esbuild/freebsd-x64": "0.25.5", "@esbuild/linux-arm": "0.25.5", "@esbuild/linux-arm64": "0.25.5", "@esbuild/linux-ia32": "0.25.5", "@esbuild/linux-loong64": "0.25.5", "@esbuild/linux-mips64el": "0.25.5", "@esbuild/linux-ppc64": "0.25.5", "@esbuild/linux-riscv64": "0.25.5", "@esbuild/linux-s390x": "0.25.5", "@esbuild/linux-x64": "0.25.5", "@esbuild/netbsd-arm64": "0.25.5", "@esbuild/netbsd-x64": "0.25.5", "@esbuild/openbsd-arm64": "0.25.5", "@esbuild/openbsd-x64": "0.25.5", "@esbuild/sunos-x64": "0.25.5", "@esbuild/win32-arm64": "0.25.5", "@esbuild/win32-ia32": "0.25.5", "@esbuild/win32-x64": "0.25.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ=="],
224
-
225
- "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
226
-
227
  "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
228
 
229
- "exsolve": ["exsolve@1.0.5", "", {}, "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg=="],
230
-
231
- "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
232
-
233
- "fdir": ["fdir@6.4.5", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw=="],
234
-
235
- "fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="],
236
-
237
- "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="],
238
-
239
- "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
240
-
241
- "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
242
-
243
- "giget": ["giget@1.2.5", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.5.4", "pathe": "^2.0.3", "tar": "^6.2.1" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug=="],
244
-
245
- "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
246
-
247
- "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="],
248
-
249
- "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
250
-
251
- "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
252
-
253
- "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="],
254
-
255
- "import-lazy": ["import-lazy@4.0.0", "", {}, "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw=="],
256
-
257
- "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
258
-
259
- "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
260
-
261
- "jju": ["jju@1.4.0", "", {}, "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA=="],
262
-
263
- "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
264
-
265
- "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
266
-
267
- "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="],
268
-
269
- "kolorist": ["kolorist@1.8.0", "", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="],
270
-
271
- "local-pkg": ["local-pkg@1.1.1", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.0.1", "quansync": "^0.2.8" } }, "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg=="],
272
-
273
- "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
274
-
275
- "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
276
-
277
- "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
278
-
279
- "minimatch": ["minimatch@3.0.8", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q=="],
280
-
281
- "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
282
-
283
- "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="],
284
-
285
- "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="],
286
-
287
- "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
288
-
289
- "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="],
290
-
291
- "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
292
-
293
- "muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="],
294
-
295
- "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
296
-
297
- "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="],
298
-
299
- "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="],
300
-
301
- "nypm": ["nypm@0.5.4", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "tinyexec": "^0.3.2", "ufo": "^1.5.4" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA=="],
302
-
303
- "ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="],
304
-
305
- "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
306
-
307
- "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
308
-
309
- "pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="],
310
-
311
- "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="],
312
-
313
- "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
314
-
315
- "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
316
-
317
- "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
318
-
319
- "postcss": ["postcss@8.5.4", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w=="],
320
-
321
- "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
322
-
323
- "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="],
324
-
325
- "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="],
326
-
327
- "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
328
-
329
- "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
330
-
331
- "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="],
332
-
333
- "rollup": ["rollup@4.41.1", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.41.1", "@rollup/rollup-android-arm64": "4.41.1", "@rollup/rollup-darwin-arm64": "4.41.1", "@rollup/rollup-darwin-x64": "4.41.1", "@rollup/rollup-freebsd-arm64": "4.41.1", "@rollup/rollup-freebsd-x64": "4.41.1", "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", "@rollup/rollup-linux-arm-musleabihf": "4.41.1", "@rollup/rollup-linux-arm64-gnu": "4.41.1", "@rollup/rollup-linux-arm64-musl": "4.41.1", "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", "@rollup/rollup-linux-riscv64-gnu": "4.41.1", "@rollup/rollup-linux-riscv64-musl": "4.41.1", "@rollup/rollup-linux-s390x-gnu": "4.41.1", "@rollup/rollup-linux-x64-gnu": "4.41.1", "@rollup/rollup-linux-x64-musl": "4.41.1", "@rollup/rollup-win32-arm64-msvc": "4.41.1", "@rollup/rollup-win32-ia32-msvc": "4.41.1", "@rollup/rollup-win32-x64-msvc": "4.41.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw=="],
334
-
335
- "semver": ["semver@7.5.4", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA=="],
336
-
337
- "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
338
-
339
- "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
340
-
341
- "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
342
-
343
- "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="],
344
-
345
- "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
346
-
347
- "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
348
-
349
- "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
350
-
351
- "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="],
352
-
353
- "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
354
-
355
- "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="],
356
-
357
  "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
358
 
359
- "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="],
360
-
361
- "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="],
362
-
363
  "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
364
-
365
- "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
366
-
367
- "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
368
-
369
- "vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="],
370
-
371
- "vite-plugin-dts": ["vite-plugin-dts@4.5.4", "", { "dependencies": { "@microsoft/api-extractor": "^7.50.1", "@rollup/pluginutils": "^5.1.4", "@volar/typescript": "^2.4.11", "@vue/language-core": "2.2.0", "compare-versions": "^6.1.1", "debug": "^4.4.0", "kolorist": "^1.8.0", "local-pkg": "^1.0.0", "magic-string": "^0.30.17" }, "peerDependencies": { "typescript": "*", "vite": "*" }, "optionalPeers": ["vite"] }, "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg=="],
372
-
373
- "vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
374
-
375
- "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="],
376
-
377
- "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
378
-
379
- "@microsoft/api-extractor/typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="],
380
-
381
- "@rushstack/node-core-library/ajv": ["ajv@8.13.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.4.1" } }, "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA=="],
382
-
383
- "@rushstack/ts-command-line/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
384
-
385
- "@vue/language-core/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
386
-
387
- "ajv-formats/ajv": ["ajv@8.13.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.4.1" } }, "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA=="],
388
-
389
- "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
390
-
391
- "giget/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
392
-
393
- "local-pkg/pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="],
394
-
395
- "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
396
-
397
- "mlly/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
398
-
399
- "nypm/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
400
-
401
- "pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
402
-
403
- "@vue/language-core/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
404
-
405
- "local-pkg/pkg-types/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="],
406
-
407
- "local-pkg/pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
408
  }
409
  }
 
4
  "": {
5
  "name": "lerobot_arena_client",
6
  "dependencies": {
 
7
  "eventemitter3": "^5.0.1",
8
  },
9
  "devDependencies": {
 
10
  "@types/bun": "^1.2.15",
11
  "typescript": "^5.3.3",
 
 
12
  },
13
  "peerDependencies": {
14
  "typescript": ">=5.0.0",
 
16
  },
17
  },
18
  "packages": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  "@types/bun": ["@types/bun@1.2.15", "", { "dependencies": { "bun-types": "1.2.15" } }, "sha512-U1ljPdBEphF0nw1MIk0hI7kPg7dFdPyM7EenHsp6W5loNHl7zqy6JQf/RKCgnUn2KDzUpkBwHPnEJEjII594bA=="],
20
 
 
 
 
 
21
  "@types/node": ["@types/node@22.15.30", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA=="],
22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  "bun-types": ["bun-types@1.2.15", "", { "dependencies": { "@types/node": "*" } }, "sha512-NarRIaS+iOaQU1JPfyKhZm4AsUOrwUOqRNHY0XxI8GI8jYxiLXLcdjYMG9UKS+fwWasc1uw1htV9AX24dD+p4w=="],
24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
28
 
 
 
 
 
29
  "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  }
31
  }
client/js/package.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
- "name": "@robohub/transport-server-client",
3
  "version": "1.0.0",
4
  "description": "Modular TypeScript client library for LeRobot Arena - video streaming, robotics control, and sensor data",
5
  "type": "module",
@@ -11,16 +11,12 @@
11
  "types": "./dist/index.d.ts"
12
  },
13
  "./video": {
14
- "import": "./dist/video.js",
15
- "types": "./dist/video.d.ts"
16
  },
17
  "./robotics": {
18
- "import": "./dist/robotics.js",
19
- "types": "./dist/robotics.d.ts"
20
- },
21
- "./audio": {
22
- "import": "./dist/audio.js",
23
- "types": "./dist/audio.d.ts"
24
  }
25
  },
26
  "files": [
@@ -28,11 +24,9 @@
28
  "README.md"
29
  ],
30
  "scripts": {
31
- "build": "bun build src/index.ts --outdir dist --target bun --format esm --sourcemap && bun build src/video.ts --outdir dist --target bun --format esm --sourcemap && bun build src/robotics.ts --outdir dist --target bun --format esm --sourcemap && bun build src/audio.ts --outdir dist --target bun --format esm --sourcemap && bunx tsc --emitDeclarationOnly --declaration --outDir dist",
32
  "dev": "bun --watch src/index.ts",
33
  "test": "bun test",
34
- "lint": "bun run eslint src --ext ts,tsx",
35
- "lint:fix": "bun run eslint src --ext ts,tsx --fix",
36
  "typecheck": "bun run tsc --noEmit",
37
  "clean": "rm -rf dist",
38
  "prebuild": "bun run clean"
@@ -61,13 +55,13 @@
61
  },
62
  "repository": {
63
  "type": "git",
64
- "url": "git+https://github.com/julien-blanchon/RoboHub.git#main:services/transport-server/client/js",
65
  "directory": "services/transport-server/client/js"
66
  },
67
  "bugs": {
68
- "url": "https://github.com/julien-blanchon/RoboHub.git#main:services/transport-server/client/js"
69
  },
70
- "homepage": "https://github.com/julien-blanchon/RoboHub.git#main:services/transport-server/client/js",
71
  "engines": {
72
  "bun": ">=1.0.0"
73
  },
 
1
  {
2
+ "name": "@robothub/transport-server-client",
3
  "version": "1.0.0",
4
  "description": "Modular TypeScript client library for LeRobot Arena - video streaming, robotics control, and sensor data",
5
  "type": "module",
 
11
  "types": "./dist/index.d.ts"
12
  },
13
  "./video": {
14
+ "import": "./dist/video/index.js",
15
+ "types": "./dist/video/index.d.ts"
16
  },
17
  "./robotics": {
18
+ "import": "./dist/robotics/index.js",
19
+ "types": "./dist/robotics/index.d.ts"
 
 
 
 
20
  }
21
  },
22
  "files": [
 
24
  "README.md"
25
  ],
26
  "scripts": {
27
+ "build": "bun build src/index.ts --outdir dist --target bun --format esm --sourcemap && bunx tsc --emitDeclarationOnly --declaration --outDir dist",
28
  "dev": "bun --watch src/index.ts",
29
  "test": "bun test",
 
 
30
  "typecheck": "bun run tsc --noEmit",
31
  "clean": "rm -rf dist",
32
  "prebuild": "bun run clean"
 
55
  },
56
  "repository": {
57
  "type": "git",
58
+ "url": "git+https://github.com/julien-blanchon/robothub.git#main:services/transport-server/client/js",
59
  "directory": "services/transport-server/client/js"
60
  },
61
  "bugs": {
62
+ "url": "https://github.com/julien-blanchon/robothub.git#main:services/transport-server/client/js"
63
  },
64
+ "homepage": "https://github.com/julien-blanchon/robothub.git#main:services/transport-server/client/js",
65
  "engines": {
66
  "bun": ">=1.0.0"
67
  },
client/js/src/video/producer.ts CHANGED
@@ -124,7 +124,7 @@ export class VideoProducer extends VideoClientCore {
124
  }
125
 
126
  private async restartConnectionsWithNewStream(stream: MediaStream): Promise<void> {
127
- console.info('🔄 Restarting connections with new stream...');
128
 
129
  // Close all existing connections
130
  for (const [consumerId, peerConnection] of this.consumerConnections) {
 
124
  }
125
 
126
  private async restartConnectionsWithNewStream(stream: MediaStream): Promise<void> {
127
+ console.info('🔄 Restarting connections with new stream...', { streamId: stream.id });
128
 
129
  // Close all existing connections
130
  for (const [consumerId, peerConnection] of this.consumerConnections) {
client/js/tsconfig.json CHANGED
@@ -1,32 +1,35 @@
1
  {
2
  "compilerOptions": {
3
- // Environment setup & latest features
4
- "lib": ["ESNext", "DOM"],
5
- "target": "ESNext",
6
- "module": "Preserve",
7
- "moduleDetection": "force",
8
- "jsx": "react-jsx",
9
- "allowJs": true,
10
-
11
- // Enable Bun types
12
- "types": ["bun-types"],
13
-
14
- // Bundler mode (for Vite)
15
  "moduleResolution": "bundler",
16
  "allowImportingTsExtensions": true,
17
  "verbatimModuleSyntax": true,
18
  "noEmit": true,
19
-
20
- // Best practices
 
21
  "strict": true,
22
- "skipLibCheck": true,
 
23
  "noFallthroughCasesInSwitch": true,
24
  "noUncheckedIndexedAccess": true,
25
- "noImplicitOverride": true,
26
-
27
- // Some stricter flags (disabled by default)
28
- "noUnusedLocals": false,
29
- "noUnusedParameters": false,
30
- "noPropertyAccessFromIndexSignature": false
31
- }
 
 
 
 
 
 
 
 
 
 
32
  }
 
1
  {
2
  "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["ES2022", "DOM"],
5
+ "module": "ESNext",
 
 
 
 
 
 
 
 
 
6
  "moduleResolution": "bundler",
7
  "allowImportingTsExtensions": true,
8
  "verbatimModuleSyntax": true,
9
  "noEmit": true,
10
+ "declaration": true,
11
+ "emitDeclarationOnly": true,
12
+ "outDir": "dist",
13
  "strict": true,
14
+ "noUnusedLocals": true,
15
+ "noUnusedParameters": true,
16
  "noFallthroughCasesInSwitch": true,
17
  "noUncheckedIndexedAccess": true,
18
+ "skipLibCheck": true,
19
+ "resolveJsonModule": true,
20
+ "allowSyntheticDefaultImports": true,
21
+ "esModuleInterop": true,
22
+ "forceConsistentCasingInFileNames": true,
23
+ "isolatedModules": true,
24
+ "types": ["bun-types"]
25
+ },
26
+ "include": [
27
+ "src/**/*.ts"
28
+ ],
29
+ "exclude": [
30
+ "node_modules",
31
+ "dist",
32
+ "**/*.config.*",
33
+ "**/vite.config.ts"
34
+ ]
35
  }
client/js/vite.config.ts DELETED
@@ -1,38 +0,0 @@
1
- import { defineConfig } from 'vite';
2
- import { resolve } from 'path';
3
- import dts from 'vite-plugin-dts';
4
-
5
- export default defineConfig({
6
- plugins: [
7
- dts({
8
- insertTypesEntry: true,
9
- rollupTypes: true,
10
- }),
11
- ],
12
- build: {
13
- lib: {
14
- entry: {
15
- index: resolve('src/index.ts'),
16
- video: resolve('src/video/index.ts'),
17
- robotics: resolve('src/robotics/index.ts'),
18
- },
19
- formats: ['es'],
20
- },
21
- rollupOptions: {
22
- external: ['eventemitter3'],
23
- output: {
24
- preserveModules: false,
25
- exports: 'named',
26
- },
27
- },
28
- target: 'esnext',
29
- minify: false,
30
- },
31
- resolve: {
32
- alias: {
33
- '@': resolve('src'),
34
- '@/video': resolve('src/video'),
35
- '@/robotics': resolve('src/robotics'),
36
- },
37
- },
38
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
client/python/README.md CHANGED
@@ -20,7 +20,7 @@ pip install -e ".[dev]"
20
 
21
  ```python
22
  import asyncio
23
- from lerobot_arena_client import RoboticsProducer
24
 
25
  async def main():
26
  # Create producer client
@@ -60,7 +60,7 @@ if __name__ == "__main__":
60
 
61
  ```python
62
  import asyncio
63
- from lerobot_arena_client import RoboticsConsumer
64
 
65
  async def main():
66
  consumer = RoboticsConsumer('http://localhost:8000')
@@ -105,7 +105,7 @@ if __name__ == "__main__":
105
 
106
  ```python
107
  import asyncio
108
- from lerobot_arena_client import create_client
109
 
110
  async def main():
111
  # Create clients using factory function
@@ -113,7 +113,7 @@ async def main():
113
  consumer = create_client("consumer", "http://localhost:8000")
114
 
115
  # Or use convenience functions
116
- from lerobot_arena_client import create_producer_client, create_consumer_client
117
 
118
  # Quick producer setup (auto-creates room and connects)
119
  producer = await create_producer_client('http://localhost:8000')
@@ -136,7 +136,7 @@ if __name__ == "__main__":
136
 
137
  ```python
138
  import asyncio
139
- from lerobot_arena_client import RoboticsProducer, RoboticsConsumer
140
 
141
  async def run_producer(room_id: str):
142
  async with RoboticsProducer() as producer:
 
20
 
21
  ```python
22
  import asyncio
23
+ from transport_server_client import RoboticsProducer
24
 
25
  async def main():
26
  # Create producer client
 
60
 
61
  ```python
62
  import asyncio
63
+ from transport_server_client import RoboticsConsumer
64
 
65
  async def main():
66
  consumer = RoboticsConsumer('http://localhost:8000')
 
105
 
106
  ```python
107
  import asyncio
108
+ from transport_server_client import create_client
109
 
110
  async def main():
111
  # Create clients using factory function
 
113
  consumer = create_client("consumer", "http://localhost:8000")
114
 
115
  # Or use convenience functions
116
+ from transport_server_client import create_producer_client, create_consumer_client
117
 
118
  # Quick producer setup (auto-creates room and connects)
119
  producer = await create_producer_client('http://localhost:8000')
 
136
 
137
  ```python
138
  import asyncio
139
+ from transport_server_client import RoboticsProducer, RoboticsConsumer
140
 
141
  async def run_producer(room_id: str):
142
  async with RoboticsProducer() as producer:
client/python/examples/basic_consumer.py CHANGED
@@ -12,7 +12,7 @@ This example demonstrates:
12
  import asyncio
13
  import logging
14
 
15
- from lerobot_arena_client import RoboticsConsumer
16
 
17
  # Setup logging
18
  logging.basicConfig(level=logging.INFO)
@@ -81,7 +81,7 @@ async def main():
81
  logger.info(f"Received {len(received_states)} state syncs")
82
 
83
  except Exception as e:
84
- logger.error(f"Error: {e}")
85
  finally:
86
  # Always disconnect
87
  if consumer.is_connected():
 
12
  import asyncio
13
  import logging
14
 
15
+ from transport_server_client import RoboticsConsumer
16
 
17
  # Setup logging
18
  logging.basicConfig(level=logging.INFO)
 
81
  logger.info(f"Received {len(received_states)} state syncs")
82
 
83
  except Exception as e:
84
+ logger.exception(f"Error: {e}")
85
  finally:
86
  # Always disconnect
87
  if consumer.is_connected():
client/python/examples/basic_producer.py CHANGED
@@ -12,7 +12,7 @@ This example demonstrates:
12
  import asyncio
13
  import logging
14
 
15
- from lerobot_arena_client import RoboticsProducer
16
 
17
  # Setup logging
18
  logging.basicConfig(level=logging.INFO)
@@ -65,7 +65,7 @@ async def main():
65
  logger.info("Example completed successfully!")
66
 
67
  except Exception as e:
68
- logger.error(f"Error: {e}")
69
  finally:
70
  # Always disconnect
71
  if producer.is_connected():
 
12
  import asyncio
13
  import logging
14
 
15
+ from transport_server_client import RoboticsProducer
16
 
17
  # Setup logging
18
  logging.basicConfig(level=logging.INFO)
 
65
  logger.info("Example completed successfully!")
66
 
67
  except Exception as e:
68
+ logger.exception(f"Error: {e}")
69
  finally:
70
  # Always disconnect
71
  if producer.is_connected():
client/python/examples/consumer_first_recorder.py CHANGED
@@ -18,7 +18,7 @@ from pathlib import Path
18
 
19
  import cv2
20
  import numpy as np
21
- from lerobot_arena_client.video import VideoConsumer
22
 
23
  # Setup logging
24
  logging.basicConfig(
@@ -123,7 +123,7 @@ class VideoRecorder:
123
  )
124
 
125
  except Exception as e:
126
- logger.error(f"❌ Error adding frame to recording: {e}")
127
 
128
  return False
129
 
@@ -290,7 +290,7 @@ async def main():
290
  logger.warning("⚠️ No recording was made - producer may not have joined")
291
 
292
  except Exception as e:
293
- logger.error(f"❌ Consumer-first recorder failed: {e}")
294
  import traceback
295
 
296
  traceback.print_exc()
@@ -303,7 +303,7 @@ async def main():
303
  await consumer.disconnect()
304
  logger.info("👋 Consumer disconnected successfully")
305
  except Exception as e:
306
- logger.error(f"Error during cleanup: {e}")
307
 
308
 
309
  if __name__ == "__main__":
@@ -313,7 +313,7 @@ if __name__ == "__main__":
313
  logger.info("🛑 Stopped by user")
314
  logger.info("👋 Goodbye!")
315
  except Exception as e:
316
- logger.error(f"💥 Fatal error: {e}")
317
  import traceback
318
 
319
  traceback.print_exc()
 
18
 
19
  import cv2
20
  import numpy as np
21
+ from transport_server_client.video import VideoConsumer
22
 
23
  # Setup logging
24
  logging.basicConfig(
 
123
  )
124
 
125
  except Exception as e:
126
+ logger.exception(f"❌ Error adding frame to recording: {e}")
127
 
128
  return False
129
 
 
290
  logger.warning("⚠️ No recording was made - producer may not have joined")
291
 
292
  except Exception as e:
293
+ logger.exception(f"❌ Consumer-first recorder failed: {e}")
294
  import traceback
295
 
296
  traceback.print_exc()
 
303
  await consumer.disconnect()
304
  logger.info("👋 Consumer disconnected successfully")
305
  except Exception as e:
306
+ logger.exception(f"Error during cleanup: {e}")
307
 
308
 
309
  if __name__ == "__main__":
 
313
  logger.info("🛑 Stopped by user")
314
  logger.info("👋 Goodbye!")
315
  except Exception as e:
316
+ logger.exception(f"💥 Fatal error: {e}")
317
  import traceback
318
 
319
  traceback.print_exc()
client/python/examples/context_manager_example.py CHANGED
@@ -12,7 +12,7 @@ This example demonstrates:
12
  import asyncio
13
  import logging
14
 
15
- from lerobot_arena_client import (
16
  RoboticsConsumer,
17
  RoboticsProducer,
18
  create_consumer_client,
@@ -67,7 +67,7 @@ async def factory_function_example():
67
 
68
  # Set up callback
69
  received_updates = []
70
- consumer.on_joint_update(lambda joints: received_updates.append(joints))
71
 
72
  # Send some updates
73
  await producer.send_joint_update([
@@ -99,14 +99,15 @@ async def exception_handling_example():
99
  for i in range(5):
100
  if i == 3:
101
  # Simulate an error
102
- raise ValueError("Simulated error during operation")
 
103
 
104
  await producer.send_state_sync({f"joint_{i}": float(i * 10)})
105
  logger.info(f"Sent update {i}")
106
  await asyncio.sleep(0.1)
107
 
108
  except ValueError as e:
109
- logger.error(f"Caught expected error: {e}")
110
  logger.info("Context manager still ensures cleanup")
111
 
112
  logger.info("Exception handling example completed")
@@ -170,7 +171,7 @@ async def main():
170
  logger.info("\n✅ All context manager examples completed successfully!")
171
 
172
  except Exception as e:
173
- logger.error(f"❌ Example failed: {e}")
174
 
175
 
176
  if __name__ == "__main__":
 
12
  import asyncio
13
  import logging
14
 
15
+ from transport_server_client import (
16
  RoboticsConsumer,
17
  RoboticsProducer,
18
  create_consumer_client,
 
67
 
68
  # Set up callback
69
  received_updates = []
70
+ consumer.on_joint_update(received_updates.append)
71
 
72
  # Send some updates
73
  await producer.send_joint_update([
 
99
  for i in range(5):
100
  if i == 3:
101
  # Simulate an error
102
+ msg = "Simulated error during operation"
103
+ raise ValueError(msg)
104
 
105
  await producer.send_state_sync({f"joint_{i}": float(i * 10)})
106
  logger.info(f"Sent update {i}")
107
  await asyncio.sleep(0.1)
108
 
109
  except ValueError as e:
110
+ logger.exception(f"Caught expected error: {e}")
111
  logger.info("Context manager still ensures cleanup")
112
 
113
  logger.info("Exception handling example completed")
 
171
  logger.info("\n✅ All context manager examples completed successfully!")
172
 
173
  except Exception as e:
174
+ logger.exception(f"❌ Example failed: {e}")
175
 
176
 
177
  if __name__ == "__main__":
client/python/examples/producer_consumer_demo.py CHANGED
@@ -14,7 +14,7 @@ import asyncio
14
  import logging
15
  import random
16
 
17
- from lerobot_arena_client import RoboticsConsumer, RoboticsProducer
18
 
19
  # Setup logging
20
  logging.basicConfig(level=logging.INFO)
@@ -200,7 +200,7 @@ async def main():
200
  logger.info("Demo completed successfully!")
201
 
202
  except Exception as e:
203
- logger.error(f"Demo error: {e}")
204
  finally:
205
  # Cleanup
206
  logger.info("Cleaning up...")
 
14
  import logging
15
  import random
16
 
17
+ from transport_server_client import RoboticsConsumer, RoboticsProducer
18
 
19
  # Setup logging
20
  logging.basicConfig(level=logging.INFO)
 
200
  logger.info("Demo completed successfully!")
201
 
202
  except Exception as e:
203
+ logger.exception(f"Demo error: {e}")
204
  finally:
205
  # Cleanup
206
  logger.info("Cleaning up...")
client/python/examples/room_management.py CHANGED
@@ -13,7 +13,7 @@ This example demonstrates:
13
  import asyncio
14
  import logging
15
 
16
- from lerobot_arena_client import RoboticsClientCore
17
 
18
  # Setup logging
19
  logging.basicConfig(level=logging.INFO)
@@ -86,7 +86,7 @@ async def main():
86
  logger.info("\nRoom management example completed!")
87
 
88
  except Exception as e:
89
- logger.error(f"Error: {e}")
90
 
91
 
92
  if __name__ == "__main__":
 
13
  import asyncio
14
  import logging
15
 
16
+ from transport_server_client import RoboticsClientCore
17
 
18
  # Setup logging
19
  logging.basicConfig(level=logging.INFO)
 
86
  logger.info("\nRoom management example completed!")
87
 
88
  except Exception as e:
89
+ logger.exception(f"Error: {e}")
90
 
91
 
92
  if __name__ == "__main__":
client/python/examples/test_consumer_fix.py CHANGED
@@ -13,7 +13,7 @@ from pathlib import Path
13
 
14
  import cv2
15
  import numpy as np
16
- from lerobot_arena_client.video import VideoConsumer
17
 
18
  # Setup logging
19
  logging.basicConfig(
@@ -83,7 +83,7 @@ class FrameProcessor:
83
  logger.info(f" Data received: {mb_received:.2f} MB")
84
 
85
  except Exception as e:
86
- logger.error(f"❌ Error processing frame {self.frame_count}: {e}")
87
 
88
 
89
  async def test_consumer_fix():
@@ -177,7 +177,7 @@ async def test_consumer_fix():
177
  return False
178
 
179
  except Exception as e:
180
- logger.error(f"❌ Test failed with error: {e}")
181
  import traceback
182
 
183
  traceback.print_exc()
@@ -203,7 +203,7 @@ async def main():
203
  logger.info("🛑 Test interrupted by user")
204
  return 1
205
  except Exception as e:
206
- logger.error(f"💥 Unexpected error: {e}")
207
  return 1
208
 
209
 
 
13
 
14
  import cv2
15
  import numpy as np
16
+ from transport_server_client.video import VideoConsumer
17
 
18
  # Setup logging
19
  logging.basicConfig(
 
83
  logger.info(f" Data received: {mb_received:.2f} MB")
84
 
85
  except Exception as e:
86
+ logger.exception(f"❌ Error processing frame {self.frame_count}: {e}")
87
 
88
 
89
  async def test_consumer_fix():
 
177
  return False
178
 
179
  except Exception as e:
180
+ logger.exception(f"❌ Test failed with error: {e}")
181
  import traceback
182
 
183
  traceback.print_exc()
 
203
  logger.info("🛑 Test interrupted by user")
204
  return 1
205
  except Exception as e:
206
+ logger.exception(f"💥 Unexpected error: {e}")
207
  return 1
208
 
209
 
client/python/examples/video_consumer_example.py CHANGED
@@ -13,7 +13,7 @@ from pathlib import Path
13
 
14
  import cv2
15
  import numpy as np
16
- from lerobot_arena_client.video import VideoConsumer
17
 
18
  # Setup logging
19
  logging.basicConfig(
@@ -81,7 +81,7 @@ class VideoFrameHandler:
81
  self.last_log_time = current_time
82
 
83
  except Exception as e:
84
- logger.error(f"❌ Error handling frame {self.frame_count}: {e}")
85
 
86
 
87
  async def main():
@@ -171,7 +171,7 @@ async def main():
171
  logger.warning("⚠️ No frames received - check if producer is active")
172
 
173
  except Exception as e:
174
- logger.error(f"❌ Consumer example failed: {e}")
175
  import traceback
176
 
177
  traceback.print_exc()
@@ -183,7 +183,7 @@ async def main():
183
  await consumer.stop_receiving()
184
  logger.info("👋 Consumer stopped successfully")
185
  except Exception as e:
186
- logger.error(f"Error during cleanup: {e}")
187
 
188
 
189
  if __name__ == "__main__":
@@ -192,7 +192,7 @@ if __name__ == "__main__":
192
  except KeyboardInterrupt:
193
  logger.info("👋 Goodbye!")
194
  except Exception as e:
195
- logger.error(f"💥 Fatal error: {e}")
196
  import traceback
197
 
198
  traceback.print_exc()
 
13
 
14
  import cv2
15
  import numpy as np
16
+ from transport_server_client.video import VideoConsumer
17
 
18
  # Setup logging
19
  logging.basicConfig(
 
81
  self.last_log_time = current_time
82
 
83
  except Exception as e:
84
+ logger.exception(f"❌ Error handling frame {self.frame_count}: {e}")
85
 
86
 
87
  async def main():
 
171
  logger.warning("⚠️ No frames received - check if producer is active")
172
 
173
  except Exception as e:
174
+ logger.exception(f"❌ Consumer example failed: {e}")
175
  import traceback
176
 
177
  traceback.print_exc()
 
183
  await consumer.stop_receiving()
184
  logger.info("👋 Consumer stopped successfully")
185
  except Exception as e:
186
+ logger.exception(f"Error during cleanup: {e}")
187
 
188
 
189
  if __name__ == "__main__":
 
192
  except KeyboardInterrupt:
193
  logger.info("👋 Goodbye!")
194
  except Exception as e:
195
+ logger.exception(f"💥 Fatal error: {e}")
196
  import traceback
197
 
198
  traceback.print_exc()
client/python/examples/video_producer_example.py CHANGED
@@ -13,7 +13,7 @@ import time
13
  import numpy as np
14
 
15
  # Import the video client
16
- from lerobot_arena_client.video import (
17
  VideoProducer,
18
  create_producer_client,
19
  )
@@ -134,7 +134,7 @@ async def main():
134
  await producer.stop_streaming()
135
 
136
  except Exception as e:
137
- logger.error(f"❌ Unexpected error: {e}")
138
  import traceback
139
 
140
  traceback.print_exc()
@@ -184,7 +184,7 @@ async def camera_example():
184
  logger.warning("⚠️ No cameras found")
185
 
186
  except Exception as e:
187
- logger.error(f"❌ Camera error: {e}")
188
  logger.info("💡 Make sure your camera is available and not used by other apps")
189
  finally:
190
  if "producer" in locals():
@@ -211,7 +211,7 @@ async def screen_share_example():
211
  await asyncio.sleep(20)
212
 
213
  except Exception as e:
214
- logger.error(f"❌ Screen share error: {e}")
215
  finally:
216
  if "producer" in locals():
217
  await producer.disconnect()
 
13
  import numpy as np
14
 
15
  # Import the video client
16
+ from transport_server_client.video import (
17
  VideoProducer,
18
  create_producer_client,
19
  )
 
134
  await producer.stop_streaming()
135
 
136
  except Exception as e:
137
+ logger.exception(f"❌ Unexpected error: {e}")
138
  import traceback
139
 
140
  traceback.print_exc()
 
184
  logger.warning("⚠️ No cameras found")
185
 
186
  except Exception as e:
187
+ logger.exception(f"❌ Camera error: {e}")
188
  logger.info("💡 Make sure your camera is available and not used by other apps")
189
  finally:
190
  if "producer" in locals():
 
211
  await asyncio.sleep(20)
212
 
213
  except Exception as e:
214
+ logger.exception(f"❌ Screen share error: {e}")
215
  finally:
216
  if "producer" in locals():
217
  await producer.disconnect()
client/python/pyproject.toml CHANGED
@@ -1,7 +1,7 @@
1
  [project]
2
- name = "robohub-transport-server-client"
3
  version = "1.0.0"
4
- description = "Python client for RoboHub transport server"
5
  readme = "README.md"
6
  requires-python = ">=3.12"
7
  dependencies = [
 
1
  [project]
2
+ name = "robothub_transport_server_client"
3
  version = "1.0.0"
4
+ description = "Python client for robothub transport server"
5
  readme = "README.md"
6
  requires-python = ">=3.12"
7
  dependencies = [
client/python/src/transport_server_client/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
  # Import video module
2
- from lerobot_arena_client import video
3
- from lerobot_arena_client.client import (
4
  RoboticsClientCore,
5
  RoboticsConsumer,
6
  RoboticsProducer,
 
1
  # Import video module
2
+ from transport_server_client import video
3
+ from transport_server_client.client import (
4
  RoboticsClientCore,
5
  RoboticsConsumer,
6
  RoboticsProducer,
client/python/src/transport_server_client/__pycache__/__init__.cpython-312.pyc CHANGED
Binary files a/client/python/src/transport_server_client/__pycache__/__init__.cpython-312.pyc and b/client/python/src/transport_server_client/__pycache__/__init__.cpython-312.pyc differ
 
client/python/src/transport_server_client/__pycache__/client.cpython-312.pyc CHANGED
Binary files a/client/python/src/transport_server_client/__pycache__/client.cpython-312.pyc and b/client/python/src/transport_server_client/__pycache__/client.cpython-312.pyc differ
 
client/python/src/transport_server_client/video/__pycache__/__init__.cpython-312.pyc CHANGED
Binary files a/client/python/src/transport_server_client/video/__pycache__/__init__.cpython-312.pyc and b/client/python/src/transport_server_client/video/__pycache__/__init__.cpython-312.pyc differ
 
client/python/src/transport_server_client/video/__pycache__/consumer.cpython-312.pyc CHANGED
Binary files a/client/python/src/transport_server_client/video/__pycache__/consumer.cpython-312.pyc and b/client/python/src/transport_server_client/video/__pycache__/consumer.cpython-312.pyc differ
 
client/python/src/transport_server_client/video/__pycache__/core.cpython-312.pyc CHANGED
Binary files a/client/python/src/transport_server_client/video/__pycache__/core.cpython-312.pyc and b/client/python/src/transport_server_client/video/__pycache__/core.cpython-312.pyc differ
 
client/python/src/transport_server_client/video/__pycache__/factory.cpython-312.pyc CHANGED
Binary files a/client/python/src/transport_server_client/video/__pycache__/factory.cpython-312.pyc and b/client/python/src/transport_server_client/video/__pycache__/factory.cpython-312.pyc differ
 
client/python/src/transport_server_client/video/__pycache__/producer.cpython-312.pyc CHANGED
Binary files a/client/python/src/transport_server_client/video/__pycache__/producer.cpython-312.pyc and b/client/python/src/transport_server_client/video/__pycache__/producer.cpython-312.pyc differ
 
client/python/src/transport_server_client/video/__pycache__/types.cpython-312.pyc CHANGED
Binary files a/client/python/src/transport_server_client/video/__pycache__/types.cpython-312.pyc and b/client/python/src/transport_server_client/video/__pycache__/types.cpython-312.pyc differ
 
client/python/tests/conftest.py CHANGED
@@ -2,7 +2,7 @@ import asyncio
2
 
3
  import pytest
4
  import pytest_asyncio
5
- from lerobot_arena_client import RoboticsConsumer, RoboticsProducer
6
 
7
  # Default server URL for tests
8
  TEST_SERVER_URL = "http://localhost:8000"
 
2
 
3
  import pytest
4
  import pytest_asyncio
5
+ from transport_server_client import RoboticsConsumer, RoboticsProducer
6
 
7
  # Default server URL for tests
8
  TEST_SERVER_URL = "http://localhost:8000"
client/python/tests/test_consumer.py CHANGED
@@ -1,7 +1,7 @@
1
  import asyncio
2
 
3
  import pytest
4
- from lerobot_arena_client import RoboticsConsumer
5
 
6
 
7
  class TestRoboticsConsumer:
@@ -36,7 +36,7 @@ class TestRoboticsConsumer:
36
  @pytest.mark.asyncio
37
  async def test_get_state_sync(self, connected_consumer):
38
  """Test getting current state synchronously."""
39
- consumer, room_id = connected_consumer
40
 
41
  state = await consumer.get_state_sync()
42
  assert isinstance(state, dict)
@@ -113,7 +113,7 @@ class TestRoboticsConsumer:
113
  @pytest.mark.asyncio
114
  async def test_consumer_receive_state_sync(self, producer_consumer_pair):
115
  """Test consumer receiving state sync from producer."""
116
- producer, consumer, room_id = producer_consumer_pair
117
 
118
  received_states = []
119
  received_updates = []
@@ -143,7 +143,7 @@ class TestRoboticsConsumer:
143
  @pytest.mark.asyncio
144
  async def test_consumer_receive_joint_updates(self, producer_consumer_pair):
145
  """Test consumer receiving joint updates from producer."""
146
- producer, consumer, room_id = producer_consumer_pair
147
 
148
  received_updates = []
149
 
@@ -175,7 +175,7 @@ class TestRoboticsConsumer:
175
  @pytest.mark.asyncio
176
  async def test_consumer_multiple_updates(self, producer_consumer_pair):
177
  """Test consumer receiving multiple updates."""
178
- producer, consumer, room_id = producer_consumer_pair
179
 
180
  received_updates = []
181
 
@@ -204,7 +204,7 @@ class TestRoboticsConsumer:
204
  @pytest.mark.asyncio
205
  async def test_consumer_emergency_stop(self, producer_consumer_pair):
206
  """Test consumer receiving emergency stop."""
207
- producer, consumer, room_id = producer_consumer_pair
208
 
209
  received_errors = []
210
 
@@ -276,7 +276,7 @@ class TestRoboticsConsumer:
276
  @pytest.mark.asyncio
277
  async def test_consumer_state_after_producer_updates(self, producer_consumer_pair):
278
  """Test that consumer can get updated state after producer sends updates."""
279
- producer, consumer, room_id = producer_consumer_pair
280
 
281
  # Give some time for connection to stabilize
282
  await asyncio.sleep(0.1)
 
1
  import asyncio
2
 
3
  import pytest
4
+ from transport_server_client import RoboticsConsumer
5
 
6
 
7
  class TestRoboticsConsumer:
 
36
  @pytest.mark.asyncio
37
  async def test_get_state_sync(self, connected_consumer):
38
  """Test getting current state synchronously."""
39
+ consumer, _room_id = connected_consumer
40
 
41
  state = await consumer.get_state_sync()
42
  assert isinstance(state, dict)
 
113
  @pytest.mark.asyncio
114
  async def test_consumer_receive_state_sync(self, producer_consumer_pair):
115
  """Test consumer receiving state sync from producer."""
116
+ producer, consumer, _room_id = producer_consumer_pair
117
 
118
  received_states = []
119
  received_updates = []
 
143
  @pytest.mark.asyncio
144
  async def test_consumer_receive_joint_updates(self, producer_consumer_pair):
145
  """Test consumer receiving joint updates from producer."""
146
+ producer, consumer, _room_id = producer_consumer_pair
147
 
148
  received_updates = []
149
 
 
175
  @pytest.mark.asyncio
176
  async def test_consumer_multiple_updates(self, producer_consumer_pair):
177
  """Test consumer receiving multiple updates."""
178
+ producer, consumer, _room_id = producer_consumer_pair
179
 
180
  received_updates = []
181
 
 
204
  @pytest.mark.asyncio
205
  async def test_consumer_emergency_stop(self, producer_consumer_pair):
206
  """Test consumer receiving emergency stop."""
207
+ producer, consumer, _room_id = producer_consumer_pair
208
 
209
  received_errors = []
210
 
 
276
  @pytest.mark.asyncio
277
  async def test_consumer_state_after_producer_updates(self, producer_consumer_pair):
278
  """Test that consumer can get updated state after producer sends updates."""
279
+ producer, consumer, _room_id = producer_consumer_pair
280
 
281
  # Give some time for connection to stabilize
282
  await asyncio.sleep(0.1)
client/python/tests/test_factory_functions.py CHANGED
@@ -1,7 +1,7 @@
1
  import asyncio
2
 
3
  import pytest
4
- from lerobot_arena_client import (
5
  RoboticsConsumer,
6
  RoboticsProducer,
7
  create_client,
 
1
  import asyncio
2
 
3
  import pytest
4
+ from transport_server_client import (
5
  RoboticsConsumer,
6
  RoboticsProducer,
7
  create_client,
client/python/tests/test_integration.py CHANGED
@@ -1,7 +1,7 @@
1
  import asyncio
2
 
3
  import pytest
4
- from lerobot_arena_client import (
5
  RoboticsProducer,
6
  create_consumer_client,
7
  create_producer_client,
@@ -98,12 +98,8 @@ class TestIntegration:
98
  consumer1_updates = []
99
  consumer2_updates = []
100
 
101
- consumer1.on_joint_update(
102
- lambda joints: consumer1_updates.append(joints)
103
- )
104
- consumer2.on_joint_update(
105
- lambda joints: consumer2_updates.append(joints)
106
- )
107
 
108
  # Wait for connections
109
  await asyncio.sleep(0.2)
@@ -150,8 +146,8 @@ class TestIntegration:
150
  consumer1_errors = []
151
  consumer2_errors = []
152
 
153
- consumer1.on_error(lambda error: consumer1_errors.append(error))
154
- consumer2.on_error(lambda error: consumer2_errors.append(error))
155
 
156
  # Wait for connections
157
  await asyncio.sleep(0.2)
@@ -193,7 +189,7 @@ class TestIntegration:
193
 
194
  try:
195
  received_updates = []
196
- consumer.on_joint_update(lambda joints: received_updates.append(joints))
197
 
198
  # Create producer and connect
199
  producer = RoboticsProducer("http://localhost:8000")
@@ -301,7 +297,7 @@ class TestIntegration:
301
 
302
  try:
303
  received_updates = []
304
- consumer.on_joint_update(lambda joints: received_updates.append(joints))
305
 
306
  # Wait for connection
307
  await asyncio.sleep(0.1)
 
1
  import asyncio
2
 
3
  import pytest
4
+ from transport_server_client import (
5
  RoboticsProducer,
6
  create_consumer_client,
7
  create_producer_client,
 
98
  consumer1_updates = []
99
  consumer2_updates = []
100
 
101
+ consumer1.on_joint_update(consumer1_updates.append)
102
+ consumer2.on_joint_update(consumer2_updates.append)
 
 
 
 
103
 
104
  # Wait for connections
105
  await asyncio.sleep(0.2)
 
146
  consumer1_errors = []
147
  consumer2_errors = []
148
 
149
+ consumer1.on_error(consumer1_errors.append)
150
+ consumer2.on_error(consumer2_errors.append)
151
 
152
  # Wait for connections
153
  await asyncio.sleep(0.2)
 
189
 
190
  try:
191
  received_updates = []
192
+ consumer.on_joint_update(received_updates.append)
193
 
194
  # Create producer and connect
195
  producer = RoboticsProducer("http://localhost:8000")
 
297
 
298
  try:
299
  received_updates = []
300
+ consumer.on_joint_update(received_updates.append)
301
 
302
  # Wait for connection
303
  await asyncio.sleep(0.1)
client/python/tests/test_producer.py CHANGED
@@ -1,7 +1,7 @@
1
  import asyncio
2
 
3
  import pytest
4
- from lerobot_arena_client import RoboticsProducer
5
 
6
 
7
  class TestRoboticsProducer:
@@ -36,7 +36,7 @@ class TestRoboticsProducer:
36
  @pytest.mark.asyncio
37
  async def test_send_joint_update(self, connected_producer):
38
  """Test sending joint updates."""
39
- producer, room_id = connected_producer
40
 
41
  joints = [
42
  {"name": "shoulder", "value": 45.0},
@@ -50,7 +50,7 @@ class TestRoboticsProducer:
50
  @pytest.mark.asyncio
51
  async def test_send_state_sync(self, connected_producer):
52
  """Test sending state synchronization."""
53
- producer, room_id = connected_producer
54
 
55
  state = {"shoulder": 45.0, "elbow": -20.0, "wrist": 10.0}
56
 
@@ -60,7 +60,7 @@ class TestRoboticsProducer:
60
  @pytest.mark.asyncio
61
  async def test_send_emergency_stop(self, connected_producer):
62
  """Test sending emergency stop."""
63
- producer, room_id = connected_producer
64
 
65
  # Should not raise an exception
66
  await producer.send_emergency_stop("Test emergency stop")
@@ -69,7 +69,7 @@ class TestRoboticsProducer:
69
  @pytest.mark.asyncio
70
  async def test_send_heartbeat(self, connected_producer):
71
  """Test sending heartbeat."""
72
- producer, room_id = connected_producer
73
 
74
  # Should not raise an exception
75
  await producer.send_heartbeat()
@@ -185,12 +185,10 @@ class TestRoboticsProducer:
185
  @pytest.mark.asyncio
186
  async def test_large_joint_update(self, connected_producer):
187
  """Test sending large joint update."""
188
- producer, room_id = connected_producer
189
 
190
  # Create a large joint update
191
- joints = []
192
- for i in range(100):
193
- joints.append({"name": f"joint_{i}", "value": float(i)})
194
 
195
  # Should handle large updates without issue
196
  await producer.send_joint_update(joints)
@@ -198,7 +196,7 @@ class TestRoboticsProducer:
198
  @pytest.mark.asyncio
199
  async def test_rapid_updates(self, connected_producer):
200
  """Test sending rapid joint updates."""
201
- producer, room_id = connected_producer
202
 
203
  # Send multiple rapid updates
204
  for i in range(10):
 
1
  import asyncio
2
 
3
  import pytest
4
+ from transport_server_client import RoboticsProducer
5
 
6
 
7
  class TestRoboticsProducer:
 
36
  @pytest.mark.asyncio
37
  async def test_send_joint_update(self, connected_producer):
38
  """Test sending joint updates."""
39
+ producer, _room_id = connected_producer
40
 
41
  joints = [
42
  {"name": "shoulder", "value": 45.0},
 
50
  @pytest.mark.asyncio
51
  async def test_send_state_sync(self, connected_producer):
52
  """Test sending state synchronization."""
53
+ producer, _room_id = connected_producer
54
 
55
  state = {"shoulder": 45.0, "elbow": -20.0, "wrist": 10.0}
56
 
 
60
  @pytest.mark.asyncio
61
  async def test_send_emergency_stop(self, connected_producer):
62
  """Test sending emergency stop."""
63
+ producer, _room_id = connected_producer
64
 
65
  # Should not raise an exception
66
  await producer.send_emergency_stop("Test emergency stop")
 
69
  @pytest.mark.asyncio
70
  async def test_send_heartbeat(self, connected_producer):
71
  """Test sending heartbeat."""
72
+ producer, _room_id = connected_producer
73
 
74
  # Should not raise an exception
75
  await producer.send_heartbeat()
 
185
  @pytest.mark.asyncio
186
  async def test_large_joint_update(self, connected_producer):
187
  """Test sending large joint update."""
188
+ producer, _room_id = connected_producer
189
 
190
  # Create a large joint update
191
+ joints = [{"name": f"joint_{i}", "value": float(i)} for i in range(100)]
 
 
192
 
193
  # Should handle large updates without issue
194
  await producer.send_joint_update(joints)
 
196
  @pytest.mark.asyncio
197
  async def test_rapid_updates(self, connected_producer):
198
  """Test sending rapid joint updates."""
199
+ producer, _room_id = connected_producer
200
 
201
  # Send multiple rapid updates
202
  for i in range(10):
client/python/tests/test_rest_api.py CHANGED
@@ -1,6 +1,6 @@
1
  import pytest
2
  import pytest_asyncio
3
- from lerobot_arena_client import RoboticsProducer
4
 
5
 
6
  @pytest_asyncio.fixture
 
1
  import pytest
2
  import pytest_asyncio
3
+ from transport_server_client import RoboticsProducer
4
 
5
 
6
  @pytest_asyncio.fixture
client/python/tests/test_video_client.py CHANGED
@@ -10,7 +10,7 @@ import logging
10
 
11
  import numpy as np
12
  import pytest
13
- from lerobot_arena_client.video import (
14
  CustomVideoTrack,
15
  ParticipantRole,
16
  Resolution,
@@ -162,15 +162,13 @@ class TestVideoClientIntegration:
162
  # (We can't actually connect without a server)
163
 
164
  try:
165
- producer = await create_producer_client("http://localhost:8000")
166
  except Exception:
167
  # Expected to fail without server
168
  pass
169
 
170
  try:
171
- consumer = await create_consumer_client(
172
- "test-room", "http://localhost:8000"
173
- )
174
  except Exception:
175
  # Expected to fail without server
176
  pass
 
10
 
11
  import numpy as np
12
  import pytest
13
+ from transport_server_client.video import (
14
  CustomVideoTrack,
15
  ParticipantRole,
16
  Resolution,
 
162
  # (We can't actually connect without a server)
163
 
164
  try:
165
+ await create_producer_client("http://localhost:8000")
166
  except Exception:
167
  # Expected to fail without server
168
  pass
169
 
170
  try:
171
+ await create_consumer_client("test-room", "http://localhost:8000")
 
 
172
  except Exception:
173
  # Expected to fail without server
174
  pass
demo/README.md CHANGED
@@ -153,7 +153,7 @@ bun run format
153
  The demo uses the local `lerobot-arena-client` package:
154
 
155
  ```typescript
156
- import { robotics } from '@robohub/transport-server-client';
157
 
158
  // Create clients
159
  const producer = new robotics.RoboticsProducer('http://localhost:8000');
 
153
  The demo uses the local `lerobot-arena-client` package:
154
 
155
  ```typescript
156
+ import { robotics } from '@robothub/transport-server-client';
157
 
158
  // Create clients
159
  const producer = new robotics.RoboticsProducer('http://localhost:8000');
demo/bun.lock CHANGED
@@ -4,7 +4,7 @@
4
  "": {
5
  "name": "demo",
6
  "dependencies": {
7
- "@robohub/transport-server-client": "https://gitpkg.now.sh/julien-blanchon/RoboHub/services/transport-server/client/js?main",
8
  },
9
  "devDependencies": {
10
  "@eslint/compat": "^1.2.5",
@@ -130,7 +130,7 @@
130
 
131
  "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="],
132
 
133
- "@robohub/transport-server-client": ["@robohub/transport-server-client@https://gitpkg.now.sh/julien-blanchon/RoboHub/services/transport-server/client/js?main", { "dependencies": { "eventemitter3": "^5.0.1" }, "peerDependencies": { "typescript": ">=5.0.0" } }],
134
 
135
  "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.41.1", "", { "os": "android", "cpu": "arm" }, "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw=="],
136
 
 
4
  "": {
5
  "name": "demo",
6
  "dependencies": {
7
+ "@robothub/transport-server-client": "https://gitpkg.now.sh/julien-blanchon/robothub/services/transport-server/client/js?main",
8
  },
9
  "devDependencies": {
10
  "@eslint/compat": "^1.2.5",
 
130
 
131
  "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="],
132
 
133
+ "@robothub/transport-server-client": ["@robothub/transport-server-client@https://gitpkg.now.sh/julien-blanchon/robothub/services/transport-server/client/js?main", { "dependencies": { "eventemitter3": "^5.0.1" }, "peerDependencies": { "typescript": ">=5.0.0" } }],
134
 
135
  "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.41.1", "", { "os": "android", "cpu": "arm" }, "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw=="],
136
 
demo/package.json CHANGED
@@ -35,6 +35,6 @@
35
  "vite": "^6.2.6"
36
  },
37
  "dependencies": {
38
- "@robohub/transport-server-client": "file:../client/js"
39
  }
40
  }
 
35
  "vite": "^6.2.6"
36
  },
37
  "dependencies": {
38
+ "@robothub/transport-server-client": "file:../client/js"
39
  }
40
  }
demo/src/routes/+page.svelte CHANGED
@@ -1,7 +1,7 @@
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
- import { robotics } from '@robohub/transport-server-client';
4
- import type { robotics as roboticsTypes } from '@robohub/transport-server-client';
5
  import { goto } from '$app/navigation';
6
 
7
  // Server status
 
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
+ import { robotics } from '@robothub/transport-server-client';
4
+ import type { robotics as roboticsTypes } from '@robothub/transport-server-client';
5
  import { goto } from '$app/navigation';
6
 
7
  // Server status
demo/src/routes/[workspaceId]/+page.svelte CHANGED
@@ -1,7 +1,7 @@
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
- import { robotics, video } from '@robohub/transport-server-client';
4
- import type { robotics as roboticsTypes, video as videoTypes } from '@robohub/transport-server-client';
5
 
6
  // Get data from load function
7
  let { data } = $props();
 
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
+ import { robotics, video } from '@robothub/transport-server-client';
4
+ import type { robotics as roboticsTypes, video as videoTypes } from '@robothub/transport-server-client';
5
 
6
  // Get data from load function
7
  let { data } = $props();
demo/src/routes/[workspaceId]/robotics/+page.svelte CHANGED
@@ -1,7 +1,7 @@
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
- import { robotics } from '@robohub/transport-server-client';
4
- import type { robotics as roboticsTypes } from '@robohub/transport-server-client';
5
 
6
  // Get data from load function
7
  let { data } = $props();
 
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
+ import { robotics } from '@robothub/transport-server-client';
4
+ import type { robotics as roboticsTypes } from '@robothub/transport-server-client';
5
 
6
  // Get data from load function
7
  let { data } = $props();
demo/src/routes/[workspaceId]/robotics/consumer/+page.svelte CHANGED
@@ -1,7 +1,7 @@
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
- import { robotics } from '@robohub/transport-server-client';
4
- import type { robotics as roboticsTypes } from '@robohub/transport-server-client';
5
 
6
  // Get data from load function
7
  let { data } = $props();
 
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
+ import { robotics } from '@robothub/transport-server-client';
4
+ import type { robotics as roboticsTypes } from '@robothub/transport-server-client';
5
 
6
  // Get data from load function
7
  let { data } = $props();
demo/src/routes/[workspaceId]/robotics/producer/+page.svelte CHANGED
@@ -1,6 +1,6 @@
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
- import { robotics } from '@robohub/transport-server-client';
4
 
5
  // Get data from load function
6
  let { data } = $props();
 
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
+ import { robotics } from '@robothub/transport-server-client';
4
 
5
  // Get data from load function
6
  let { data } = $props();
demo/src/routes/[workspaceId]/video/+page.svelte CHANGED
@@ -1,7 +1,7 @@
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
- import { video } from '@robohub/transport-server-client';
4
- import type { video as videoTypes } from '@robohub/transport-server-client';
5
 
6
  // Get data from load function
7
  let { data } = $props();
 
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
+ import { video } from '@robothub/transport-server-client';
4
+ import type { video as videoTypes } from '@robothub/transport-server-client';
5
 
6
  // Get data from load function
7
  let { data } = $props();
demo/src/routes/[workspaceId]/video/consumer/+page.svelte CHANGED
@@ -1,6 +1,6 @@
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
- import { video } from '@robohub/transport-server-client';
4
 
5
  // Get data from load function
6
  let { data } = $props();
 
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
+ import { video } from '@robothub/transport-server-client';
4
 
5
  // Get data from load function
6
  let { data } = $props();
demo/src/routes/[workspaceId]/video/producer/+page.svelte CHANGED
@@ -1,6 +1,6 @@
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
- import { video } from '@robohub/transport-server-client';
4
 
5
  // Get data from load function
6
  let { data } = $props();
 
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
+ import { video } from '@robothub/transport-server-client';
4
 
5
  // Get data from load function
6
  let { data } = $props();
demo/test-demo.js CHANGED
@@ -4,7 +4,7 @@
4
  * Simple test script to verify the demo application
5
  */
6
 
7
- import { robotics } from '@robohub/transport-server-client';
8
 
9
  console.log('🤖 Testing LeRobot Arena Demo');
10
  console.log('✅ Successfully imported robotics client');
 
4
  * Simple test script to verify the demo application
5
  */
6
 
7
+ import { robotics } from '@robothub/transport-server-client';
8
 
9
  console.log('🤖 Testing LeRobot Arena Demo');
10
  console.log('✅ Successfully imported robotics client');
server/pyproject.toml CHANGED
@@ -1,7 +1,7 @@
1
  [project]
2
- name = "robohub-transport-server"
3
  version = "1.0.0"
4
- description = "RoboHub transport server"
5
  readme = "README.md"
6
  requires-python = ">=3.12"
7
  dependencies = [
 
1
  [project]
2
+ name = "robothub-transport-server"
3
  version = "1.0.0"
4
+ description = "robothub transport server"
5
  readme = "README.md"
6
  requires-python = ">=3.12"
7
  dependencies = [
server/src/lerobot_arena_server.egg-info/PKG-INFO DELETED
@@ -1,10 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: lerobot_arena_server
3
- Version: 0.1.0
4
- Summary: Add your description here
5
- Requires-Python: >=3.12
6
- Description-Content-Type: text/markdown
7
- Requires-Dist: fastapi>=0.115.12
8
- Requires-Dist: opencv-python>=4.11.0.86
9
- Requires-Dist: pydantic>=2.11.5
10
- Requires-Dist: uvicorn[standard]>=0.34.3
 
 
 
 
 
 
 
 
 
 
 
server/src/lerobot_arena_server.egg-info/SOURCES.txt DELETED
@@ -1,19 +0,0 @@
1
- README.md
2
- pyproject.toml
3
- src/__init__.py
4
- src/api.py
5
- src/audio/__init__.py
6
- src/audio/api.py
7
- src/lerobot_arena_server.egg-info/PKG-INFO
8
- src/lerobot_arena_server.egg-info/SOURCES.txt
9
- src/lerobot_arena_server.egg-info/dependency_links.txt
10
- src/lerobot_arena_server.egg-info/requires.txt
11
- src/lerobot_arena_server.egg-info/top_level.txt
12
- src/robotics/__init__.py
13
- src/robotics/api.py
14
- src/robotics/core.py
15
- src/robotics/models.py
16
- src/video/__init__.py
17
- src/video/api.py
18
- src/video/core.py
19
- src/video/models.py