diff --git a/.github/workflows/fast-pr.yml b/.github/workflows/fast-pr.yml index c538132..d7d7a3b 100644 --- a/.github/workflows/fast-pr.yml +++ b/.github/workflows/fast-pr.yml @@ -48,8 +48,8 @@ jobs: - name: Run Clippy run: cargo clippy --all-targets --all-features -- -D warnings - test: - name: Test Suite + smoke: + name: Integration Smoke runs-on: ubuntu-latest steps: - name: Checkout code @@ -61,8 +61,14 @@ jobs: - name: Cache Rust build artifacts uses: Swatinem/rust-cache@v2 - - name: Run tests - run: cargo test --all-features --verbose + - name: Run Janus API integration smoke test + run: cargo test --test janus_api_integration_test --all-features - - name: Run doc tests - run: cargo test --doc --all-features --verbose + - name: Run HTTP server integration smoke test + run: cargo test --test http_server_integration_test --all-features + + - name: Run stream bus CLI smoke test + run: cargo test --test stream_bus_cli_test --all-features + + - name: Build HTTP client example + run: cargo build --example http_client_example --all-features diff --git a/GETTING_STARTED.md b/GETTING_STARTED.md index 7c3406d..67585d2 100644 --- a/GETTING_STARTED.md +++ b/GETTING_STARTED.md @@ -1,134 +1,86 @@ # Getting Started with Janus -This guide reflects the current state of the repository. - -Janus is primarily a backend Rust project. The most useful entry points today are: - -- `http_server` for the HTTP/WebSocket API -- `stream_bus_cli` for replaying RDF files into storage and MQTT -- the Rust test suite for validating the engine locally +Janus is a Rust engine for querying historical and live RDF data through one +Janus-QL model and one HTTP/WebSocket API. ## Prerequisites -- Rust stable -- Cargo -- Git -- Docker, if you want to run the local MQTT broker - -## Clone and Build - -```bash -git clone https://github.com/SolidLabResearch/janus.git -cd janus - -cargo build -``` +- Rust stable with Cargo +- Docker and Docker Compose if you want the MQTT-backed replay flow -## Run the Backend +## Fastest Working Path -### Option 1: Start the HTTP API +### 1. Build and test ```bash -cargo run --bin http_server +make build +make test ``` -The server listens on `http://127.0.0.1:8080` by default. - -### Option 2: Inspect the replay CLI +### 2. Start the HTTP server ```bash -cargo run --bin stream_bus_cli -- --help +cargo run --bin http_server -- --host 127.0.0.1 --port 8080 --storage-dir ./data/storage ``` -Typical usage: +Verify it is up: ```bash -cargo run --bin stream_bus_cli -- \ - --input data/sensors.nq \ - --broker none \ - --rate 0 +curl http://127.0.0.1:8080/health ``` -## Run Tests - -```bash -cargo test --all-features -``` +### 3. Exercise the API -## Run Lint Checks +The quickest end-to-end client is the example binary: ```bash -cargo clippy --all-targets --all-features -- -D warnings +cargo run --example http_client_example ``` -## Quick HTTP Flow +That example covers query registration, start, stop, replay control, and +WebSocket result consumption. -1. Start the server: +## Optional Local Demo UI -```bash -cargo run --bin http_server -``` +This repository keeps a small static demo at +`examples/demo_dashboard.html` for manual browser testing. -2. Register a query: +The maintained Svelte dashboard lives in the separate +`SolidLabResearch/janus-dashboard` repository. -```bash -curl -X POST http://localhost:8080/api/queries \ - -H "Content-Type: application/json" \ - -d '{ - "query_id": "demo_query", - "janusql": "PREFIX ex: SELECT ?s ?p ?o FROM NAMED WINDOW ex:w ON STREAM ex:sensorStream [START 0 END 9999999999999] WHERE { WINDOW ex:w { ?s ?p ?o . } }" - }' -``` - -3. Start the query: - -```bash -curl -X POST http://localhost:8080/api/queries/demo_query/start -``` +## Main Binaries -4. Subscribe to results: +- `http_server`: REST and WebSocket API for query lifecycle and replay control +- `stream_bus_cli`: replay and ingestion CLI for RDF event files -```text -ws://localhost:8080/api/queries/demo_query/results -``` - -5. Stop the query when done: +## Common Commands ```bash -curl -X POST http://localhost:8080/api/queries/demo_query/stop -``` - -## Project Layout - -```text -janus/ -├── src/ -│ ├── api/ # Janus API coordination layer -│ ├── core/ # RDF event types and encoding -│ ├── execution/ # Historical execution and result conversion -│ ├── http/ # HTTP and WebSocket server -│ ├── parsing/ # JanusQL parser -│ ├── querying/ # SPARQL execution adapters -│ ├── storage/ # Segmented storage and indexing -│ ├── stream/ # Live stream processing -│ └── stream_bus/ # Replay and broker integration -├── tests/ # Integration and module tests -├── examples/ # Example clients and benchmarks -├── docs/ # Documentation -└── janus-dashboard/ # Lightweight local demo dashboard +make build +make release +make test +make fmt +make fmt-check +make lint +make check +make ci-check ``` -## Dashboard Boundary - -This repository includes a small demo dashboard under `janus-dashboard/`, but the maintained dashboard lives separately: - -- `https://github.com/SolidLabResearch/janus-dashboard` +## Repository Layout -If you are working on frontend product features, use the separate dashboard repository. +- `src/api`: query lifecycle orchestration +- `src/http`: REST and WebSocket server +- `src/parsing`: Janus-QL parsing +- `src/execution`: historical execution +- `src/stream`: live stream processing +- `src/storage`: segmented RDF storage +- `src/bin`: executable binaries +- `examples`: runnable examples and a minimal static demo +- `tests`: integration coverage +- `docs`: current docs plus older design notes -## Recommended Next Reads +## Where to Read Next -- [START_HERE.md](./START_HERE.md) -- [docs/README_HTTP_API.md](./docs/README_HTTP_API.md) -- [docs/STREAM_BUS_CLI.md](./docs/STREAM_BUS_CLI.md) -- [docs/README.md](./docs/README.md) +- `README.md` +- `START_HERE.md` +- `docs/DOCUMENTATION_INDEX.md` diff --git a/README.md b/README.md index fbfedf3..f9ee576 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,15 @@ This example demonstrates: - replay control - WebSocket result consumption +### Frontend Boundary + +The maintained web dashboard lives in the separate +`SolidLabResearch/janus-dashboard` repository. + +This repository keeps a small static demo at +[`examples/demo_dashboard.html`](./examples/demo_dashboard.html) for manual API +testing, but frontend development should happen in the dedicated dashboard repo. + ## Development ### Common Commands @@ -145,6 +154,8 @@ make ci-check # local CI script The repository includes runnable examples under [`examples/`](./examples), including: - [`examples/http_client_example.rs`](./examples/http_client_example.rs) +- [`examples/comparator_demo.rs`](./examples/comparator_demo.rs) +- [`examples/demo_dashboard.html`](./examples/demo_dashboard.html) for a minimal local demo ## Documentation diff --git a/START_HERE.md b/START_HERE.md index 1dc6afc..c5edc6f 100644 --- a/START_HERE.md +++ b/START_HERE.md @@ -1,54 +1,32 @@ -# Janus Backend - Start Here - -Use this file if you want the fastest path to a working local backend. +# Janus Start Here ## Quick Start -### 1. Start the MQTT broker - ```bash docker-compose up -d mosquitto +cargo run --bin http_server -- --host 127.0.0.1 --port 8080 --storage-dir ./data/storage +curl http://127.0.0.1:8080/health ``` -### 2. Start the HTTP server - -```bash -cargo run --bin http_server -``` - -### 3. Check health - -```bash -curl http://localhost:8080/health -``` - -Expected response: - -```json -{"message":"Janus HTTP API is running"} -``` - -## Optional: Open the local demo dashboard - -This repository contains a small demo dashboard: +In another terminal, run: ```bash -open examples/demo_dashboard.html +cargo run --example http_client_example ``` -For the maintained frontend, use the separate repository: - -- `https://github.com/SolidLabResearch/janus-dashboard` - -## Most Useful Docs +## What To Use -- [GETTING_STARTED.md](./GETTING_STARTED.md) -- [docs/README_HTTP_API.md](./docs/README_HTTP_API.md) -- [docs/QUICKSTART_HTTP_API.md](./docs/QUICKSTART_HTTP_API.md) -- [docs/README.md](./docs/README.md) +- `http_server` is the main backend entry point +- `stream_bus_cli` is the ingestion and replay CLI +- `examples/demo_dashboard.html` is a minimal manual demo +- the maintained Svelte dashboard lives in the separate `janus-dashboard` repository -## Notes +## Current Docs -- The backend is the primary concern of this repository. -- `http_server` is the main user-facing executable. -- `stream_bus_cli` is the replay/ingestion CLI. +- `README.md` +- `GETTING_STARTED.md` +- `docs/DOCUMENTATION_INDEX.md` +- `docs/HTTP_API_CURRENT.md` +- `docs/README_HTTP_API.md` +- `docs/QUICKSTART_HTTP_API.md` +- `docs/QUICK_REFERENCE.md` diff --git a/docs/DOCUMENTATION_INDEX.md b/docs/DOCUMENTATION_INDEX.md index a67e801..7bccdf6 100644 --- a/docs/DOCUMENTATION_INDEX.md +++ b/docs/DOCUMENTATION_INDEX.md @@ -12,6 +12,7 @@ This is the shortest path to understanding the current Janus implementation. 6. [BASELINES.md](./BASELINES.md) 7. [HTTP_API_CURRENT.md](./HTTP_API_CURRENT.md) 8. [ANOMALY_DETECTION.md](./ANOMALY_DETECTION.md) +9. [QUICK_REFERENCE.md](./QUICK_REFERENCE.md) ## What Each File Covers @@ -38,19 +39,24 @@ This is the shortest path to understanding the current Janus implementation. - current REST endpoints - WebSocket result flow - request and response shapes - - `baseline_mode` registration fallback + - persisted query lifecycle status - [ANOMALY_DETECTION.md](./ANOMALY_DETECTION.md) - when extension functions are enough - when baseline state helps - recommended query patterns +- [QUICK_REFERENCE.md](./QUICK_REFERENCE.md) + - common local commands + - query lifecycle endpoints + - replay endpoints + - smoke-test flow + ## Additional Current Guides - [STREAM_BUS_CLI.md](./STREAM_BUS_CLI.md) - [README_HTTP_API.md](./README_HTTP_API.md) - [QUICKSTART_HTTP_API.md](./QUICKSTART_HTTP_API.md) -- [QUICK_REFERENCE.md](./QUICK_REFERENCE.md) ## Legacy Material @@ -58,9 +64,8 @@ The following files remain useful as background, but they are not the main entry - [ARCHITECTURE.md](./ARCHITECTURE.md) - [EXECUTION_ARCHITECTURE.md](./EXECUTION_ARCHITECTURE.md) -- [HTTP_API.md](./HTTP_API.md) -- [MVP_TODO.md](./MVP_TODO.md) - [MVP_ARCHITECTURE.md](./MVP_ARCHITECTURE.md) +- [MVP_TODO.md](./MVP_TODO.md) - [RSP_INTEGRATION_COMPLETE.md](./RSP_INTEGRATION_COMPLETE.md) - [SPARQL_BINDINGS_UPGRADE.md](./SPARQL_BINDINGS_UPGRADE.md) diff --git a/docs/QUICK_REFERENCE.md b/docs/QUICK_REFERENCE.md index 626bc72..90d58cd 100644 --- a/docs/QUICK_REFERENCE.md +++ b/docs/QUICK_REFERENCE.md @@ -1,22 +1,21 @@ -# Janus HTTP API - Quick Reference +# Janus Quick Reference -## Setup (3 Commands) +## Setup ```bash -./scripts/test_setup.sh # Optional local setup helper -docker-compose up -d mosquitto # Start MQTT -cargo run --bin http_server # Start server +docker-compose up -d mosquitto +cargo run --bin http_server -- --host 127.0.0.1 --port 8080 --storage-dir ./data/storage +cargo run --example http_client_example ``` -## Local Demo Dashboard +## Optional Manual Demo ```bash open examples/demo_dashboard.html ``` -For the maintained frontend, use: - -- `https://github.com/SolidLabResearch/janus-dashboard` +The static HTML demo is only for local manual testing. The maintained web +dashboard lives in the separate `janus-dashboard` repository. ## API Endpoints @@ -100,26 +99,13 @@ docker exec -it janus-mosquitto mosquitto_sub -t "sensors" -v docker-compose restart mosquitto ``` -## File Locations - -``` -janus/ -├── examples/demo_dashboard.html # Local demo client -├── docs/README_HTTP_API.md # Current HTTP guide -├── docs/QUICKSTART_HTTP_API.md # Short API quickstart -├── docs/SETUP_GUIDE.md # Detailed setup -└── scripts/test_setup.sh # Local setup helper -``` - ## Success Checklist - [ ] MQTT running: `docker ps | grep mosquitto` - [ ] Server running: `curl localhost:8080/health` -- [ ] Data exists: `ls data/sensors.nq` -- [ ] Query registers successfully -- [ ] Query starts successfully -- [ ] WebSocket receives results +- [ ] Example client runs: `cargo run --example http_client_example` +- [ ] Optional demo opens: `open examples/demo_dashboard.html` --- -**Quick Start:** `./scripts/test_setup.sh` then `cargo run --bin http_server` +**Quick Start:** `cargo run --bin http_server` then `cargo run --example http_client_example` diff --git a/docs/README.md b/docs/README.md index 1f2f9b3..dac27f6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,7 +2,8 @@ This directory contains the project documentation for Janus. -Some older files in this directory are design notes, implementation logs, or milestone-specific writeups. The files below are the current starting point for understanding how Janus works today. +Some files here are current product documentation. Others are older design or +milestone notes kept only for background context. ## Start Here @@ -11,13 +12,15 @@ Some older files in this directory are design notes, implementation logs, or mil - [QUERY_EXECUTION.md](./QUERY_EXECUTION.md): how registration, startup, historical execution, live execution, and result delivery work - [BASELINES.md](./BASELINES.md): `USING BASELINE`, `LAST`, `AGGREGATE`, and async warm-up - [HTTP_API_CURRENT.md](./HTTP_API_CURRENT.md): current REST and WebSocket API +- [README_HTTP_API.md](./README_HTTP_API.md): backend HTTP lifecycle guide +- [QUICKSTART_HTTP_API.md](./QUICKSTART_HTTP_API.md): shortest API validation flow - [ANOMALY_DETECTION.md](./ANOMALY_DETECTION.md): recommended anomaly-detection patterns and limitations +- [QUICK_REFERENCE.md](./QUICK_REFERENCE.md): short operational commands and endpoint summary ## Supporting Material - [ARCHITECTURE.md](./ARCHITECTURE.md): older high-level architecture notes - [EXECUTION_ARCHITECTURE.md](./EXECUTION_ARCHITECTURE.md): historical execution design notes -- [HTTP_API.md](./HTTP_API.md): earlier HTTP API writeup - [BENCHMARK_RESULTS.md](./BENCHMARK_RESULTS.md): benchmark data - [STREAM_BUS_CLI.md](./STREAM_BUS_CLI.md): replay and ingestion CLI @@ -29,9 +32,9 @@ The maintained dashboard lives in: - `https://github.com/SolidLabResearch/janus-dashboard` -The dashboard code checked into this repository should be treated as a local demo client unless stated otherwise. +The static demo in this repository is only for local manual backend testing. ## Notes -- The canonical docs above are intended to describe the current implementation on `main`. +- The files listed under Start Here are the current sources of truth for `main`. - Older files are still useful for background, but they may describe previous milestones or implementation states. diff --git a/docs/SETUP_GUIDE.md b/docs/SETUP_GUIDE.md deleted file mode 100644 index 765ff24..0000000 --- a/docs/SETUP_GUIDE.md +++ /dev/null @@ -1,530 +0,0 @@ -# Janus HTTP API - Complete Setup Guide - -This guide will walk you through setting up Janus with MQTT for both historical and live stream processing. - -## Prerequisites - -- Rust 1.70+ (`rustup update`) -- Docker and Docker Compose (for MQTT broker) -- Git - -## Quick Start (5 minutes) - -### Step 1: Start MQTT Broker - -```bash -# Navigate to janus directory -cd janus - -# Start Mosquitto MQTT broker with Docker Compose -docker-compose up -d - -# Verify MQTT is running -docker-compose ps -``` - -Expected output: -``` -NAME STATUS PORTS -janus-mosquitto Up 0.0.0.0:1883->1883/tcp, 0.0.0.0:9001->9001/tcp -``` - -### Step 2: Start Janus HTTP Server - -```bash -# In the janus directory -cargo run --bin http_server - -# Server will start on http://127.0.0.1:8080 -``` - -### Step 3: Open Demo Dashboard - -```bash -# Open in your default browser -open examples/demo_dashboard.html - -# Or manually navigate to: -# file:///path/to/janus/examples/demo_dashboard.html -``` - -### Step 4: Test the System - -1. **Click "Start Replay"** button - - Loads data from `data/sensors.nq` - - Publishes to MQTT topic `sensors` - - Stores in local storage - - Watch the metrics update in real-time - -2. **Click "Start Query"** button - - Registers and starts a historical query - - Connects WebSocket for results - - Watch results appear in the panel below - -## Detailed Setup - -### 1. Clone and Build - -```bash -# Clone the repository -git clone https://github.com/SolidLabResearch/janus.git -cd janus - -# Build the project -cargo build --release - -# Verify build -./target/release/http_server --help -``` - -### 2. MQTT Broker Setup - -#### Option A: Docker Compose (Recommended) - -```bash -# Start MQTT broker -docker-compose up -d mosquitto - -# Check logs -docker-compose logs -f mosquitto - -# Stop when done -docker-compose down -``` - -#### Option B: Local Mosquitto Installation - -**macOS:** -```bash -brew install mosquitto -mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf -``` - -**Linux (Ubuntu/Debian):** -```bash -sudo apt-get install mosquitto mosquitto-clients -sudo systemctl start mosquitto -sudo systemctl enable mosquitto -``` - -**Windows:** -Download from https://mosquitto.org/download/ - -Configuration file (`mosquitto.conf`): -```conf -listener 1883 -allow_anonymous true -``` - -#### Option C: Public MQTT Broker (Testing Only) - -You can use a public broker for testing: -- `test.mosquitto.org:1883` -- `broker.hivemq.com:1883` - -**Note:** Public brokers are NOT recommended for production or sensitive data. - -### 3. Prepare Test Data - -Create `data/sensors.nq` with sample RDF data: - -```bash -mkdir -p data - -cat > data/sensors.nq << 'EOF' - "23.5"^^ . - "2024-01-01T12:00:00Z"^^ . - "26.8"^^ . - "2024-01-01T12:00:01Z"^^ . - "21.2"^^ . - "2024-01-01T12:00:02Z"^^ . -EOF -``` - -### 4. Start HTTP Server - -```bash -# Default configuration (localhost:8080) -cargo run --bin http_server - -# Custom configuration -cargo run --bin http_server -- \ - --host 0.0.0.0 \ - --port 8080 \ - --storage-dir ./data/storage \ - --max-batch-size-bytes 10485760 \ - --flush-interval-ms 5000 -``` - -Server options: -- `--host`: Bind address (default: 127.0.0.1) -- `--port`: Server port (default: 8080) -- `--storage-dir`: Storage directory (default: ./data/storage) -- `--max-batch-size-bytes`: Max batch size before flush (default: 10MB) -- `--flush-interval-ms`: Flush interval in milliseconds (default: 5000ms) - -### 5. Verify Setup - -#### Test MQTT Broker - -```bash -# Terminal 1: Subscribe to test topic -docker exec -it janus-mosquitto mosquitto_sub -t "sensors" -v - -# Terminal 2: Publish test message -docker exec -it janus-mosquitto mosquitto_pub -t "sensors" -m "test message" -``` - -You should see "test message" in Terminal 1. - -#### Test HTTP Server - -```bash -# Health check -curl http://localhost:8080/health - -# Should return: {"message":"Janus HTTP API is running"} -``` - -## Usage Workflows - -### Workflow 1: Historical Query Only - -```bash -# Terminal 1: Start server -cargo run --bin http_server - -# Terminal 2: Register historical query -curl -X POST http://localhost:8080/api/queries \ - -H "Content-Type: application/json" \ - -d '{ - "query_id": "historical_temps", - "janusql": "PREFIX ex: REGISTER RStream ex:output AS SELECT ?sensor ?temp FROM NAMED WINDOW ex:histWindow ON STREAM ex:sensorStream [START 1704067200 END 1735689599] WHERE { WINDOW ex:histWindow { ?sensor ex:temperature ?temp . } }" - }' - -# Start replay (to populate storage) -curl -X POST http://localhost:8080/api/replay/start \ - -H "Content-Type: application/json" \ - -d '{ - "input_file": "data/sensors.nq", - "broker_type": "none", - "topics": ["sensors"], - "rate_of_publishing": 5000 - }' - -# Wait a few seconds, then start query -curl -X POST http://localhost:8080/api/queries/historical_temps/start - -# Connect WebSocket to get results (use browser console or websocket client) -``` - -### Workflow 2: Live Stream Processing - -```bash -# Ensure MQTT is running -docker-compose up -d mosquitto - -# Register live query -curl -X POST http://localhost:8080/api/queries \ - -H "Content-Type: application/json" \ - -d '{ - "query_id": "live_temps", - "janusql": "PREFIX ex: REGISTER RStream ex:output AS SELECT ?sensor ?temp FROM NAMED WINDOW ex:liveWindow ON STREAM ex:sensorStream [RANGE 10000 STEP 5000] WHERE { WINDOW ex:liveWindow { ?sensor ex:temperature ?temp . } }" - }' - -# Start query (before replay to catch all events) -curl -X POST http://localhost:8080/api/queries/live_temps/start - -# Start replay with MQTT -curl -X POST http://localhost:8080/api/replay/start \ - -H "Content-Type: application/json" \ - -d '{ - "input_file": "data/sensors.nq", - "broker_type": "mqtt", - "topics": ["sensors"], - "rate_of_publishing": 100, - "loop_file": true, - "mqtt_config": { - "host": "localhost", - "port": 1883, - "client_id": "janus_client", - "keep_alive_secs": 30 - } - }' - -# Results will stream via WebSocket at ws://localhost:8080/api/queries/live_temps/results -``` - -### Workflow 3: Hybrid (Historical + Live) - -```bash -# Register hybrid query -curl -X POST http://localhost:8080/api/queries \ - -H "Content-Type: application/json" \ - -d '{ - "query_id": "hybrid_analysis", - "janusql": "PREFIX ex: REGISTER RStream ex:output AS SELECT ?sensor ?temp FROM NAMED WINDOW ex:histWindow ON STREAM ex:sensorStream [START 1704067200 END 1704153599] FROM NAMED WINDOW ex:liveWindow ON STREAM ex:sensorStream [RANGE 30000 STEP 10000] WHERE { WINDOW ex:histWindow { ?sensor ex:temperature ?temp . } WINDOW ex:liveWindow { ?sensor ex:temperature ?temp . } }" - }' - -# Start replay with MQTT -curl -X POST http://localhost:8080/api/replay/start \ - -H "Content-Type: application/json" \ - -d '{ - "input_file": "data/sensors.nq", - "broker_type": "mqtt", - "topics": ["sensors"], - "rate_of_publishing": 1000, - "loop_file": true, - "mqtt_config": { - "host": "localhost", - "port": 1883, - "client_id": "janus_hybrid", - "keep_alive_secs": 30 - } - }' - -# Wait for data to load into storage -sleep 5 - -# Start query - will process historical first, then live -curl -X POST http://localhost:8080/api/queries/hybrid_analysis/start - -# WebSocket will receive: -# - Historical results tagged with "source": "historical" -# - Live results tagged with "source": "live" -``` - -## Monitoring and Debugging - -### Monitor MQTT Messages - -```bash -# Subscribe to all topics -docker exec -it janus-mosquitto mosquitto_sub -t "#" -v - -# Subscribe to specific topic -docker exec -it janus-mosquitto mosquitto_sub -t "sensors" -v -``` - -### Check Replay Status - -```bash -curl http://localhost:8080/api/replay/status | jq -``` - -### Check Query Status - -```bash -curl http://localhost:8080/api/queries/your_query_id | jq -``` - -### View Server Logs - -```bash -# Server logs are printed to stdout -# Look for: -# - "Janus HTTP API server listening on..." -# - Query registration confirmations -# - Error messages -``` - -### MQTT Broker Logs - -```bash -docker-compose logs -f mosquitto -``` - -## Troubleshooting - -### MQTT Broker Won't Start - -**Check if port 1883 is in use:** -```bash -lsof -i :1883 -``` - -**Solution:** Kill the process or use a different port -```bash -# Edit docker-compose.yml to change port -# Then restart -docker-compose down -docker-compose up -d -``` - -### No Data in MQTT Topic - -**Verify replay is publishing to MQTT:** -```bash -# Check replay status -curl http://localhost:8080/api/replay/status - -# Should show broker_type: "mqtt" -``` - -**Subscribe to topic to verify messages:** -```bash -docker exec -it janus-mosquitto mosquitto_sub -t "sensors" -v -``` - -### Live Query Not Receiving Events - -**Checklist:** -1. MQTT broker is running: `docker-compose ps` -2. Replay is using `broker_type: "mqtt"` -3. Query is started BEFORE replay (or replay is looping) -4. MQTT topic matches the query's stream name -5. Live window specification is correct - -**Debug steps:** -```bash -# 1. Verify MQTT messages -docker exec -it janus-mosquitto mosquitto_sub -t "sensors" -v - -# 2. Check query status -curl http://localhost:8080/api/queries/your_query_id - -# 3. Check server logs for errors -``` - -### WebSocket Connection Fails - -**Checklist:** -1. Query is registered: `GET /api/queries` -2. Query is started: `POST /api/queries/:id/start` -3. Browser allows WebSocket connections -4. Correct WebSocket URL: `ws://localhost:8080/api/queries/:id/results` - -**Test WebSocket with browser console:** -```javascript -const ws = new WebSocket('ws://localhost:8080/api/queries/your_query_id/results'); -ws.onopen = () => console.log('Connected'); -ws.onmessage = (e) => console.log('Message:', JSON.parse(e.data)); -ws.onerror = (e) => console.error('Error:', e); -``` - -### Server Won't Start - -**Port already in use:** -```bash -lsof -i :8080 -# Use different port -cargo run --bin http_server -- --port 8081 -``` - -**Build errors:** -```bash -# Clean and rebuild -cargo clean -cargo build --release -``` - -### No Results from Query - -**Historical queries:** -- Ensure data is in storage (run replay first) -- Check time window matches your data timestamps -- Verify N-Quads file is valid - -**Live queries:** -- Ensure MQTT broker is running -- Verify replay is publishing to MQTT -- Check query window specification - -## Performance Tuning - -### For High Throughput - -```bash -cargo run --bin http_server -- \ - --max-batch-size-bytes 52428800 \ - --flush-interval-ms 1000 -``` - -### For Low Latency - -```bash -cargo run --bin http_server -- \ - --max-batch-size-bytes 1048576 \ - --flush-interval-ms 100 -``` - -### MQTT Broker Tuning - -Edit `docker/mosquitto/config/mosquitto.conf`: -```conf -max_connections 1000 -max_queued_messages 10000 -message_size_limit 0 -``` - -Restart broker: -```bash -docker-compose restart mosquitto -``` - -## Production Deployment - -### Security Checklist - -- [ ] Add authentication to HTTP API -- [ ] Enable MQTT authentication -- [ ] Use HTTPS/WSS instead of HTTP/WS -- [ ] Restrict CORS to specific origins -- [ ] Add rate limiting -- [ ] Use firewall rules -- [ ] Enable SSL/TLS for MQTT - -### MQTT with Authentication - -Edit `docker/mosquitto/config/mosquitto.conf`: -```conf -allow_anonymous false -password_file /mosquitto/config/passwd -``` - -Create password file: -```bash -docker exec -it janus-mosquitto mosquitto_passwd -c /mosquitto/config/passwd username -docker-compose restart mosquitto -``` - -### Reverse Proxy (nginx) - -```nginx -server { - listen 80; - server_name janus.example.com; - - location / { - proxy_pass http://localhost:8080; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header Host $host; - } -} -``` - -## Next Steps - -1. Read the [HTTP API Documentation](HTTP_API.md) -2. Learn [JanusQL Query Language](JANUSQL.md) -3. Explore [Example Client](examples/http_client_example.rs) -4. Review [Architecture](ARCHITECTURE.md) -5. Check [Benchmark Results](BENCHMARK_RESULTS.md) - -## Support - -- GitHub Issues: https://github.com/SolidLabResearch/janus/issues -- Documentation: Complete API reference in `HTTP_API.md` - -## Summary - -You now have: -- ✅ MQTT broker running (Mosquitto) -- ✅ Janus HTTP server running -- ✅ Demo dashboard ready to use -- ✅ Sample data prepared -- ✅ Both historical and live processing capabilities - -**Ready to process RDF streams!** \ No newline at end of file diff --git a/janus-dashboard/.gitignore b/janus-dashboard/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/janus-dashboard/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/janus-dashboard/index.html b/janus-dashboard/index.html deleted file mode 100644 index 9b86771..0000000 --- a/janus-dashboard/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - janus-dashboard - - -
- - - diff --git a/janus-dashboard/package-lock.json b/janus-dashboard/package-lock.json deleted file mode 100644 index 04cb70f..0000000 --- a/janus-dashboard/package-lock.json +++ /dev/null @@ -1,1490 +0,0 @@ -{ - "name": "janus-dashboard", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "janus-dashboard", - "version": "0.0.0", - "dependencies": { - "echarts": "^6.0.0" - }, - "devDependencies": { - "@sveltejs/vite-plugin-svelte": "^6.2.1", - "@tsconfig/svelte": "^5.0.6", - "@types/node": "^24.10.1", - "svelte": "^5.43.8", - "svelte-check": "^4.3.4", - "typescript": "~5.9.3", - "vite": "^7.2.4" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.7.tgz", - "integrity": "sha512-znp1A/Y1Jj4l/Zy7PX5DZKBE0ZNY+5QBngiE21NJkfSTyzzC5iKNWOtwFXKtIrn7MXEFBck4jD95iBNkGjK92Q==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8.9.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", - "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", - "debug": "^4.4.1", - "deepmerge": "^4.3.1", - "magic-string": "^0.30.17", - "vitefu": "^1.1.1" - }, - "engines": { - "node": "^20.19 || ^22.12 || >=24" - }, - "peerDependencies": { - "svelte": "^5.0.0", - "vite": "^6.3.0 || ^7.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz", - "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.1" - }, - "engines": { - "node": "^20.19 || ^22.12 || >=24" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", - "svelte": "^5.0.0", - "vite": "^6.3.0 || ^7.0.0" - } - }, - "node_modules/@tsconfig/svelte": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.6.tgz", - "integrity": "sha512-yGxYL0I9eETH1/DR9qVJey4DAsCdeau4a9wYPKuXfEhm8lFO8wg+LLYJjIpAm6Fw7HSlhepPhYPDop75485yWQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/devalue": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.5.0.tgz", - "integrity": "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/echarts": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz", - "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "2.3.0", - "zrender": "6.0.0" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/esm-env": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/esrap": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.0.tgz", - "integrity": "sha512-WBmtxe7R9C5mvL4n2le8nMUe4mD5V9oiK2vJpQ9I3y20ENPUomPcphBXE8D1x/Bm84oN1V+lOfgXxtqmxTp3Xg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.6" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", - "fsevents": "~2.3.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/svelte": { - "version": "5.45.2", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.45.2.tgz", - "integrity": "sha512-yyXdW2u3H0H/zxxWoGwJoQlRgaSJLp+Vhktv12iRw2WRDlKqUPT54Fi0K/PkXqrdkcQ98aBazpy0AH4BCBVfoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "@jridgewell/sourcemap-codec": "^1.5.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/estree": "^1.0.5", - "acorn": "^8.12.1", - "aria-query": "^5.3.1", - "axobject-query": "^4.1.0", - "clsx": "^2.1.1", - "devalue": "^5.5.0", - "esm-env": "^1.2.1", - "esrap": "^2.2.0", - "is-reference": "^3.0.3", - "locate-character": "^3.0.0", - "magic-string": "^0.30.11", - "zimmerframe": "^1.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/svelte-check": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.4.tgz", - "integrity": "sha512-DVWvxhBrDsd+0hHWKfjP99lsSXASeOhHJYyuKOFYJcP7ThfSCKgjVarE8XfuMWpS5JV3AlDf+iK1YGGo2TACdw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "chokidar": "^4.0.1", - "fdir": "^6.2.0", - "picocolors": "^1.0.0", - "sade": "^1.7.4" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": ">=5.0.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "license": "0BSD" - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.4.tgz", - "integrity": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", - "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", - "dev": true, - "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*", - "tests/projects/workspace/packages/*" - ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/zimmerframe": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", - "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/zrender": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz", - "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", - "license": "BSD-3-Clause", - "dependencies": { - "tslib": "2.3.0" - } - } - } -} diff --git a/janus-dashboard/package.json b/janus-dashboard/package.json deleted file mode 100644 index 50224b9..0000000 --- a/janus-dashboard/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "janus-dashboard", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview", - "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json" - }, - "devDependencies": { - "@sveltejs/vite-plugin-svelte": "^6.2.1", - "@tsconfig/svelte": "^5.0.6", - "@types/node": "^24.10.1", - "svelte": "^5.43.8", - "svelte-check": "^4.3.4", - "typescript": "~5.9.3", - "vite": "^7.2.4" - }, - "dependencies": { - "echarts": "^6.0.0" - } -} diff --git a/janus-dashboard/public/vite.svg b/janus-dashboard/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/janus-dashboard/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/janus-dashboard/src/App.svelte b/janus-dashboard/src/App.svelte deleted file mode 100644 index b1b7e39..0000000 --- a/janus-dashboard/src/App.svelte +++ /dev/null @@ -1,336 +0,0 @@ - - -
- - -
- -
-
- - diff --git a/janus-dashboard/src/app.css b/janus-dashboard/src/app.css deleted file mode 100644 index 76cda08..0000000 --- a/janus-dashboard/src/app.css +++ /dev/null @@ -1,79 +0,0 @@ -:root { - font-family: "Inter", system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light; - color: #333333; - background-color: #ffffff; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -.card { - padding: 2em; -} - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/janus-dashboard/src/assets/svelte.svg b/janus-dashboard/src/assets/svelte.svg deleted file mode 100644 index c5e0848..0000000 --- a/janus-dashboard/src/assets/svelte.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/janus-dashboard/src/lib/Query.svelte b/janus-dashboard/src/lib/Query.svelte deleted file mode 100644 index 74313d3..0000000 --- a/janus-dashboard/src/lib/Query.svelte +++ /dev/null @@ -1,56 +0,0 @@ - - -
- - -
- - diff --git a/janus-dashboard/src/lib/StreamChart.svelte b/janus-dashboard/src/lib/StreamChart.svelte deleted file mode 100644 index 3cc741f..0000000 --- a/janus-dashboard/src/lib/StreamChart.svelte +++ /dev/null @@ -1,309 +0,0 @@ - - -
- - diff --git a/janus-dashboard/src/main.ts b/janus-dashboard/src/main.ts deleted file mode 100644 index 664a057..0000000 --- a/janus-dashboard/src/main.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { mount } from 'svelte' -import './app.css' -import App from './App.svelte' - -const app = mount(App, { - target: document.getElementById('app')!, -}) - -export default app diff --git a/janus-dashboard/svelte.config.js b/janus-dashboard/svelte.config.js deleted file mode 100644 index 96b3455..0000000 --- a/janus-dashboard/svelte.config.js +++ /dev/null @@ -1,8 +0,0 @@ -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' - -/** @type {import("@sveltejs/vite-plugin-svelte").SvelteConfig} */ -export default { - // Consult https://svelte.dev/docs#compile-time-svelte-preprocess - // for more information about preprocessors - preprocess: vitePreprocess(), -} diff --git a/janus-dashboard/tsconfig.app.json b/janus-dashboard/tsconfig.app.json deleted file mode 100644 index 31c18cf..0000000 --- a/janus-dashboard/tsconfig.app.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "@tsconfig/svelte/tsconfig.json", - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", - "target": "ES2022", - "useDefineForClassFields": true, - "module": "ESNext", - "types": ["svelte", "vite/client"], - "noEmit": true, - /** - * Typecheck JS in `.svelte` and `.js` files by default. - * Disable checkJs if you'd like to use dynamic types in JS. - * Note that setting allowJs false does not prevent the use - * of JS in `.svelte` files. - */ - "allowJs": true, - "checkJs": true, - "moduleDetection": "force" - }, - "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] -} diff --git a/janus-dashboard/tsconfig.json b/janus-dashboard/tsconfig.json deleted file mode 100644 index 1ffef60..0000000 --- a/janus-dashboard/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] -} diff --git a/janus-dashboard/tsconfig.node.json b/janus-dashboard/tsconfig.node.json deleted file mode 100644 index 8a67f62..0000000 --- a/janus-dashboard/tsconfig.node.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "target": "ES2023", - "lib": ["ES2023"], - "module": "ESNext", - "types": ["node"], - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "moduleDetection": "force", - "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "erasableSyntaxOnly": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/janus-dashboard/vite.config.ts b/janus-dashboard/vite.config.ts deleted file mode 100644 index d32eba1..0000000 --- a/janus-dashboard/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import { svelte } from '@sveltejs/vite-plugin-svelte' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [svelte()], -}) diff --git a/src/execution/historical_executor.rs b/src/execution/historical_executor.rs index f207028..768e206 100644 --- a/src/execution/historical_executor.rs +++ b/src/execution/historical_executor.rs @@ -95,21 +95,6 @@ impl HistoricalExecutor { self.execute_sparql_on_events(&events, sparql_query) } - /// Execute a sliding window query that returns an iterator of results (bypassing operator). - /// - /// Note: This is a simplified implementation that queries storage directly. - /// For production use, consider implementing proper window sliding logic. - #[allow(dead_code)] - fn execute_fixed_window_with_operator( - &self, - window: &WindowDefinition, - sparql_query: &str, - ) -> Result>, JanusApiError> { - // Original operator-based implementation kept for reference - // Note: Requires Arc->Rc conversion which is currently problematic - unimplemented!("Operator-based execution requires refactoring window operators to use Arc") - } - /// Execute a sliding window query that returns an iterator of results. /// /// # Arguments diff --git a/src/querying/kolibrie_adapter.rs b/src/querying/kolibrie_adapter.rs deleted file mode 100644 index 470c8e4..0000000 --- a/src/querying/kolibrie_adapter.rs +++ /dev/null @@ -1,44 +0,0 @@ -use crate::querying::query_processing::SparqlEngine; -use rsp_rs::QuadContainer; -use std::fmt; - -#[derive(Debug)] -pub struct KolibrieError; - -impl fmt::Display for KolibrieError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "Kolibrie error") - } -} - -impl std::error::Error for KolibrieError {} - -pub struct KolibrieAdapter {} - -impl KolibrieAdapter { - pub fn new() -> Self { - KolibrieAdapter {} - } -} - -impl SparqlEngine for KolibrieAdapter { - type EngineError = KolibrieError; - - fn execute_query( - &self, - query: &str, - container: &QuadContainer, - ) -> Result, Self::EngineError> { - // Here you would implement the actual query execution using Kolibrie - // For now, we'll log the container size and return an empty result set - - #[cfg(debug_assertions)] - { - println!("Executing query on Kolibrie adapter with {} quads", container.len()); - println!("Query: {}", query); - } - - // TODO: Implement actual Kolibrie query execution - Ok(vec![]) - } -} diff --git a/src/querying/main.rs b/src/querying/main.rs deleted file mode 100644 index 0c0d377..0000000 --- a/src/querying/main.rs +++ /dev/null @@ -1,43 +0,0 @@ -use crate::querying::kolibrie_adapter::KolibrieAdapter; -use crate::querying::oxigraph_adapter::OxigraphAdapter; -use crate::querying::query_processing::QueryProcessor; -use oxigraph::model::{GraphName, Literal, NamedNode, Quad}; -use rsp_rs::QuadContainer; -use std::collections::HashSet; - -#[allow(dead_code)] -fn main() { - let query = "SELECT ?s WHERE { ?s ?p ?o }"; - - // Create sample quads - let mut quads = HashSet::new(); - - // Add sample quad to the set - // Example: "Object1" in default graph - let subject = NamedNode::new("http://example.org/subject1").unwrap(); - let predicate = NamedNode::new("http://example.org/predicate1").unwrap(); - let object = Literal::new_simple_literal("Object1"); - let quad = Quad::new(subject, predicate, object, oxigraph::model::GraphName::DefaultGraph); - quads.insert(quad); - - // Create a QuadContainer with the quads and a timestamp - let timestamp = 1000; // milliseconds since epoch - let container = QuadContainer::new(quads, timestamp); - - let oxigraph_adapter = OxigraphAdapter::new(); - let kolibrie_adapter = KolibrieAdapter::new(); - - let query_processor_oxigraph = QueryProcessor::new(oxigraph_adapter); - let query_processor_kolibrie = QueryProcessor::new(kolibrie_adapter); - - // Pass the container to the query processor - match query_processor_oxigraph.process_query(query, &container) { - Ok(results) => println!("Oxigraph results: {:?}", results), - Err(e) => eprintln!("Oxigraph error: {}", e), - } - - match query_processor_kolibrie.process_query(query, &container) { - Ok(results) => println!("Kolibrie results: {:?}", results), - Err(e) => eprintln!("Kolibrie error: {}", e), - } -} diff --git a/src/querying/mod.rs b/src/querying/mod.rs index f3de775..9c10bc1 100644 --- a/src/querying/mod.rs +++ b/src/querying/mod.rs @@ -1,4 +1,2 @@ -pub mod kolibrie_adapter; -pub mod main; pub mod oxigraph_adapter; pub mod query_processing; diff --git a/src/sources/mod.rs b/src/sources/mod.rs index 0d33144..6bf9526 100644 --- a/src/sources/mod.rs +++ b/src/sources/mod.rs @@ -1,3 +1,2 @@ pub mod mqtt_adapter; -pub mod stream_ingestion_pipeline; pub mod stream_source; diff --git a/src/sources/stream_ingestion_pipeline.rs b/src/sources/stream_ingestion_pipeline.rs deleted file mode 100644 index 645444b..0000000 --- a/src/sources/stream_ingestion_pipeline.rs +++ /dev/null @@ -1,41 +0,0 @@ -use crate::core::RDFEvent; -use crate::sources::stream_source::StreamSource; -use crate::storage::segmented_storage::StreamingSegmentedStorage; -use std::sync::Arc; - -pub struct StreamIngestionPipeline { - storage: Arc, - sources: Vec>, -} - -impl StreamIngestionPipeline { - pub fn new(storage: Arc) -> Self { - StreamIngestionPipeline { storage, sources: Vec::new() } - } - - /// Adding a source for the stream ingestion pipeline (for example MQTT). - pub fn add_source(&mut self, source: Box) { - self.sources.push(source); - } - - /// Start the stream ingestion pipeline by subscribing to the sources and ingesting data - /// into storage as well as the live stream processing RSP Engine. - pub fn start(&self, topics: Vec) -> Result<(), Box> { - let storage = Arc::clone(&self.storage); - - // Shared callback writes to the storage (handles both storage and live processing) - let callback: Arc = Arc::new(move |event: RDFEvent| { - // Storage will handle the background flushing. - // TODO: Add live stream processing here as a process. - if let Err(e) = storage.write_rdf_event(event) { - eprintln!("Error writing to storage: {:?}", e); - } - }); - - for source in &self.sources { - source.subscribe(topics.clone(), Arc::clone(&callback))?; - } - - Ok(()) - } -}