Spaces:
Sleeping
Sleeping
Update
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .dockerignore +101 -50
- Dockerfile +73 -29
- client/js/README.md +3 -3
- client/js/bun.lock +0 -378
- client/js/package.json +9 -15
- client/js/src/video/producer.ts +1 -1
- client/js/tsconfig.json +25 -22
- client/js/vite.config.ts +0 -38
- client/python/README.md +5 -5
- client/python/examples/basic_consumer.py +2 -2
- client/python/examples/basic_producer.py +2 -2
- client/python/examples/consumer_first_recorder.py +5 -5
- client/python/examples/context_manager_example.py +6 -5
- client/python/examples/producer_consumer_demo.py +2 -2
- client/python/examples/room_management.py +2 -2
- client/python/examples/test_consumer_fix.py +4 -4
- client/python/examples/video_consumer_example.py +5 -5
- client/python/examples/video_producer_example.py +4 -4
- client/python/pyproject.toml +2 -2
- client/python/src/transport_server_client/__init__.py +2 -2
- client/python/src/transport_server_client/__pycache__/__init__.cpython-312.pyc +0 -0
- client/python/src/transport_server_client/__pycache__/client.cpython-312.pyc +0 -0
- client/python/src/transport_server_client/video/__pycache__/__init__.cpython-312.pyc +0 -0
- client/python/src/transport_server_client/video/__pycache__/consumer.cpython-312.pyc +0 -0
- client/python/src/transport_server_client/video/__pycache__/core.cpython-312.pyc +0 -0
- client/python/src/transport_server_client/video/__pycache__/factory.cpython-312.pyc +0 -0
- client/python/src/transport_server_client/video/__pycache__/producer.cpython-312.pyc +0 -0
- client/python/src/transport_server_client/video/__pycache__/types.cpython-312.pyc +0 -0
- client/python/tests/conftest.py +1 -1
- client/python/tests/test_consumer.py +7 -7
- client/python/tests/test_factory_functions.py +1 -1
- client/python/tests/test_integration.py +7 -11
- client/python/tests/test_producer.py +8 -10
- client/python/tests/test_rest_api.py +1 -1
- client/python/tests/test_video_client.py +3 -5
- demo/README.md +1 -1
- demo/bun.lock +2 -2
- demo/package.json +1 -1
- demo/src/routes/+page.svelte +2 -2
- demo/src/routes/[workspaceId]/+page.svelte +2 -2
- demo/src/routes/[workspaceId]/robotics/+page.svelte +2 -2
- demo/src/routes/[workspaceId]/robotics/consumer/+page.svelte +2 -2
- demo/src/routes/[workspaceId]/robotics/producer/+page.svelte +1 -1
- demo/src/routes/[workspaceId]/video/+page.svelte +2 -2
- demo/src/routes/[workspaceId]/video/consumer/+page.svelte +1 -1
- demo/src/routes/[workspaceId]/video/producer/+page.svelte +1 -1
- demo/test-demo.js +1 -1
- server/pyproject.toml +2 -2
- server/src/lerobot_arena_server.egg-info/PKG-INFO +0 -10
- server/src/lerobot_arena_server.egg-info/SOURCES.txt +0 -19
.dockerignore
CHANGED
@@ -1,52 +1,103 @@
|
|
1 |
-
#
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
.
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
.
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
|
43 |
# Test files
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
11 |
-
COPY client/js/ ./client/js/
|
12 |
-
COPY demo/ ./demo/
|
13 |
|
14 |
-
#
|
15 |
WORKDIR /app/client/js
|
16 |
-
RUN bun install
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
RUN bun run build
|
18 |
RUN bun link
|
19 |
|
20 |
-
#
|
21 |
WORKDIR /app/demo
|
22 |
-
RUN bun link
|
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 |
-
#
|
41 |
-
RUN useradd -m -u 1000
|
42 |
-
|
43 |
-
# Switch to the "user" user
|
44 |
-
USER user
|
45 |
|
46 |
-
# Set
|
47 |
-
|
48 |
-
|
49 |
|
50 |
-
#
|
51 |
-
|
52 |
|
53 |
-
# Copy
|
54 |
-
COPY --chown=
|
55 |
|
56 |
# Install dependencies first (better caching)
|
57 |
-
WORKDIR
|
58 |
-
RUN uv
|
|
|
59 |
|
60 |
# Copy the rest of the Python backend
|
61 |
-
COPY --chown=
|
62 |
|
63 |
-
# Install the project
|
64 |
-
RUN uv
|
|
|
65 |
|
66 |
# Copy built frontend from previous stage with proper ownership
|
67 |
-
COPY --chown=
|
68 |
|
69 |
# Set working directory back to app root
|
70 |
-
WORKDIR
|
|
|
|
|
|
|
71 |
|
72 |
-
# Expose port 7860 (
|
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 '@
|
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 '@
|
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 '@
|
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": "@
|
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 &&
|
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/
|
65 |
"directory": "services/transport-server/client/js"
|
66 |
},
|
67 |
"bugs": {
|
68 |
-
"url": "https://github.com/julien-blanchon/
|
69 |
},
|
70 |
-
"homepage": "https://github.com/julien-blanchon/
|
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 |
-
|
4 |
-
"lib": ["
|
5 |
-
"
|
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 |
-
|
|
|
21 |
"strict": true,
|
22 |
-
"
|
|
|
23 |
"noFallthroughCasesInSwitch": true,
|
24 |
"noUncheckedIndexedAccess": true,
|
25 |
-
"
|
26 |
-
|
27 |
-
|
28 |
-
"
|
29 |
-
"
|
30 |
-
"
|
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
|
24 |
|
25 |
async def main():
|
26 |
# Create producer client
|
@@ -60,7 +60,7 @@ if __name__ == "__main__":
|
|
60 |
|
61 |
```python
|
62 |
import asyncio
|
63 |
-
from
|
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
|
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
|
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
|
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
|
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.
|
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
|
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.
|
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
|
22 |
|
23 |
# Setup logging
|
24 |
logging.basicConfig(
|
@@ -123,7 +123,7 @@ class VideoRecorder:
|
|
123 |
)
|
124 |
|
125 |
except Exception as e:
|
126 |
-
logger.
|
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.
|
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.
|
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.
|
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
|
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(
|
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 |
-
|
|
|
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.
|
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.
|
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
|
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.
|
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
|
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.
|
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
|
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.
|
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.
|
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.
|
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
|
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.
|
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.
|
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.
|
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.
|
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
|
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.
|
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.
|
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.
|
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 = "
|
3 |
version = "1.0.0"
|
4 |
-
description = "Python client for
|
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
|
3 |
-
from
|
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
|
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
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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
|
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
|
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 |
-
|
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(
|
154 |
-
consumer2.on_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(
|
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(
|
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
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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
|
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
|
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 |
-
|
166 |
except Exception:
|
167 |
# Expected to fail without server
|
168 |
pass
|
169 |
|
170 |
try:
|
171 |
-
|
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 '@
|
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 |
-
"@
|
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 |
-
"@
|
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 |
-
"@
|
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 '@
|
4 |
-
import type { robotics as roboticsTypes } from '@
|
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 '@
|
4 |
-
import type { robotics as roboticsTypes, video as videoTypes } from '@
|
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 '@
|
4 |
-
import type { robotics as roboticsTypes } from '@
|
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 '@
|
4 |
-
import type { robotics as roboticsTypes } from '@
|
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 '@
|
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 '@
|
4 |
-
import type { video as videoTypes } from '@
|
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 '@
|
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 '@
|
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 '@
|
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 = "
|
3 |
version = "1.0.0"
|
4 |
-
description = "
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|