diff --git a/.beads/.gitignore b/.beads/.gitignore new file mode 100644 index 00000000..8ff02f42 --- /dev/null +++ b/.beads/.gitignore @@ -0,0 +1,17 @@ +# SQLite databases +*.db +*.db-journal +*.db-wal +*.db-shm + +# Daemon runtime files +daemon.log +daemon.pid +bd.sock + +# Legacy database files +db.sqlite +bd.db + +# Keep JSONL exports (source of truth for git) +!*.jsonl diff --git a/.beads/config.json b/.beads/config.json new file mode 100644 index 00000000..ab1df070 --- /dev/null +++ b/.beads/config.json @@ -0,0 +1,5 @@ +{ + "database": "beads.db", + "version": "0.17.7", + "jsonl_export": "beads.jsonl" +} \ No newline at end of file diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl new file mode 100644 index 00000000..775508fa --- /dev/null +++ b/.beads/issues.jsonl @@ -0,0 +1,45 @@ +{"id":"scotty-1","title":"Unified Output System - Complete Implementation","description":"Parent epic tracking the unified output system for logs and interactive shell access. Backend is complete, CLI logs working, but some frontend features and CLI shell command remain.","design":"See docs/prds/unified-output-system.md for complete technical specification. Current status: Phase 1-3.7 and Phase 5 complete, Phase 4 partially complete.","status":"open","priority":1,"issue_type":"epic","created_at":"2025-10-25T00:58:21.660841+02:00","updated_at":"2025-10-25T00:58:21.660841+02:00"} +{"id":"scotty-10","title":"Instrument shell service with metrics","description":"Add metrics recording to ShellService for session counts, durations, errors, and timeouts.","design":"Instrument ShellService:\n- Track shell_sessions_active gauge\n- Increment shell_sessions_total counter\n- Record shell_session_duration histogram\n- Track shell_session_errors and timeouts","acceptance_criteria":"- Session metrics recorded correctly\n- Duration tracking works\n- Timeout cases tracked separately\n- Memory leak tests pass","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-25T01:28:15.964474+02:00","updated_at":"2025-10-26T18:37:15.004569+01:00","closed_at":"2025-10-26T18:37:15.004569+01:00","dependencies":[{"issue_id":"scotty-10","depends_on_id":"scotty-5","type":"parent-child","created_at":"2025-10-25T01:28:30.18956+02:00","created_by":"daemon"},{"issue_id":"scotty-10","depends_on_id":"scotty-8","type":"blocks","created_at":"2025-10-25T01:28:42.15994+02:00","created_by":"daemon"}]} +{"id":"scotty-11","title":"Instrument WebSocket connections with metrics","description":"Add metrics to WebSocket client management for connection counts, message throughput, and authentication failures.","design":"Instrument WebSocket layer:\n- Track websocket_connections_active\n- Count messages sent/received\n- Track authentication failures\n- Monitor disconnect events","acceptance_criteria":"- Connection lifecycle tracked\n- Message counters increment correctly\n- Auth failure tracking works\n- No overhead on message path","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-25T01:28:16.086525+02:00","updated_at":"2025-10-26T17:38:41.091932+01:00","closed_at":"2025-10-26T17:38:41.091932+01:00","dependencies":[{"issue_id":"scotty-11","depends_on_id":"scotty-5","type":"parent-child","created_at":"2025-10-25T01:28:30.272345+02:00","created_by":"daemon"},{"issue_id":"scotty-11","depends_on_id":"scotty-8","type":"blocks","created_at":"2025-10-25T01:28:42.23292+02:00","created_by":"daemon"}]} +{"id":"scotty-12","title":"Add observability stack to docker-compose","description":"Create docker-compose.observability.yml with OTel Collector, VictoriaMetrics, and Grafana services. Create OTel Collector configuration file.","design":"Create docker-compose.observability.yml with:\n- otel-collector service (ports 4317/4318)\n- victoriametrics service (port 8428)\n- grafana service (port 3000)\n- Create otel-collector-config.yaml with trace/metrics pipelines\n- Add Traefik labels for ddev.site domains","acceptance_criteria":"- docker-compose up works with observability stack\n- OTel Collector receives metrics on port 4317\n- VictoriaMetrics stores metrics\n- Grafana accessible at grafana.ddev.site\n- No port conflicts with existing services","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-25T01:28:16.207816+02:00","updated_at":"2025-10-25T01:38:25.612801+02:00","closed_at":"2025-10-25T01:38:25.612801+02:00","dependencies":[{"issue_id":"scotty-12","depends_on_id":"scotty-5","type":"parent-child","created_at":"2025-10-25T01:28:30.352479+02:00","created_by":"daemon"}]} +{"id":"scotty-13","title":"Create Grafana dashboards for Scotty metrics","description":"Create Grafana dashboard JSON and provisioning config showing unified output system metrics with panels for log streams, shell sessions, WebSocket connections, and tasks.","design":"Create Grafana assets:\n- grafana/provisioning/datasources/datasources.yaml (VictoriaMetrics + Jaeger)\n- grafana/provisioning/dashboards/dashboards.yaml\n- grafana/dashboards/scotty-unified-output.json\n- Panels: active streams, session durations, message rates, error rates","acceptance_criteria":"- Grafana dashboard loads automatically\n- All panels show live data\n- VictoriaMetrics datasource works\n- Dashboard is intuitive and useful\n- Export JSON to git","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-25T01:28:16.355104+02:00","updated_at":"2025-10-25T15:21:28.683425+02:00","closed_at":"2025-10-25T15:21:28.683425+02:00","dependencies":[{"issue_id":"scotty-13","depends_on_id":"scotty-5","type":"parent-child","created_at":"2025-10-25T01:28:30.434812+02:00","created_by":"daemon"},{"issue_id":"scotty-13","depends_on_id":"scotty-12","type":"blocks","created_at":"2025-10-25T01:28:42.307778+02:00","created_by":"daemon"}]} +{"id":"scotty-14","title":"Document metrics and observability setup","description":"Write documentation for setting up and using the observability stack, including metrics available, dashboard usage, and troubleshooting.","design":"Documentation:\n- README section on observability\n- docs/observability/setup.md - How to run the stack\n- docs/observability/metrics.md - Available metrics reference\n- docs/observability/dashboards.md - Dashboard guide\n- Troubleshooting common issues","acceptance_criteria":"- Setup instructions are clear and complete\n- Metrics reference documents all instruments\n- Dashboard guide has screenshots\n- Troubleshooting covers common issues\n- Updates to main README.md","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-25T01:28:16.527864+02:00","updated_at":"2025-10-26T18:43:52.600539+01:00","closed_at":"2025-10-26T18:43:52.600539+01:00","dependencies":[{"issue_id":"scotty-14","depends_on_id":"scotty-5","type":"parent-child","created_at":"2025-10-25T01:28:30.517999+02:00","created_by":"daemon"}]} +{"id":"scotty-15","title":"Upgrade OpenTelemetry dependencies to latest versions","description":"Upgrade opentelemetry, opentelemetry_sdk, and opentelemetry-otlp crates to their latest stable versions to get bug fixes, performance improvements, and new features.","design":"Check current versions in Cargo.toml workspace dependencies:\n- opentelemetry = \"0.28.0\"\n- opentelemetry_sdk = \"0.28\"\n- opentelemetry-otlp = \"0.28.0\"\n\nResearch latest versions on crates.io and upgrade incrementally. Update any API changes in:\n- scotty/src/metrics/init.rs\n- scotty/src/metrics/instruments.rs\n- scotty/src/init_telemetry.rs\n\nTest that traces and metrics still export correctly after upgrade.","acceptance_criteria":"- All opentelemetry crates upgraded to latest stable versions\n- Cargo.toml updated with new versions\n- Code compiles without errors\n- Metrics initialization works\n- Traces export successfully\n- No breaking changes in existing functionality","notes":"Successfully upgraded OpenTelemetry from 0.28 to 0.31 (latest stable version):\n\nUpgraded crates:\n- opentelemetry: 0.28.0 → 0.31.0\n- opentelemetry_sdk: 0.28 → 0.31\n- opentelemetry-otlp: 0.28.0 → 0.31.0 (added grpc-tonic feature)\n- tracing-opentelemetry: 0.29 → 0.32\n- axum-tracing-opentelemetry: 0.26.0 → 0.32.1\n- init-tracing-opentelemetry: 0.27.0 → 0.32.1\n\nAPI changes handled:\n- Fixed TraceError import (moved to opentelemetry_sdk::trace)\n- Updated init_tracerprovider imports (now in otlp::traces module)\n- Fixed TracingConfig import (moved to config module)\n- Added error conversion for init_tracerprovider\n- Fixed build_layer() result handling\n\nRemoved axum-otel-metrics due to version conflict (required 0.30 while ecosystem moved to 0.31). Implemented custom HTTP metrics middleware instead.\n\nImplementation notes:\n- Created scotty/src/metrics/http.rs with custom middleware\n- Tracks http_requests_total, http_request_duration, http_requests_active\n- Fixed telemetry_enabled flag to check for both 'traces' and 'metrics'\n- All metrics exporting correctly to VictoriaMetrics\n- Grafana dashboard updated with correct metric names\n\nCommits: bb28b5cd, 075c755b, 8e297537","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-25T01:51:52.305855+02:00","updated_at":"2025-10-25T18:54:58.935792+02:00","closed_at":"2025-10-25T18:54:58.935792+02:00","dependencies":[{"issue_id":"scotty-15","depends_on_id":"scotty-8","type":"blocks","created_at":"2025-10-25T01:51:52.306614+02:00","created_by":"daemon"}]} +{"id":"scotty-16","title":"Instrument task output streaming with metrics","description":"Add metrics recording to TaskOutputStreamingService for task counts, durations, errors, and output volume.","design":"Instrument TaskOutputStreamingService similar to LogStreamingService:\n- Track tasks_active gauge (current running tasks)\n- Track tasks_total counter (cumulative task count)\n- Add task_output_lines counter (throughput tracking)\n- Add task_errors counter (error tracking)\n- Consider task_duration histogram if tasks have clear lifecycle\n\nLocation: scotty/src/tasks/output_streaming.rs\nPattern: Use metrics::get_metrics() to access global metrics instance","acceptance_criteria":"- Metrics recorded at task start/end\n- Output lines counted\n- Error cases tracked\n- No performance degradation\n- Code compiles and tests pass","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-25T02:29:59.988921+02:00","updated_at":"2025-10-26T18:10:42.53396+01:00","closed_at":"2025-10-26T18:10:42.53396+01:00","dependencies":[{"issue_id":"scotty-16","depends_on_id":"scotty-8","type":"blocks","created_at":"2025-10-25T02:29:59.990577+02:00","created_by":"daemon"}]} +{"id":"scotty-17","title":"Add memory usage metrics","description":"Track scotty's memory usage (heap allocated, RSS, etc.) to monitor resource consumption and detect memory leaks.","design":"Add memory metrics to ScottyMetrics struct:\n- memory_heap_bytes (Gauge) - heap allocated memory\n- memory_rss_bytes (Gauge) - resident set size\n- Consider using jemalloc or system metrics crate\n\nOptions:\n1. Use `sysinfo` crate for cross-platform process metrics\n2. Use jemalloc stats if using jemalloc allocator\n3. Sample memory every 30s-60s to avoid overhead\n\nLocation: \n- Add metrics to scotty/src/metrics/instruments.rs\n- Add sampling task to scotty/src/main.rs or metrics/mod.rs\n- Record metrics periodically in background task","acceptance_criteria":"- Memory metrics exported to OTLP\n- Metrics update at reasonable interval (30-60s)\n- Minimal performance overhead\n- Works on all platforms (Linux, macOS)\n- Dashboard panel created for memory tracking","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-25T02:30:11.101617+02:00","updated_at":"2025-10-25T02:49:17.419136+02:00","closed_at":"2025-10-25T02:49:17.419136+02:00","dependencies":[{"issue_id":"scotty-17","depends_on_id":"scotty-8","type":"blocks","created_at":"2025-10-25T02:30:11.102361+02:00","created_by":"daemon"}]} +{"id":"scotty-18","title":"Add Tokio runtime metrics","description":"Track Tokio async runtime statistics like active tasks, worker threads, idle time, and task queue depth to monitor async performance.","design":"Add Tokio runtime metrics to ScottyMetrics:\n- tokio_tasks_active (Gauge) - currently spawned tasks\n- tokio_workers_count (Gauge) - number of worker threads\n- tokio_workers_idle (Gauge) - idle workers\n- tokio_tasks_spawned_total (Counter) - total tasks spawned\n\nImplementation options:\n1. Use tokio-metrics crate (official tokio metrics)\n2. Use tokio::runtime::Handle::metrics() (requires unstable features)\n3. Use tokio-console integration via console-subscriber\n\nRecommended: tokio-metrics crate\n- Add tokio-metrics to Cargo.toml\n- Create background task to sample runtime metrics\n- Record every 10-30s\n\nLocation:\n- Add metrics to scotty/src/metrics/instruments.rs\n- Add tokio metrics sampler in scotty/src/metrics/tokio.rs\n- Spawn sampling task in main.rs after runtime creation","acceptance_criteria":"- Tokio runtime metrics exported to OTLP\n- Metrics show active tasks and worker state\n- Minimal performance overhead\n- Code compiles with stable Rust\n- Dashboard panel created for runtime monitoring","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-25T02:30:22.11133+02:00","updated_at":"2025-10-25T16:17:30.994921+02:00","closed_at":"2025-10-25T16:17:30.994921+02:00","dependencies":[{"issue_id":"scotty-18","depends_on_id":"scotty-8","type":"blocks","created_at":"2025-10-25T02:30:22.112175+02:00","created_by":"daemon"}]} +{"id":"scotty-19","title":"Add TaskManager metrics for task tracking","description":"Instrument TaskManager to track number of tasks, their states (running/finished/failed), durations, and success rates.","design":"Add TaskManager metrics to ScottyMetrics struct:\n- tasks_total (Counter) - Total tasks created\n- tasks_by_state (Gauge) - Current tasks grouped by state labels:\n * state=\"running\"\n * state=\"finished\"\n * state=\"failed\"\n- task_duration_seconds (Histogram) - Task execution time\n- task_failures_total (Counter) - Failed tasks counter\n\nImplementation approach:\n1. Add metrics to scotty/src/metrics/instruments.rs\n2. Instrument scotty/src/tasks/manager.rs:\n - add_task(): increment tasks_total, update state gauge\n - set_task_finished(): update state gauges, record duration histogram\n - Optional: background sampler every 30s to sync gauges with HashMap state\n\nData sources:\n- TaskManager.processes HashMap size = total active tasks\n- TaskDetails.state: Running | Finished | Failed\n- TaskDetails.start_time + finish_time for duration calculation\n- TaskDetails.last_exit_code for success/failure tracking","acceptance_criteria":"- Task metrics exported to OTLP\n- Metrics accurately reflect task states\n- Duration tracking works correctly\n- Failed vs successful tasks distinguishable\n- Dashboard panels created for task monitoring\n- No performance degradation","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-25T02:37:07.454119+02:00","updated_at":"2025-10-25T15:29:19.632177+02:00","closed_at":"2025-10-25T15:29:19.632177+02:00","dependencies":[{"issue_id":"scotty-19","depends_on_id":"scotty-8","type":"blocks","created_at":"2025-10-25T02:37:07.454889+02:00","created_by":"daemon"}]} +{"id":"scotty-2","title":"Implement app:shell CLI command in scottyctl","description":"Add the app:shell command to scottyctl CLI. Backend ShellService is fully implemented and tested, but the CLI command is missing. Need to create scottyctl/src/commands/apps/shell.rs with WebSocket-based terminal integration.","design":"- Create ShellCommand struct in cli.rs\n- Implement WebSocket-based shell handler in commands/apps/shell.rs\n- Add TTY resize handling and raw terminal mode\n- Support interactive input/output with proper escape sequences\n- Reuse AuthenticatedWebSocket pattern from logs command","acceptance_criteria":"- scottyctl app:shell myapp web opens interactive shell\n- Terminal escape sequences work correctly\n- Ctrl+C and Ctrl+D handled properly\n- Session cleanup on disconnect\n- Help text and examples documented","status":"in_progress","priority":1,"issue_type":"feature","created_at":"2025-10-25T00:58:21.798713+02:00","updated_at":"2025-10-26T18:37:31.697764+01:00","dependencies":[{"issue_id":"scotty-2","depends_on_id":"scotty-1","type":"parent-child","created_at":"2025-10-25T00:58:32.439042+02:00","created_by":"daemon"}]} +{"id":"scotty-20","title":"Add AppList metrics for application monitoring","description":"Instrument SharedAppList to track number of apps, their states (stopped/starting/running/etc), services per app, and health check age.","design":"Add AppList metrics to ScottyMetrics struct:\n- apps_total (Gauge) - Total number of managed apps\n- apps_by_status (Gauge) - Apps grouped by status labels:\n * status=\"stopped\"\n * status=\"starting\"\n * status=\"running\"\n * status=\"creating\"\n * status=\"destroying\"\n * status=\"unsupported\"\n- app_services_count (Histogram) - Distribution of services per app\n- app_last_check_age_seconds (Histogram) - Time since last health check\n\nImplementation approach:\n1. Add metrics to scotty/src/metrics/instruments.rs\n2. Instrument scotty-core/src/apps/shared_app_list.rs:\n - add_app() / remove_app(): update apps_total\n - Background sampler task (30-60s interval):\n * Iterate apps HashMap\n * Count by status\n * Sample services.len() distribution\n * Calculate last_checked age\n3. Spawn sampler task in scotty/src/main.rs or via AppState\n\nData sources:\n- SharedAppList.apps HashMap size = total apps\n- AppData.status: Stopped | Starting | Running | Creating | Destroying | Unsupported\n- AppData.services.len() = service count per app\n- AppData.last_checked timestamp for age calculation\n\nNote: Requires access to SharedAppList from metrics, may need to pass via background task or add to AppState.","acceptance_criteria":"- App metrics exported to OTLP\n- Metrics accurately reflect app states\n- Status distribution correct\n- Service count distribution tracked\n- Health check age visible\n- Dashboard panels created for app monitoring\n- Minimal performance overhead from sampling","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-25T02:37:26.668911+02:00","updated_at":"2025-10-26T17:20:02.191752+01:00","closed_at":"2025-10-26T17:20:02.191752+01:00","dependencies":[{"issue_id":"scotty-20","depends_on_id":"scotty-8","type":"blocks","created_at":"2025-10-25T02:37:26.669776+02:00","created_by":"daemon"}]} +{"id":"scotty-21","title":"Add Traefik to observability docker-compose for .ddev.site URLs","description":"The observability stack uses Traefik labels for routing (grafana.ddev.site, jaeger.ddev.site, vm.ddev.site) but requires external Traefik to be running from apps/traefik. This creates a dependency and extra setup step.\n\nAdd Traefik service to observability/docker-compose.yml so the stack works out-of-the-box without requiring apps/traefik to be running.","design":"Options:\n1. Add Traefik service to observability/docker-compose.yml\n - Include network configuration\n - Configure dashboard access\n - Ensure no port conflicts with main Traefik\n\n2. Share network with existing apps/traefik\n - Create external network\n - Less duplication but still requires apps/traefik\n\nRecommended: Option 1 - self-contained observability stack\n\nImplementation:\n- Add Traefik service to observability/docker-compose.yml\n- Use different ports than apps/traefik (80/443 vs 8080/8443)\n- Configure proxy network\n- Update README.md to mention this works standalone","acceptance_criteria":"- grafana.ddev.site, jaeger.ddev.site, vm.ddev.site work without apps/traefik running\n- cd observability \u0026\u0026 docker-compose up -d brings up full working stack\n- No port conflicts with apps/traefik\n- Documentation updated","status":"open","priority":3,"issue_type":"task","created_at":"2025-10-25T02:59:32.096433+02:00","updated_at":"2025-10-25T02:59:32.096433+02:00"} +{"id":"scotty-22","title":"Refactor metrics instrumentation to use dedicated helper functions","description":"Review and refactor existing metrics code in log streaming and other services to move metrics recording into dedicated helper functions, keeping business logic clean and separated from instrumentation code.","design":"Pattern established in scotty-19:\n- Create dedicated helper functions like `record_task_added_metrics()` and `record_task_finished_metrics()`\n- Move all `if let Some(m) = metrics::get_metrics()` blocks into these helpers\n- Keep business logic methods focused on their primary responsibility\n\nFiles to review and refactor:\n- scotty/src/docker/services/logs.rs (log streaming metrics)\n- scotty/src/docker/services/shell.rs (shell session metrics - if implemented)\n- Any other services with inline metrics code\n\nBenefits:\n- Cleaner separation of concerns\n- Easier to test business logic without metrics\n- Consistent metrics instrumentation pattern\n- Better code readability","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-10-25T15:28:09.285832+02:00","updated_at":"2025-10-25T16:07:00.885661+02:00","closed_at":"2025-10-25T16:07:00.885661+02:00"} +{"id":"scotty-23","title":"Reduce cloning overhead by wrapping AppData in Arc","description":"AppData is cloned on every access from SharedAppList. Wrapping AppData in Arc would make cloning cheap (just reference count increment) instead of copying all nested structures.","design":"Location: scotty-core/src/apps/shared_app_list.rs:56-58\n\nCurrent code clones entire AppData structure on every get_app() call. AppData contains multiple nested structures (containers, services, settings) making clones expensive.\n\nProposed solution:\n```rust\npub type SharedAppData = Arc\u0026lt;AppData\u0026gt;;\n\npub async fn get_app(\u0026amp;self, app_name: \u0026amp;str) -\u0026gt; Option\u0026lt;SharedAppData\u0026gt; {\n let t = self.apps.read().await;\n t.get(app_name).map(Arc::clone) // Only clones Arc, not data\n}\n```\n\nImpact: Major performance improvement for app data access paths\nEffort: 2-4 hours","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-26T21:21:10.34027+01:00","updated_at":"2025-10-26T21:21:10.34027+01:00","labels":["performance","refactoring"]} +{"id":"scotty-24","title":"Add timeout to Docker command execution","description":"Docker commands currently have no timeout and could hang indefinitely if Docker daemon becomes unresponsive.","design":"Location: scotty/src/docker/docker_compose.rs:88\n\nCurrent code:\n```rust\nlet output = cmd.output()?; // No timeout\n```\n\nProposed solution:\n```rust\nuse tokio::time::timeout;\n\nlet output = timeout(\n Duration::from_secs(300), // 5 minute timeout\n tokio::process::Command::new(\"docker-compose\")\n .args(command)\n .output()\n).await??;\n```\n\nImpact: Prevents indefinite hangs on Docker failures\nEffort: 1-2 hours","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-26T21:21:10.406194+01:00","updated_at":"2025-10-26T21:21:10.406194+01:00","labels":["docker","stability"]} +{"id":"scotty-25","title":"Improve authorization error handling in Casbin enforcement","description":"Authorization service silently denies access on Casbin errors using unwrap_or(false), potentially hiding system issues.","design":"Location: scotty/src/services/authorization/service.rs:182\n\nCurrent code:\n```rust\nlet result = enforcer\n .enforce(vec![user, app, action_str])\n .unwrap_or(false);\n```\n\nProposed solution:\n```rust\nlet result = enforcer\n .enforce(vec![user, app, action_str])\n .map_err(|e| {\n error!(\"Casbin enforce error: {}\", e);\n crate::metrics::authorization::record_error();\n })\n .unwrap_or(false);\n```\n\nImpact: Better visibility into authorization failures\nEffort: 30 minutes","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-26T21:21:10.471975+01:00","updated_at":"2025-10-26T21:21:10.471975+01:00","labels":["observability","security"]} +{"id":"scotty-26","title":"Fix wildcard dependency for tracing-subscriber","description":"tracing-subscriber uses wildcard version \"*\" which prevents reproducible builds.","design":"Location: Cargo.toml:36\n\nCurrent: `tracing-subscriber = \"*\"`\nReplace with: `tracing-subscriber = \"0.3\"`\n\nImpact: Reproducible builds\nEffort: 5 minutes","status":"closed","priority":1,"issue_type":"chore","assignee":"claude","created_at":"2025-10-26T21:21:10.53848+01:00","updated_at":"2025-10-26T22:00:48.493544+01:00","closed_at":"2025-10-26T22:00:48.493544+01:00","labels":["dependencies"]} +{"id":"scotty-27","title":"Wrap large configuration structures in Arc","description":"Settings struct contains large nested HashMaps (blueprints, registries) that get cloned unnecessarily. Wrapping them in Arc would reduce clone overhead.","design":"Location: scotty-core/src/settings/apps.rs\n\nSettings contains large, rarely modified structures that are cloned when Settings is cloned.\n\nProposed solution:\n```rust\n#[derive(Clone)]\npub struct Apps {\n pub root_folder: String,\n pub blueprints: Arc\u0026lt;HashMap\u0026lt;String, AppBlueprint\u0026gt;\u0026gt;, // Large, rarely modified\n // ...\n}\n```\n\nImpact: Reduce Settings clone overhead\nEffort: 1-2 hours","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-26T21:21:10.606337+01:00","updated_at":"2025-10-26T21:21:10.606337+01:00","labels":["performance","refactoring"]} +{"id":"scotty-28","title":"Consider DashMap for WebSocket client management","description":"WebSocket client HashMap uses Arc\u0026lt;Mutex\u0026lt;HashMap\u0026gt;\u0026gt; which causes lock contention during broadcasts. DashMap provides lock-free reads.","design":"Location: scotty/src/api/websocket/messaging.rs\n\nCurrent implementation uses mutex-protected HashMap which can cause contention during broadcasts to multiple clients.\n\nProposed solution:\n```rust\nuse dashmap::DashMap;\n\npub struct WebSocketMessenger {\n clients: Arc\u0026lt;DashMap\u0026lt;Uuid, WebSocketClient\u0026gt;\u0026gt;,\n}\n```\n\nBenefits:\n- Lock-free concurrent reads\n- Automatic sharding for better concurrency\n- Reduced contention during broadcasts\n\nImpact: Reduced lock contention during broadcasts\nEffort: 2-3 hours","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-26T21:21:10.680572+01:00","updated_at":"2025-10-26T21:21:10.680572+01:00","labels":["performance","websocket"]} +{"id":"scotty-29","title":"Split large authorization service file into submodules","description":"The authorization service.rs file is 754 lines and could be split into more focused submodules for better maintainability.","design":"Location: scotty/src/services/authorization/service.rs (754 lines)\n\nProposed structure:\n- service.rs - Core service and main authorization logic\n- permissions.rs - Permission checking and management\n- scopes.rs - Scope-related operations\n- roles.rs - Role management\n- assignments.rs - Assignment handling\n\nImpact: Better code organization and maintainability\nEffort: 2-4 hours","status":"open","priority":1,"issue_type":"chore","created_at":"2025-10-26T21:21:10.754914+01:00","updated_at":"2025-10-26T21:21:10.754914+01:00","labels":["maintainability","refactoring"]} +{"id":"scotty-3","title":"Frontend container log viewer UI","description":"Add UI to view container logs in the web frontend. Backend log streaming API is complete with WebSocket support, but frontend has no log viewer component.","design":"- Create log viewer component similar to unified-output.svelte\n- Add WebSocket handlers for LogLineReceived/LogStreamStarted/LogStreamEnded messages\n- Add log viewer page or modal accessible from app detail page\n- Support follow mode, timestamps, line limits\n- Reuse webSocketStore.ts infrastructure","acceptance_criteria":"- Can view historical logs for any service\n- Follow mode for real-time streaming\n- Toggle timestamps on/off\n- Auto-scroll control\n- Copy logs to clipboard\n- Integration from app detail page","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-10-25T00:58:21.90526+02:00","updated_at":"2025-10-25T01:06:56.395577+02:00","closed_at":"2025-10-25T01:06:56.395577+02:00","dependencies":[{"issue_id":"scotty-3","depends_on_id":"scotty-1","type":"parent-child","created_at":"2025-10-25T00:58:32.507014+02:00","created_by":"daemon"}]} +{"id":"scotty-30","title":"Add metrics for clone operations in hot paths","description":"Add tracing/metrics to performance-critical clone operations to identify actual hotspots with real usage data.","design":"Add instrumentation to measure clone operations in:\n- AppData access patterns\n- Settings propagation\n- State machine handler contexts\n\nUse tracing spans with timing information to identify which clones actually impact performance in production.\n\nThis data will help prioritize which clone operations to optimize first.\n\nImpact: Data-driven optimization decisions\nEffort: 2-3 hours","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-26T21:21:10.829701+01:00","updated_at":"2025-10-26T21:21:10.829701+01:00","labels":["observability","performance"]} +{"id":"scotty-31","title":"Refactor test code organization and extract common helpers","description":"Extract common test helpers and utilities into a dedicated test utilities module to reduce duplication across test files.","design":"Current state: Test code has duplicated setup/teardown logic and helper functions across multiple test files.\n\nProposed:\n- Create `scotty/tests/common/mod.rs` for shared test utilities\n- Extract common fixtures (test users, apps, configurations)\n- Create builder patterns for test data\n- Consolidate mock setup functions\n\nImpact: Reduce test code duplication, easier to maintain tests\nEffort: 4-6 hours","status":"open","priority":1,"issue_type":"chore","created_at":"2025-10-26T21:21:10.90688+01:00","updated_at":"2025-10-26T21:21:10.90688+01:00","labels":["maintainability","testing"]} +{"id":"scotty-32","title":"Upgrade ts-rs from 10.0 to 11.0","description":"ts-rs has a major version update available (10.0 → 11.0) that should be evaluated and applied. This affects TypeScript type generation.","design":"Location: scotty-types/Cargo.toml:21\n\nCurrent: ts-rs = { version = \"10.0\", features = [\"chrono-impl\", \"uuid-impl\"] }\nTarget: ts-rs = { version = \"11.0\", features = [\"chrono-impl\", \"uuid-impl\"] }\n\nSteps:\n1. Review ts-rs 11.0 changelog for breaking changes\n2. Update version in scotty-types/Cargo.toml\n3. Run TypeScript generation and verify output\n4. Test that generated TypeScript types are compatible with frontend\n5. Update any code that uses ts-rs macros if needed\n\nImpact: May change generated TypeScript types\nEffort: 2-4 hours","status":"closed","priority":3,"issue_type":"chore","assignee":"claude","created_at":"2025-10-26T22:07:52.621782+01:00","updated_at":"2025-10-26T22:14:26.407903+01:00","closed_at":"2025-10-26T22:14:26.407903+01:00","labels":["dependencies","typescript"]} +{"id":"scotty-33","title":"Upgrade oauth2 from 4.4 to 5.0","description":"oauth2 crate has a major version update available (4.4 → 5.0). This affects OAuth2 authentication flow in the API.","design":"Location: scotty/Cargo.toml:61\n\nCurrent: oauth2 = \"4.4\"\nTarget: oauth2 = \"5.0\"\n\nSteps:\n1. Review oauth2 5.0 changelog and migration guide\n2. Identify breaking changes in API\n3. Update version in scotty/Cargo.toml\n4. Update OAuth2 implementation code to match new API\n5. Test OAuth2 authentication flows thoroughly\n6. Verify token generation and validation still works\n\nImpact: May require changes to OAuth2 authentication implementation\nEffort: 3-5 hours","status":"open","priority":3,"issue_type":"chore","created_at":"2025-10-26T22:08:00.856298+01:00","updated_at":"2025-10-26T22:08:00.856298+01:00","labels":["dependencies","oauth","security"]} +{"id":"scotty-34","title":"Upgrade rustls ecosystem from 0.21 to 0.23","description":"rustls, tokio-rustls, and hyper-rustls have major version updates available (0.21 → 0.23, 0.24 → 0.26, 0.24 → 0.27). These need coordinated updates for TLS support.","design":"Current versions (transitive dependencies):\n- rustls: 0.21.12 → 0.23.34\n- tokio-rustls: 0.24.1 → 0.26.4 \n- hyper-rustls: 0.24.2 → 0.27.7\n\nThese are currently pulled in transitively through reqwest and other dependencies.\n\nSteps:\n1. Review rustls 0.23 changelog for breaking changes\n2. Check if reqwest needs update to support rustls 0.23\n3. Update any direct dependencies on rustls/tokio-rustls\n4. Ensure all TLS connections still work properly\n5. Test HTTPS endpoints and WebSocket over TLS\n6. Verify certificate validation still works\n\nImpact: TLS/SSL implementation changes, better security and performance\nEffort: 4-6 hours\n\nNote: This may require updating other HTTP-related crates in coordination.","status":"open","priority":3,"issue_type":"chore","created_at":"2025-10-26T22:08:11.918721+01:00","updated_at":"2025-10-26T22:08:11.918721+01:00","labels":["dependencies","security","tls"]} +{"id":"scotty-35","title":"Upgrade http/hyper ecosystem to v1.x","description":"The http and hyper crates have major version updates (http 0.2 → 1.3, hyper 0.14 → 1.7, http-body 0.4 → 1.0). This is a coordinated ecosystem upgrade.","design":"Current versions (transitive dependencies):\n- http: 0.2.12 → 1.3.1\n- http-body: 0.4.6 → 1.0.1\n- hyper: 0.14.32 → 1.7.0\n- h2: 0.3.27 → 0.4.12\n\nThese are foundational HTTP crates used by axum, reqwest, and other dependencies.\n\nSteps:\n1. Review hyper 1.0 migration guide and breaking changes\n2. Check if current versions of axum/reqwest support hyper 1.x\n3. May need to update axum, reqwest, tower-http in coordination\n4. Update any direct usage of http/hyper types in code\n5. Test all HTTP endpoints (REST API, WebSocket, etc.)\n6. Verify middleware and error handling still works\n7. Run full integration test suite\n\nImpact: Major HTTP stack upgrade, affects all network communication\nEffort: 6-10 hours\n\nNote: This is a significant upgrade that touches the core HTTP stack. Should be done carefully with comprehensive testing. May need to wait for ecosystem crates to fully support hyper 1.x.","status":"open","priority":3,"issue_type":"chore","created_at":"2025-10-26T22:08:24.871193+01:00","updated_at":"2025-10-26T22:08:24.871193+01:00","labels":["dependencies","http","infrastructure"]} +{"id":"scotty-36","title":"Fix hardcoded localhost in OAuth callback URL","description":"The OAuth callback URL is hardcoded to use localhost, which breaks OAuth flows when the server is accessed via different hostnames.","design":"Location: scotty/src/oauth/handlers.rs:456-459\n\nCurrent code hardcodes localhost:\n```rust\nformat!(\n \"http://localhost:21342/oauth/callback?session_id={}\",\n oauth_session_id\n)\n```\n\nRecommendation: Add a `frontend_base_url` configuration option to allow dynamic callback URL construction:\n- Extract from request Host header\n- Fall back to configured base URL\n- Support both HTTP and HTTPS schemes\n\nImpact: OAuth web flows fail when scotty is accessed through production domains","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-10-27T11:42:29.94207+01:00","updated_at":"2025-10-27T15:02:23.208743+01:00","closed_at":"2025-10-27T15:02:23.208743+01:00","labels":["oauth","production-blocker","security"]} +{"id":"scotty-37","title":"Implement session cleanup for expired OAuth sessions","description":"OAuth session storage (DeviceFlowStore, WebFlowStore, OAuthSessionStore) accumulates expired sessions without cleanup, leading to unbounded memory growth.","design":"Impact:\n- Memory Leak: Server memory consumption grows indefinitely\n- DoS Vector: Attackers can exhaust server memory by creating sessions\n- Production Risk: Requires server restarts to reclaim memory\n\nCurrent: All three session stores use Arc\u003cMutex\u003cHashMap\u003cString, Session\u003e\u003e\u003e without expiration cleanup.\n\nRecommendation: Implement periodic cleanup task:\n1. Add background task using clokwerk scheduler (already in workspace dependencies)\n2. Scan sessions every N minutes\n3. Remove entries where SystemTime::now() \u003e expires_at\n4. Consider using a TTL cache library (ttl_cache, moka)","status":"closed","priority":1,"issue_type":"bug","assignee":"claude","created_at":"2025-10-27T11:42:30.048154+01:00","updated_at":"2025-10-27T15:28:59.581236+01:00","closed_at":"2025-10-27T15:28:59.581236+01:00","labels":["memory-leak","oauth","security"]} +{"id":"scotty-38","title":"Protect PKCE verifier with secrecy wrapper","description":"The PKCE verifier in WebFlowSession is stored as a plain String, allowing it to be logged, dumped in stack traces, or accidentally exposed.","design":"Location: scotty/src/oauth/mod.rs:40-48\n\nCurrent code stores PKCE verifier as plain String. This may appear in logs or error messages.\n\nRecommendation: Use the secrecy crate (already in workspace dependencies):\n```rust\nuse scotty_core::utils::secret::MaskedSecret;\n\npub struct WebFlowSession {\n pub csrf_token: String,\n pub pkce_verifier: MaskedSecret\u003cString\u003e, // Protected\n pub redirect_url: String,\n pub frontend_callback_url: Option\u003cString\u003e,\n pub expires_at: SystemTime,\n}\n```\n\nThe project already has MaskedSecret wrapper in scotty-core/src/utils/secret.rs.","status":"open","priority":2,"issue_type":"task","created_at":"2025-10-27T11:42:30.152917+01:00","updated_at":"2025-10-27T11:42:30.152917+01:00","labels":["oauth","security"]} +{"id":"scotty-39","title":"Use constant-time comparison for bearer token validation","description":"Bearer token comparison uses standard equality operator, making it vulnerable to timing attacks.","design":"Location: scotty/src/api/auth_core.rs:173-182\n\nCurrent code:\n```rust\nfn find_token_identifier(shared_app_state: \u0026SharedAppState, token: \u0026str) -\u003e Option\u003cString\u003e {\n for (identifier, configured_token) in \u0026shared_app_state.settings.api.bearer_tokens {\n if configured_token == token { // NOT constant-time!\n return Some(identifier.clone());\n }\n }\n None\n}\n```\n\nVulnerability: Standard string comparison short-circuits on first mismatch, allowing attackers to reconstruct valid bearer tokens through timing analysis.\n\nRecommendation: Use constant-time comparison from subtle crate:\n```rust\nuse subtle::ConstantTimeEq;\n\nif token.as_bytes().ct_eq(configured_token.as_bytes()).into() {\n return Some(identifier.clone());\n}\n```\n\nAdd subtle to Cargo.toml: `subtle = \"2.5\"`","notes":"PR #524 updated with complete fix:\n\nInitial commit (29845ae):\n- Fixed timing attack in auth_core.rs find_token_identifier()\n- Added subtle crate v2.6 for constant-time comparison\n\nSecond commit (c3328f1):\n- Fixed timing attack in login.rs login_handler() \n- Applied constant-time comparison to bearer token login\n- Addresses PR review feedback\n\nAll token comparison points now use constant-time operations.\nAll 184 tests passing (110 scotty + 51 scotty-core + 20 scotty-types + 3 scottyctl)\n\nBranch: fix/scotty-39-constant-time-token-comparison\nPR: https://github.com/factorial-io/scotty/pull/524","status":"in_progress","priority":1,"issue_type":"bug","created_at":"2025-10-27T11:42:30.260247+01:00","updated_at":"2025-10-27T13:19:44.309154+01:00","labels":["security","vulnerability"]} +{"id":"scotty-4","title":"Frontend interactive shell UI with xterm.js","description":"Add interactive shell terminal to web frontend using xterm.js. Backend ShellService is complete with WebSocket support, but frontend has no shell UI.","design":"- Integrate xterm.js for terminal emulation\n- WebSocket handlers for ShellSession* messages\n- TTY resize support on window resize\n- Copy/paste support\n- Terminal settings (font size, theme)\n- Shell session management UI (list, create, terminate)\n- Session timeout indicator","acceptance_criteria":"- Can open interactive shell to any service from web UI\n- Terminal emulation works correctly (colors, escape sequences)\n- Copy/paste functional\n- Terminal resizes properly\n- Session list shows active shells\n- Clean session termination\n- Security: requires Shell permission","status":"open","priority":2,"issue_type":"feature","created_at":"2025-10-25T00:58:22.023108+02:00","updated_at":"2025-10-25T00:58:22.023108+02:00","dependencies":[{"issue_id":"scotty-4","depends_on_id":"scotty-1","type":"parent-child","created_at":"2025-10-25T00:58:32.576268+02:00","created_by":"daemon"},{"issue_id":"scotty-4","depends_on_id":"scotty-3","type":"related","created_at":"2025-10-25T00:58:39.410575+02:00","created_by":"daemon"}]} +{"id":"scotty-40","title":"Add rate limiting to OAuth endpoints","description":"OAuth endpoints are publicly accessible without rate limiting, allowing DoS attacks and credential stuffing.","design":"Vulnerable Endpoints (scotty/src/api/router.rs:415-419):\n- POST /oauth/device\n- POST /oauth/device/token \n- GET /oauth/authorize\n- GET /api/oauth/callback\n- POST /oauth/exchange\n\nAttack Scenarios:\n1. Credential Stuffing: Unlimited token validation attempts\n2. Session Exhaustion: Create thousands of sessions (combined with scotty-37 memory leak)\n3. Resource Exhaustion: Flood OIDC validation endpoint\n4. Enumeration: Discover valid session IDs through brute force\n\nRecommendation: Implement rate limiting using tower-governor middleware:\n```rust\nuse tower_governor::{governor::GovernorConfigBuilder, GovernorLayer};\n\nlet public_limiter = GovernorConfigBuilder::default()\n .per_millisecond(100) // 10 requests per second\n .burst_size(20)\n .finish()\n .unwrap();\n```\n\nAdd dependency: `tower-governor = \"0.4\"`","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-27T11:42:30.368145+01:00","updated_at":"2025-10-27T11:42:30.368145+01:00","labels":["dos-prevention","oauth","security"]} +{"id":"scotty-41","title":"Add OAuth metrics for monitoring","description":"OAuth flows lack observability metrics, making it difficult to monitor authentication health, detect attack patterns, track session lifecycle, and debug production issues.","design":"Add OAuth-specific metrics to scotty/src/metrics/instruments.rs:\n\n```rust\n// OAuth flow metrics\npub oauth_device_flows_active: Gauge\u003ci64\u003e,\npub oauth_device_flows_total: Counter\u003cu64\u003e,\npub oauth_web_flows_active: Gauge\u003ci64\u003e,\npub oauth_web_flows_total: Counter\u003cu64\u003e,\npub oauth_flow_duration: Histogram\u003cf64\u003e,\npub oauth_flow_failures: Counter\u003cu64\u003e,\n\n// Token metrics\npub oauth_token_validations_total: Counter\u003cu64\u003e,\npub oauth_token_validation_duration: Histogram\u003cf64\u003e,\npub oauth_token_validation_failures: Counter\u003cu64\u003e,\npub oauth_active_sessions: Gauge\u003ci64\u003e,\npub oauth_expired_sessions_cleaned: Counter\u003cu64\u003e,\n```\n\nInstrumentation Points:\n1. start_device_flow() - increment device flows total/active\n2. start_authorization_flow() - increment web flows total/active\n3. validate_oidc_token() - track validation count and duration\n4. Session cleanup task - track expired session removal\n5. exchange_session_for_token() - track successful exchanges\n\nRelated to scotty-37 (session cleanup) and scotty-42 (cache metrics)","status":"closed","priority":2,"issue_type":"task","assignee":"claude","created_at":"2025-10-27T11:42:30.477735+01:00","updated_at":"2025-10-27T15:36:55.30953+01:00","closed_at":"2025-10-27T15:36:55.30953+01:00","labels":["metrics","oauth","observability"],"dependencies":[{"issue_id":"scotty-41","depends_on_id":"scotty-37","type":"blocks","created_at":"2025-10-27T11:42:30.478666+01:00","created_by":"daemon"}]} +{"id":"scotty-42","title":"Implement token caching for OIDC validation","description":"OIDC token validation makes an HTTP request to /oauth/userinfo on every API request, causing high latency, increased load on OIDC provider, potential rate limiting, and poor API performance.","design":"Location: scotty/src/oauth/device_flow.rs:221-256\n\nCurrent code makes HTTP call on EVERY validation. \n\nRecommendation: Implement in-memory token cache with TTL using moka or mini-moka crate for built-in TTL and LRU eviction.\n\n⚠️ CRITICAL: Must implement cache entry cleanup to prevent memory leaks:\n1. Background task to remove expired entries (every 5-10 minutes)\n2. Max cache size with LRU eviction policy\n3. Manual invalidation on token revocation events\n\nPerformance Impact:\n- Reduces validation latency from ~100-500ms to \u003c1ms (cache hit)\n- Reduces OIDC provider load by 95%+\n- Improves API response times significantly\n\nRelated: scotty-41 for cache hit/miss metrics","status":"open","priority":2,"issue_type":"task","created_at":"2025-10-27T11:42:30.587922+01:00","updated_at":"2025-10-27T11:42:30.587922+01:00","labels":["caching","oauth","performance"]} +{"id":"scotty-43","title":"Prevent concurrent tasks for the same app","description":"Currently you can run multiple tasks for the same app at the same time, this should be prevented. On the other hand we need the possibility to cancel a running task to enable the UI again. The concurrent task prevention should be handled ideally by the backend.","design":"The backend should track running tasks per app and reject new task requests if a task is already running for that app.\n\nImplementation considerations:\n1. TaskManager should track which app each task belongs to\n2. Add endpoint to check if app has running tasks\n3. Add task cancellation endpoint\n4. Frontend UI should:\n - Disable action buttons when task is running\n - Show cancel button for running tasks\n - Re-enable UI when task completes/cancelled\n\nLocation: scotty/src/tasks/manager.rs","status":"open","priority":2,"issue_type":"bug","created_at":"2025-10-27T11:43:29.205844+01:00","updated_at":"2025-10-27T11:43:29.205844+01:00","labels":["tasks","ux"]} +{"id":"scotty-44","title":"State machine handler errors don't bubble up to tasks","description":"If a state_machine_handler errors out, the error does not bubble up to the task, keeping the task running forever.","design":"State machine handler errors need proper error propagation to the task system.\n\nCurrent issue: When a state machine handler encounters an error, the task continues running instead of being marked as failed.\n\nSolution:\n1. Ensure state machine errors are propagated to task manager\n2. Task manager should mark task as failed when state machine errors\n3. Add proper error handling and cleanup\n4. Consider timeout mechanism for stuck tasks\n\nLocation: State machine handlers and task integration points","status":"open","priority":1,"issue_type":"bug","created_at":"2025-10-27T11:43:29.276532+01:00","updated_at":"2025-10-27T11:43:29.276532+01:00","labels":["error-handling","state-machine","tasks"]} +{"id":"scotty-45","title":"Fix hardcoded localhost in OAuth callback URL","description":"The OAuth callback URL is hardcoded to use localhost, which breaks OAuth flows when the server is accessed via different hostnames.","design":"Location: scotty/src/oauth/handlers.rs:456-459\n\nCurrent code hardcodes localhost:\n```rust\nformat!(\n \"http://localhost:21342/oauth/callback?session_id={}\",\n oauth_session_id\n)\n```\n\nRecommendation: Add a `frontend_base_url` configuration option to allow dynamic callback URL construction:\n- Extract from request Host header\n- Fall back to configured base URL\n- Support both HTTP and HTTPS schemes\n\nImpact: OAuth web flows fail when scotty is accessed through production domains","status":"open","priority":1,"issue_type":"bug","created_at":"2025-10-27T15:02:24.111221+01:00","updated_at":"2025-10-27T15:02:24.111221+01:00","labels":["oauth","production-blocker","security"]} +{"id":"scotty-5","title":"Enhanced monitoring and observability","description":"Add comprehensive monitoring for the unified output system. Basic logging exists but metrics and tracing are incomplete.","design":"Implementation using OpenTelemetry Collector + VictoriaMetrics architecture.\n\nArchitecture:\n- Scotty exports OTLP metrics to OTel Collector (port 4317)\n- OTel Collector routes traces to Jaeger, metrics to VictoriaMetrics\n- Grafana visualizes metrics from VictoriaMetrics\n- Total memory overhead: ~180-250 MB\n\nSee docs/research/otel-metrics-backend-evaluation.md for complete research and rationale.","acceptance_criteria":"- Prometheus metrics exported\n- Grafana dashboard created\n- Tracing spans for log/shell operations\n- Memory usage tracked\n- Error rates monitored","notes":"Chosen solution: OTel Collector + VictoriaMetrics for lightweight, OpenTelemetry-native metrics collection. Integrates with existing Jaeger setup.","status":"open","priority":3,"issue_type":"task","created_at":"2025-10-25T00:58:22.135422+02:00","updated_at":"2025-10-25T01:28:15.468691+02:00","dependencies":[{"issue_id":"scotty-5","depends_on_id":"scotty-1","type":"parent-child","created_at":"2025-10-25T00:58:32.652182+02:00","created_by":"daemon"}]} +{"id":"scotty-6","title":"End-user documentation for unified output system","description":"Write comprehensive end-user documentation for the logs and shell features. Technical PRD exists but user-facing docs are missing.","design":"- User guide for app:logs command with examples\n- User guide for app:shell command (once CLI implemented)\n- Web UI documentation for log viewer\n- Web UI documentation for shell access\n- Security best practices for shell access\n- Troubleshooting guide\n- Add to main documentation site","acceptance_criteria":"- app:logs documented with all options\n- app:shell documented (when available)\n- Screenshots of web UI features\n- Security guidelines clear\n- Common issues documented\n- Published to docs site","status":"open","priority":3,"issue_type":"task","created_at":"2025-10-25T00:58:22.241151+02:00","updated_at":"2025-10-25T00:58:22.241151+02:00","dependencies":[{"issue_id":"scotty-6","depends_on_id":"scotty-1","type":"parent-child","created_at":"2025-10-25T00:58:32.723437+02:00","created_by":"daemon"},{"issue_id":"scotty-6","depends_on_id":"scotty-2","type":"related","created_at":"2025-10-25T00:58:39.470922+02:00","created_by":"daemon"}]} +{"id":"scotty-7","title":"Add OpenTelemetry metrics dependencies to workspace","description":"Add metrics feature to opentelemetry and opentelemetry-otlp crates in workspace Cargo.toml. Enable metrics support in opentelemetry_sdk.","design":"Update workspace Cargo.toml:\n- opentelemetry: Add \"metrics\" feature\n- opentelemetry_sdk: Add \"metrics\" to features array\n- opentelemetry-otlp: Add \"metrics\" feature","acceptance_criteria":"- Cargo.toml updated with metrics features\n- cargo check passes\n- No breaking changes to existing trace functionality","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-25T01:28:15.598548+02:00","updated_at":"2025-10-25T01:32:41.399679+02:00","closed_at":"2025-10-25T01:32:41.399679+02:00","dependencies":[{"issue_id":"scotty-7","depends_on_id":"scotty-5","type":"parent-child","created_at":"2025-10-25T01:28:29.940257+02:00","created_by":"daemon"}]} +{"id":"scotty-8","title":"Create metrics module with ScottyMetrics struct","description":"Create scotty/src/metrics/mod.rs with ScottyMetrics struct containing all metric instruments (counters, gauges, histograms) for unified output system monitoring.","design":"Create metrics module with:\n- ScottyMetrics struct with all instruments\n- init_metrics() function to set up OTLP exporter\n- Metrics for: log streams, shell sessions, WebSocket, tasks, system health\n- Uses opentelemetry::metrics API (Counter, Gauge, Histogram)","acceptance_criteria":"- metrics/mod.rs created and compiles\n- ScottyMetrics struct has all planned metrics\n- init_metrics() successfully initializes MeterProvider\n- Metrics can be recorded without panics","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-25T01:28:15.721881+02:00","updated_at":"2025-10-25T01:50:03.687196+02:00","closed_at":"2025-10-25T01:50:03.687196+02:00","dependencies":[{"issue_id":"scotty-8","depends_on_id":"scotty-5","type":"parent-child","created_at":"2025-10-25T01:28:30.027423+02:00","created_by":"daemon"},{"issue_id":"scotty-8","depends_on_id":"scotty-7","type":"blocks","created_at":"2025-10-25T01:28:42.019675+02:00","created_by":"daemon"}]} +{"id":"scotty-9","title":"Instrument log streaming service with metrics","description":"Add metrics recording to LogStreamingService for stream counts, durations, errors, and bytes transferred.","design":"Instrument LogStreamingService:\n- Increment log_streams_active on stream start\n- Increment log_streams_total counter\n- Record log_stream_duration on completion\n- Track log_lines_received and log_stream_bytes\n- Increment log_stream_errors on failures","acceptance_criteria":"- Metrics recorded at stream start/end\n- Duration measured accurately\n- Error cases increment error counter\n- No performance degradation","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-25T01:28:15.847014+02:00","updated_at":"2025-10-25T01:57:04.063722+02:00","closed_at":"2025-10-25T01:57:04.063722+02:00","dependencies":[{"issue_id":"scotty-9","depends_on_id":"scotty-5","type":"parent-child","created_at":"2025-10-25T01:28:30.109241+02:00","created_by":"daemon"},{"issue_id":"scotty-9","depends_on_id":"scotty-8","type":"blocks","created_at":"2025-10-25T01:28:42.089191+02:00","created_by":"daemon"}]} diff --git a/.cargo-husky/hooks/pre-push b/.cargo-husky/hooks/pre-push new file mode 100755 index 00000000..ab1cace2 --- /dev/null +++ b/.cargo-husky/hooks/pre-push @@ -0,0 +1,51 @@ +#!/bin/sh +# +# Pre-push hook for scotty +# Ensures code quality before pushing to remote +# + +set -e + +echo "Running pre-push checks..." +echo "" + +# 1. Check code formatting first (fastest check) +echo "📝 Checking Rust code formatting..." +cargo fmt -- --check +echo "✅ Rust formatting OK" +echo "" + +# 2. Run Clippy linter +echo "🔍 Running Clippy linter..." +cargo clippy -- -D warnings +echo "✅ Clippy checks passed" +echo "" + +# 3. Frontend checks (only if frontend files changed) +# Check if any frontend files are being pushed +if git diff --name-only @{upstream}..HEAD 2>/dev/null | grep -q "^frontend/" || \ + git diff --name-only HEAD 2>/dev/null | grep -q "^frontend/"; then + + echo "🎨 Linting frontend code..." + cd frontend && npm run lint + cd .. + echo "✅ Frontend linting passed" + echo "" + + echo "🔎 Type-checking frontend code..." + cd frontend && npm run check + cd .. + echo "✅ Frontend type checking passed" + echo "" +else + echo "⏭️ Skipping frontend checks (no frontend changes detected)" + echo "" +fi + +# 4. Run Rust tests (slowest, run last) +echo "🧪 Running Rust tests..." +cargo test +echo "✅ All tests passed" +echo "" + +echo "🎉 All pre-push checks passed! Proceeding with push..." diff --git a/.env.1password b/.env.1password new file mode 100644 index 00000000..bbf4833e --- /dev/null +++ b/.env.1password @@ -0,0 +1,5 @@ +SCOTTY__DOCKER__REGISTRIES__FACTORIAL__PASSWORD=op://Kubernetes/Deploybot Kubernetes token/password +SCOTTY__API__OAUTH__CLIENT_ID=op://Scotty/scotty local oauth gitlab/application_id +SCOTTY__API__OAUTH__CLIENT_SECRET=op://Scotty/scotty local oauth gitlab/Secret +SCOTTY__TELEMETRY="metrics" +OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4317" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 93bed177..7a43dcdd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,6 +57,16 @@ jobs: steps: - uses: actions/checkout@v4 + + # Setup Rust toolchain for TypeScript generation + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + + # Generate TypeScript types from Rust code + - name: Generate TypeScript types + run: cargo run --package scotty-ts-generator + - uses: oven-sh/setup-bun@v2 # run any `bun` or `bunx` command diff --git a/.gitignore b/.gitignore index 3bb4b45a..5698b4bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ /target +/ts-generator/target frontend/node_modules +frontend/src/generated/ +scotty-types/bindings/ docs/node_modules docs/_site apps/test-nginx-creation diff --git a/.zed/debug.json b/.zed/debug.json new file mode 100644 index 00000000..1c6170ec --- /dev/null +++ b/.zed/debug.json @@ -0,0 +1,18 @@ +// Project-local debug tasks +// +// For more documentation on how to configure debug tasks, +// see: https://zed.dev/docs/debugger +[ + { + "label": "Build & Debug scotty server", + "build": { + "command": "cargo", + "args": ["build", "--bin", "scotty"] + }, + "program": "$ZED_WORKTREE_ROOT/target/debug/scotty", + // sourceLanguages is required for CodeLLDB (not GDB) when using Rust + "sourceLanguages": ["rust"], + "request": "launch", + "adapter": "CodeLLDB" + } +] diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..3d07cd1a --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,204 @@ +# AGENTS.md + +BEFORE ANYTHING ELSE: run 'bd onboard' and follow the instructions + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Scotty is a Rust-based Micro-PaaS (Platform as a Service) that provides an API to manage Docker Compose-based applications. It consists of three main components: + +- **scotty**: HTTP server providing REST API and web UI for managing applications +- **scottyctl**: CLI application for interacting with the Scotty server +- **scotty-core**: Core library containing shared data structures and settings + +## Architecture + +Scotty manages applications by: +1. Scanning a configurable apps directory for folders containing `docker-compose.yml` files +2. Reading optional `.scotty.yml` configuration files for app-specific settings +3. Generating `docker-compose.override.yml` files with load balancer configurations (Traefik or HAProxy) +4. Managing app lifecycle (create, start, stop, destroy) with TTL-based auto-cleanup +5. Supporting app blueprints for common deployment patterns + +### Authentication Modes + +Scotty supports three authentication modes (configured via `auth_mode`): +- **Development**: No authentication required, uses fixed dev user +- **OAuth**: Authentication via oauth2-proxy with GitLab OIDC integration +- **Bearer**: Traditional token-based authentication + +Authentication is handled by the `basic_auth.rs` middleware which extracts user information based on the configured mode. + +## Development Commands + +### Building and Running + +```bash +# Build all workspace members +cargo build + +# Run the scotty server +cargo run --bin scotty + +# Run the scottyctl CLI +cargo run --bin scottyctl -- help + +# Run with specific configuration +SCOTTY__API__AUTH_MODE=dev cargo run --bin scotty +``` + +### Frontend Development + +The frontend is a SvelteKit application with TypeScript: + +```bash +cd frontend + +# Install dependencies (use bun instead of npm) +bun install + +# Run development server +bun run dev + +# Build for production +bun run build + +# Lint and format +bun run lint +bun run format +``` + +### Testing and Quality + +```bash +# Run tests for all workspace members +cargo test + +# Run tests for specific crate +cargo test -p scotty-core + +# Check formatting +cargo fmt --check + +# Run clippy linting +cargo clippy --all-targets --all-features +``` + +### Release Management + +```bash +# Update changelog using git-cliff +git cliff > CHANGELOG.md + +# Create new release (example for alpha) +cargo release --no-publish alpha -x --tag-prefix "" +``` + +## Configuration Structure + +### Main Configuration Files +- `config/default.yaml`: Base configuration with all settings +- `config/local.yaml`: Local overrides for development +- `config/blueprints/`: App blueprint definitions (drupal-lagoon.yaml, nginx-lagoon.yaml) + +### OAuth Development Setup +The `examples/oauth2-proxy/` directory contains a complete OAuth development environment: + +```bash +cd examples/oauth2-proxy + +# Start in development mode (no auth) +./start-dev.sh dev + +# Start with OAuth (requires GitLab app configuration) +op run --env-file="./.env.1password" -- ./start-dev.sh oauth --build + +# Start in bearer token mode +./start-dev.sh bearer +``` + +### Key Configuration Options + +- `auth_mode`: "dev", "oauth", or "bearer" +- `bind_address`: Server bind address (default: "0.0.0.0:21342") +- `apps.root_folder`: Directory to scan for applications +- `load_balancer_type`: "Traefik" or "HaproxyConfig" +- `traefik.network`: Docker network for Traefik integration +- `docker.registries`: Private Docker registry configurations + +## App Management + +### App Types +- **Owned**: Fully managed by Scotty, can be destroyed +- **Supported**: Can be managed but not destroyed +- **Unsupported**: Read-only, shown in UI but not manageable + +### App Structure +``` +apps/ +├── my-app/ +│ ├── docker-compose.yml # Required +│ ├── .scotty.yml # Optional app settings +│ ├── docker-compose.override.yml # Generated by Scotty +│ └── ... (other app files) +``` + +### Blueprints +Blueprints provide common deployment patterns and are referenced during app creation. They define lifecycle hooks that execute at specific events (create, run, destroy). + +## API and CLI Integration + +The API is self-documenting via OpenAPI/Swagger at `/rapidoc` endpoint. The CLI (`scottyctl`) communicates with the server via this REST API using bearer token authentication. + +Key environment variables for CLI: +- `SCOTTY_SERVER`: Server URL +- `SCOTTY_ACCESS_TOKEN`: Authentication token + +## Load Balancer Integration + +Scotty generates appropriate configurations for: + +### Traefik (Preferred) +- Uses Docker labels for service discovery +- Supports custom middlewares, basic auth, robots.txt prevention +- Automatic SSL via Let's Encrypt integration + +### HAProxy-Config (Legacy) +- Uses environment variables for configuration +- Limited feature set compared to Traefik + +## Development Notes + +- Use workspace-level Cargo.toml for shared dependencies +- Frontend uses Bun instead of npm for package management (62% faster builds) +- TypeScript generation optimized with standalone `ts-generator` crate (6s vs 27s) +- All shared types consolidated in `scotty-types` crate (single source of truth) +- Docker builds support multiple platforms (ARM64, x86_64, glibc, musl) +- Conventional commits are enforced via git-cliff +- Pre-push hooks via cargo-husky perform quality checks +- Container apps directory must have identical paths on host and container for bind mounts +- Use conventional commit messages +- **IMPORTANT**: Always run quality checks before committing: + - Rust code: `cargo fmt` and `cargo clippy` + - Frontend code: `cd frontend && bun run lint` (runs Prettier and ESLint) + - If linting fails, run `bun run format` to auto-fix formatting issues + +## Current Work in Progress + +### Unified Output System Implementation + +**Branch:** `feat/better-logs-and-shell` + +See beads issues (scotty-1 and children) for current implementation status and remaining work. + +**Reference Documents:** +- `docs/prds/unified-output-system.md` - Complete PRD and technical specifications +- `docs/technical-spike-bollard-findings.md` - Bollard API validation results + +**Key Notes:** +- The build files of scotty_frontend will be embedded into scotty, so restart scotty after the frontend files got rebuilt +- Backend log streaming and shell services are fully implemented and tested +- CLI `app:logs` command is fully functional with real-time streaming +- Frontend task output viewer uses WebSocket integration +- Breaking change: TaskDetails no longer contains stdout/stderr fields (uses WebSocket streaming instead) diff --git a/Cargo.lock b/Cargo.lock index 23737abf..05ec41c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,23 @@ version = 4 [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "const-random", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] [[package]] name = "aho-corasick" @@ -47,9 +61,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -62,36 +76,37 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", - "windows-sys 0.59.0", + "once_cell_polyfill", + "windows-sys 0.60.2", ] [[package]] @@ -102,9 +117,9 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] @@ -121,6 +136,16 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "assert-json-diff" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "async-stream" version = "0.3.6" @@ -162,36 +187,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "axum" -version = "0.7.9" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" -dependencies = [ - "async-trait", - "axum-core 0.4.5", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "itoa", - "matchit 0.7.3", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper", - "tower 0.5.2", - "tower-layer", - "tower-service", -] +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" @@ -199,19 +197,19 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871" dependencies = [ - "axum-core 0.5.5", + "axum-core", "axum-macros", "base64 0.22.1", "bytes", "form_urlencoded", "futures-util", - "http", - "http-body", + "http 1.3.1", + "http-body 1.0.1", "http-body-util", - "hyper", + "hyper 1.7.0", "hyper-util", "itoa", - "matchit 0.8.4", + "matchit", "memchr", "mime", "percent-encoding", @@ -221,35 +219,15 @@ dependencies = [ "serde_path_to_error", "serde_urlencoded", "sha1", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", "tokio-tungstenite", - "tower 0.5.2", + "tower", "tower-layer", "tower-service", "tracing", ] -[[package]] -name = "axum-core" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", -] - [[package]] name = "axum-core" version = "0.5.5" @@ -258,12 +236,12 @@ checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" dependencies = [ "bytes", "futures-core", - "http", - "http-body", + "http 1.3.1", + "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", - "sync_wrapper", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", "tracing", @@ -280,24 +258,60 @@ dependencies = [ "syn", ] +[[package]] +name = "axum-test" +version = "18.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680e88effaafbb28675074f29cda0e984c984bed5eb513085c17caf7de564225" +dependencies = [ + "anyhow", + "axum", + "bytes", + "bytesize", + "cookie", + "expect-json", + "http 1.3.1", + "http-body-util", + "hyper 1.7.0", + "hyper-util", + "mime", + "pretty_assertions", + "reserve-port", + "rust-multipart-rfc7578_2", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "tokio", + "tower", + "url", +] + [[package]] name = "axum-tracing-opentelemetry" -version = "0.26.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248d7a5925bf89cc9997882d3d0768061477c9b5998959fcebaa5bf8ba4d50dc" +checksum = "328c8ddd5ca871b2a5acb00be0b4f103aa62f5d6b6db4071ccf3b12b0629e7c1" dependencies = [ - "axum 0.8.6", + "axum", "futures-core", "futures-util", - "http", + "http 1.3.1", "opentelemetry", + "opentelemetry-semantic-conventions", "pin-project-lite", - "tower 0.5.2", + "tower", "tracing", "tracing-opentelemetry", "tracing-opentelemetry-instrumentation-sdk", ] +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "base64" version = "0.21.7" @@ -318,18 +332,24 @@ checksum = "abaf6da45c74385272ddf00e1ac074c7d8a6c1a1dda376902bd6a427522a8b2c" dependencies = [ "base64 0.22.1", "blowfish", - "getrandom 0.3.1", + "getrandom 0.3.4", "subtle", "zeroize", ] [[package]] name = "bitflags" -version = "2.9.0" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -363,9 +383,9 @@ dependencies = [ "futures-core", "futures-util", "hex", - "http", + "http 1.3.1", "http-body-util", - "hyper", + "hyper 1.7.0", "hyper-named-pipe", "hyper-util", "hyperlocal", @@ -376,7 +396,7 @@ dependencies = [ "serde_json", "serde_repr", "serde_urlencoded", - "thiserror", + "thiserror 2.0.17", "tokio", "tokio-util", "tower-service", @@ -398,15 +418,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytecount" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "byteorder" @@ -416,9 +436,24 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "bytesize" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5c434ae3cf0089ca203e9019ebe529c47ff45cefe8af7c85ecb734ef541822f" + +[[package]] +name = "camino" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +dependencies = [ + "serde_core", +] [[package]] name = "cargo-husky" @@ -426,20 +461,66 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b02b629252fe8ef6460461409564e2c21d0c8e77e0944f3d189ff06c4e932ad" +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", +] + +[[package]] +name = "casbin" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "204a52f19e041f2abcc31cd10e6692ea441ab420e163b4e7cf1238315204ab86" +dependencies = [ + "async-trait", + "fixedbitset", + "getrandom 0.3.4", + "hashlink 0.9.1", + "mini-moka", + "once_cell", + "parking_lot", + "petgraph", + "regex", + "rhai", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "wasm-bindgen-test", +] + [[package]] name = "cc" -version = "1.2.16" +version = "1.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2" dependencies = [ + "find-msvc-tools", "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -458,7 +539,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -516,9 +597,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "clokwerk" @@ -531,9 +612,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "config" @@ -570,7 +651,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "tiny-keccak", ] @@ -593,6 +674,16 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -605,9 +696,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -621,29 +712,63 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + [[package]] name = "crossterm" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags", + "bitflags 2.10.0", "crossterm_winapi", "derive_more", "document-features", @@ -666,9 +791,9 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" @@ -680,27 +805,58 @@ dependencies = [ "typenum", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" -version = "2.6.0" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "deadpool" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be2b1d1d6ec8d846f05e137292d0b89133caf95ef33695424c09568bdd39b1b" +dependencies = [ + "deadpool-runtime", + "lazy_static", + "num_cpus", + "tokio", +] + +[[package]] +name = "deadpool-runtime" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" [[package]] name = "deranged" -version = "0.3.11" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", @@ -734,6 +890,12 @@ version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + [[package]] name = "digest" version = "0.10.7" @@ -766,9 +928,9 @@ dependencies = [ [[package]] name = "document-features" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ "litrs", ] @@ -779,12 +941,27 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "email_address" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" +dependencies = [ + "serde", +] + [[package]] name = "encoding_rs" version = "0.8.35" @@ -796,28 +973,66 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" dependencies = [ "serde", + "serde_core", "typeid", ] [[package]] name = "errno" -version = "0.3.10" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "version_check", +] + +[[package]] +name = "expect-json" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7519e78573c950576b89eb4f4fe82aedf3a80639245afa07e3ee3d199dcdb29e" +dependencies = [ + "chrono", + "email_address", + "expect-json-macros", + "num", + "serde", + "serde_json", + "thiserror 2.0.17", + "typetag", + "uuid", +] + +[[package]] +name = "expect-json-macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bf7f5979e98460a0eb412665514594f68f366a32b85fa8d7ffb65bb1edee6a0" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -826,11 +1041,23 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "libz-rs-sys", @@ -873,6 +1100,21 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -935,6 +1177,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -948,9 +1191,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -958,48 +1201,69 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasip2", + "wasm-bindgen", ] [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "h2" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.12.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] [[package]] name = "h2" -version = "0.4.7" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http", - "indexmap 2.7.0", + "http 1.3.1", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -1017,23 +1281,41 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + [[package]] name = "hashlink" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.5", ] [[package]] @@ -1042,6 +1324,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "hex" version = "0.4.3" @@ -1050,15 +1338,37 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" -version = "1.2.0" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", "itoa", ] +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + [[package]] name = "http-body" version = "1.0.1" @@ -1066,7 +1376,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http", + "http 1.3.1", ] [[package]] @@ -1077,8 +1387,8 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http", - "http-body", + "http 1.3.1", + "http-body 1.0.1", "pin-project-lite", ] @@ -1090,9 +1400,9 @@ checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1102,20 +1412,46 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.6.0" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", + "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", "httparse", "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1128,7 +1464,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" dependencies = [ "hex", - "hyper", + "hyper 1.7.0", "hyper-util", "pin-project-lite", "tokio", @@ -1138,21 +1474,34 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.32", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.3.1", + "hyper 1.7.0", "hyper-util", - "rustls", + "rustls 0.23.34", "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 0.26.7", + "webpki-roots 1.0.3", ] [[package]] @@ -1161,7 +1510,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper", + "hyper 1.7.0", "hyper-util", "pin-project-lite", "tokio", @@ -1176,7 +1525,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper", + "hyper 1.7.0", "hyper-util", "native-tls", "tokio", @@ -1186,24 +1535,24 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.13" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", "futures-core", "futures-util", - "http", - "http-body", - "hyper", + "http 1.3.1", + "http-body 1.0.1", + "hyper 1.7.0", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", - "system-configuration", + "socket2 0.6.1", + "system-configuration 0.6.1", "tokio", "tower-service", "tracing", @@ -1218,7 +1567,7 @@ checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7" dependencies = [ "hex", "http-body-util", - "hyper", + "hyper 1.7.0", "hyper-util", "pin-project-lite", "tokio", @@ -1227,16 +1576,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core", + "windows-core 0.62.2", ] [[package]] @@ -1250,21 +1600,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -1273,31 +1624,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -1305,67 +1636,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "idna" version = "1.1.0" @@ -1379,9 +1697,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -1419,26 +1737,27 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] name = "init-tracing-opentelemetry" -version = "0.27.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa368e50bd23d6445105987d7dc4fed10d93b3dc4fc9f38b25f691edb7c3b352" +checksum = "3405b8beafca487bde01d88e05e6646c4e5c6a3c9830e7b937290ea8f7f5e5d9" dependencies = [ "opentelemetry", "opentelemetry-otlp", "opentelemetry-semantic-conventions", "opentelemetry_sdk", - "thiserror", + "thiserror 2.0.17", "tracing", "tracing-opentelemetry", "tracing-subscriber", @@ -1446,18 +1765,36 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "generic-array", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "inventory" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" +dependencies = [ + "rustversion", +] + [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" @@ -1469,11 +1806,30 @@ dependencies = [ "serde", ] +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -1486,15 +1842,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -1519,58 +1875,67 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.172" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "libyml" +version = "0.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "3302702afa434ffa30847a83305f0a69d6abd74293b6554c18ec85c7ef30c980" +dependencies = [ + "anyhow", + "version_check", +] [[package]] name = "libz-rs-sys" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" +checksum = "840db8cf39d9ec4dd794376f38acc40d0fc65eec2a8f484f7fd375b84602becd" dependencies = [ "zlib-rs", ] [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" -version = "0.4.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] -name = "lockfree-object-pool" -version = "0.1.6" +name = "log" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] -name = "log" -version = "0.4.22" +name = "lru-slab" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "maplit" @@ -1587,12 +1952,6 @@ dependencies = [ "regex-automata", ] -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - [[package]] name = "matchit" version = "0.8.4" @@ -1601,9 +1960,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mime" @@ -1621,6 +1980,31 @@ dependencies = [ "unicase", ] +[[package]] +name = "mini-moka" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c325dfab65f261f386debee8b0969da215b3fa0037e74c8a1234db7ba986d803" +dependencies = [ + "crossbeam-channel", + "crossbeam-utils", + "dashmap", + "skeptic", + "smallvec", + "tagptr", + "triomphe", +] + +[[package]] +name = "minicov" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" +dependencies = [ + "cc", + "walkdir", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1629,30 +2013,31 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -1665,6 +2050,15 @@ dependencies = [ "tempfile", ] +[[package]] +name = "no-std-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" +dependencies = [ + "spin", +] + [[package]] name = "nom" version = "7.1.3" @@ -1675,13 +2069,55 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + [[package]] name = "nu-ansi-term" -version = "0.50.1" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", ] [[package]] @@ -1690,6 +2126,37 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1699,19 +2166,69 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "oauth2" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c38841cdd844847e3e7c8d29cef9dcfed8877f8f56f9071f77843ecf3baf937f" +dependencies = [ + "base64 0.13.1", + "chrono", + "getrandom 0.2.16", + "http 0.2.12", + "rand 0.8.5", + "reqwest 0.11.27", + "serde", + "serde_json", + "serde_path_to_error", + "sha2", + "thiserror 1.0.69", + "url", +] + [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "open" +version = "5.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" +dependencies = [ + "is-wsl", + "libc", + "pathdiff", +] [[package]] name = "openssl" -version = "0.10.72" +version = "0.10.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" dependencies = [ - "bitflags", + "bitflags 2.10.0", "cfg-if", "foreign-types", "libc", @@ -1733,15 +2250,15 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.107" +version = "0.9.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" +checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" dependencies = [ "cc", "libc", @@ -1751,85 +2268,82 @@ dependencies = [ [[package]] name = "opentelemetry" -version = "0.28.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "236e667b670a5cdf90c258f5a55794ec5ac5027e960c224bff8367a59e1e6426" +checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" dependencies = [ "futures-core", "futures-sink", "js-sys", "pin-project-lite", - "thiserror", + "thiserror 2.0.17", "tracing", ] [[package]] name = "opentelemetry-http" -version = "0.28.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8863faf2910030d139fb48715ad5ff2f35029fc5f244f6d5f689ddcf4d26253" +checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" dependencies = [ "async-trait", "bytes", - "http", + "http 1.3.1", "opentelemetry", - "reqwest", - "tracing", + "reqwest 0.12.24", ] [[package]] name = "opentelemetry-otlp" -version = "0.28.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bef114c6d41bea83d6dc60eb41720eedd0261a67af57b66dd2b84ac46c01d91" +checksum = "7a2366db2dca4d2ad033cad11e6ee42844fd727007af5ad04a1730f4cb8163bf" dependencies = [ - "async-trait", - "futures-core", - "http", + "http 1.3.1", "opentelemetry", "opentelemetry-http", "opentelemetry-proto", "opentelemetry_sdk", "prost", - "reqwest", - "thiserror", + "reqwest 0.12.24", + "thiserror 2.0.17", "tokio", "tonic", + "tracing", ] [[package]] name = "opentelemetry-proto" -version = "0.28.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f8870d3024727e99212eb3bb1762ec16e255e3e6f58eeb3dc8db1aa226746d" +checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" dependencies = [ "opentelemetry", "opentelemetry_sdk", "prost", "tonic", + "tonic-prost", ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.28.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fb3a2f78c2d55362cd6c313b8abedfbc0142ab3c2676822068fd2ab7d51f9b7" +checksum = "e62e29dfe041afb8ed2a6c9737ab57db4907285d999ef8ad3a59092a36bdc846" [[package]] name = "opentelemetry_sdk" -version = "0.28.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84dfad6042089c7fc1f6118b7040dc2eb4ab520abbf410b79dc481032af39570" +checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" dependencies = [ - "async-trait", "futures-channel", "futures-executor", "futures-util", - "glob", "opentelemetry", "percent-encoding", - "rand 0.8.5", - "thiserror", + "rand 0.9.2", + "thiserror 2.0.17", "tokio", "tokio-stream", ] @@ -1865,9 +2379,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1875,23 +2389,17 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "path-clean" version = "1.0.1" @@ -1912,20 +2420,19 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.7.15" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" dependencies = [ "memchr", - "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.15" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" +checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" dependencies = [ "pest", "pest_generator", @@ -1933,9 +2440,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.15" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" +checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" dependencies = [ "pest", "pest_meta", @@ -1946,15 +2453,24 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.7.15" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" dependencies = [ - "once_cell", "pest", "sha2", ] +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.12.0", +] + [[package]] name = "pin-project" version = "1.1.10" @@ -1977,9 +2493,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1989,9 +2505,24 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] [[package]] name = "powerfmt" @@ -2001,13 +2532,23 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -2032,18 +2573,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "prost" -version = "0.13.5" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" dependencies = [ "bytes", "prost-derive", @@ -2051,9 +2592,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.5" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" dependencies = [ "anyhow", "itertools", @@ -2062,39 +2603,53 @@ dependencies = [ "syn", ] +[[package]] +name = "pulldown-cmark" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" +dependencies = [ + "bitflags 2.10.0", + "memchr", + "unicase", +] + [[package]] name = "quinn" -version = "0.11.6" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", - "rustls", - "socket2 0.5.10", - "thiserror", + "rustls 0.23.34", + "socket2 0.6.1", + "thiserror 2.0.17", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.9" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.2.15", - "rand 0.8.5", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", "ring", "rustc-hash", - "rustls", + "rustls 0.23.34", "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -2102,27 +2657,33 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.9" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.1", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.8.5" @@ -2136,9 +2697,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -2170,7 +2731,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -2179,7 +2740,27 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.4", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", ] [[package]] @@ -2195,11 +2776,31 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.12" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.10.0", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2227,9 +2828,50 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "reqwest" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls 0.24.2", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", + "tokio", + "tokio-rustls 0.24.1", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.25.4", + "winreg", +] [[package]] name = "reqwest" @@ -2243,12 +2885,12 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", "http-body-util", - "hyper", - "hyper-rustls", + "hyper 1.7.0", + "hyper-rustls 0.27.7", "hyper-tls", "hyper-util", "js-sys", @@ -2258,24 +2900,63 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls", + "rustls 0.23.34", "rustls-native-certs", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", "tokio-native-tls", - "tokio-rustls", - "tower 0.5.2", + "tokio-rustls 0.26.4", + "tower", "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.0", + "webpki-roots 1.0.3", +] + +[[package]] +name = "reserve-port" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21918d6644020c6f6ef1993242989bf6d4952d2e025617744f184c02df51c356" +dependencies = [ + "thiserror 2.0.17", +] + +[[package]] +name = "rhai" +version = "1.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527390cc333a8d2cd8237890e15c36518c26f8b54c903d86fc59f42f08d25594" +dependencies = [ + "ahash", + "bitflags 2.10.0", + "instant", + "no-std-compat", + "num-traits", + "once_cell", + "rhai_codegen", + "serde", + "smallvec", + "smartstring", + "thin-vec", +] + +[[package]] +name = "rhai_codegen" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4322a2a4e8cf30771dd9f27f7f37ca9ac8fe812dddd811096a98483080dabe6" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2286,7 +2967,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", @@ -2299,16 +2980,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.7", - "bitflags", + "bitflags 2.10.0", "serde", "serde_derive", ] [[package]] name = "rust-embed" -version = "8.5.0" +version = "8.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" +checksum = "fb44e1917075637ee8c7bcb865cf8830e3a92b5b1189e44e3a0ab5a0d5be314b" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -2317,9 +2998,9 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.5.0" +version = "8.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" +checksum = "382499b49db77a7c19abd2a574f85ada7e9dbe125d5d1160fa5cad7c4cf71fc9" dependencies = [ "proc-macro2", "quote", @@ -2330,9 +3011,9 @@ dependencies = [ [[package]] name = "rust-embed-utils" -version = "8.5.0" +version = "8.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" +checksum = "21fcbee55c2458836bcdbfffb6ec9ba74bbc23ca7aa6816015a3dd2c4d8fc185" dependencies = [ "sha2", "walkdir", @@ -2348,65 +3029,113 @@ dependencies = [ "ordered-multimap", ] +[[package]] +name = "rust-multipart-rfc7578_2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c839d037155ebc06a571e305af66ff9fd9063a6e662447051737e1ac75beea41" +dependencies = [ + "bytes", + "futures-core", + "futures-util", + "http 1.3.1", + "mime", + "rand 0.9.2", + "thiserror 2.0.17", +] + [[package]] name = "rustc-hash" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustix" -version = "1.0.5" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", ] [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" dependencies = [ + "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki", + "rustls-webpki 0.103.7", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.2.0", + "security-framework 3.5.1", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", ] [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", ] [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ "ring", "rustls-pki-types", @@ -2415,15 +3144,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -2436,11 +3165,35 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" dependencies = [ - "windows-sys 0.59.0", + "dyn-clone", + "ref-cast", + "serde", + "serde_json", ] [[package]] @@ -2451,15 +3204,17 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scotty" -version = "0.1.0-alpha.38" +version = "0.2.0-alpha.1" dependencies = [ "anyhow", "async-trait", - "axum 0.8.6", + "axum", + "axum-test", "axum-tracing-opentelemetry", "base64 0.22.1", "bcrypt", "bollard", + "casbin", "chrono", "clap", "clokwerk", @@ -2470,51 +3225,68 @@ dependencies = [ "init-tracing-opentelemetry", "maplit", "mime_guess", + "num_cpus", + "oauth2", + "once_cell", "opentelemetry", + "opentelemetry-otlp", "opentelemetry_sdk", "path-clean", "readonly", "regex", - "reqwest", + "reqwest 0.12.24", "scotty-core", + "scotty-types", "serde", "serde_json", "serde_norway", + "serde_yml", + "subtle", + "sysinfo", "tempfile", - "thiserror", + "thiserror 2.0.17", "tokio", + "tokio-metrics", "tokio-stream", + "tokio-test", "tower-http", "tracing", "tracing-opentelemetry", "tracing-subscriber", + "url", "urlencoding", "utoipa", - "utoipa-axum", "utoipa-rapidoc", "utoipa-redoc", "utoipa-swagger-ui", "uuid", "walkdir", + "wiremock", ] [[package]] name = "scotty-core" -version = "0.1.0-alpha.38" +version = "0.2.0-alpha.1" dependencies = [ "anyhow", "async-trait", + "axum", "bollard", "cargo-husky", "chrono", + "clap", "clokwerk", "deunicode", "readonly", + "reqwest 0.12.24", + "scotty-types", "secrecy", + "semver", "serde", "serde_json", "serde_norway", "tempfile", + "thiserror 2.0.17", "tokio", "tracing", "url", @@ -2523,9 +3295,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "scotty-ts-generator" +version = "0.2.0-alpha.1" +dependencies = [ + "scotty-types", +] + +[[package]] +name = "scotty-types" +version = "0.2.0-alpha.1" +dependencies = [ + "chrono", + "serde", + "ts-rs", + "utoipa", + "uuid", +] + [[package]] name = "scottyctl" -version = "0.1.0-alpha.38" +version = "0.2.0-alpha.1" dependencies = [ "anyhow", "base64 0.22.1", @@ -2534,18 +3324,36 @@ dependencies = [ "clap_complete", "crossterm", "dotenvy", + "futures-util", + "open", "owo-colors", - "reqwest", + "reqwest 0.12.24", "scotty-core", + "scotty-types", + "semver", "serde", "serde_json", "tabled", + "thiserror 2.0.17", "tokio", + "tokio-tungstenite", "tracing", "tracing-subscriber", + "url", + "uuid", "walkdir", ] +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "secrecy" version = "0.10.3" @@ -2562,7 +3370,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.10.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -2571,12 +3379,12 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.2.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags", - "core-foundation 0.10.0", + "bitflags 2.10.0", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -2584,14 +3392,24 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde" version = "1.0.228" @@ -2653,7 +3471,7 @@ version = "0.9.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e408f29489b5fd500fab51ff1484fc859bb655f32c671f307dcd733b72e8168c" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.12.0", "itoa", "ryu", "serde", @@ -2662,19 +3480,20 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.16" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", @@ -2704,21 +3523,37 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.12.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.0", - "serde", - "serde_derive", + "indexmap 2.12.0", + "schemars 0.9.0", + "schemars 1.0.4", + "serde_core", "serde_json", "time", ] +[[package]] +name = "serde_yml" +version = "0.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59e2dd588bf1597a252c3b920e0143eb99b0f76e4e082f4c92ce34fbc9e71ddd" +dependencies = [ + "indexmap 2.12.0", + "itoa", + "libyml", + "memchr", + "ryu", + "serde", + "version_check", +] + [[package]] name = "sha1" version = "0.10.6" @@ -2732,9 +3567,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -2768,9 +3603,9 @@ dependencies = [ [[package]] name = "signal-hook-mio" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" dependencies = [ "libc", "mio", @@ -2779,9 +3614,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -2793,19 +3628,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] -name = "slab" -version = "0.4.9" +name = "skeptic" +version = "0.13.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" dependencies = [ - "autocfg", + "bytecount", + "cargo_metadata", + "error-chain", + "glob", + "pulldown-cmark", + "tempfile", + "walkdir", ] +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] + +[[package]] +name = "smartstring" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" +dependencies = [ + "autocfg", + "serde", + "static_assertions", + "version_check", +] [[package]] name = "socket2" @@ -2819,19 +3681,31 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" @@ -2847,15 +3721,21 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.90" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -2867,24 +3747,59 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "sysinfo" +version = "0.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" +dependencies = [ + "core-foundation-sys", + "libc", + "memchr", + "ntapi", + "rayon", + "windows", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "system-configuration-sys 0.5.0", +] + [[package]] name = "system-configuration" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags", + "bitflags 2.10.0", "core-foundation 0.9.4", - "system-configuration-sys", + "system-configuration-sys 0.6.0", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] @@ -2923,6 +3838,12 @@ dependencies = [ "syn", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tempfile" version = "3.23.0" @@ -2930,10 +3851,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.1", + "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", ] [[package]] @@ -2946,13 +3876,42 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "thin-vec" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" +dependencies = [ + "serde", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + [[package]] name = "thiserror" version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2968,19 +3927,18 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] name = "time" -version = "0.3.37" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -2993,15 +3951,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -3018,9 +3976,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -3028,9 +3986,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -3052,9 +4010,9 @@ dependencies = [ "mio", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.0", + "socket2 0.6.1", "tokio-macros", - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] @@ -3068,6 +4026,18 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-metrics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eace09241d62c98b7eeb1107d4c5c64ca3bd7da92e8c218c153ab3a78f9be112" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", + "tokio-stream", +] + [[package]] name = "tokio-native-tls" version = "0.3.1" @@ -3080,11 +4050,21 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.34", "tokio", ] @@ -3099,6 +4079,19 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-test" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" +dependencies = [ + "async-stream", + "bytes", + "futures-core", + "tokio", + "tokio-stream", +] + [[package]] name = "tokio-tungstenite" version = "0.28.0" @@ -3113,9 +4106,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -3157,54 +4150,42 @@ dependencies = [ [[package]] name = "tonic" -version = "0.12.3" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" dependencies = [ - "async-stream", "async-trait", - "axum 0.7.9", "base64 0.22.1", "bytes", - "h2", - "http", - "http-body", + "http 1.3.1", + "http-body 1.0.1", "http-body-util", - "hyper", + "hyper 1.7.0", "hyper-timeout", "hyper-util", - "percent-encoding", - "pin-project", - "prost", - "socket2 0.5.10", - "tokio", - "tokio-stream", - "tower 0.4.13", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", + "percent-encoding", "pin-project", - "pin-project-lite", - "rand 0.8.5", - "slab", + "sync_wrapper 1.0.2", "tokio", - "tokio-util", + "tokio-rustls 0.26.4", + "tokio-stream", + "tower", "tower-layer", "tower-service", "tracing", ] +[[package]] +name = "tonic-prost" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" +dependencies = [ + "bytes", + "prost", + "tonic", +] + [[package]] name = "tower" version = "0.5.2" @@ -3213,9 +4194,12 @@ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", + "indexmap 2.12.0", "pin-project-lite", - "sync_wrapper", + "slab", + "sync_wrapper 1.0.2", "tokio", + "tokio-util", "tower-layer", "tower-service", "tracing", @@ -3227,12 +4211,12 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags", + "bitflags 2.10.0", "bytes", "futures-core", "futures-util", - "http", - "http-body", + "http 1.3.1", + "http-body 1.0.1", "http-body-util", "http-range-header", "httpdate", @@ -3243,7 +4227,7 @@ dependencies = [ "pin-project-lite", "tokio", "tokio-util", - "tower 0.5.2", + "tower", "tower-layer", "tower-service", "tracing", @@ -3275,9 +4259,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", @@ -3286,9 +4270,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -3307,15 +4291,16 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.29.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721f2d2569dce9f3dfbbddee5906941e953bfcdf736a62da3377f5751650cc36" +checksum = "1e6e5658463dd88089aba75c7791e1d3120633b1bfde22478b28f625a9bb1b8e" dependencies = [ "js-sys", - "once_cell", "opentelemetry", "opentelemetry_sdk", + "rustversion", "smallvec", + "thiserror 2.0.17", "tracing", "tracing-core", "tracing-log", @@ -3325,12 +4310,13 @@ dependencies = [ [[package]] name = "tracing-opentelemetry-instrumentation-sdk" -version = "0.26.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cae2c7a01582abc7b0a4672f92c47411b69cd3967b8b79bb743d5d0991c9089" +checksum = "7a1a4dcfb798af2cef9e47c30a14e13c108b4b40e057120401b2025ec622c416" dependencies = [ - "http", + "http 1.3.1", "opentelemetry", + "opentelemetry-semantic-conventions", "tracing", "tracing-opentelemetry", ] @@ -3366,12 +4352,42 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "triomphe" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" + [[package]] name = "try-lock" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "ts-rs" +version = "11.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4994acea2522cd2b3b85c1d9529a55991e3ad5e25cdcd3de9d505972c4379424" +dependencies = [ + "chrono", + "thiserror 2.0.17", + "ts-rs-macros", + "uuid", +] + +[[package]] +name = "ts-rs-macros" +version = "11.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6ff59666c9cbaec3533964505d39154dc4e0a56151fdea30a09ed0301f62e2" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "termcolor", +] + [[package]] name = "tungstenite" version = "0.28.0" @@ -3380,12 +4396,12 @@ checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" dependencies = [ "bytes", "data-encoding", - "http", + "http 1.3.1", "httparse", "log", - "rand 0.9.1", + "rand 0.9.2", "sha1", - "thiserror", + "thiserror 2.0.17", "utf-8", ] @@ -3397,9 +4413,33 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "typetag" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2212c8a9b9bcfca32024de14998494cf9a5dfa59ea1b829de98bac374b86bf" +dependencies = [ + "erased-serde", + "inventory", + "once_cell", + "serde", + "typetag-impl", +] + +[[package]] +name = "typetag-impl" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "27a7a9b72ba121f6f1f6c3632b85604cac41aedb5ddc70accbebb6cac83de846" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "ucd-trie" @@ -3415,9 +4455,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" [[package]] name = "unicode-segmentation" @@ -3427,9 +4467,9 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unsafe-libyaml-norway" @@ -3467,12 +4507,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -3491,25 +4525,12 @@ version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.12.0", "serde", "serde_json", "utoipa-gen", ] -[[package]] -name = "utoipa-axum" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c25bae5bccc842449ec0c5ddc5cbb6a3a1eaeac4503895dc105a1138f8234a0" -dependencies = [ - "axum 0.8.6", - "paste", - "tower-layer", - "tower-service", - "utoipa", -] - [[package]] name = "utoipa-gen" version = "5.4.0" @@ -3529,7 +4550,7 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5f8f5abd341cce16bb4f09a8bafc087d4884a004f25fb980e538d51d6501dab" dependencies = [ - "axum 0.8.6", + "axum", "serde", "serde_json", "utoipa", @@ -3541,7 +4562,7 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6427547f6db7ec006cbbef95f7565952a16f362e298b416d2d497d9706fef72d" dependencies = [ - "axum 0.8.6", + "axum", "serde", "serde_json", "utoipa", @@ -3553,11 +4574,11 @@ version = "9.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d047458f1b5b65237c2f6dc6db136945667f40a7668627b3490b9513a3d43a55" dependencies = [ - "axum 0.8.6", + "axum", "base64 0.22.1", "mime_guess", "regex", - "reqwest", + "reqwest 0.12.24", "rust-embed", "serde", "serde_json", @@ -3572,7 +4593,7 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.4", "js-sys", "serde", "wasm-bindgen", @@ -3580,9 +4601,9 @@ dependencies = [ [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -3627,36 +4648,37 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.13.3+wasi-0.2.2" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -3668,9 +4690,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -3681,9 +4703,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3691,9 +4713,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -3704,18 +4726,42 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-bindgen-test" +version = "0.3.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e381134e148c1062f965a42ed1f5ee933eef2927c3f70d1812158f711d39865" +dependencies = [ + "js-sys", + "minicov", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b673bca3298fe582aeef8352330ecbad91849f85090805582400850f8270a2e8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -3733,18 +4779,15 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.7" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" -dependencies = [ - "rustls-pki-types", -] +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" dependencies = [ "rustls-pki-types", ] @@ -3767,11 +4810,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3780,54 +4823,160 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" -version = "0.52.0" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" dependencies = [ + "windows-implement 0.57.0", + "windows-interface 0.57.0", + "windows-result 0.1.2", "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" -version = "0.1.0" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-link" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-registry" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.53.0", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] name = "windows-result" -version = "0.3.1" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.1.0", + "windows-link 0.2.1", ] [[package]] name = "windows-strings" -version = "0.3.1" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-link 0.1.0", + "windows-targets 0.48.5", ] [[package]] @@ -3841,20 +4990,35 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.61.1" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows-link 0.2.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -3875,20 +5039,27 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -3897,9 +5068,15 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" @@ -3909,9 +5086,15 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" @@ -3921,9 +5104,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -3933,9 +5116,15 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" @@ -3945,9 +5134,15 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" @@ -3957,9 +5152,15 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" @@ -3969,9 +5170,15 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" @@ -3981,9 +5188,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -3995,25 +5202,49 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.33.0" +name = "winreg" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "bitflags", + "cfg-if", + "windows-sys 0.48.0", ] [[package]] -name = "write16" -version = "1.0.0" +name = "wiremock" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08db1edfb05d9b3c1542e521aea074442088292f00b5f28e435c714a98f85031" +dependencies = [ + "assert-json-diff", + "base64 0.22.1", + "deadpool", + "futures", + "http 1.3.1", + "http-body-util", + "hyper 1.7.0", + "hyper-util", + "log", + "once_cell", + "regex", + "serde", + "serde_json", + "tokio", + "url", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "yaml-rust2" @@ -4023,14 +5254,20 @@ checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" dependencies = [ "arraydeque", "encoding_rs", - "hashlink", + "hashlink 0.10.0", ] +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -4040,9 +5277,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", @@ -4052,19 +5289,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", @@ -4073,18 +5309,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", @@ -4098,11 +5334,22 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -4111,9 +5358,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", @@ -4129,27 +5376,25 @@ dependencies = [ "arbitrary", "crc32fast", "flate2", - "indexmap 2.7.0", + "indexmap 2.12.0", "memchr", "zopfli", ] [[package]] name = "zlib-rs" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" +checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" [[package]] name = "zopfli" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" dependencies = [ "bumpalo", "crc32fast", - "lockfree-object-pool", "log", - "once_cell", "simd-adler32", ] diff --git a/Cargo.toml b/Cargo.toml index 2d86c3b1..8d67cd52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,9 @@ [workspace] -members = ["scotty-core", "scotty", "scottyctl"] +members = ["scotty-core", "scotty", "scottyctl", "scotty-types", "ts-generator"] resolver = "2" [workspace.package] -version = "0.1.0-alpha.38" +version = "0.2.0-alpha.1" edition = "2021" rust-version = "1.86" description = "scotty is a Micro-PaaS which helps you to administer a bunch of docker-compose-based applications. It comes with an API and a cli" @@ -31,23 +31,28 @@ tokio = { version = "1.44.2", features = [ "signal", "process", ] } +tokio-metrics = "0.3" tracing = "0.1.40" -tracing-subscriber = "*" -opentelemetry = { version = "0.28.0", features = ["trace"] } -opentelemetry_sdk = { version = "0.28", features = [ +tracing-subscriber = "0.3" +ts-rs = "11.0" +opentelemetry = { version = "0.31.0", features = ["trace", "metrics"] } +opentelemetry_sdk = { version = "0.31", features = [ "rt-tokio", + "metrics", ], default-features = false } -tracing-opentelemetry = "0.29" -init-tracing-opentelemetry = { version = "0.27.0", features = [ +tracing-opentelemetry = "0.32" +init-tracing-opentelemetry = { version = "0.32.1", features = [ "otlp", "tracing_subscriber_ext", ] } -axum-tracing-opentelemetry = "0.26.0" -opentelemetry-otlp = { version = "0.28.0", features = [ +axum-tracing-opentelemetry = "0.32.1" +opentelemetry-otlp = { version = "0.31.0", features = [ + "grpc-tonic", "reqwest-client", "reqwest-rustls", "http-proto", "tls", + "metrics", ] } utoipa = { version = "5.3", features = ["axum_extras", "uuid", "chrono"] } @@ -57,7 +62,7 @@ utoipa-rapidoc = { version = "6.0", features = ["axum"] } utoipa-axum = "0.2" tower-http = { version = "0.6.1", features = ["cors", "fs"] } -tokio-tungstenite = "*" +tokio-tungstenite = "0.28" futures-util = "0.3.30" uuid = { version = "1.10", features = ["v4", "serde"] } reqwest = { version = "0.12.8", features = ["json"] } @@ -81,8 +86,14 @@ dotenvy = "0.15.7" url = "2.5" include_dir = "0.7.3" mime_guess = "2.0.4" +semver = "1.0" +casbin = { version = "2.8", default-features = false, features = ["runtime-tokio", "cached"] } secrecy = { version = "0.10", features = ["serde"] } +subtle = "2.6" zeroize = "1.8" +sysinfo = "0.33" +once_cell = "1.20" +num_cpus = "1.16" [workspace.metadata.release] pre-release-hook = ["sh", "-c", "git cliff -o CHANGELOG.md --tag {{version}}"] diff --git a/Dockerfile b/Dockerfile index 4b64876b..1d0b0b93 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,5 @@ -# First build the frontend -FROM node:22 as frontend-builder -WORKDIR /app -COPY ./frontend /app -RUN yarn install && yarn build - -# Now build the backend with the frontend files embedded -FROM rust:1.89-slim-bookworm as chef +# Base Rust environment with cargo-chef +FROM rust:1.89-slim-bookworm AS chef RUN apt-get update -y && \ apt-get install --no-install-recommends -y pkg-config make g++ libssl-dev curl jq && \ rustup target add x86_64-unknown-linux-gnu && \ @@ -16,10 +10,34 @@ RUN cargo install cargo-chef WORKDIR /app FROM chef AS planner -COPY --from=frontend-builder /app/build /app/frontend/build COPY . . RUN cargo chef prepare --recipe-path recipe.json +# TypeScript generation stage using cargo-chef +FROM chef AS ts-generator +COPY --from=planner /app/recipe.json recipe.json +RUN cargo chef cook --recipe-path recipe.json --package scotty-ts-generator +COPY . . +RUN cargo run --package scotty-ts-generator + +# Frontend build stage +FROM oven/bun:1 AS frontend-builder +WORKDIR /app +COPY frontend/package.json frontend/bun.lock ./ +RUN bun install --frozen-lockfile +# Install all potential Rollup platform binaries as optional dependencies +# This ensures the build works across different target platforms +RUN bun add \ + @rollup/rollup-linux-x64-gnu \ + @rollup/rollup-linux-arm64-gnu \ + @rollup/rollup-linux-x64-musl \ + @rollup/rollup-linux-arm64-musl \ + --optional +COPY frontend/ ./ +COPY --from=ts-generator /app/frontend/src/generated ./src/generated +RUN bun run build + +# Main application build stage FROM chef AS builder COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json @@ -61,7 +79,7 @@ COPY --from=builder /app/config ${APP}/config # USER $APP_USER WORKDIR ${APP} -HEALTHCHECK --interval=30s --timeout=3s \ +HEALTHCHECK --interval=10s --timeout=2s --start-period=15s --retries=3 \ CMD curl -f http://localhost:21342/api/v1/health || exit 1 ENV RUST_LOG=api diff --git a/README.md b/README.md index ec8a2394..536aacad 100644 --- a/README.md +++ b/README.md @@ -41,12 +41,75 @@ your shell, see [here](docs/content/installation.md). ## Configuring the CLI -The CLI needs only two environment variables to work: -* `SCOTTY_SERVER` the address of the server -* `SCOTTY_ACCESS_TOKEN` the bearer token to use +### Option 1: OAuth Authentication (Recommended) -You can provide the information either via env-vars or by passing the -`--server` and `--access-token` arguments to the CLI. +Use OAuth device flow for secure authentication: + +```shell +# Authenticate with OAuth +scottyctl auth:login --server https://localhost:21342 + +# Use authenticated commands +scottyctl app:list +``` + +### Option 2: Bearer Token + +Bearer tokens are configured on the server with logical identifiers that map to secure tokens. Use environment variables or command-line arguments: + +```shell +# Via environment variables +export SCOTTY_SERVER=https://localhost:21342 +export SCOTTY_ACCESS_TOKEN=your_secure_bearer_token + +# Via command-line arguments +scottyctl --server https://localhost:21342 --access-token your_secure_bearer_token app:list +``` + +**Security Note**: Server administrators should **never store actual bearer tokens in configuration files**. Instead, use placeholder values in config files and set actual secure tokens via environment variables like `SCOTTY__API__BEARER_TOKENS__ADMIN=your_secure_token`. See the [configuration documentation](docs/content/configuration.md) for security best practices. + +## Observability + +Scotty includes a comprehensive observability stack with metrics, distributed tracing, and pre-built dashboards for monitoring application health and performance. + +### Quick Start + +Start the observability stack (Grafana, Jaeger, VictoriaMetrics, OpenTelemetry Collector): + +```shell +cd observability +docker-compose up -d +``` + +Enable telemetry in Scotty: + +```shell +SCOTTY__TELEMETRY=metrics,traces cargo run --bin scotty +``` + +Access the services: +- **Grafana Dashboard**: http://grafana.ddev.site (admin/admin) +- **Jaeger Tracing**: http://jaeger.ddev.site +- **VictoriaMetrics**: http://vm.ddev.site + +### What's Monitored + +Scotty exports 40+ metrics covering: +- Log streaming (active streams, throughput, errors) +- Shell sessions (active connections, timeouts) +- WebSocket connections and message rates +- Task execution and output streaming +- HTTP server performance by endpoint +- Memory usage (RSS and virtual) +- Application fleet metrics +- Tokio async runtime health + +### Documentation + +For complete setup instructions, metrics reference, and production deployment guide: + +📖 **[Observability Documentation](docs/content/observability.md)** +📖 **[Observability Setup Guide](observability/README.md)** ## Developing/Contributing diff --git a/apps/scotty-demo/.scotty.yml b/apps/scotty-demo/.scotty.yml new file mode 100644 index 00000000..716cec9c --- /dev/null +++ b/apps/scotty-demo/.scotty.yml @@ -0,0 +1,8 @@ +groups: + - client-b +public_services: [] +domain: scotty-demo.ddev.site +time_to_live: !Days 7 +basic_auth: null +disallow_robots: true +environment: {} \ No newline at end of file diff --git a/apps/simple_nginx/.scotty.yml b/apps/simple_nginx/.scotty.yml index 61f80632..0b5586ea 100644 --- a/apps/simple_nginx/.scotty.yml +++ b/apps/simple_nginx/.scotty.yml @@ -1,4 +1,6 @@ needs_setup: true +groups: + - client-a public_services: - service: nginx port: 80 diff --git a/apps/simple_nginx_2/.scotty.yml b/apps/simple_nginx_2/.scotty.yml new file mode 100644 index 00000000..44813ec0 --- /dev/null +++ b/apps/simple_nginx_2/.scotty.yml @@ -0,0 +1,8 @@ +groups: + - client-a +public_services: [] +domain: simple_nginx_2.ddev.site +time_to_live: !Days 7 +basic_auth: null +disallow_robots: true +environment: {} \ No newline at end of file diff --git a/apps/test-env/.scotty.yml b/apps/test-env/.scotty.yml new file mode 100644 index 00000000..2434e634 --- /dev/null +++ b/apps/test-env/.scotty.yml @@ -0,0 +1,15 @@ +public_services: +- service: nginx + port: 80 + domains: [] +domain: test-env.ddev.site +time_to_live: !Days 7 +destroy_on_ttl: false +basic_auth: null +disallow_robots: true +environment: {} +registry: null +app_blueprint: null +notify: [] +middlewares: +- test-middleware diff --git a/apps/test-env/docker-compose.override.yml b/apps/test-env/docker-compose.override.yml new file mode 100644 index 00000000..a96fbee1 --- /dev/null +++ b/apps/test-env/docker-compose.override.yml @@ -0,0 +1,15 @@ +services: + nginx: + labels: + traefik.enable: 'true' + traefik.http.middlewares.nginx--test-env--robots.headers.customresponseheaders.X-Robots-Tags: none, noarchive, nosnippet, notranslate, noimageindex + traefik.http.routers.nginx--test-env-0.middlewares: nginx--test-env--robots,test-middleware + traefik.http.routers.nginx--test-env-0.rule: Host(`nginx.test-env.ddev.site`) + traefik.http.services.nginx--test-env.loadbalancer.server.port: '80' + environment: {} + networks: + - default + - proxy +networks: + proxy: + external: true diff --git a/apps/test-env/docker-compose.yml b/apps/test-env/docker-compose.yml new file mode 100644 index 00000000..f4ec887c --- /dev/null +++ b/apps/test-env/docker-compose.yml @@ -0,0 +1,5 @@ +services: + nginx: + image: nginx:latest + volumes: + - ./html:/usr/share/nginx/html diff --git a/apps/test-env/html/index.html b/apps/test-env/html/index.html new file mode 100644 index 00000000..cf112c1a --- /dev/null +++ b/apps/test-env/html/index.html @@ -0,0 +1 @@ +