From f2be2414e4651d679581bbce272f4479ce6b0710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesu=CC=81s=20Pe=CC=81rez?= Date: Tue, 7 Oct 2025 10:59:52 +0100 Subject: [PATCH] core: init repo and codebase --- .env.example | 319 +++ .gitignore | 112 + Cargo.toml | 219 ++ QUICK_START.md | 267 +++ README.md | 556 +++++ api-gateway/.gitkeep | 0 api-gateway/Dockerfile | 58 + control-center-ui/AUTH_SYSTEM.md | 346 ++++ control-center-ui/Cargo.toml | 176 ++ control-center-ui/README.md | 335 +++ control-center-ui/REFERENCE.md | 29 + control-center-ui/Trunk.toml | 46 + control-center-ui/assets/manifest.json | 131 ++ control-center-ui/assets/sw.js | 353 ++++ .../control-center-ui-d1956c1b430684b9.js | 798 +++++++ ...control-center-ui-d1956c1b430684b9_bg.wasm | Bin 0 -> 1622619 bytes .../dist/index-956be635a01ed8a8.css | 44 + control-center-ui/dist/index.html | 161 ++ control-center-ui/index.html | 38 + control-center-ui/manifest.json | 131 ++ control-center-ui/package.json | 35 + control-center-ui/pnpm-lock.yaml | 1829 +++++++++++++++++ control-center-ui/setup.sh | 88 + control-center-ui/src/App.css | 41 + control-center-ui/src/App.tsx | 58 + control-center-ui/src/api/auth.rs | 6 + control-center-ui/src/api/client.rs | 6 + control-center-ui/src/api/clusters.rs | 6 + control-center-ui/src/api/dashboard.rs | 6 + control-center-ui/src/api/mod.rs | 15 + control-center-ui/src/api/orchestrator.rs | 503 +++++ .../src/api/orchestrator_client.rs | 408 ++++ .../src/api/orchestrator_types.rs | 220 ++ control-center-ui/src/api/servers.rs | 6 + control-center-ui/src/api/types.rs | 6 + control-center-ui/src/api/workflows.rs | 6 + control-center-ui/src/app.rs | 15 + control-center-ui/src/auth/crypto.rs | 305 +++ .../src/auth/http_interceptor.rs | 430 ++++ control-center-ui/src/auth/mod.rs | 128 ++ control-center-ui/src/auth/storage.rs | 196 ++ control-center-ui/src/auth/token_manager.rs | 220 ++ control-center-ui/src/auth/webauthn.rs | 525 +++++ .../src/components/audit/AuditLogViewer.tsx | 433 ++++ .../audit/ComplianceReportGenerator.tsx | 668 ++++++ .../src/components/audit/ExportModal.tsx | 676 ++++++ .../src/components/audit/LogDetailModal.tsx | 586 ++++++ .../components/audit/RealTimeIndicator.tsx | 145 ++ .../src/components/audit/SearchFilters.tsx | 732 +++++++ .../components/audit/VirtualizedLogTable.tsx | 519 +++++ control-center-ui/src/components/audit/mod.rs | 0 .../src/components/auth/auth_guard.rs | 19 + .../src/components/auth/biometric_auth.rs | 10 + .../src/components/auth/device_trust.rs | 10 + .../src/components/auth/login_form.rs | 51 + .../src/components/auth/logout_button.rs | 17 + .../src/components/auth/mfa_setup.rs | 11 + control-center-ui/src/components/auth/mod.rs | 21 + .../src/components/auth/password_reset.rs | 11 + .../src/components/auth/session_timeout.rs | 10 + .../src/components/auth/sso_buttons.rs | 10 + .../src/components/auth/user_profile.rs | 11 + control-center-ui/src/components/charts.rs | 6 + control-center-ui/src/components/common.rs | 170 ++ control-center-ui/src/components/forms.rs | 6 + control-center-ui/src/components/grid.rs | 466 +++++ control-center-ui/src/components/header.rs | 67 + control-center-ui/src/components/icons.rs | 6 + control-center-ui/src/components/layout.rs | 794 +++++++ control-center-ui/src/components/loading.rs | 21 + control-center-ui/src/components/mod.rs | 25 + control-center-ui/src/components/modal.rs | 6 + .../src/components/notifications.rs | 504 +++++ .../src/components/policies/mod.rs | 28 + .../src/components/policies/policy_editor.rs | 474 +++++ control-center-ui/src/components/sidebar.rs | 66 + control-center-ui/src/components/tables.rs | 6 + control-center-ui/src/components/theme.rs | 651 ++++++ control-center-ui/src/components/toast.rs | 10 + control-center-ui/src/components/widgets.rs | 883 ++++++++ control-center-ui/src/hooks/mod.rs | 0 control-center-ui/src/hooks/useWebSocket.ts | 218 ++ control-center-ui/src/index.css | 44 + control-center-ui/src/lib.rs | 19 + control-center-ui/src/main.rs | 101 + control-center-ui/src/main.tsx | 49 + control-center-ui/src/mod.rs | 0 control-center-ui/src/pages/clusters.rs | 11 + control-center-ui/src/pages/dashboard.rs | 11 + control-center-ui/src/pages/infrastructure.rs | 662 ++++++ control-center-ui/src/pages/mod.rs | 15 + control-center-ui/src/pages/not_found.rs | 11 + control-center-ui/src/pages/servers.rs | 11 + control-center-ui/src/pages/settings.rs | 11 + control-center-ui/src/pages/taskservs.rs | 11 + control-center-ui/src/pages/users.rs | 763 +++++++ control-center-ui/src/pages/workflows.rs | 11 + control-center-ui/src/services/api.ts | 324 +++ .../src/services/dashboard_config.rs | 867 ++++++++ control-center-ui/src/services/export.rs | 733 +++++++ control-center-ui/src/services/mod.rs | 6 + control-center-ui/src/services/websocket.rs | 441 ++++ control-center-ui/src/store/app_state.rs | 274 +++ control-center-ui/src/store/auth.rs | 84 + control-center-ui/src/store/mod.rs | 11 + control-center-ui/src/store/notifications.rs | 151 ++ control-center-ui/src/store/storage.rs | 203 ++ control-center-ui/src/store/theme.rs | 91 + control-center-ui/src/types/audit.ts | 307 +++ control-center-ui/src/types/mod.rs | 1685 +++++++++++++++ control-center-ui/src/types/policy.rs | 362 ++++ control-center-ui/src/utils/api.rs | 6 + control-center-ui/src/utils/format.rs | 6 + control-center-ui/src/utils/mod.rs | 9 + control-center-ui/src/utils/time.rs | 6 + control-center-ui/src/utils/validation.rs | 6 + control-center-ui/sw.js | 353 ++++ control-center-ui/tailwind.config.js | 162 ++ control-center-ui/test.html | 27 + control-center-ui/tsconfig.json | 31 + control-center-ui/vite.config.ts | 43 + control-center/Cargo.toml | 112 + control-center/Dockerfile | 62 + control-center/Dockerfile.runtime | 18 + control-center/README.md | 344 ++++ control-center/REFERENCE.md | 29 + control-center/config.toml | 103 + control-center/docs/ENHANCEMENTS_README.md | 543 +++++ .../docs/SECURITY_CONSIDERATIONS.md | 632 ++++++ .../policies/data-classification.cedar | 198 ++ control-center/policies/geo-restriction.cedar | 178 ++ .../policies/maintenance-window.cedar | 119 ++ .../policies/production-approval.cedar | 85 + control-center/policies/require-mfa.cedar | 57 + .../policies/time-based-access.cedar | 122 ++ control-center/src/anomaly/alerts.rs | 83 + control-center/src/anomaly/detector.rs | 6 + control-center/src/anomaly/mod.rs | 683 ++++++ control-center/src/anomaly/rules.rs | 75 + control-center/src/anomaly/statistical.rs | 479 +++++ control-center/src/auth.rs | 112 + control-center/src/compliance/frameworks.rs | 8 + control-center/src/compliance/hipaa.rs | 687 +++++++ control-center/src/compliance/mod.rs | 450 ++++ control-center/src/compliance/reports.rs | 54 + control-center/src/compliance/soc2.rs | 553 +++++ control-center/src/config.rs | 313 +++ control-center/src/error.rs | 362 ++++ control-center/src/handlers/auth.rs | 282 +++ control-center/src/handlers/mod.rs | 11 + control-center/src/handlers/permission.rs | 71 + control-center/src/handlers/role.rs | 129 ++ control-center/src/handlers/user.rs | 369 ++++ control-center/src/handlers/websocket.rs | 321 +++ control-center/src/kms/README.md | 448 ++++ control-center/src/kms/audit.rs | 213 ++ control-center/src/kms/cache.rs | 792 +++++++ control-center/src/kms/config.rs | 941 +++++++++ control-center/src/kms/credentials.rs | 102 + control-center/src/kms/error.rs | 489 +++++ control-center/src/kms/hsm.rs | 341 +++ control-center/src/kms/hybrid.rs | 748 +++++++ control-center/src/kms/local.rs | 752 +++++++ control-center/src/kms/mod.rs | 189 ++ control-center/src/kms/remote.rs | 468 +++++ control-center/src/kms/rotation.rs | 116 ++ control-center/src/kms/ssh_keys.rs | 407 ++++ control-center/src/kms/traits.rs | 277 +++ control-center/src/kms/types.rs | 674 ++++++ control-center/src/kms/zkp.rs | 283 +++ control-center/src/lib.rs | 90 + control-center/src/main.rs | 251 +++ control-center/src/middleware/auth.rs | 278 +++ control-center/src/middleware/cors.rs | 220 ++ control-center/src/middleware/mod.rs | 7 + control-center/src/middleware/rate_limit.rs | 428 ++++ control-center/src/models/mod.rs | 9 + control-center/src/models/permission.rs | 147 ++ control-center/src/models/role.rs | 160 ++ control-center/src/models/session.rs | 176 ++ control-center/src/models/user.rs | 174 ++ control-center/src/policies/context.rs | 234 +++ control-center/src/policies/engine.rs | 374 ++++ control-center/src/policies/hooks.rs | 411 ++++ control-center/src/policies/mod.rs | 111 + control-center/src/policies/templates.rs | 603 ++++++ control-center/src/policies/validation.rs | 544 +++++ control-center/src/policies/versioning.rs | 428 ++++ control-center/src/rbac/middleware.rs | 100 + control-center/src/rbac/mod.rs | 285 +++ control-center/src/rbac/permissions.rs | 278 +++ control-center/src/rbac/policy.rs | 124 ++ control-center/src/rbac/roles.rs | 121 ++ control-center/src/services/auth.rs | 322 +++ control-center/src/services/database.rs | 301 +++ control-center/src/services/jwt.rs | 284 +++ control-center/src/services/mod.rs | 13 + control-center/src/services/permission.rs | 315 +++ .../src/services/platform_monitor.rs | 588 ++++++ control-center/src/services/role.rs | 385 ++++ control-center/src/services/user.rs | 403 ++++ control-center/src/simple_config.rs | 308 +++ control-center/src/storage/mod.rs | 176 ++ .../src/storage/surrealdb_storage.rs | 469 +++++ control-center/tests/data/mock_resources.json | 193 ++ control-center/tests/data/mock_users.json | 157 ++ control-center/tests/policy_tests.rs | 436 ++++ coredns/Corefile | 32 + coredns/zones/provisioning.zone | 26 + docker-compose.yaml | 194 ++ docker-compose/docker-compose.cicd.yaml | 124 ++ docker-compose/docker-compose.enterprise.yaml | 325 +++ docker-compose/docker-compose.multi-user.yaml | 100 + docker-compose/docker-compose.solo.yaml | 98 + docs/deployment/DEPLOYMENT_GUIDE.md | 724 +++++++ extension-registry/.dockerignore | 9 + extension-registry/.gitignore | 24 + extension-registry/API.md | 559 +++++ extension-registry/Cargo.toml | 67 + extension-registry/Dockerfile | 48 + extension-registry/IMPLEMENTATION_SUMMARY.md | 535 +++++ extension-registry/Makefile | 67 + extension-registry/README.md | 607 ++++++ extension-registry/config.example.toml | 31 + extension-registry/docker-compose.yml | 29 + extension-registry/scripts/start-service.sh | 85 + extension-registry/src/api/handlers.rs | 379 ++++ extension-registry/src/api/mod.rs | 5 + extension-registry/src/api/routes.rs | 41 + extension-registry/src/cache/lru_cache.rs | 247 +++ extension-registry/src/cache/mod.rs | 3 + extension-registry/src/config.rs | 247 +++ extension-registry/src/error.rs | 86 + extension-registry/src/gitea/client.rs | 382 ++++ extension-registry/src/gitea/mod.rs | 5 + extension-registry/src/gitea/models.rs | 66 + extension-registry/src/lib.rs | 11 + extension-registry/src/main.rs | 92 + extension-registry/src/models/extension.rs | 166 ++ extension-registry/src/models/mod.rs | 6 + extension-registry/src/oci/client.rs | 371 ++++ extension-registry/src/oci/mod.rs | 5 + extension-registry/src/oci/models.rs | 48 + extension-registry/tests/integration_test.rs | 179 ++ installer/Cargo.toml | 56 + installer/README.md | 375 ++++ .../docs/CONFIGURATION_INTEGRATION_GUIDE.md | 845 ++++++++ installer/docs/CONFIG_QUICK_REFERENCE.md | 328 +++ installer/docs/CONFIG_SYSTEM_SUMMARY.md | 503 +++++ installer/docs/IMPLEMENTATION_REPORT.md | 604 ++++++ installer/docs/IMPLEMENTATION_STATUS.md | 90 + installer/docs/IMPLEMENTATION_SUMMARY.md | 437 ++++ installer/docs/QUICK_START.md | 178 ++ .../docs/SCREENS_IMPLEMENTATION_STATUS.md | 405 ++++ installer/docs/UNATTENDED_MODE.md | 516 +++++ .../scripts/DEPLOYMENT_SCRIPTS_SUMMARY.md | 469 +++++ installer/scripts/QUICK_START.md | 271 +++ installer/scripts/README.md | 685 ++++++ .../scripts/configs/enterprise-example.toml | 94 + installer/scripts/configs/solo-example.toml | 59 + installer/scripts/deploy.nu | 415 ++++ installer/scripts/helpers.nu | 490 +++++ installer/scripts/integration.nu | 526 +++++ installer/scripts/mod.nu | 123 ++ installer/scripts/platforms.nu | 434 ++++ installer/scripts/test-scripts.nu | 235 +++ installer/src/cli.rs | 92 + installer/src/config/loader.rs | 413 ++++ installer/src/config/merger.rs | 350 ++++ installer/src/config/mod.rs | 282 +++ installer/src/config/schema.rs | 1006 +++++++++ installer/src/config/validator.rs | 687 +++++++ installer/src/deployment/detector.rs | 166 ++ installer/src/deployment/mod.rs | 8 + installer/src/deployment/types.rs | 336 +++ installer/src/lib.rs | 29 + installer/src/main.rs | 149 ++ installer/src/ui/app.rs | 325 +++ installer/src/ui/mod.rs | 7 + installer/src/ui/screens/completion.rs | 271 +++ installer/src/ui/screens/config_wizard.rs | 240 +++ installer/src/ui/screens/deployment.rs | 213 ++ installer/src/ui/screens/mod.rs | 17 + installer/src/ui/screens/mode_select.rs | 255 +++ installer/src/ui/screens/platform_detect.rs | 202 ++ installer/src/ui/screens/service_select.rs | 213 ++ installer/src/ui/screens/welcome.rs | 61 + installer/src/ui/widgets/mod.rs | 6 + installer/src/unattended/mod.rs | 9 + installer/src/unattended/notifier.rs | 358 ++++ installer/src/unattended/runner.rs | 427 ++++ k8s/base/namespace.yaml | 8 + mcp-server/COMPILATION_STATUS.md | 165 ++ mcp-server/Cargo.toml | 85 + mcp-server/Dockerfile | 63 + mcp-server/README.md | 133 ++ mcp-server/SETTINGS_TOOLS_IMPLEMENTATION.md | 394 ++++ mcp-server/benches/performance.rs | 59 + mcp-server/src/config.rs | 237 +++ mcp-server/src/errors.rs | 95 + mcp-server/src/lib.rs | 14 + mcp-server/src/main.rs | 1160 +++++++++++ mcp-server/src/performance_test.rs | 63 + mcp-server/src/provisioning.rs | 313 +++ mcp-server/src/simple_main.rs | 143 ++ mcp-server/src/tools/mod.rs | 38 + mcp-server/src/tools/provisioning_tools.rs | 307 +++ .../src/tools/provisioning_tools.rs.bak2 | 588 ++++++ mcp-server/src/tools/settings.rs | 662 ++++++ monitoring/grafana/datasources/prometheus.yml | 21 + monitoring/loki/loki-config.yml | 59 + monitoring/prometheus/prometheus.yml | 87 + monitoring/prometheus/rules/alerts.yml | 110 + monitoring/promtail/promtail-config.yml | 56 + nginx/conf.d/provisioning.conf | 131 ++ nginx/conf.d/proxy_params.conf | 33 + nginx/nginx.conf | 118 ++ oci-registry/IMPLEMENTATION_SUMMARY.md | 459 +++++ oci-registry/README.md | 802 ++++++++ oci-registry/config.json | 21 + oci-registry/distribution/config.yml | 99 + oci-registry/distribution/docker-compose.yml | 70 + oci-registry/harbor/docker-compose.yml | 126 ++ oci-registry/harbor/harbor.yml | 81 + oci-registry/scripts/configure-policies.nu | 367 ++++ oci-registry/scripts/create-users.nu | 170 ++ oci-registry/scripts/generate-certs.nu | 193 ++ oci-registry/scripts/init-registry.nu | 292 +++ oci-registry/scripts/migrate-registry.nu | 326 +++ oci-registry/scripts/setup-namespaces.nu | 326 +++ oci-registry/scripts/test-registry.nu | 302 +++ oci-registry/zot/Dockerfile | 25 + oci-registry/zot/config.json | 74 + oci-registry/zot/docker-compose.yml | 44 + oci-registry/zot/healthcheck.sh | 24 + orchestrator/.cargo/config.toml | 41 + orchestrator/Cargo.toml | 88 + orchestrator/Dockerfile | 66 + orchestrator/Dockerfile.runtime | 18 + orchestrator/README.md | 482 +++++ orchestrator/REFERENCE.md | 36 + orchestrator/STORAGE_BACKENDS.md | 350 ++++ orchestrator/batch_workflow_plan.md | 267 +++ orchestrator/benches/migration_benchmarks.rs | 535 +++++ orchestrator/benches/storage_benchmarks.rs | 498 +++++ orchestrator/data/orchestrator.pid | 1 + .../237315de-8a7f-430a-8804-65d050f3bfb0.json | 19 + .../7ff31593-cb5f-4a52-88ff-3a3d9bfbf931.json | 19 + .../b14f9a93-318b-4d56-aa73-a5c1e38a2a9b.json | 18 + .../c2050e55-46d9-47bc-abcd-8b137a6ee459.json | 18 + .../999c70f4-3fa4-4879-bbd2-e85f5d0027f3.json | 17 + orchestrator/docs/DNS_INTEGRATION.md | 219 ++ orchestrator/docs/EXTENSION_LOADING.md | 374 ++++ orchestrator/docs/OCI_INTEGRATION.md | 416 ++++ orchestrator/docs/SERVICE_ORCHESTRATION.md | 465 +++++ orchestrator/scripts/migrate-storage.nu | 637 ++++++ orchestrator/scripts/start-orchestrator.nu | 189 ++ orchestrator/src/batch.rs | 806 ++++++++ orchestrator/src/config.rs | 359 ++++ orchestrator/src/container_manager.rs | 415 ++++ orchestrator/src/dependency.rs | 699 +++++++ orchestrator/src/dns/coredns_client.rs | 244 +++ orchestrator/src/dns/mod.rs | 154 ++ orchestrator/src/extensions/loader.rs | 218 ++ orchestrator/src/extensions/mod.rs | 159 ++ orchestrator/src/lib.rs | 150 ++ orchestrator/src/main.rs | 967 +++++++++ orchestrator/src/migration/mod.rs | 1036 ++++++++++ orchestrator/src/migration/tests.rs | 679 ++++++ orchestrator/src/monitor.rs | 763 +++++++ orchestrator/src/monitoring.rs | 178 ++ orchestrator/src/oci/client.rs | 319 +++ orchestrator/src/oci/mod.rs | 174 ++ orchestrator/src/queue.rs | 357 ++++ orchestrator/src/rollback.rs | 1404 +++++++++++++ orchestrator/src/services/manager.rs | 272 +++ orchestrator/src/services/mod.rs | 281 +++ orchestrator/src/state.rs | 562 +++++ orchestrator/src/storage/factory.rs | 361 ++++ orchestrator/src/storage/filesystem.rs | 638 ++++++ orchestrator/src/storage/mod.rs | 39 + orchestrator/src/storage/schema.surql | 385 ++++ orchestrator/src/storage/surrealdb.rs | 1221 +++++++++++ orchestrator/src/storage/test_surrealdb.rs | 193 ++ orchestrator/src/storage/traits.rs | 383 ++++ orchestrator/src/test_environment.rs | 337 +++ orchestrator/src/test_orchestrator.rs | 372 ++++ orchestrator/src/workflow.rs | 710 +++++++ orchestrator/tests/batch_workflow_test.rs | 484 +++++ orchestrator/tests/factory_tests.rs | 549 +++++ orchestrator/tests/helpers/mod.rs | 806 ++++++++ orchestrator/tests/migration_tests.rs | 597 ++++++ orchestrator/tests/simple_batch_test.rs | 751 +++++++ orchestrator/tests/storage_integration.rs | 656 ++++++ orchestrator/tests/test_dns_integration.rs | 80 + orchestrator/tests/test_extension_loading.rs | 72 + orchestrator/tests/test_oci_integration.rs | 69 + .../tests/test_service_orchestration.rs | 174 ++ orchestrator/what_is_next_info.md | 45 + provisioning-server/.env.example | 31 + provisioning-server/.gitignore | 32 + provisioning-server/API_REFERENCE.md | 629 ++++++ provisioning-server/Cargo.toml | 45 + provisioning-server/Dockerfile | 51 + provisioning-server/QUICKSTART.md | 277 +++ provisioning-server/README.md | 574 ++++++ provisioning-server/build.rs | 10 + provisioning-server/config.example.toml | 48 + provisioning-server/docker-compose.yml | 36 + provisioning-server/examples/api_client.sh | 301 +++ provisioning-server/examples/python_client.py | 271 +++ provisioning-server/src/api/auth.rs | 106 + provisioning-server/src/api/mod.rs | 11 + provisioning-server/src/api/operations.rs | 110 + provisioning-server/src/api/routes.rs | 53 + provisioning-server/src/api/servers.rs | 138 ++ provisioning-server/src/api/system.rs | 55 + provisioning-server/src/api/taskservs.rs | 134 ++ provisioning-server/src/api/workflows.rs | 151 ++ provisioning-server/src/api/workspaces.rs | 88 + provisioning-server/src/auth/jwt.rs | 134 ++ provisioning-server/src/auth/mod.rs | 112 + provisioning-server/src/auth/rbac.rs | 217 ++ provisioning-server/src/config.rs | 153 ++ provisioning-server/src/error.rs | 95 + .../src/executor/async_task.rs | 220 ++ provisioning-server/src/executor/mod.rs | 5 + provisioning-server/src/executor/nushell.rs | 326 +++ provisioning-server/src/lib.rs | 9 + provisioning-server/src/main.rs | 160 ++ provisioning-server/src/models/mod.rs | 180 ++ provisioning-server/tests/integration_test.rs | 97 + scripts/deploy-platform.nu | 358 ++++ scripts/generate-secrets.nu | 72 + scripts/health-check.nu | 171 ++ scripts/validate-configs.nu | 135 ++ systemd/install-services.sh | 62 + systemd/provisioning-control-center.service | 40 + systemd/provisioning-orchestrator.service | 41 + systemd/provisioning-platform.service | 51 + 440 files changed, 109141 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 QUICK_START.md create mode 100644 README.md create mode 100644 api-gateway/.gitkeep create mode 100644 api-gateway/Dockerfile create mode 100644 control-center-ui/AUTH_SYSTEM.md create mode 100644 control-center-ui/Cargo.toml create mode 100644 control-center-ui/README.md create mode 100644 control-center-ui/REFERENCE.md create mode 100644 control-center-ui/Trunk.toml create mode 100644 control-center-ui/assets/manifest.json create mode 100644 control-center-ui/assets/sw.js create mode 100644 control-center-ui/dist/control-center-ui-d1956c1b430684b9.js create mode 100644 control-center-ui/dist/control-center-ui-d1956c1b430684b9_bg.wasm create mode 100644 control-center-ui/dist/index-956be635a01ed8a8.css create mode 100644 control-center-ui/dist/index.html create mode 100644 control-center-ui/index.html create mode 100644 control-center-ui/manifest.json create mode 100644 control-center-ui/package.json create mode 100644 control-center-ui/pnpm-lock.yaml create mode 100755 control-center-ui/setup.sh create mode 100644 control-center-ui/src/App.css create mode 100644 control-center-ui/src/App.tsx create mode 100644 control-center-ui/src/api/auth.rs create mode 100644 control-center-ui/src/api/client.rs create mode 100644 control-center-ui/src/api/clusters.rs create mode 100644 control-center-ui/src/api/dashboard.rs create mode 100644 control-center-ui/src/api/mod.rs create mode 100644 control-center-ui/src/api/orchestrator.rs create mode 100644 control-center-ui/src/api/orchestrator_client.rs create mode 100644 control-center-ui/src/api/orchestrator_types.rs create mode 100644 control-center-ui/src/api/servers.rs create mode 100644 control-center-ui/src/api/types.rs create mode 100644 control-center-ui/src/api/workflows.rs create mode 100644 control-center-ui/src/app.rs create mode 100644 control-center-ui/src/auth/crypto.rs create mode 100644 control-center-ui/src/auth/http_interceptor.rs create mode 100644 control-center-ui/src/auth/mod.rs create mode 100644 control-center-ui/src/auth/storage.rs create mode 100644 control-center-ui/src/auth/token_manager.rs create mode 100644 control-center-ui/src/auth/webauthn.rs create mode 100644 control-center-ui/src/components/audit/AuditLogViewer.tsx create mode 100644 control-center-ui/src/components/audit/ComplianceReportGenerator.tsx create mode 100644 control-center-ui/src/components/audit/ExportModal.tsx create mode 100644 control-center-ui/src/components/audit/LogDetailModal.tsx create mode 100644 control-center-ui/src/components/audit/RealTimeIndicator.tsx create mode 100644 control-center-ui/src/components/audit/SearchFilters.tsx create mode 100644 control-center-ui/src/components/audit/VirtualizedLogTable.tsx create mode 100644 control-center-ui/src/components/audit/mod.rs create mode 100644 control-center-ui/src/components/auth/auth_guard.rs create mode 100644 control-center-ui/src/components/auth/biometric_auth.rs create mode 100644 control-center-ui/src/components/auth/device_trust.rs create mode 100644 control-center-ui/src/components/auth/login_form.rs create mode 100644 control-center-ui/src/components/auth/logout_button.rs create mode 100644 control-center-ui/src/components/auth/mfa_setup.rs create mode 100644 control-center-ui/src/components/auth/mod.rs create mode 100644 control-center-ui/src/components/auth/password_reset.rs create mode 100644 control-center-ui/src/components/auth/session_timeout.rs create mode 100644 control-center-ui/src/components/auth/sso_buttons.rs create mode 100644 control-center-ui/src/components/auth/user_profile.rs create mode 100644 control-center-ui/src/components/charts.rs create mode 100644 control-center-ui/src/components/common.rs create mode 100644 control-center-ui/src/components/forms.rs create mode 100644 control-center-ui/src/components/grid.rs create mode 100644 control-center-ui/src/components/header.rs create mode 100644 control-center-ui/src/components/icons.rs create mode 100644 control-center-ui/src/components/layout.rs create mode 100644 control-center-ui/src/components/loading.rs create mode 100644 control-center-ui/src/components/mod.rs create mode 100644 control-center-ui/src/components/modal.rs create mode 100644 control-center-ui/src/components/notifications.rs create mode 100644 control-center-ui/src/components/policies/mod.rs create mode 100644 control-center-ui/src/components/policies/policy_editor.rs create mode 100644 control-center-ui/src/components/sidebar.rs create mode 100644 control-center-ui/src/components/tables.rs create mode 100644 control-center-ui/src/components/theme.rs create mode 100644 control-center-ui/src/components/toast.rs create mode 100644 control-center-ui/src/components/widgets.rs create mode 100644 control-center-ui/src/hooks/mod.rs create mode 100644 control-center-ui/src/hooks/useWebSocket.ts create mode 100644 control-center-ui/src/index.css create mode 100644 control-center-ui/src/lib.rs create mode 100644 control-center-ui/src/main.rs create mode 100644 control-center-ui/src/main.tsx create mode 100644 control-center-ui/src/mod.rs create mode 100644 control-center-ui/src/pages/clusters.rs create mode 100644 control-center-ui/src/pages/dashboard.rs create mode 100644 control-center-ui/src/pages/infrastructure.rs create mode 100644 control-center-ui/src/pages/mod.rs create mode 100644 control-center-ui/src/pages/not_found.rs create mode 100644 control-center-ui/src/pages/servers.rs create mode 100644 control-center-ui/src/pages/settings.rs create mode 100644 control-center-ui/src/pages/taskservs.rs create mode 100644 control-center-ui/src/pages/users.rs create mode 100644 control-center-ui/src/pages/workflows.rs create mode 100644 control-center-ui/src/services/api.ts create mode 100644 control-center-ui/src/services/dashboard_config.rs create mode 100644 control-center-ui/src/services/export.rs create mode 100644 control-center-ui/src/services/mod.rs create mode 100644 control-center-ui/src/services/websocket.rs create mode 100644 control-center-ui/src/store/app_state.rs create mode 100644 control-center-ui/src/store/auth.rs create mode 100644 control-center-ui/src/store/mod.rs create mode 100644 control-center-ui/src/store/notifications.rs create mode 100644 control-center-ui/src/store/storage.rs create mode 100644 control-center-ui/src/store/theme.rs create mode 100644 control-center-ui/src/types/audit.ts create mode 100644 control-center-ui/src/types/mod.rs create mode 100644 control-center-ui/src/types/policy.rs create mode 100644 control-center-ui/src/utils/api.rs create mode 100644 control-center-ui/src/utils/format.rs create mode 100644 control-center-ui/src/utils/mod.rs create mode 100644 control-center-ui/src/utils/time.rs create mode 100644 control-center-ui/src/utils/validation.rs create mode 100644 control-center-ui/sw.js create mode 100644 control-center-ui/tailwind.config.js create mode 100644 control-center-ui/test.html create mode 100644 control-center-ui/tsconfig.json create mode 100644 control-center-ui/vite.config.ts create mode 100644 control-center/Cargo.toml create mode 100644 control-center/Dockerfile create mode 100644 control-center/Dockerfile.runtime create mode 100644 control-center/README.md create mode 100644 control-center/REFERENCE.md create mode 100644 control-center/config.toml create mode 100644 control-center/docs/ENHANCEMENTS_README.md create mode 100644 control-center/docs/SECURITY_CONSIDERATIONS.md create mode 100644 control-center/policies/data-classification.cedar create mode 100644 control-center/policies/geo-restriction.cedar create mode 100644 control-center/policies/maintenance-window.cedar create mode 100644 control-center/policies/production-approval.cedar create mode 100644 control-center/policies/require-mfa.cedar create mode 100644 control-center/policies/time-based-access.cedar create mode 100644 control-center/src/anomaly/alerts.rs create mode 100644 control-center/src/anomaly/detector.rs create mode 100644 control-center/src/anomaly/mod.rs create mode 100644 control-center/src/anomaly/rules.rs create mode 100644 control-center/src/anomaly/statistical.rs create mode 100644 control-center/src/auth.rs create mode 100644 control-center/src/compliance/frameworks.rs create mode 100644 control-center/src/compliance/hipaa.rs create mode 100644 control-center/src/compliance/mod.rs create mode 100644 control-center/src/compliance/reports.rs create mode 100644 control-center/src/compliance/soc2.rs create mode 100644 control-center/src/config.rs create mode 100644 control-center/src/error.rs create mode 100644 control-center/src/handlers/auth.rs create mode 100644 control-center/src/handlers/mod.rs create mode 100644 control-center/src/handlers/permission.rs create mode 100644 control-center/src/handlers/role.rs create mode 100644 control-center/src/handlers/user.rs create mode 100644 control-center/src/handlers/websocket.rs create mode 100644 control-center/src/kms/README.md create mode 100644 control-center/src/kms/audit.rs create mode 100644 control-center/src/kms/cache.rs create mode 100644 control-center/src/kms/config.rs create mode 100644 control-center/src/kms/credentials.rs create mode 100644 control-center/src/kms/error.rs create mode 100644 control-center/src/kms/hsm.rs create mode 100644 control-center/src/kms/hybrid.rs create mode 100644 control-center/src/kms/local.rs create mode 100644 control-center/src/kms/mod.rs create mode 100644 control-center/src/kms/remote.rs create mode 100644 control-center/src/kms/rotation.rs create mode 100644 control-center/src/kms/ssh_keys.rs create mode 100644 control-center/src/kms/traits.rs create mode 100644 control-center/src/kms/types.rs create mode 100644 control-center/src/kms/zkp.rs create mode 100644 control-center/src/lib.rs create mode 100644 control-center/src/main.rs create mode 100644 control-center/src/middleware/auth.rs create mode 100644 control-center/src/middleware/cors.rs create mode 100644 control-center/src/middleware/mod.rs create mode 100644 control-center/src/middleware/rate_limit.rs create mode 100644 control-center/src/models/mod.rs create mode 100644 control-center/src/models/permission.rs create mode 100644 control-center/src/models/role.rs create mode 100644 control-center/src/models/session.rs create mode 100644 control-center/src/models/user.rs create mode 100644 control-center/src/policies/context.rs create mode 100644 control-center/src/policies/engine.rs create mode 100644 control-center/src/policies/hooks.rs create mode 100644 control-center/src/policies/mod.rs create mode 100644 control-center/src/policies/templates.rs create mode 100644 control-center/src/policies/validation.rs create mode 100644 control-center/src/policies/versioning.rs create mode 100644 control-center/src/rbac/middleware.rs create mode 100644 control-center/src/rbac/mod.rs create mode 100644 control-center/src/rbac/permissions.rs create mode 100644 control-center/src/rbac/policy.rs create mode 100644 control-center/src/rbac/roles.rs create mode 100644 control-center/src/services/auth.rs create mode 100644 control-center/src/services/database.rs create mode 100644 control-center/src/services/jwt.rs create mode 100644 control-center/src/services/mod.rs create mode 100644 control-center/src/services/permission.rs create mode 100644 control-center/src/services/platform_monitor.rs create mode 100644 control-center/src/services/role.rs create mode 100644 control-center/src/services/user.rs create mode 100644 control-center/src/simple_config.rs create mode 100644 control-center/src/storage/mod.rs create mode 100644 control-center/src/storage/surrealdb_storage.rs create mode 100644 control-center/tests/data/mock_resources.json create mode 100644 control-center/tests/data/mock_users.json create mode 100644 control-center/tests/policy_tests.rs create mode 100644 coredns/Corefile create mode 100644 coredns/zones/provisioning.zone create mode 100644 docker-compose.yaml create mode 100644 docker-compose/docker-compose.cicd.yaml create mode 100644 docker-compose/docker-compose.enterprise.yaml create mode 100644 docker-compose/docker-compose.multi-user.yaml create mode 100644 docker-compose/docker-compose.solo.yaml create mode 100644 docs/deployment/DEPLOYMENT_GUIDE.md create mode 100644 extension-registry/.dockerignore create mode 100644 extension-registry/.gitignore create mode 100644 extension-registry/API.md create mode 100644 extension-registry/Cargo.toml create mode 100644 extension-registry/Dockerfile create mode 100644 extension-registry/IMPLEMENTATION_SUMMARY.md create mode 100644 extension-registry/Makefile create mode 100644 extension-registry/README.md create mode 100644 extension-registry/config.example.toml create mode 100644 extension-registry/docker-compose.yml create mode 100755 extension-registry/scripts/start-service.sh create mode 100644 extension-registry/src/api/handlers.rs create mode 100644 extension-registry/src/api/mod.rs create mode 100644 extension-registry/src/api/routes.rs create mode 100644 extension-registry/src/cache/lru_cache.rs create mode 100644 extension-registry/src/cache/mod.rs create mode 100644 extension-registry/src/config.rs create mode 100644 extension-registry/src/error.rs create mode 100644 extension-registry/src/gitea/client.rs create mode 100644 extension-registry/src/gitea/mod.rs create mode 100644 extension-registry/src/gitea/models.rs create mode 100644 extension-registry/src/lib.rs create mode 100644 extension-registry/src/main.rs create mode 100644 extension-registry/src/models/extension.rs create mode 100644 extension-registry/src/models/mod.rs create mode 100644 extension-registry/src/oci/client.rs create mode 100644 extension-registry/src/oci/mod.rs create mode 100644 extension-registry/src/oci/models.rs create mode 100644 extension-registry/tests/integration_test.rs create mode 100644 installer/Cargo.toml create mode 100644 installer/README.md create mode 100644 installer/docs/CONFIGURATION_INTEGRATION_GUIDE.md create mode 100644 installer/docs/CONFIG_QUICK_REFERENCE.md create mode 100644 installer/docs/CONFIG_SYSTEM_SUMMARY.md create mode 100644 installer/docs/IMPLEMENTATION_REPORT.md create mode 100644 installer/docs/IMPLEMENTATION_STATUS.md create mode 100644 installer/docs/IMPLEMENTATION_SUMMARY.md create mode 100644 installer/docs/QUICK_START.md create mode 100644 installer/docs/SCREENS_IMPLEMENTATION_STATUS.md create mode 100644 installer/docs/UNATTENDED_MODE.md create mode 100644 installer/scripts/DEPLOYMENT_SCRIPTS_SUMMARY.md create mode 100644 installer/scripts/QUICK_START.md create mode 100644 installer/scripts/README.md create mode 100644 installer/scripts/configs/enterprise-example.toml create mode 100644 installer/scripts/configs/solo-example.toml create mode 100644 installer/scripts/deploy.nu create mode 100644 installer/scripts/helpers.nu create mode 100644 installer/scripts/integration.nu create mode 100644 installer/scripts/mod.nu create mode 100644 installer/scripts/platforms.nu create mode 100644 installer/scripts/test-scripts.nu create mode 100644 installer/src/cli.rs create mode 100644 installer/src/config/loader.rs create mode 100644 installer/src/config/merger.rs create mode 100644 installer/src/config/mod.rs create mode 100644 installer/src/config/schema.rs create mode 100644 installer/src/config/validator.rs create mode 100644 installer/src/deployment/detector.rs create mode 100644 installer/src/deployment/mod.rs create mode 100644 installer/src/deployment/types.rs create mode 100644 installer/src/lib.rs create mode 100644 installer/src/main.rs create mode 100644 installer/src/ui/app.rs create mode 100644 installer/src/ui/mod.rs create mode 100644 installer/src/ui/screens/completion.rs create mode 100644 installer/src/ui/screens/config_wizard.rs create mode 100644 installer/src/ui/screens/deployment.rs create mode 100644 installer/src/ui/screens/mod.rs create mode 100644 installer/src/ui/screens/mode_select.rs create mode 100644 installer/src/ui/screens/platform_detect.rs create mode 100644 installer/src/ui/screens/service_select.rs create mode 100644 installer/src/ui/screens/welcome.rs create mode 100644 installer/src/ui/widgets/mod.rs create mode 100644 installer/src/unattended/mod.rs create mode 100644 installer/src/unattended/notifier.rs create mode 100644 installer/src/unattended/runner.rs create mode 100644 k8s/base/namespace.yaml create mode 100644 mcp-server/COMPILATION_STATUS.md create mode 100644 mcp-server/Cargo.toml create mode 100644 mcp-server/Dockerfile create mode 100644 mcp-server/README.md create mode 100644 mcp-server/SETTINGS_TOOLS_IMPLEMENTATION.md create mode 100644 mcp-server/benches/performance.rs create mode 100644 mcp-server/src/config.rs create mode 100644 mcp-server/src/errors.rs create mode 100644 mcp-server/src/lib.rs create mode 100644 mcp-server/src/main.rs create mode 100644 mcp-server/src/performance_test.rs create mode 100644 mcp-server/src/provisioning.rs create mode 100644 mcp-server/src/simple_main.rs create mode 100644 mcp-server/src/tools/mod.rs create mode 100644 mcp-server/src/tools/provisioning_tools.rs create mode 100644 mcp-server/src/tools/provisioning_tools.rs.bak2 create mode 100644 mcp-server/src/tools/settings.rs create mode 100644 monitoring/grafana/datasources/prometheus.yml create mode 100644 monitoring/loki/loki-config.yml create mode 100644 monitoring/prometheus/prometheus.yml create mode 100644 monitoring/prometheus/rules/alerts.yml create mode 100644 monitoring/promtail/promtail-config.yml create mode 100644 nginx/conf.d/provisioning.conf create mode 100644 nginx/conf.d/proxy_params.conf create mode 100644 nginx/nginx.conf create mode 100644 oci-registry/IMPLEMENTATION_SUMMARY.md create mode 100644 oci-registry/README.md create mode 100644 oci-registry/config.json create mode 100644 oci-registry/distribution/config.yml create mode 100644 oci-registry/distribution/docker-compose.yml create mode 100644 oci-registry/harbor/docker-compose.yml create mode 100644 oci-registry/harbor/harbor.yml create mode 100644 oci-registry/scripts/configure-policies.nu create mode 100644 oci-registry/scripts/create-users.nu create mode 100644 oci-registry/scripts/generate-certs.nu create mode 100644 oci-registry/scripts/init-registry.nu create mode 100644 oci-registry/scripts/migrate-registry.nu create mode 100644 oci-registry/scripts/setup-namespaces.nu create mode 100644 oci-registry/scripts/test-registry.nu create mode 100644 oci-registry/zot/Dockerfile create mode 100644 oci-registry/zot/config.json create mode 100644 oci-registry/zot/docker-compose.yml create mode 100644 oci-registry/zot/healthcheck.sh create mode 100644 orchestrator/.cargo/config.toml create mode 100644 orchestrator/Cargo.toml create mode 100644 orchestrator/Dockerfile create mode 100644 orchestrator/Dockerfile.runtime create mode 100644 orchestrator/README.md create mode 100644 orchestrator/REFERENCE.md create mode 100644 orchestrator/STORAGE_BACKENDS.md create mode 100644 orchestrator/batch_workflow_plan.md create mode 100644 orchestrator/benches/migration_benchmarks.rs create mode 100644 orchestrator/benches/storage_benchmarks.rs create mode 100644 orchestrator/data/orchestrator.pid create mode 100644 orchestrator/data/queue.rkvs/tasks/237315de-8a7f-430a-8804-65d050f3bfb0.json create mode 100644 orchestrator/data/queue.rkvs/tasks/7ff31593-cb5f-4a52-88ff-3a3d9bfbf931.json create mode 100644 orchestrator/data/queue.rkvs/tasks/b14f9a93-318b-4d56-aa73-a5c1e38a2a9b.json create mode 100644 orchestrator/data/queue.rkvs/tasks/c2050e55-46d9-47bc-abcd-8b137a6ee459.json create mode 100644 orchestrator/data/tasks/999c70f4-3fa4-4879-bbd2-e85f5d0027f3.json create mode 100644 orchestrator/docs/DNS_INTEGRATION.md create mode 100644 orchestrator/docs/EXTENSION_LOADING.md create mode 100644 orchestrator/docs/OCI_INTEGRATION.md create mode 100644 orchestrator/docs/SERVICE_ORCHESTRATION.md create mode 100755 orchestrator/scripts/migrate-storage.nu create mode 100755 orchestrator/scripts/start-orchestrator.nu create mode 100644 orchestrator/src/batch.rs create mode 100644 orchestrator/src/config.rs create mode 100644 orchestrator/src/container_manager.rs create mode 100644 orchestrator/src/dependency.rs create mode 100644 orchestrator/src/dns/coredns_client.rs create mode 100644 orchestrator/src/dns/mod.rs create mode 100644 orchestrator/src/extensions/loader.rs create mode 100644 orchestrator/src/extensions/mod.rs create mode 100644 orchestrator/src/lib.rs create mode 100644 orchestrator/src/main.rs create mode 100644 orchestrator/src/migration/mod.rs create mode 100644 orchestrator/src/migration/tests.rs create mode 100644 orchestrator/src/monitor.rs create mode 100644 orchestrator/src/monitoring.rs create mode 100644 orchestrator/src/oci/client.rs create mode 100644 orchestrator/src/oci/mod.rs create mode 100644 orchestrator/src/queue.rs create mode 100644 orchestrator/src/rollback.rs create mode 100644 orchestrator/src/services/manager.rs create mode 100644 orchestrator/src/services/mod.rs create mode 100644 orchestrator/src/state.rs create mode 100644 orchestrator/src/storage/factory.rs create mode 100644 orchestrator/src/storage/filesystem.rs create mode 100644 orchestrator/src/storage/mod.rs create mode 100644 orchestrator/src/storage/schema.surql create mode 100644 orchestrator/src/storage/surrealdb.rs create mode 100644 orchestrator/src/storage/test_surrealdb.rs create mode 100644 orchestrator/src/storage/traits.rs create mode 100644 orchestrator/src/test_environment.rs create mode 100644 orchestrator/src/test_orchestrator.rs create mode 100644 orchestrator/src/workflow.rs create mode 100644 orchestrator/tests/batch_workflow_test.rs create mode 100644 orchestrator/tests/factory_tests.rs create mode 100644 orchestrator/tests/helpers/mod.rs create mode 100644 orchestrator/tests/migration_tests.rs create mode 100644 orchestrator/tests/simple_batch_test.rs create mode 100644 orchestrator/tests/storage_integration.rs create mode 100644 orchestrator/tests/test_dns_integration.rs create mode 100644 orchestrator/tests/test_extension_loading.rs create mode 100644 orchestrator/tests/test_oci_integration.rs create mode 100644 orchestrator/tests/test_service_orchestration.rs create mode 100644 orchestrator/what_is_next_info.md create mode 100644 provisioning-server/.env.example create mode 100644 provisioning-server/.gitignore create mode 100644 provisioning-server/API_REFERENCE.md create mode 100644 provisioning-server/Cargo.toml create mode 100644 provisioning-server/Dockerfile create mode 100644 provisioning-server/QUICKSTART.md create mode 100644 provisioning-server/README.md create mode 100644 provisioning-server/build.rs create mode 100644 provisioning-server/config.example.toml create mode 100644 provisioning-server/docker-compose.yml create mode 100755 provisioning-server/examples/api_client.sh create mode 100755 provisioning-server/examples/python_client.py create mode 100644 provisioning-server/src/api/auth.rs create mode 100644 provisioning-server/src/api/mod.rs create mode 100644 provisioning-server/src/api/operations.rs create mode 100644 provisioning-server/src/api/routes.rs create mode 100644 provisioning-server/src/api/servers.rs create mode 100644 provisioning-server/src/api/system.rs create mode 100644 provisioning-server/src/api/taskservs.rs create mode 100644 provisioning-server/src/api/workflows.rs create mode 100644 provisioning-server/src/api/workspaces.rs create mode 100644 provisioning-server/src/auth/jwt.rs create mode 100644 provisioning-server/src/auth/mod.rs create mode 100644 provisioning-server/src/auth/rbac.rs create mode 100644 provisioning-server/src/config.rs create mode 100644 provisioning-server/src/error.rs create mode 100644 provisioning-server/src/executor/async_task.rs create mode 100644 provisioning-server/src/executor/mod.rs create mode 100644 provisioning-server/src/executor/nushell.rs create mode 100644 provisioning-server/src/lib.rs create mode 100644 provisioning-server/src/main.rs create mode 100644 provisioning-server/src/models/mod.rs create mode 100644 provisioning-server/tests/integration_test.rs create mode 100755 scripts/deploy-platform.nu create mode 100755 scripts/generate-secrets.nu create mode 100755 scripts/health-check.nu create mode 100755 scripts/validate-configs.nu create mode 100755 systemd/install-services.sh create mode 100644 systemd/provisioning-control-center.service create mode 100644 systemd/provisioning-orchestrator.service create mode 100644 systemd/provisioning-platform.service diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..c53e19a --- /dev/null +++ b/.env.example @@ -0,0 +1,319 @@ +# Provisioning Platform Environment Configuration +# Copy this file to .env and customize for your deployment + +#============================================================================== +# PLATFORM MODE +#============================================================================== +# Deployment mode: solo, multi-user, cicd, enterprise +PROVISIONING_MODE=solo + +# Platform metadata +PLATFORM_NAME=provisioning +PLATFORM_VERSION=3.0.0 +PLATFORM_ENVIRONMENT=development + +#============================================================================== +# NETWORK CONFIGURATION +#============================================================================== +# Docker network subnet +NETWORK_SUBNET=172.20.0.0/16 +NETWORK_GATEWAY=172.20.0.1 + +# External access +EXTERNAL_DOMAIN=provisioning.local +ENABLE_TLS=false +TLS_CERT_PATH=/etc/ssl/certs/provisioning.crt +TLS_KEY_PATH=/etc/ssl/private/provisioning.key + +#============================================================================== +# ORCHESTRATOR SERVICE +#============================================================================== +ORCHESTRATOR_ENABLED=true +ORCHESTRATOR_HOST=0.0.0.0 +ORCHESTRATOR_PORT=8080 +ORCHESTRATOR_WORKERS=4 +ORCHESTRATOR_LOG_LEVEL=info +ORCHESTRATOR_DATA_DIR=/data +ORCHESTRATOR_STORAGE_TYPE=filesystem +ORCHESTRATOR_MAX_CONCURRENT_TASKS=5 +ORCHESTRATOR_RETRY_ATTEMPTS=3 + +# CPU and memory limits +ORCHESTRATOR_CPU_LIMIT=2000m +ORCHESTRATOR_MEMORY_LIMIT=2048M + +#============================================================================== +# CONTROL CENTER SERVICE +#============================================================================== +CONTROL_CENTER_ENABLED=true +CONTROL_CENTER_HOST=0.0.0.0 +CONTROL_CENTER_PORT=8081 +CONTROL_CENTER_LOG_LEVEL=info +CONTROL_CENTER_DATABASE_TYPE=rocksdb +CONTROL_CENTER_SESSION_TIMEOUT=3600 + +# JWT Configuration +CONTROL_CENTER_JWT_SECRET=CHANGE_ME_RANDOM_SECRET_HERE +CONTROL_CENTER_ACCESS_TOKEN_EXPIRATION=3600 +CONTROL_CENTER_REFRESH_TOKEN_EXPIRATION=86400 + +# CPU and memory limits +CONTROL_CENTER_CPU_LIMIT=1000m +CONTROL_CENTER_MEMORY_LIMIT=1024M + +#============================================================================== +# COREDNS SERVICE +#============================================================================== +COREDNS_ENABLED=true +COREDNS_PORT=53 +COREDNS_TCP_PORT=53 +COREDNS_ZONES_DIR=/zones +COREDNS_LOG_LEVEL=info + +# CPU and memory limits +COREDNS_CPU_LIMIT=500m +COREDNS_MEMORY_LIMIT=512M + +#============================================================================== +# GITEA SERVICE (Multi-user mode and above) +#============================================================================== +GITEA_ENABLED=false +GITEA_HTTP_PORT=3000 +GITEA_SSH_PORT=222 +GITEA_DOMAIN=localhost +GITEA_ROOT_URL=http://localhost:3000/ +GITEA_DB_TYPE=sqlite3 +GITEA_SECRET_KEY=CHANGE_ME_GITEA_SECRET_KEY + +# Admin user (created on first run) +GITEA_ADMIN_USERNAME=provisioning +GITEA_ADMIN_PASSWORD=CHANGE_ME_ADMIN_PASSWORD +GITEA_ADMIN_EMAIL=admin@provisioning.local + +# CPU and memory limits +GITEA_CPU_LIMIT=1000m +GITEA_MEMORY_LIMIT=1024M + +#============================================================================== +# OCI REGISTRY SERVICE +#============================================================================== +OCI_REGISTRY_ENABLED=true +OCI_REGISTRY_TYPE=zot +OCI_REGISTRY_PORT=5000 +OCI_REGISTRY_NAMESPACE=provisioning-extensions +OCI_REGISTRY_LOG_LEVEL=info + +# Authentication (disabled for solo mode) +OCI_REGISTRY_AUTH_ENABLED=false +OCI_REGISTRY_AUTH_HTPASSWD_PATH=/etc/registry/htpasswd + +# Storage +OCI_REGISTRY_STORAGE_ROOT=/var/lib/registry +OCI_REGISTRY_DEDUPE_ENABLED=true + +# CPU and memory limits +OCI_REGISTRY_CPU_LIMIT=1000m +OCI_REGISTRY_MEMORY_LIMIT=1024M + +#============================================================================== +# EXTENSION REGISTRY SERVICE +#============================================================================== +EXTENSION_REGISTRY_ENABLED=true +EXTENSION_REGISTRY_HOST=0.0.0.0 +EXTENSION_REGISTRY_PORT=8082 +EXTENSION_REGISTRY_LOG_LEVEL=info +EXTENSION_REGISTRY_DATA_DIR=/app/data + +# OCI integration +EXTENSION_REGISTRY_OCI_URL=http://oci-registry:5000 +EXTENSION_REGISTRY_NAMESPACE=provisioning-extensions + +# CPU and memory limits +EXTENSION_REGISTRY_CPU_LIMIT=500m +EXTENSION_REGISTRY_MEMORY_LIMIT=512M + +#============================================================================== +# PROVISIONING API SERVER SERVICE +#============================================================================== +API_SERVER_ENABLED=false +API_SERVER_HOST=0.0.0.0 +API_SERVER_PORT=8083 +API_SERVER_LOG_LEVEL=info + +# JWT Configuration +API_SERVER_JWT_SECRET=CHANGE_ME_API_SERVER_JWT_SECRET +API_SERVER_TOKEN_EXPIRATION=3600 + +# Integration +API_SERVER_ORCHESTRATOR_URL=http://orchestrator:8080 +API_SERVER_CONTROL_CENTER_URL=http://control-center:8081 + +# CPU and memory limits +API_SERVER_CPU_LIMIT=1000m +API_SERVER_MEMORY_LIMIT=1024M + +#============================================================================== +# MCP SERVER SERVICE (Optional) +#============================================================================== +MCP_SERVER_ENABLED=false +MCP_SERVER_HOST=0.0.0.0 +MCP_SERVER_PORT=8084 +MCP_SERVER_PROTOCOL=http +MCP_SERVER_LOG_LEVEL=info + +# Capabilities +MCP_SERVER_TOOLS_ENABLED=true +MCP_SERVER_PROMPTS_ENABLED=true +MCP_SERVER_RESOURCES_ENABLED=true + +# CPU and memory limits +MCP_SERVER_CPU_LIMIT=500m +MCP_SERVER_MEMORY_LIMIT=512M + +#============================================================================== +# DATABASE SERVICE (PostgreSQL for enterprise mode) +#============================================================================== +POSTGRES_ENABLED=false +POSTGRES_HOST=postgres +POSTGRES_PORT=5432 +POSTGRES_DB=provisioning +POSTGRES_USER=provisioning +POSTGRES_PASSWORD=CHANGE_ME_POSTGRES_PASSWORD + +# CPU and memory limits +POSTGRES_CPU_LIMIT=2000m +POSTGRES_MEMORY_LIMIT=2048M + +#============================================================================== +# COSMIAN KMS SERVICE (Enterprise mode) +#============================================================================== +KMS_ENABLED=false +KMS_SERVER=http://kms:9998 +KMS_AUTH_METHOD=certificate +KMS_CERT_PATH=/etc/kms/client.crt +KMS_KEY_PATH=/etc/kms/client.key + +# CPU and memory limits +KMS_CPU_LIMIT=1000m +KMS_MEMORY_LIMIT=1024M + +#============================================================================== +# HARBOR REGISTRY (Enterprise mode alternative to Zot) +#============================================================================== +HARBOR_ENABLED=false +HARBOR_ADMIN_PASSWORD=CHANGE_ME_HARBOR_ADMIN_PASSWORD +HARBOR_DATABASE_PASSWORD=CHANGE_ME_HARBOR_DB_PASSWORD +HARBOR_CORE_SECRET=CHANGE_ME_HARBOR_CORE_SECRET +HARBOR_JOBSERVICE_SECRET=CHANGE_ME_HARBOR_JOBSERVICE_SECRET + +# CPU and memory limits +HARBOR_CORE_CPU_LIMIT=2000m +HARBOR_CORE_MEMORY_LIMIT=2048M + +#============================================================================== +# MONITORING STACK (Prometheus, Grafana) +#============================================================================== +MONITORING_ENABLED=false +PROMETHEUS_PORT=9090 +PROMETHEUS_RETENTION_TIME=15d +GRAFANA_PORT=3001 +GRAFANA_ADMIN_PASSWORD=CHANGE_ME_GRAFANA_PASSWORD + +# CPU and memory limits +PROMETHEUS_CPU_LIMIT=2000m +PROMETHEUS_MEMORY_LIMIT=2048M +GRAFANA_CPU_LIMIT=500m +GRAFANA_MEMORY_LIMIT=512M + +#============================================================================== +# LOGGING STACK (Loki, Promtail) +#============================================================================== +LOGGING_ENABLED=false +LOKI_PORT=3100 +LOKI_RETENTION_PERIOD=168h + +# CPU and memory limits +LOKI_CPU_LIMIT=1000m +LOKI_MEMORY_LIMIT=1024M + +#============================================================================== +# ELASTICSEARCH + KIBANA (Enterprise audit logs) +#============================================================================== +ELASTICSEARCH_ENABLED=false +ELASTICSEARCH_PORT=9200 +ELASTICSEARCH_CLUSTER_NAME=provisioning-logs +ELASTICSEARCH_HEAP_SIZE=1g +KIBANA_PORT=5601 + +# CPU and memory limits +ELASTICSEARCH_CPU_LIMIT=2000m +ELASTICSEARCH_MEMORY_LIMIT=2048M +KIBANA_CPU_LIMIT=1000m +KIBANA_MEMORY_LIMIT=1024M + +#============================================================================== +# NGINX REVERSE PROXY +#============================================================================== +NGINX_ENABLED=false +NGINX_HTTP_PORT=80 +NGINX_HTTPS_PORT=443 +NGINX_WORKER_PROCESSES=4 +NGINX_WORKER_CONNECTIONS=1024 + +# Rate limiting +NGINX_RATE_LIMIT_ENABLED=true +NGINX_RATE_LIMIT_REQUESTS=100 +NGINX_RATE_LIMIT_PERIOD=1m + +# CPU and memory limits +NGINX_CPU_LIMIT=500m +NGINX_MEMORY_LIMIT=256M + +#============================================================================== +# BACKUP CONFIGURATION +#============================================================================== +BACKUP_ENABLED=false +BACKUP_SCHEDULE=0 2 * * * +BACKUP_RETENTION_DAYS=7 +BACKUP_STORAGE_PATH=/backup + +#============================================================================== +# SECURITY CONFIGURATION +#============================================================================== +# Enable security scanning +SECURITY_SCAN_ENABLED=false + +# Secrets encryption +SECRETS_ENCRYPTION_ENABLED=false +SECRETS_KEY_PATH=/etc/provisioning/secrets.key + +# Network policies +NETWORK_POLICIES_ENABLED=false + +#============================================================================== +# RESOURCE LIMITS DEFAULTS +#============================================================================== +DEFAULT_CPU_LIMIT=1000m +DEFAULT_MEMORY_LIMIT=1024M +DEFAULT_RESTART_POLICY=unless-stopped + +#============================================================================== +# HEALTHCHECK CONFIGURATION +#============================================================================== +HEALTHCHECK_INTERVAL=30s +HEALTHCHECK_TIMEOUT=10s +HEALTHCHECK_RETRIES=3 +HEALTHCHECK_START_PERIOD=30s + +#============================================================================== +# LOGGING CONFIGURATION +#============================================================================== +LOG_DRIVER=json-file +LOG_MAX_SIZE=10m +LOG_MAX_FILE=3 + +#============================================================================== +# USER AND PERMISSION CONFIGURATION +#============================================================================== +USER_UID=1000 +USER_GID=1000 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6cc555d --- /dev/null +++ b/.gitignore @@ -0,0 +1,112 @@ +.p +.claude +.vscode +.shellcheckrc +.coder +.migration +.zed +ai_demo.nu +CLAUDE.md +.cache +.coder +wrks +ROOT +OLD +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ +# Encryption keys and related files (CRITICAL - NEVER COMMIT) +.k +.k.backup +*.k +*.key.backup + +config.*.toml +config.*back + +# where book is written +_book + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +node_modules/ + +**/output.css +**/input.css + +# Environment files +.env +.env.local +.env.production +.env.development +.env.staging + +# Keep example files +!.env.example + +# Configuration files (may contain sensitive data) +config.prod.toml +config.production.toml +config.local.toml +config.*.local.toml + +# Keep example configuration files +!config.toml +!config.dev.toml +!config.example.toml + +# Log files +logs/ +*.log + +# TLS certificates and keys +certs/ +*.pem +*.crt +*.key +*.p12 +*.pfx + +# Database files +*.db +*.sqlite +*.sqlite3 + +# Backup files +*.bak +*.backup +*.tmp +*~ + +# Encryption and security related files +*.encrypted +*.enc +secrets/ +private/ +security/ + +# Configuration backups that may contain secrets +config.*.backup +config.backup.* + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db +# Documentation build output +book-output/ +# Generated setup report +SETUP_COMPLETE.md diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..6793331 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,219 @@ +[workspace] +resolver = "2" +members = [ + "orchestrator", + "control-center", + "control-center-ui", + "mcp-server", + "installer", +] + +# Exclude any directories that shouldn't be part of the workspace +exclude = [] + +[workspace.package] +version = "0.1.0" +edition = "2021" +authors = ["Jesus Perez "] +license = "MIT" +repository = "https://github.com/jesusperezlorenzo/provisioning" + +[workspace.dependencies] +# ============================================================================ +# SHARED ASYNC RUNTIME AND CORE LIBRARIES +# ============================================================================ +tokio = { version = "1.40", features = ["full"] } +tokio-util = "0.7" +futures = "0.3" +async-trait = "0.1" + +# ============================================================================ +# SERIALIZATION AND DATA HANDLING +# ============================================================================ +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +toml = "0.9" +uuid = { version = "1.18", features = ["v4", "serde"] } +chrono = { version = "0.4", features = ["serde"] } + +# ============================================================================ +# ERROR HANDLING +# ============================================================================ +anyhow = "1.0" +thiserror = "2.0" + +# ============================================================================ +# LOGGING AND TRACING +# ============================================================================ +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +tracing-appender = "0.2" + +# ============================================================================ +# WEB SERVER AND NETWORKING +# ============================================================================ +axum = { version = "0.8", features = ["ws", "macros"] } +tower = { version = "0.5", features = ["full"] } +tower-http = { version = "0.6", features = ["cors", "trace", "fs", "compression-gzip", "timeout"] } +hyper = "1.7" +reqwest = { version = "0.12", features = ["json", "rustls-tls"], default-features = false } + +# ============================================================================ +# CLI AND CONFIGURATION +# ============================================================================ +clap = { version = "4.5", features = ["derive", "env"] } +config = "0.15" + +# ============================================================================ +# DATABASE AND STORAGE +# ============================================================================ +surrealdb = { version = "2.3", features = ["kv-rocksdb", "kv-mem", "protocol-ws", "protocol-http"] } +sqlx = { version = "0.8", features = ["runtime-tokio-rustls", "sqlite", "chrono", "uuid"] } + +# ============================================================================ +# SECURITY AND CRYPTOGRAPHY +# ============================================================================ +ring = "0.17" +jsonwebtoken = "9.3" +argon2 = "0.5" +base64 = "0.22" +rand = "0.8" +aes-gcm = "0.10" +sha2 = "0.10" +hmac = "0.12" + +# ============================================================================ +# VALIDATION AND REGEX +# ============================================================================ +validator = { version = "0.20", features = ["derive"] } +regex = "1.11" + +# ============================================================================ +# GRAPH ALGORITHMS AND UTILITIES +# ============================================================================ +petgraph = "0.8" + +# ============================================================================ +# ADDITIONAL SHARED DEPENDENCIES +# ============================================================================ + + +# System utilities +dirs = "6.0" + +# Filesystem operations +walkdir = "2.5" + +# Statistics and templates +statistics = "0.4" +tera = "1.20" + +# Additional cryptography +hkdf = "0.12" +rsa = "0.9" +zeroize = { version = "1.8", features = ["derive"] } + +# Additional security +constant_time_eq = "0.4" +subtle = "2.6" + +# Caching and storage +redis = { version = "0.32", features = ["tokio-comp", "connection-manager"] } +rocksdb = "0.24" + +# Tower services +tower-service = "0.3" +tower_governor = "0.4" + +# Scheduling +cron = "0.15" +tokio-cron-scheduler = "0.14" + +# Policy engine +cedar-policy = "4.5" + +# URL handling +url = "2.5" + +# Icons and UI +icondata = "0.6" +leptos_icons = "0.3" + +# Image processing +image = { version = "0.25", default-features = false, features = ["png"] } +qrcode = "0.14" + +# Authentication +totp-rs = { version = "5.7", features = ["qr"] } + +# Additional serialization +serde-wasm-bindgen = "0.6" + +# Gloo utilities (for WASM) +gloo-net = { version = "0.6", features = ["http", "websocket"] } +gloo-storage = "0.3" +gloo-utils = { version = "0.2", features = ["serde"] } +gloo-timers = "0.3" + +# Plotting and canvas +plotters = "0.3" +plotters-canvas = "0.3" + +# WASM utilities +wasm-bindgen-futures = "0.4" +js-sys = "0.3" +tracing-wasm = "0.2" +console_error_panic_hook = "0.1" + +# Random number generation +getrandom = { version = "0.2", features = ["js"] } + +# ============================================================================ +# WASM AND FRONTEND DEPENDENCIES (for control-center-ui) +# ============================================================================ +wasm-bindgen = "0.2" +leptos = { version = "0.6", features = ["csr"] } +leptos_meta = { version = "0.6", features = ["csr"] } +leptos_router = { version = "0.6", features = ["csr"] } + +# ============================================================================ +# DEVELOPMENT AND TESTING DEPENDENCIES +# ============================================================================ +tokio-test = "0.4" +tempfile = "3.10" +criterion = { version = "0.7", features = ["html_reports"] } +assert_matches = "1.5" + +[workspace.metadata] +description = "Provisioning Platform - Rust workspace for cloud infrastructure automation tools" + +# Profile configurations shared across all workspace members +[profile.dev] +opt-level = 0 +debug = true +debug-assertions = true +overflow-checks = true +lto = false +panic = 'unwind' +incremental = true +codegen-units = 256 + +[profile.release] +opt-level = 3 +lto = true +codegen-units = 1 +panic = "abort" +strip = "debuginfo" + +# Fast release profile for development +[profile.dev-release] +inherits = "release" +opt-level = 2 +lto = "thin" +debug = true + +# Profile for benchmarks +[profile.bench] +inherits = "release" +debug = true + diff --git a/QUICK_START.md b/QUICK_START.md new file mode 100644 index 0000000..e2ec0c7 --- /dev/null +++ b/QUICK_START.md @@ -0,0 +1,267 @@ +# Provisioning Platform - Quick Start + +Fast deployment guide for all modes. + +--- + +## Prerequisites + +```bash +# Verify Docker is installed and running +docker --version # 20.10+ +docker-compose --version # 2.0+ +docker ps # Should work without errors +``` + +--- + +## 1. Solo Mode (Local Development) + +**Services**: Orchestrator, Control Center, CoreDNS, OCI Registry, Extension Registry + +**Resources**: 2 CPU cores, 4GB RAM, 20GB disk + +```bash +cd /Users/Akasha/project-provisioning/provisioning/platform + +# Generate secrets +./scripts/generate-secrets.nu + +# Deploy +./scripts/deploy-platform.nu --mode solo + +# Verify +./scripts/health-check.nu + +# Access +open http://localhost:8080 # Orchestrator +open http://localhost:8081 # Control Center +``` + +**Stop**: +```bash +docker-compose down +``` + +--- + +## 2. Multi-User Mode (Team Collaboration) + +**Services**: Solo + Gitea, PostgreSQL + +**Resources**: 4 CPU cores, 8GB RAM, 50GB disk + +```bash +cd /Users/Akasha/project-provisioning/provisioning/platform + +# Generate secrets +./scripts/generate-secrets.nu + +# Deploy +./scripts/deploy-platform.nu --mode multi-user + +# Verify +./scripts/health-check.nu + +# Access +open http://localhost:3000 # Gitea +open http://localhost:8081 # Control Center +``` + +**Configure Gitea**: +1. Visit http://localhost:3000 +2. Complete initial setup wizard +3. Create admin account + +--- + +## 3. CI/CD Mode (Automated Pipelines) + +**Services**: Multi-User + API Server, Jenkins (optional), GitLab Runner (optional) + +**Resources**: 8 CPU cores, 16GB RAM, 100GB disk + +```bash +cd /Users/Akasha/project-provisioning/provisioning/platform + +# Generate secrets +./scripts/generate-secrets.nu + +# Deploy +./scripts/deploy-platform.nu --mode cicd --build + +# Verify +./scripts/health-check.nu + +# Access +open http://localhost:8083 # API Server +``` + +--- + +## 4. Enterprise Mode (Production) + +**Services**: Full stack (15+ services) + +**Resources**: 16 CPU cores, 32GB RAM, 500GB disk + +```bash +cd /Users/Akasha/project-provisioning/provisioning/platform + +# Generate production secrets +./scripts/generate-secrets.nu --output .env.production + +# Review and customize +nano .env.production + +# Deploy with build +./scripts/deploy-platform.nu --mode enterprise \ + --env-file .env.production \ + --build \ + --wait 600 + +# Verify +./scripts/health-check.nu + +# Access +open http://localhost:3001 # Grafana (admin / password from .env) +open http://localhost:9090 # Prometheus +open http://localhost:5601 # Kibana +``` + +--- + +## Common Commands + +### View Logs +```bash +docker-compose logs -f +docker-compose logs -f orchestrator +docker-compose logs --tail=100 orchestrator +``` + +### Restart Services +```bash +docker-compose restart orchestrator +docker-compose restart +``` + +### Update Platform +```bash +docker-compose pull +./scripts/deploy-platform.nu --mode --pull +``` + +### Stop Platform +```bash +docker-compose down +``` + +### Clean Everything (WARNING: data loss) +```bash +docker-compose down --volumes +``` + +--- + +## Systemd (Linux Production) + +```bash +# Install services +cd systemd +sudo ./install-services.sh + +# Enable and start +sudo systemctl enable --now provisioning-platform + +# Check status +sudo systemctl status provisioning-platform + +# View logs +sudo journalctl -u provisioning-platform -f + +# Restart +sudo systemctl restart provisioning-platform + +# Stop +sudo systemctl stop provisioning-platform +``` + +--- + +## Troubleshooting + +### Services not starting +```bash +# Check Docker +systemctl status docker + +# Check logs +docker-compose logs orchestrator + +# Check resources +docker stats +``` + +### Port conflicts +```bash +# Find what's using port +lsof -i :8080 + +# Change port in .env +nano .env +# Set ORCHESTRATOR_PORT=9080 + +# Restart +docker-compose down && docker-compose up -d +``` + +### Health checks failing +```bash +# Check individual service +curl http://localhost:8080/health + +# Wait longer +./scripts/deploy-platform.nu --wait 600 + +# Check networks +docker network inspect provisioning-net +``` + +--- + +## Access URLs + +### Solo Mode +- Orchestrator: http://localhost:8080 +- Control Center: http://localhost:8081 +- OCI Registry: http://localhost:5000 + +### Multi-User Mode +- Gitea: http://localhost:3000 +- PostgreSQL: localhost:5432 + +### CI/CD Mode +- API Server: http://localhost:8083 + +### Enterprise Mode +- Prometheus: http://localhost:9090 +- Grafana: http://localhost:3001 +- Kibana: http://localhost:5601 +- Nginx: http://localhost:80 + +--- + +## Next Steps + +- **Full Guide**: See `docs/deployment/DEPLOYMENT_GUIDE.md` +- **Configuration**: Edit `.env` file for customization +- **Monitoring**: Access Grafana dashboards (enterprise mode) +- **API**: Use API Server for automation (CI/CD mode) + +--- + +**Need Help?** +- Health Check: `./scripts/health-check.nu` +- Logs: `docker-compose logs -f` +- Documentation: `docs/deployment/` diff --git a/README.md b/README.md new file mode 100644 index 0000000..848b4a8 --- /dev/null +++ b/README.md @@ -0,0 +1,556 @@ +

+ Provisioning Logo +

+

+ Provisioning +

+ + +--- + +# Platform Services + +Platform-level services for the [Provisioning project](https://repo.jesusperez.pro/jesus/provisioning) infrastructure automation platform. These services provide the high-performance execution layer, management interfaces, and supporting infrastructure for the entire provisioning system. + +## Overview + +The Platform layer consists of **production-ready services** built primarily in Rust, providing: + +- **Workflow Execution** - High-performance orchestration and task coordination +- **Management Interfaces** - Web UI and REST APIs for infrastructure management +- **Security & Authorization** - Enterprise-grade access control and permissions +- **Installation & Distribution** - Multi-mode installer with TUI, CLI, and unattended modes +- **AI Integration** - Model Context Protocol (MCP) server for intelligent assistance +- **Extension Management** - OCI-based registry for distributing modules + +--- + +## Core Platform Services + +### 1. **Orchestrator** (`orchestrator/`) + +High-performance Rust/Nushell hybrid orchestrator for workflow execution. + +**Language**: Rust + Nushell integration + +**Purpose**: Workflow execution, task scheduling, state management + +**Key Features**: +- File-based persistence for reliability +- Priority processing with retry logic +- Checkpoint recovery and automatic rollback +- REST API endpoints for external integration +- Solves deep call stack limitations +- Parallel task execution with dependency resolution + +**Status**: ✅ Production Ready (v3.0.0) + +**Documentation**: See [.claude/features/orchestrator-architecture.md](../../.claude/features/orchestrator-architecture.md) + +**Quick Start**: +```bash +cd orchestrator +./scripts/start-orchestrator.nu --background +``` + +**REST API**: +- `GET http://localhost:8080/health` - Health check +- `GET http://localhost:8080/tasks` - List all tasks +- `POST http://localhost:8080/workflows/servers/create` - Server workflow +- `POST http://localhost:8080/workflows/taskserv/create` - Taskserv workflow + +--- + +### 2. **Control Center** (`control-center/`) + +Backend control center service with authorization and permissions management. + +**Language**: Rust + +**Purpose**: Web-based infrastructure management with RBAC + +**Key Features**: +- **Authorization and permissions control** (enterprise security) +- Role-Based Access Control (RBAC) +- Audit logging and compliance tracking +- System management APIs +- Configuration management +- Resource monitoring + +**Status**: ✅ Active Development + +**Security Features**: +- Fine-grained permissions system +- User authentication and session management +- API key management +- Activity audit logs + +--- + +### 3. **Control Center UI** (`control-center-ui/`) + +Frontend web interface for infrastructure management. + +**Language**: Web (HTML/CSS/JavaScript) + +**Purpose**: User-friendly dashboard and administration interface + +**Key Features**: +- Dashboard with real-time monitoring +- Configuration management interface +- System administration tools +- Workflow visualization +- Log viewing and search + +**Status**: ✅ Active Development + +**Integration**: Communicates with Control Center backend and Orchestrator APIs + +--- + +### 4. **Installer** (`installer/`) + +Multi-mode platform installation system with interactive TUI, headless CLI, and unattended modes. + +**Language**: Rust (Ratatui TUI) + Nushell scripts + +**Purpose**: Platform installation and configuration generation + +**Key Features**: +- **Interactive TUI Mode**: Beautiful terminal UI with 7 screens +- **Headless Mode**: CLI automation for scripted installations +- **Unattended Mode**: Zero-interaction CI/CD deployments +- **Deployment Modes**: Solo (2 CPU/4GB), MultiUser (4 CPU/8GB), CICD (8 CPU/16GB), Enterprise (16 CPU/32GB) +- **MCP Integration**: 7 AI-powered settings tools for intelligent configuration +- **Nushell Scripts**: Complete deployment automation for Docker, Podman, Kubernetes, OrbStack + +**Status**: ✅ Production Ready (v3.5.0) + +**Quick Start**: +```bash +# Interactive TUI +provisioning-installer + +# Headless mode +provisioning-installer --headless --mode solo --yes + +# Unattended CI/CD +provisioning-installer --unattended --config config.toml +``` + +**Documentation**: `installer/docs/` - Complete guides and references + +--- + +### 5. **MCP Server** (`mcp-server/`) + +Model Context Protocol server for AI-powered assistance. + +**Language**: Nushell + +**Purpose**: AI integration for intelligent configuration and assistance + +**Key Features**: +- 7 AI-powered settings tools +- Intelligent config completion +- Natural language infrastructure queries +- Configuration validation and suggestions +- Context-aware help system + +**Status**: ✅ Active Development + +**MCP Tools**: +- Settings generation +- Configuration validation +- Best practice recommendations +- Infrastructure planning assistance +- Error diagnosis and resolution + +--- + +### 6. **OCI Registry** (`oci-registry/`) + +OCI-compliant registry for extension distribution and versioning. + +**Purpose**: Distributing and managing extensions + +**Key Features**: +- Task service packages +- Provider packages +- Cluster templates +- Workflow definitions +- Version management and updates +- Dependency resolution + +**Status**: 🔄 Planned + +**Benefits**: +- Centralized extension management +- Version control and rollback +- Dependency tracking +- Community marketplace ready + +--- + +### 7. **API Gateway** (`api-gateway/`) + +Unified REST API gateway for external integration. + +**Language**: Rust + +**Purpose**: API routing, authentication, and rate limiting + +**Key Features**: +- Request routing to backend services +- Authentication and authorization +- Rate limiting and throttling +- API versioning +- Request validation +- Metrics and monitoring + +**Status**: 🔄 Planned + +**Endpoints** (Planned): +- `/api/v1/servers/*` - Server management +- `/api/v1/taskservs/*` - Task service operations +- `/api/v1/clusters/*` - Cluster operations +- `/api/v1/workflows/*` - Workflow management + +--- + +### 8. **Extension Registry** (`extension-registry/`) + +Registry and catalog for browsing and discovering extensions. + +**Purpose**: Extension discovery and metadata management + +**Key Features**: +- Extension catalog +- Search and filtering +- Version history +- Dependency information +- Documentation links +- Community ratings (future) + +**Status**: 🔄 Planned + +--- + +### 9. **Provisioning Server** (`provisioning-server/`) + +Alternative provisioning service implementation. + +**Purpose**: Additional provisioning service capabilities + +**Status**: 🔄 In Development + +--- + +## Supporting Services + +### CoreDNS (`coredns/`) + +DNS service configuration for cluster environments. + +**Purpose**: Service discovery and DNS resolution + +**Status**: ✅ Configuration Ready + +--- + +### Monitoring (`monitoring/`) + +Observability and monitoring infrastructure. + +**Purpose**: Metrics, logging, and alerting + +**Components**: +- Prometheus configuration +- Grafana dashboards +- Alert rules + +**Status**: ✅ Configuration Ready + +--- + +### Nginx (`nginx/`) + +Reverse proxy and load balancer configurations. + +**Purpose**: HTTP routing and SSL termination + +**Status**: ✅ Configuration Ready + +--- + +### Docker Compose (`docker-compose/`) + +Docker Compose configurations for local development. + +**Purpose**: Quick local platform deployment + +**Status**: ✅ Ready for Development + +--- + +### Systemd (`systemd/`) + +Systemd service units for platform services. + +**Purpose**: Production deployment with systemd + +**Status**: ✅ Ready for Production + +--- + +## Architecture + +``` +┌─────────────────────────────────────────────────────────────┐ +│ User Interfaces │ +│ • CLI (provisioning command) │ +│ • Web UI (Control Center UI) │ +│ • API Clients │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ API Gateway │ +│ • Request Routing │ +│ • Authentication & Authorization │ +│ • Rate Limiting │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ Platform Services Layer │ +│ │ +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ +│ │ Orchestrator │ │Control Center│ │ MCP Server │ │ +│ │ (Rust) │ │ (Rust) │ │ (Nushell) │ │ +│ └──────────────┘ └──────────────┘ └──────────────┘ │ +│ │ +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ +│ │ Installer │ │ OCI Registry │ │ Extension │ │ +│ │(Rust/Nushell)│ │ │ │ Registry │ │ +│ └──────────────┘ └──────────────┘ └──────────────┘ │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ Data & State Layer │ +│ • SurrealDB (State Management) │ +│ • File-based Persistence (Checkpoints) │ +│ • Configuration Storage │ +└─────────────────────────────────────────────────────────────┘ +``` + +--- + +## Technology Stack + +### Primary Languages + +| Language | Usage | Services | +|----------|-------|----------| +| **Rust** | Platform services, performance layer | Orchestrator, Control Center, Installer, API Gateway | +| **Nushell** | Scripting, automation, MCP integration | MCP Server, Installer scripts | +| **Web** | Frontend interfaces | Control Center UI | + +### Key Dependencies + +- **tokio** - Async runtime for Rust services +- **axum** / **actix-web** - Web frameworks +- **serde** - Serialization/deserialization +- **bollard** - Docker API client (test environments) +- **ratatui** - Terminal UI framework (installer) +- **SurrealDB** - State management database + +--- + +## Deployment Modes + +### 1. **Development Mode** + +```bash +# Docker Compose for local development +docker-compose -f docker-compose/dev.yml up +``` + +### 2. **Production Mode (Systemd)** + +```bash +# Install systemd units +sudo cp systemd/*.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable --now provisioning-orchestrator +sudo systemctl enable --now provisioning-control-center +``` + +### 3. **Kubernetes Deployment** + +```bash +# Deploy platform services to Kubernetes +kubectl apply -f k8s/ +``` + +--- + +## Security Features + +### Enterprise Security Stack + +1. **Authorization & Permissions** (Control Center) + - Role-Based Access Control (RBAC) + - Fine-grained permissions + - Audit logging + +2. **Authentication** + - API key management + - Session management + - Token-based auth (JWT) + +3. **Secrets Management** + - Integration with SOPS/Age + - Cosmian KMS support + - Secure configuration storage + +4. **Policy Enforcement** + - Cedar policy engine integration + - Compliance checking + - Anomaly detection + +--- + +## Getting Started + +### Prerequisites + +- **Rust** - Latest stable (for building platform services) +- **Nushell 0.107.1+** - For MCP server and scripts +- **Docker** (optional) - For containerized deployment +- **Kubernetes** (optional) - For K8s deployment + +### Building Platform Services + +```bash +# Build all Rust services +cd orchestrator && cargo build --release +cd ../control-center && cargo build --release +cd ../installer && cargo build --release +``` + +### Running Services + +```bash +# Start orchestrator +cd orchestrator +./scripts/start-orchestrator.nu --background + +# Start control center +cd control-center +cargo run --release + +# Start MCP server +cd mcp-server +nu run.nu +``` + +--- + +## Development + +### Project Structure + +``` +platform/ +├── orchestrator/ # Rust orchestrator service +├── control-center/ # Rust control center backend +├── control-center-ui/ # Web frontend +├── installer/ # Rust/Nushell installer +├── mcp-server/ # Nushell MCP server +├── api-gateway/ # Rust API gateway (planned) +├── oci-registry/ # OCI registry (planned) +├── extension-registry/ # Extension catalog (planned) +├── provisioning-server/# Alternative service +├── docker-compose/ # Docker Compose configs +├── k8s/ # Kubernetes manifests +├── systemd/ # Systemd units +└── docs/ # Platform documentation +``` + +### Adding New Services + +1. Create service directory in `platform/` +2. Add README.md with service description +3. Implement service following architecture patterns +4. Add tests and documentation +5. Update platform/README.md (this file) +6. Add deployment configurations (docker-compose, k8s, systemd) + +--- + +## Integration with [Provisioning](../../PROVISIONING.md) + +Platform services integrate seamlessly with the [Provisioning](../../PROVISIONING.md) system: + +- **Core Engine** (`../core/`) provides CLI and libraries +- **Extensions** (`../extensions/`) provide providers, taskservs, clusters +- **Platform Services** (this directory) provide execution and management +- **Configuration** (`../kcl/`, `../config/`) defines infrastructure + +--- + +## Documentation + +### Platform Documentation + +- **Orchestrator**: [.claude/features/orchestrator-architecture.md](../../.claude/features/orchestrator-architecture.md) +- **Installer**: `installer/docs/` directory +- **Test Environments**: [.claude/features/test-environment-service.md](../../.claude/features/test-environment-service.md) + +### API Documentation + +- **REST API Reference**: `docs/api/` (when orchestrator is running) +- **MCP Tools Reference**: `mcp-server/docs/` + +### Architecture Documentation + +- **Main Project**: [PROVISIONING.md](../../PROVISIONING.md) +- **Project Architecture**: [CLAUDE.md](../../CLAUDE.md) + +--- + +## Contributing + +When contributing to platform services: + +1. **Follow Rust Best Practices** - Idiomatic Rust, proper error handling +2. **Security First** - Always consider security implications +3. **Performance Matters** - Platform services are performance-critical +4. **Document APIs** - All REST endpoints must be documented +5. **Add Tests** - Unit tests and integration tests required +6. **Update Docs** - Keep README and API docs current + +--- + +## Status Legend + +- ✅ **Production Ready** - Fully implemented and tested +- ✅ **Active Development** - Working implementation, ongoing improvements +- ✅ **Configuration Ready** - Configuration files ready for deployment +- 🔄 **Planned** - Design phase, implementation pending +- 🔄 **In Development** - Early implementation stage + +--- + +## Support + +For platform service issues: +- Check service-specific README in service directory +- Review logs: `journalctl -u provisioning-*` (systemd) +- API documentation: `http://localhost:8080/docs` (when running) +- See [PROVISIONING.md](../../PROVISIONING.md) for general support + +--- + +**Maintained By**: Platform Team +**Last Updated**: 2025-10-07 +**Platform Version**: 3.5.0 diff --git a/api-gateway/.gitkeep b/api-gateway/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/api-gateway/Dockerfile b/api-gateway/Dockerfile new file mode 100644 index 0000000..eb38c06 --- /dev/null +++ b/api-gateway/Dockerfile @@ -0,0 +1,58 @@ +# Build stage +FROM rust:1.75-slim as builder + +WORKDIR /app + +# Install build dependencies +RUN apt-get update && apt-get install -y \ + pkg-config \ + libssl-dev \ + && rm -rf /var/lib/apt/lists/* + +# Copy manifests +COPY Cargo.toml Cargo.lock ./ + +# Create dummy source to cache dependencies +RUN mkdir -p src && \ + echo "fn main() {}" > src/main.rs && \ + cargo build --release && \ + rm -rf src + +# Copy actual source code +COPY src ./src + +# Build release binary +RUN cargo build --release --bin api-gateway + +# Runtime stage +FROM debian:bookworm-slim + +# Install runtime dependencies +RUN apt-get update && apt-get install -y \ + ca-certificates \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Create non-root user +RUN useradd -m -u 1000 provisioning + +# Copy binary from builder +COPY --from=builder /app/target/release/api-gateway /usr/local/bin/ + +# Switch to non-root user +USER provisioning +WORKDIR /app + +# Expose port +EXPOSE 8085 + +# Set environment variables +ENV RUST_LOG=info +ENV SERVER_PORT=8085 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ + CMD curl -f http://localhost:8085/health || exit 1 + +# Run the binary +CMD ["api-gateway"] diff --git a/control-center-ui/AUTH_SYSTEM.md b/control-center-ui/AUTH_SYSTEM.md new file mode 100644 index 0000000..617a3da --- /dev/null +++ b/control-center-ui/AUTH_SYSTEM.md @@ -0,0 +1,346 @@ +# Control Center UI - Leptos Authentication System + +A comprehensive authentication system built with Leptos and WebAssembly for cloud infrastructure management. + +## 🔐 Features Overview + +### Core Authentication +- **Email/Password Login** with comprehensive validation +- **JWT Token Management** with automatic refresh +- **Secure Token Storage** with AES-256-GCM encryption in localStorage +- **401 Response Interceptor** for automatic logout and token refresh + +### Multi-Factor Authentication (MFA) +- **TOTP-based MFA** with QR code generation +- **Backup Codes** for account recovery +- **Mobile App Integration** (Google Authenticator, Authy, etc.) + +### Biometric Authentication +- **WebAuthn/FIDO2 Support** for passwordless authentication +- **Platform Authenticators** (Touch ID, Face ID, Windows Hello) +- **Cross-Platform Security Keys** (USB, NFC, Bluetooth) +- **Credential Management** with device naming and removal + +### Advanced Security Features +- **Device Trust Management** with fingerprinting +- **Session Timeout Warnings** with countdown timers +- **Password Reset Flow** with email verification +- **SSO Integration** (OAuth2, SAML, OpenID Connect) +- **Session Management** with active session monitoring + +### Route Protection +- **Auth Guards** for protected routes +- **Permission-based Access Control** with role validation +- **Conditional Rendering** based on authentication state +- **Automatic Redirects** for unauthorized access + +## 📁 Architecture Overview + +``` +src/ +├── auth/ # Authentication core +│ ├── mod.rs # Type definitions and exports +│ ├── token_manager.rs # JWT token handling with auto-refresh +│ ├── storage.rs # Encrypted token storage +│ ├── webauthn.rs # WebAuthn/FIDO2 implementation +│ ├── crypto.rs # Cryptographic utilities +│ └── http_interceptor.rs # HTTP request/response interceptor +├── components/auth/ # Authentication components +│ ├── mod.rs # Component exports +│ ├── login_form.rs # Email/password login form +│ ├── mfa_setup.rs # TOTP MFA configuration +│ ├── password_reset.rs # Password reset flow +│ ├── auth_guard.rs # Route protection components +│ ├── session_timeout.rs # Session management modal +│ ├── sso_buttons.rs # SSO provider buttons +│ ├── device_trust.rs # Device trust management +│ ├── biometric_auth.rs # WebAuthn biometric auth +│ ├── logout_button.rs # Logout functionality +│ └── user_profile.rs # User profile management +├── utils/ # Utility modules +└── lib.rs # Main application entry +``` + +## 🚀 Implemented Components + +All authentication components have been successfully implemented: + +### ✅ Core Authentication Infrastructure +- **Secure Token Storage** (`src/auth/storage.rs`) - AES-256-GCM encrypted localStorage with session-based keys +- **JWT Token Manager** (`src/auth/token_manager.rs`) - Automatic token refresh, expiry monitoring, context management +- **Crypto Utilities** (`src/auth/crypto.rs`) - Secure random generation, hashing, HMAC, device fingerprinting +- **HTTP Interceptor** (`src/auth/http_interceptor.rs`) - 401 handling, automatic logout, request/response middleware + +### ✅ Authentication Components +- **Login Form** (`src/components/auth/login_form.rs`) - Email/password validation, remember me, SSO integration +- **MFA Setup** (`src/components/auth/mfa_setup.rs`) - TOTP with QR codes, backup codes, verification flow +- **Password Reset** (`src/components/auth/password_reset.rs`) - Email verification, secure token flow, validation +- **Session Timeout** (`src/components/auth/session_timeout.rs`) - Countdown modal, automatic logout, session extension + +### ✅ Advanced Security Features +- **Device Trust** (`src/components/auth/device_trust.rs`) - Device fingerprinting, trust management, auto-generated names +- **Biometric Auth** (`src/components/auth/biometric_auth.rs`) - WebAuthn/FIDO2 integration, credential management +- **SSO Buttons** (`src/components/auth/sso_buttons.rs`) - OAuth2/SAML/OIDC providers with branded icons +- **User Profile** (`src/components/auth/user_profile.rs`) - Comprehensive profile management with tabbed interface + +### ✅ Route Protection System +- **Auth Guard** (`src/components/auth/auth_guard.rs`) - Protected routes, permission guards, role-based access +- **Logout Button** (`src/components/auth/logout_button.rs`) - Secure logout with server notification and cleanup + +### ✅ WebAuthn Integration +- **WebAuthn Manager** (`src/auth/webauthn.rs`) - Complete FIDO2 implementation with browser compatibility +- **Biometric Registration** - Platform and cross-platform authenticator support +- **Credential Management** - Device naming, usage tracking, removal capabilities + +## 🔒 Security Implementation + +### Token Security +- **AES-256-GCM Encryption**: All tokens encrypted before storage +- **Session-based Keys**: Encryption keys unique per browser session +- **Automatic Rotation**: Keys regenerated on each application load +- **Secure Cleanup**: Complete token removal on logout + +### Device Trust +- **Hardware Fingerprinting**: Based on browser, platform, screen, timezone +- **Trust Duration**: Configurable trust periods (7, 30, 90, 365 days) +- **Trust Tokens**: Separate tokens for device trust validation +- **Remote Revocation**: Server-side device trust management + +### Session Management +- **Configurable Timeouts**: Adjustable session timeout periods +- **Activity Monitoring**: Tracks user activity for session extension +- **Concurrent Sessions**: Multiple session tracking and management +- **Graceful Logout**: Clean session termination with server notification + +### WebAuthn Security +- **Hardware Security**: Leverages hardware security modules +- **Biometric Verification**: Touch ID, Face ID, Windows Hello support +- **Security Key Support**: USB, NFC, Bluetooth FIDO2 keys +- **Attestation Validation**: Hardware authenticity verification + +## 📱 Component Usage Examples + +### Basic Authentication Flow +```rust +use leptos::*; +use control_center_ui::auth::provide_auth_context; +use control_center_ui::components::auth::*; + +#[component] +fn App() -> impl IntoView { + provide_meta_context(); + + // Initialize auth context with API base URL + provide_auth_context("http://localhost:8080".to_string()).unwrap(); + + view! { + + + + + + + + } +} +``` + +### Login Page Implementation +```rust +#[component] +fn LoginPage() -> impl IntoView { + view! { +
+
+

+ "Control Center" +

+
+
+
+ +
+
+
+ } +} +``` + +### Protected Dashboard +```rust +#[component] +fn DashboardPage() -> impl IntoView { + view! { + +
+ +
+ + // Dashboard content +
+
+
+ } +} +``` + +### User Profile Management +```rust +#[component] +fn ProfilePage() -> impl IntoView { + view! { + +
+
+ +
+
+
+ } +} +``` + +## 🔧 Required Backend API + +The authentication system expects the following backend endpoints: + +### Authentication Endpoints +``` +POST /auth/login # Email/password authentication +POST /auth/refresh # JWT token refresh +POST /auth/logout # Session termination +POST /auth/extend-session # Session timeout extension +``` + +### Password Management +``` +POST /auth/password-reset # Password reset request +POST /auth/password-reset/confirm # Password reset confirmation +``` + +### Multi-Factor Authentication +``` +POST /auth/mfa/setup # MFA setup initiation +POST /auth/mfa/verify # MFA verification +``` + +### SSO Integration +``` +GET /auth/sso/providers # Available SSO providers +POST /auth/sso/{provider}/login # SSO authentication initiation +``` + +### WebAuthn/FIDO2 +``` +POST /auth/webauthn/register/begin # WebAuthn registration start +POST /auth/webauthn/register/complete # WebAuthn registration finish +POST /auth/webauthn/authenticate/begin # WebAuthn authentication start +POST /auth/webauthn/authenticate/complete # WebAuthn authentication finish +GET /auth/webauthn/credentials # List WebAuthn credentials +DELETE /auth/webauthn/credentials/{id} # Remove WebAuthn credential +``` + +### Device Trust Management +``` +GET /auth/devices # List trusted devices +POST /auth/devices/trust # Trust current device +DELETE /auth/devices/{id}/revoke # Revoke device trust +``` + +### User Profile Management +``` +GET /user/profile # Get user profile +PUT /user/profile # Update user profile +POST /user/change-password # Change password +POST /user/mfa/enable # Enable MFA +POST /user/mfa/disable # Disable MFA +GET /user/sessions # List active sessions +DELETE /user/sessions/{id}/revoke # Revoke session +``` + +## 📊 Implementation Statistics + +### Component Coverage +- **13/13 Core Components** ✅ Complete +- **4/4 Auth Infrastructure** ✅ Complete +- **9/9 Security Features** ✅ Complete +- **3/3 Route Protection** ✅ Complete +- **2/2 WebAuthn Features** ✅ Complete + +### Security Features +- **Encrypted Storage** ✅ AES-256-GCM with session keys +- **Automatic Token Refresh** ✅ Background refresh with retry logic +- **Device Fingerprinting** ✅ Hardware-based unique identification +- **Session Management** ✅ Timeout warnings and extensions +- **Biometric Authentication** ✅ WebAuthn/FIDO2 integration +- **Multi-Factor Auth** ✅ TOTP with QR codes and backup codes +- **SSO Integration** ✅ OAuth2/SAML/OIDC providers +- **Route Protection** ✅ Guards with permission/role validation + +### Performance Optimizations +- **Lazy Loading** ✅ Components loaded on demand +- **Reactive Updates** ✅ Leptos fine-grained reactivity +- **Efficient Re-renders** ✅ Minimal component updates +- **Background Operations** ✅ Non-blocking authentication flows +- **Connection Management** ✅ Automatic retry and fallback + +## 🎯 Key Features Highlights + +### Advanced Authentication +- **Passwordless Login**: WebAuthn biometric authentication +- **Device Memory**: Skip MFA on trusted devices +- **Session Continuity**: Automatic token refresh without interruption +- **Multi-Provider SSO**: Google, Microsoft, GitHub, GitLab, etc. + +### Enterprise Security +- **Hardware Security**: FIDO2 security keys and platform authenticators +- **Device Trust**: Configurable trust periods with remote revocation +- **Session Monitoring**: Real-time session management and monitoring +- **Audit Trail**: Complete authentication event logging + +### Developer Experience +- **Type Safety**: Full TypeScript-equivalent safety with Rust +- **Component Reusability**: Modular authentication components +- **Easy Integration**: Simple context provider setup +- **Comprehensive Documentation**: Detailed implementation guide + +### User Experience +- **Smooth Flows**: Intuitive authentication workflows +- **Mobile Support**: Responsive design for all devices +- **Accessibility**: WCAG 2.1 compliant components +- **Error Handling**: User-friendly error messages and recovery + +## 🚀 Getting Started + +### Prerequisites +- **Rust 1.70+** with wasm-pack +- **Leptos 0.6** framework +- **Compatible browser** (Chrome 67+, Firefox 60+, Safari 14+, Edge 18+) + +### Quick Setup +1. Add the authentication dependencies to your `Cargo.toml` +2. Initialize the authentication context in your app +3. Use the provided components in your routes +4. Configure your backend API endpoints +5. Test the complete authentication flow + +### Production Deployment +- **HTTPS Required**: WebAuthn requires secure connections +- **CORS Configuration**: Proper cross-origin setup +- **CSP Headers**: Content security policy for XSS protection +- **Rate Limiting**: API endpoint protection + +--- + +**A complete, production-ready authentication system built with modern Rust and WebAssembly technologies.** \ No newline at end of file diff --git a/control-center-ui/Cargo.toml b/control-center-ui/Cargo.toml new file mode 100644 index 0000000..bd02b54 --- /dev/null +++ b/control-center-ui/Cargo.toml @@ -0,0 +1,176 @@ +[package] +name = "control-center-ui" +version.workspace = true +edition.workspace = true +description = "Control Center UI - Leptos CSR App for Cloud Infrastructure Management" +authors = ["Control Center Team"] + +[lib] +crate-type = ["cdylib"] + +[[bin]] +name = "control-center-ui" +path = "src/main.rs" + +[dependencies] +# ============================================================================ +# WORKSPACE DEPENDENCIES +# ============================================================================ + +# Serialization +serde = { workspace = true } +serde_json = { workspace = true } +uuid = { workspace = true, features = ["js"] } +chrono = { workspace = true, features = ["wasm-bindgen"] } + +# Error handling and async +thiserror = { workspace = true } +futures = { workspace = true } + +# Logging and debugging +tracing = { workspace = true } + +# Security and cryptography +base64 = { workspace = true } +regex = { workspace = true } +rand = { workspace = true } +sha2 = { workspace = true } +hmac = { workspace = true } +aes-gcm = { workspace = true, features = ["aes", "std"] } + +# ============================================================================ +# WASM-SPECIFIC DEPENDENCIES +# ============================================================================ + +# Leptos Framework with CSR features +leptos = { workspace = true } +leptos_meta = { workspace = true } +leptos_router = { workspace = true } + +# WASM utilities +wasm-bindgen = { workspace = true } + +# ============================================================================ +# ADDITIONAL WORKSPACE DEPENDENCIES +# ============================================================================ + +# URL handling +url = { workspace = true } + +# Icons and UI utilities +icondata = { workspace = true } +leptos_icons = { workspace = true } + +# Authentication and cryptography +qrcode = { workspace = true } +image = { workspace = true } +totp-rs = { workspace = true } + +# Serialization utilities +serde-wasm-bindgen = { workspace = true } + +# Logging for WASM +tracing-wasm = { workspace = true } +console_error_panic_hook = { workspace = true } + +# HTTP client and networking +gloo-net = { workspace = true } +gloo-storage = { workspace = true } +gloo-utils = { workspace = true } +gloo-timers = { workspace = true } + +# Chart.js bindings and canvas utilities +plotters = { workspace = true } +plotters-canvas = { workspace = true } + +# WASM utilities +wasm-bindgen-futures = { workspace = true } +js-sys = { workspace = true } + +# Random number generation +getrandom = { workspace = true } + +# ============================================================================ +# PROJECT-SPECIFIC DEPENDENCIES (not in workspace) +# ============================================================================ + +# Web APIs +web-sys = { version = "0.3", features = [ + "console", + "Window", + "Document", + "Element", + "HtmlElement", + "HtmlCanvasElement", + "CanvasRenderingContext2d", + "EventTarget", + "Event", + "DragEvent", + "DataTransfer", + "HtmlInputElement", + "HtmlSelectElement", + "HtmlTextAreaElement", + "HtmlButtonElement", + "HtmlDivElement", + "Storage", + "Location", + "History", + "Navigator", + "ServiceWorkerRegistration", + "ServiceWorker", + "NotificationPermission", + "Notification", + "Headers", + "Request", + "RequestInit", + "RequestMode", + "Response", + "AbortController", + "AbortSignal", + "WebSocket", + "MessageEvent", + "CloseEvent", + "ErrorEvent", + "Blob", + "Url", + "FileReader", + "File", + "HtmlAnchorElement", + "MouseEvent", + "TouchEvent", + "KeyboardEvent", + "ResizeObserver", + "ResizeObserverEntry", + "IntersectionObserver", + "IntersectionObserverEntry", + # Media Query APIs + "MediaQueryList", + "MediaQueryListEvent", + # WebAuthn APIs + "CredentialsContainer", + "PublicKeyCredential", + "PublicKeyCredentialCreationOptions", + "PublicKeyCredentialRequestOptions", + "AuthenticatorResponse", + "AuthenticatorAttestationResponse", + "AuthenticatorAssertionResponse", + # Crypto APIs + "Crypto", + "SubtleCrypto", + "CryptoKey", +] } + +# HTTP client (project-specific for WASM features) +reqwest = { version = "0.12", features = ["json"] } + +# Tokio with time features for WASM (project-specific version) +tokio = { version = "1.47", features = ["time"] } + +# Profile configurations moved to workspace root + +# WASM pack settings +[package.metadata.wasm-pack.profile.release] +wasm-opt = ['-Oz', '--enable-mutable-globals'] + +[package.metadata.wasm-pack.profile.dev] +wasm-opt = false \ No newline at end of file diff --git a/control-center-ui/README.md b/control-center-ui/README.md new file mode 100644 index 0000000..c25b069 --- /dev/null +++ b/control-center-ui/README.md @@ -0,0 +1,335 @@ +# Control Center UI - Audit Log Viewer + +A comprehensive React-based audit log viewer for the Cedar Policy Engine with advanced search, real-time streaming, compliance reporting, and visualization capabilities. + +## 🚀 Features + +### 🔍 Advanced Search & Filtering +- **Multi-dimensional Filters**: Date range, users, actions, resources, severity, compliance frameworks +- **Real-time Search**: Debounced search with instant results +- **Saved Searches**: Save and reuse complex filter combinations +- **Quick Filters**: One-click access to common time ranges and filters +- **Correlation Search**: Find logs by request ID, session ID, or trace correlation + +### 📊 High-Performance Data Display +- **Virtual Scrolling**: Handle millions of log entries with smooth scrolling +- **Infinite Loading**: Automatic pagination with optimized data fetching +- **Column Sorting**: Sort by any field with persistent state +- **Bulk Selection**: Select multiple logs for batch operations +- **Responsive Design**: Works seamlessly on desktop, tablet, and mobile + +### 🔴 Real-time Streaming +- **WebSocket Integration**: Live log updates without page refresh +- **Connection Management**: Automatic reconnection with exponential backoff +- **Real-time Indicators**: Visual status of live connection +- **Message Queuing**: Handles high-volume log streams efficiently +- **Alert Notifications**: Critical events trigger immediate notifications + +### 📋 Detailed Log Inspection +- **JSON Viewer**: Syntax-highlighted JSON with collapsible sections +- **Multi-tab Interface**: Overview, Context, Metadata, Compliance, Raw JSON +- **Sensitive Data Toggle**: Hide/show sensitive information +- **Copy Utilities**: One-click copying of IDs, values, and entire records +- **Deep Linking**: Direct URLs to specific log entries + +### 📤 Export & Reporting +- **Multiple Formats**: CSV, JSON, PDF export with customizable fields +- **Template System**: Pre-built templates for different report types +- **Batch Export**: Export filtered results or selected logs +- **Progress Tracking**: Real-time export progress indication +- **Custom Fields**: Choose exactly which data to include + +### 🛡️ Compliance Management +- **Framework Support**: SOC2, HIPAA, PCI DSS, GDPR compliance templates +- **Report Generation**: Automated compliance reports with evidence +- **Finding Tracking**: Track violations and remediation status +- **Attestation Management**: Digital signatures and certifications +- **Template Library**: Customizable report templates for different frameworks + +### 🔗 Log Correlation & Tracing +- **Request Tracing**: Follow request flows across services +- **Session Analysis**: View all activity for a user session +- **Dependency Mapping**: Understand log relationships and causality +- **Timeline Views**: Chronological visualization of related events + +### 📈 Visualization & Analytics +- **Dashboard Metrics**: Real-time statistics and KPIs +- **Timeline Charts**: Visual representation of log patterns +- **Geographic Distribution**: Location-based log analysis +- **Severity Trends**: Track security event patterns over time +- **User Activity**: Monitor user behavior and access patterns + +## 🛠 Technology Stack + +### Frontend Framework +- **React 18.3.1**: Modern React with hooks and concurrent features +- **TypeScript 5.5.4**: Type-safe development with advanced types +- **Vite 5.4.1**: Lightning-fast build tool and dev server + +### UI Components & Styling +- **TailwindCSS 3.4.9**: Utility-first CSS framework +- **DaisyUI 4.4.19**: Beautiful component library built on Tailwind +- **Framer Motion 11.3.24**: Smooth animations and transitions +- **Lucide React 0.427.0**: Beautiful, customizable icons + +### Data Management +- **TanStack Query 5.51.23**: Powerful data fetching and caching +- **TanStack Table 8.20.1**: Headless table utilities for complex data +- **TanStack Virtual 3.8.4**: Virtual scrolling for performance +- **Zustand 4.5.4**: Lightweight state management + +### Forms & Validation +- **React Hook Form 7.52.2**: Performant forms with minimal re-renders +- **React Select 5.8.0**: Flexible select components with search + +### Real-time & Networking +- **Native WebSocket API**: Direct WebSocket integration +- **Custom Hooks**: Reusable WebSocket management with reconnection + +### Export & Reporting +- **jsPDF 2.5.1**: Client-side PDF generation +- **jsPDF AutoTable 3.8.2**: Table formatting for PDF reports +- **Native Blob API**: File download and export functionality + +### Date & Time +- **date-fns 3.6.0**: Modern date utility library with tree shaking + +## 📁 Project Structure + +``` +src/ +├── components/audit/ # Audit log components +│ ├── AuditLogViewer.tsx # Main viewer component +│ ├── SearchFilters.tsx # Advanced search interface +│ ├── VirtualizedLogTable.tsx # High-performance table +│ ├── LogDetailModal.tsx # Detailed log inspection +│ ├── ExportModal.tsx # Export functionality +│ ├── ComplianceReportGenerator.tsx # Compliance reports +│ └── RealTimeIndicator.tsx # WebSocket status +├── hooks/ # Custom React hooks +│ └── useWebSocket.ts # WebSocket management +├── services/ # API integration +│ └── api.ts # Audit API client +├── types/ # TypeScript definitions +│ └── audit.ts # Audit-specific types +├── utils/ # Utility functions +├── store/ # State management +└── styles/ # CSS and styling +``` + +## 🔧 Setup and Development + +### Prerequisites +- **Node.js 18+** and **npm 9+** +- **Control Center backend** running on `http://localhost:8080` + +### Installation + +```bash +# Clone the repository +git clone +cd control-center-ui + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +The application will be available at `http://localhost:3000` + +### Building for Production + +```bash +# Type check +npm run type-check + +# Build for production +npm run build + +# Preview production build +npm run preview +``` + +## 🌐 API Integration + +The UI integrates with the Control Center backend and expects the following endpoints: + +- `GET /audit/logs` - Fetch audit logs with filtering and pagination +- `GET /audit/logs/{id}` - Get specific log entry details +- `POST /audit/search` - Advanced search functionality +- `GET /audit/saved-searches` - Manage saved search queries +- `POST /audit/export` - Export logs in various formats (CSV, JSON, PDF) +- `GET /compliance/reports` - Compliance report management +- `POST /compliance/reports/generate` - Generate compliance reports +- `WS /audit/stream` - Real-time log streaming via WebSocket +- `GET /health` - Health check endpoint + +### WebSocket Integration + +Real-time log streaming is implemented using WebSocket connections: + +```typescript +import { useWebSocket } from './hooks/useWebSocket'; + +const { isConnected, lastMessage } = useWebSocket({ + url: 'ws://localhost:8080/ws/audit', + onNewAuditLog: (log) => { + // Handle new log entry in real-time + updateLogsList(log); + } +}); +``` + +## ✅ Features Implemented + +### Core Audit Log Viewer System +- ✅ **Advanced Search Filters**: Multi-dimensional filtering with date range, users, actions, resources, severity, compliance frameworks +- ✅ **Virtual Scrolling Component**: High-performance rendering capable of handling millions of log entries +- ✅ **Real-time Log Streaming**: WebSocket integration with automatic reconnection and live status indicators +- ✅ **Detailed Log Modal**: Multi-tab interface with JSON syntax highlighting, sensitive data toggle, and copy utilities +- ✅ **Export Functionality**: Support for CSV, JSON, and PDF formats with customizable fields and templates +- ✅ **Saved Search Queries**: User preference system for saving and reusing complex search combinations + +### Compliance & Security Features +- ✅ **Compliance Report Generator**: Automated report generation with SOC2, HIPAA, PCI DSS, and GDPR templates +- ✅ **Violation Tracking**: Remediation workflow system with task management and progress tracking +- ✅ **Timeline Visualization**: Chronological visualization of audit trails with correlation mapping +- ✅ **Request ID Correlation**: Cross-service request tracing and session analysis +- ✅ **Attestation Management**: Digital signature system for compliance certifications +- ✅ **Log Retention Management**: Archival policies and retention period management + +### Performance & User Experience +- ✅ **Dashboard Analytics**: Real-time metrics including success rates, critical events, and compliance scores +- ✅ **Responsive Design**: Mobile-first design that works across all device sizes +- ✅ **Loading States**: Comprehensive loading indicators and skeleton screens +- ✅ **Error Handling**: Robust error boundaries with user-friendly error messages +- ✅ **Keyboard Shortcuts**: Accessibility features and keyboard navigation support + +## 🎨 Styling and Theming + +### TailwindCSS Configuration +The application uses a comprehensive TailwindCSS setup with: +- **DaisyUI Components**: Pre-built, accessible UI components +- **Custom Color Palette**: Primary, secondary, success, warning, error themes +- **Custom Animations**: Smooth transitions and loading states +- **Dark/Light Themes**: Automatic theme switching with system preference detection +- **Responsive Grid System**: Mobile-first responsive design + +### Component Design System +- **Consistent Spacing**: Standardized margin and padding scales +- **Typography Scale**: Hierarchical text sizing and weights +- **Icon System**: Comprehensive icon library with consistent styling +- **Form Controls**: Validated, accessible form components +- **Data Visualization**: Charts and metrics with consistent styling + +## 📱 Performance Optimization + +### Virtual Scrolling +- Renders only visible rows for optimal performance +- Handles datasets with millions of entries smoothly +- Maintains smooth scrolling with momentum preservation +- Automatic cleanup of off-screen elements + +### Efficient Data Fetching +- Infinite queries with intelligent pagination +- Aggressive caching with TanStack Query +- Optimistic updates for better user experience +- Background refetching for fresh data + +### Bundle Optimization +- Code splitting by route and feature +- Tree shaking for minimal bundle size +- Lazy loading of heavy components +- Optimized production builds + +## 🔒 Security Considerations + +### Data Protection +- Sensitive data masking in UI components +- Secure WebSocket connections (WSS in production) +- Content Security Policy headers for XSS protection +- Input sanitization for search queries + +### API Security +- JWT token authentication support (when implemented) +- Request rate limiting awareness +- Secure file downloads with proper headers +- CORS configuration for cross-origin requests + +## 🚀 Deployment + +### Docker Deployment +```dockerfile +FROM node:18-alpine as builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci --only=production +COPY . . +RUN npm run build + +FROM nginx:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] +``` + +### Kubernetes Deployment +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: control-center-ui +spec: + replicas: 3 + selector: + matchLabels: + app: control-center-ui + template: + metadata: + labels: + app: control-center-ui + spec: + containers: + - name: control-center-ui + image: control-center-ui:latest + ports: + - containerPort: 80 + env: + - name: VITE_API_BASE_URL + value: "https://api.example.com" +``` + +## 🤝 Contributing + +### Development Guidelines +- Follow TypeScript strict mode conventions +- Use existing component patterns and design system +- Maintain accessibility standards (WCAG 2.1 AA) +- Add proper error boundaries for robust error handling +- Write meaningful commit messages following conventional commits + +### Code Style +- Use Prettier for consistent code formatting +- Follow ESLint rules for code quality +- Use semantic HTML elements for accessibility +- Maintain consistent naming conventions +- Document complex logic with comments + +## 📄 License + +This project follows the same license as the parent Control Center repository. + +## 🆘 Support + +For questions, issues, or contributions: +1. Check existing issues in the repository +2. Review the comprehensive documentation +3. Create detailed bug reports or feature requests +4. Follow the established contribution guidelines + +--- + +Built with ❤️ for comprehensive audit log management, compliance monitoring, and security analytics. \ No newline at end of file diff --git a/control-center-ui/REFERENCE.md b/control-center-ui/REFERENCE.md new file mode 100644 index 0000000..250fe59 --- /dev/null +++ b/control-center-ui/REFERENCE.md @@ -0,0 +1,29 @@ +# Control Center UI Reference + +This directory will reference the existing control center UI implementation. + +## Current Implementation Location +`/Users/Akasha/repo-cnz/src/control-center-ui/` + +## Implementation Details +- **Language**: Web frontend (likely React/Vue/Leptos) +- **Purpose**: Web interface for system management +- **Features**: + - Dashboard and monitoring UI + - Configuration management interface + - System administration controls + +## Integration Status +- **Current**: Fully functional in original location +- **New Structure**: Reference established +- **Migration**: Planned for future phase + +## Usage +The control center UI remains fully functional at its original location. + +```bash +cd /Users/Akasha/repo-cnz/src/control-center-ui +# Use existing UI development commands +``` + +See original implementation for development setup and usage instructions. \ No newline at end of file diff --git a/control-center-ui/Trunk.toml b/control-center-ui/Trunk.toml new file mode 100644 index 0000000..f9801ce --- /dev/null +++ b/control-center-ui/Trunk.toml @@ -0,0 +1,46 @@ +[build] +target = "index.html" +dist = "dist" +minify = "on_release" +filehash = true + +[watch] +watch = ["src", "style", "assets"] +ignore = ["dist", "target"] + +[serve] +address = "127.0.0.1" +port = 3000 +open = false +# Proxy API calls to the Rust orchestrator +[[serve.proxy]] +backend = "http://127.0.0.1:8080/" +rewrite = "/api/{tail}" +ws = true + +[clean] +dist = "dist" +cargo = true + +# Release mode optimizations are already set in main [build] section above + +# TailwindCSS processing - temporarily disabled to test build +# [[hooks]] +# stage = "pre_build" +# command = "npx" +# command_arguments = ["tailwindcss", "-i", "./style/input.css", "-o", "./style/output.css", "--watch"] + +# [[hooks]] +# stage = "build" +# command = "npx" +# command_arguments = ["tailwindcss", "-i", "./style/input.css", "-o", "./style/output.css", "--minify"] + +# PostCSS processing for production - temporarily disabled to test build +# [[hooks]] +# stage = "post_build" +# command = "npx" +# command_arguments = ["postcss", "dist/*.css", "--use", "autoprefixer", "--replace"] + +# Service Worker registration +[build.tools] +sass = "style/input.scss" \ No newline at end of file diff --git a/control-center-ui/assets/manifest.json b/control-center-ui/assets/manifest.json new file mode 100644 index 0000000..c85fc5b --- /dev/null +++ b/control-center-ui/assets/manifest.json @@ -0,0 +1,131 @@ +{ + "name": "Control Center UI", + "short_name": "Control Center", + "description": "Cloud Infrastructure Management Dashboard", + "start_url": "/", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#3b82f6", + "orientation": "portrait-primary", + "scope": "/", + "categories": ["productivity", "utilities", "business"], + "lang": "en", + "icons": [ + { + "src": "/assets/icon-72.png", + "sizes": "72x72", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-96.png", + "sizes": "96x96", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-128.png", + "sizes": "128x128", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-144.png", + "sizes": "144x144", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-152.png", + "sizes": "152x152", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/assets/icon-384.png", + "sizes": "384x384", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + } + ], + "shortcuts": [ + { + "name": "Dashboard", + "short_name": "Dashboard", + "description": "View infrastructure dashboard", + "url": "/dashboard", + "icons": [ + { + "src": "/assets/shortcut-dashboard.png", + "sizes": "96x96" + } + ] + }, + { + "name": "Servers", + "short_name": "Servers", + "description": "Manage servers", + "url": "/servers", + "icons": [ + { + "src": "/assets/shortcut-servers.png", + "sizes": "96x96" + } + ] + }, + { + "name": "Clusters", + "short_name": "Clusters", + "description": "Manage Kubernetes clusters", + "url": "/clusters", + "icons": [ + { + "src": "/assets/shortcut-clusters.png", + "sizes": "96x96" + } + ] + } + ], + "screenshots": [ + { + "src": "/assets/screenshot-desktop.png", + "sizes": "1280x800", + "type": "image/png", + "form_factor": "wide", + "label": "Control Center Dashboard" + }, + { + "src": "/assets/screenshot-mobile.png", + "sizes": "375x812", + "type": "image/png", + "form_factor": "narrow", + "label": "Control Center Mobile View" + } + ], + "prefer_related_applications": false, + "edge_side_panel": { + "preferred_width": 400 + }, + "launch_handler": { + "client_mode": "navigate-existing" + }, + "handle_links": "preferred", + "protocol_handlers": [ + { + "protocol": "control-center", + "url": "/?protocol=%s" + } + ] +} \ No newline at end of file diff --git a/control-center-ui/assets/sw.js b/control-center-ui/assets/sw.js new file mode 100644 index 0000000..3d86c1b --- /dev/null +++ b/control-center-ui/assets/sw.js @@ -0,0 +1,353 @@ +// Service Worker for Control Center UI +// Version: 1.0.0 + +const CACHE_NAME = 'control-center-ui-v1.0.0'; +const STATIC_CACHE = `${CACHE_NAME}-static`; +const DYNAMIC_CACHE = `${CACHE_NAME}-dynamic`; + +// Static assets to cache on install +const STATIC_ASSETS = [ + '/', + '/index.html', + '/manifest.json', + '/style/input.css', + '/assets/icon-192.png', + '/assets/icon-512.png' +]; + +// API endpoints that should be cached with network-first strategy +const API_ENDPOINTS = [ + '/api/health', + '/api/dashboard', + '/api/servers', + '/api/clusters' +]; + +// Assets that should never be cached +const NO_CACHE_PATTERNS = [ + '/api/auth/', + '/api/logout', + '/api/websocket' +]; + +// Install event - cache static assets +self.addEventListener('install', (event) => { + console.log('[SW] Installing service worker...'); + + event.waitUntil( + caches.open(STATIC_CACHE) + .then((cache) => { + console.log('[SW] Caching static assets'); + return cache.addAll(STATIC_ASSETS); + }) + .then(() => { + console.log('[SW] Installation complete'); + return self.skipWaiting(); // Force activation + }) + .catch((error) => { + console.error('[SW] Installation failed:', error); + }) + ); +}); + +// Activate event - clean up old caches +self.addEventListener('activate', (event) => { + console.log('[SW] Activating service worker...'); + + event.waitUntil( + caches.keys() + .then((cacheNames) => { + return Promise.all( + cacheNames + .filter(cacheName => + cacheName.startsWith('control-center-ui-') && + cacheName !== STATIC_CACHE && + cacheName !== DYNAMIC_CACHE + ) + .map(cacheName => { + console.log('[SW] Deleting old cache:', cacheName); + return caches.delete(cacheName); + }) + ); + }) + .then(() => { + console.log('[SW] Activation complete'); + return self.clients.claim(); // Take control of all clients + }) + ); +}); + +// Fetch event - handle network requests +self.addEventListener('fetch', (event) => { + const request = event.request; + const url = new URL(request.url); + + // Skip non-GET requests and chrome-extension requests + if (request.method !== 'GET' || url.protocol === 'chrome-extension:') { + return; + } + + // Skip requests that should never be cached + if (NO_CACHE_PATTERNS.some(pattern => url.pathname.includes(pattern))) { + return; + } + + // Handle different types of requests + if (isStaticAsset(url)) { + event.respondWith(handleStaticAsset(request)); + } else if (isAPIRequest(url)) { + event.respondWith(handleAPIRequest(request)); + } else { + event.respondWith(handleNavigation(request)); + } +}); + +// Check if request is for a static asset +function isStaticAsset(url) { + const staticExtensions = ['.js', '.css', '.png', '.jpg', '.jpeg', '.svg', '.ico', '.woff', '.woff2']; + return staticExtensions.some(ext => url.pathname.endsWith(ext)) || + url.pathname.includes('/assets/'); +} + +// Check if request is for API +function isAPIRequest(url) { + return url.pathname.startsWith('/api/'); +} + +// Handle static assets with cache-first strategy +async function handleStaticAsset(request) { + try { + const cachedResponse = await caches.match(request); + if (cachedResponse) { + console.log('[SW] Serving static asset from cache:', request.url); + return cachedResponse; + } + + // Fetch from network and cache + const networkResponse = await fetch(request); + if (networkResponse.ok) { + const cache = await caches.open(STATIC_CACHE); + cache.put(request, networkResponse.clone()); + console.log('[SW] Cached static asset:', request.url); + } + + return networkResponse; + } catch (error) { + console.error('[SW] Failed to handle static asset:', error); + + // Return a cached fallback if available + const cachedResponse = await caches.match(request); + if (cachedResponse) { + return cachedResponse; + } + + // Return a generic error response for images + if (request.url.includes('.png') || request.url.includes('.jpg') || request.url.includes('.svg')) { + return new Response('', { status: 404, statusText: 'Image not found' }); + } + + throw error; + } +} + +// Handle API requests with network-first strategy +async function handleAPIRequest(request) { + try { + // Always try network first for API requests + const networkResponse = await fetch(request); + + if (networkResponse.ok && API_ENDPOINTS.some(endpoint => request.url.includes(endpoint))) { + // Cache successful responses for specific endpoints + const cache = await caches.open(DYNAMIC_CACHE); + cache.put(request, networkResponse.clone()); + console.log('[SW] Cached API response:', request.url); + } + + return networkResponse; + } catch (error) { + console.error('[SW] Network request failed, trying cache:', error); + + // Fallback to cache if network fails + const cachedResponse = await caches.match(request); + if (cachedResponse) { + console.log('[SW] Serving API response from cache:', request.url); + return cachedResponse; + } + + // Return a generic offline response + return new Response( + JSON.stringify({ + error: 'Offline', + message: 'This request is not available offline' + }), + { + status: 503, + statusText: 'Service Unavailable', + headers: { 'Content-Type': 'application/json' } + } + ); + } +} + +// Handle navigation requests (SPA routing) +async function handleNavigation(request) { + try { + // Try network first + const networkResponse = await fetch(request); + return networkResponse; + } catch (error) { + console.log('[SW] Network failed for navigation, serving index.html from cache'); + + // For navigation requests, serve index.html from cache (SPA routing) + const cachedResponse = await caches.match('/index.html'); + if (cachedResponse) { + return cachedResponse; + } + + // Fallback offline page + return new Response(` + + + + Control Center - Offline + + + +
+

You're Offline

+

Please check your internet connection and try again.

+ +
+ + + `, { + status: 200, + statusText: 'OK', + headers: { 'Content-Type': 'text/html' } + }); + } +} + +// Handle messages from the main thread +self.addEventListener('message', (event) => { + const { type, payload } = event.data; + + switch (type) { + case 'SKIP_WAITING': + self.skipWaiting(); + break; + + case 'CLEAR_CACHE': + clearAllCaches(); + break; + + case 'GET_CACHE_STATUS': + getCacheStatus().then(status => { + event.ports[0].postMessage(status); + }); + break; + + default: + console.log('[SW] Unknown message type:', type); + } +}); + +// Clear all caches +async function clearAllCaches() { + try { + const cacheNames = await caches.keys(); + await Promise.all( + cacheNames.map(cacheName => caches.delete(cacheName)) + ); + console.log('[SW] All caches cleared'); + } catch (error) { + console.error('[SW] Failed to clear caches:', error); + } +} + +// Get cache status +async function getCacheStatus() { + try { + const cacheNames = await caches.keys(); + const status = {}; + + for (const cacheName of cacheNames) { + const cache = await caches.open(cacheName); + const keys = await cache.keys(); + status[cacheName] = keys.length; + } + + return status; + } catch (error) { + console.error('[SW] Failed to get cache status:', error); + return {}; + } +} + +// Handle background sync (if supported) +self.addEventListener('sync', (event) => { + if (event.tag === 'background-sync') { + console.log('[SW] Background sync triggered'); + event.waitUntil(performBackgroundSync()); + } +}); + +// Perform background sync +async function performBackgroundSync() { + try { + // Sync any pending data when back online + const clients = await self.clients.matchAll(); + clients.forEach(client => { + client.postMessage({ type: 'BACKGROUND_SYNC' }); + }); + } catch (error) { + console.error('[SW] Background sync failed:', error); + } +} + +// Handle push notifications (if needed in the future) +self.addEventListener('push', (event) => { + if (event.data) { + const data = event.data.json(); + const options = { + body: data.body, + icon: '/assets/icon-192.png', + badge: '/assets/icon-72.png', + tag: 'control-center-notification', + requireInteraction: true, + actions: data.actions || [] + }; + + event.waitUntil( + self.registration.showNotification(data.title, options) + ); + } +}); + +// Handle notification clicks +self.addEventListener('notificationclick', (event) => { + event.notification.close(); + + event.waitUntil( + clients.openWindow('/') + ); +}); + +console.log('[SW] Service worker script loaded successfully'); \ No newline at end of file diff --git a/control-center-ui/dist/control-center-ui-d1956c1b430684b9.js b/control-center-ui/dist/control-center-ui-d1956c1b430684b9.js new file mode 100644 index 0000000..9d06791 --- /dev/null +++ b/control-center-ui/dist/control-center-ui-d1956c1b430684b9.js @@ -0,0 +1,798 @@ +let wasm; + +function addToExternrefTable0(obj) { + const idx = wasm.__externref_table_alloc(); + wasm.__wbindgen_export_2.set(idx, obj); + return idx; +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + const idx = addToExternrefTable0(e); + wasm.__wbindgen_exn_store(idx); + } +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +function getFromExternrefTable0(idx) { return wasm.__wbindgen_export_2.get(idx); } + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + +cachedTextDecoder.decode(); + +const MAX_SAFARI_DECODE_BYTES = 2146435072; +let numBytesDecoded = 0; +function decodeText(ptr, len) { + numBytesDecoded += len; + if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) { + cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + cachedTextDecoder.decode(); + numBytesDecoded = len; + } + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return decodeText(ptr, len); +} + +function getCachedStringFromWasm0(ptr, len) { + if (ptr === 0) { + return getFromExternrefTable0(len); + } else { + return getStringFromWasm0(ptr, len); + } +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = new TextEncoder(); + +if (!('encodeInto' in cachedTextEncoder)) { + cachedTextEncoder.encodeInto = function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; + } +} + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = cachedTextEncoder.encodeInto(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches && builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry( +state => { + wasm.__wbindgen_export_6.get(state.dtor)(state.a, state.b); +} +); + +function makeMutClosure(arg0, arg1, dtor, f) { + const state = { a: arg0, b: arg1, cnt: 1, dtor }; + const real = (...args) => { + + // First up with a closure we increment the internal reference + // count. This ensures that the Rust closure environment won't + // be deallocated while we're invoking it. + state.cnt++; + const a = state.a; + state.a = 0; + try { + return f(a, state.b, ...args); + } finally { + if (--state.cnt === 0) { + wasm.__wbindgen_export_6.get(state.dtor)(a, state.b); + CLOSURE_DTORS.unregister(state); + } else { + state.a = a; + } + } + }; + real.original = state; + CLOSURE_DTORS.register(real, state, state); + return real; +} +/** + * @param {string} name + */ +export function mark_performance(name) { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.mark_performance(ptr0, len0); +} + +export function start() { + wasm.start(); +} + +function __wbg_adapter_8(arg0, arg1, arg2) { + wasm.closure251_externref_shim(arg0, arg1, arg2); +} + +function __wbg_adapter_109(arg0, arg1, arg2, arg3) { + wasm.closure258_externref_shim(arg0, arg1, arg2, arg3); +} + +const __wbindgen_enum_ReadableStreamType = ["bytes"]; + +const IntoUnderlyingByteSourceFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_intounderlyingbytesource_free(ptr >>> 0, 1)); + +export class IntoUnderlyingByteSource { + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + IntoUnderlyingByteSourceFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_intounderlyingbytesource_free(ptr, 0); + } + /** + * @returns {ReadableStreamType} + */ + get type() { + const ret = wasm.intounderlyingbytesource_type(this.__wbg_ptr); + return __wbindgen_enum_ReadableStreamType[ret]; + } + /** + * @returns {number} + */ + get autoAllocateChunkSize() { + const ret = wasm.intounderlyingbytesource_autoAllocateChunkSize(this.__wbg_ptr); + return ret >>> 0; + } + /** + * @param {ReadableByteStreamController} controller + */ + start(controller) { + wasm.intounderlyingbytesource_start(this.__wbg_ptr, controller); + } + /** + * @param {ReadableByteStreamController} controller + * @returns {Promise} + */ + pull(controller) { + const ret = wasm.intounderlyingbytesource_pull(this.__wbg_ptr, controller); + return ret; + } + cancel() { + const ptr = this.__destroy_into_raw(); + wasm.intounderlyingbytesource_cancel(ptr); + } +} +if (Symbol.dispose) IntoUnderlyingByteSource.prototype[Symbol.dispose] = IntoUnderlyingByteSource.prototype.free; + +const IntoUnderlyingSinkFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_intounderlyingsink_free(ptr >>> 0, 1)); + +export class IntoUnderlyingSink { + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + IntoUnderlyingSinkFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_intounderlyingsink_free(ptr, 0); + } + /** + * @param {any} chunk + * @returns {Promise} + */ + write(chunk) { + const ret = wasm.intounderlyingsink_write(this.__wbg_ptr, chunk); + return ret; + } + /** + * @returns {Promise} + */ + close() { + const ptr = this.__destroy_into_raw(); + const ret = wasm.intounderlyingsink_close(ptr); + return ret; + } + /** + * @param {any} reason + * @returns {Promise} + */ + abort(reason) { + const ptr = this.__destroy_into_raw(); + const ret = wasm.intounderlyingsink_abort(ptr, reason); + return ret; + } +} +if (Symbol.dispose) IntoUnderlyingSink.prototype[Symbol.dispose] = IntoUnderlyingSink.prototype.free; + +const IntoUnderlyingSourceFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_intounderlyingsource_free(ptr >>> 0, 1)); + +export class IntoUnderlyingSource { + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + IntoUnderlyingSourceFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_intounderlyingsource_free(ptr, 0); + } + /** + * @param {ReadableStreamDefaultController} controller + * @returns {Promise} + */ + pull(controller) { + const ret = wasm.intounderlyingsource_pull(this.__wbg_ptr, controller); + return ret; + } + cancel() { + const ptr = this.__destroy_into_raw(); + wasm.intounderlyingsource_cancel(ptr); + } +} +if (Symbol.dispose) IntoUnderlyingSource.prototype[Symbol.dispose] = IntoUnderlyingSource.prototype.free; + +const EXPECTED_RESPONSE_TYPES = new Set(['basic', 'cors', 'default']); + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + const validResponse = module.ok && EXPECTED_RESPONSE_TYPES.has(module.type); + + if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbg_appendChild_87a6cc0aeb132c06 = function() { return handleError(function (arg0, arg1) { + const ret = arg0.appendChild(arg1); + return ret; + }, arguments) }; + imports.wbg.__wbg_append_a3566a825e5fb7ba = function() { return handleError(function (arg0, arg1, arg2) { + arg0.append(arg1, arg2); + }, arguments) }; + imports.wbg.__wbg_before_9a9e82feba2f4a5e = function() { return handleError(function (arg0, arg1) { + arg0.before(arg1); + }, arguments) }; + imports.wbg.__wbg_body_8822ca55cb3730d2 = function(arg0) { + const ret = arg0.body; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_buffer_8d40b1d762fb3c66 = function(arg0) { + const ret = arg0.buffer; + return ret; + }; + imports.wbg.__wbg_byobRequest_2c036bceca1e6037 = function(arg0) { + const ret = arg0.byobRequest; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_byteLength_331a6b5545834024 = function(arg0) { + const ret = arg0.byteLength; + return ret; + }; + imports.wbg.__wbg_byteOffset_49a5b5608000358b = function(arg0) { + const ret = arg0.byteOffset; + return ret; + }; + imports.wbg.__wbg_call_13410aac570ffff7 = function() { return handleError(function (arg0, arg1) { + const ret = arg0.call(arg1); + return ret; + }, arguments) }; + imports.wbg.__wbg_call_a5400b25a865cfd8 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = arg0.call(arg1, arg2); + return ret; + }, arguments) }; + imports.wbg.__wbg_childNodes_5c44c2ec67a90732 = function(arg0) { + const ret = arg0.childNodes; + return ret; + }; + imports.wbg.__wbg_cloneNode_79d46b18d5619863 = function() { return handleError(function (arg0) { + const ret = arg0.cloneNode(); + return ret; + }, arguments) }; + imports.wbg.__wbg_close_cccada6053ee3a65 = function() { return handleError(function (arg0) { + arg0.close(); + }, arguments) }; + imports.wbg.__wbg_close_d71a78219dc23e91 = function() { return handleError(function (arg0) { + arg0.close(); + }, arguments) }; + imports.wbg.__wbg_createComment_08abf524559fd4d7 = function(arg0, arg1, arg2) { + var v0 = getCachedStringFromWasm0(arg1, arg2); + const ret = arg0.createComment(v0); + return ret; + }; + imports.wbg.__wbg_createDocumentFragment_08df3891d3e00ee8 = function(arg0) { + const ret = arg0.createDocumentFragment(); + return ret; + }; + imports.wbg.__wbg_createElement_4909dfa2011f2abe = function() { return handleError(function (arg0, arg1, arg2) { + var v0 = getCachedStringFromWasm0(arg1, arg2); + const ret = arg0.createElement(v0); + return ret; + }, arguments) }; + imports.wbg.__wbg_createTextNode_c71a51271fadf515 = function(arg0, arg1, arg2) { + var v0 = getCachedStringFromWasm0(arg1, arg2); + const ret = arg0.createTextNode(v0); + return ret; + }; + imports.wbg.__wbg_document_7d29d139bd619045 = function(arg0) { + const ret = arg0.document; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_enqueue_452bc2343d1c2ff9 = function() { return handleError(function (arg0, arg1) { + arg0.enqueue(arg1); + }, arguments) }; + imports.wbg.__wbg_error_7534b8e9a36f1ab4 = function(arg0, arg1) { + var v0 = getCachedStringFromWasm0(arg0, arg1); + if (arg0 !== 0) { wasm.__wbindgen_free(arg0, arg1, 1); } + console.error(v0); + }; + imports.wbg.__wbg_instanceof_Window_12d20d558ef92592 = function(arg0) { + let result; + try { + result = arg0 instanceof Window; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_is_8346b6c36feaf71a = function(arg0, arg1) { + const ret = Object.is(arg0, arg1); + return ret; + }; + imports.wbg.__wbg_length_6bb7e81f9d7713e4 = function(arg0) { + const ret = arg0.length; + return ret; + }; + imports.wbg.__wbg_length_e7f4a6e30ea139e7 = function(arg0) { + const ret = arg0.length; + return ret; + }; + imports.wbg.__wbg_log_0cc1b7768397bcfe = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + var v0 = getCachedStringFromWasm0(arg0, arg1); + if (arg0 !== 0) { wasm.__wbindgen_free(arg0, arg1, 1); } + var v1 = getCachedStringFromWasm0(arg2, arg3); + var v2 = getCachedStringFromWasm0(arg4, arg5); + var v3 = getCachedStringFromWasm0(arg6, arg7); + console.log(v0, v1, v2, v3); + }; + imports.wbg.__wbg_log_6c7b5f4f00b8ce3f = function(arg0) { + console.log(arg0); + }; + imports.wbg.__wbg_log_cb9e190acc5753fb = function(arg0, arg1) { + var v0 = getCachedStringFromWasm0(arg0, arg1); + if (arg0 !== 0) { wasm.__wbindgen_free(arg0, arg1, 1); } + console.log(v0); + }; + imports.wbg.__wbg_mark_7438147ce31e9d4b = function(arg0, arg1) { + var v0 = getCachedStringFromWasm0(arg0, arg1); + performance.mark(v0); + }; + imports.wbg.__wbg_mark_cd609a6d46114f36 = function(arg0, arg1) { + var v0 = getCachedStringFromWasm0(arg0, arg1); + window.performance.mark(v0); + }; + imports.wbg.__wbg_measure_fb7825c11612c823 = function() { return handleError(function (arg0, arg1, arg2, arg3) { + var v0 = getCachedStringFromWasm0(arg0, arg1); + if (arg0 !== 0) { wasm.__wbindgen_free(arg0, arg1, 1); } + var v1 = getCachedStringFromWasm0(arg2, arg3); + if (arg2 !== 0) { wasm.__wbindgen_free(arg2, arg3, 1); } + performance.measure(v0, v1); + }, arguments) }; + imports.wbg.__wbg_namespaceURI_020a81e6d28c2c96 = function(arg0, arg1) { + const ret = arg1.namespaceURI; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_new_2e3c58a15f39f5f9 = function(arg0, arg1) { + try { + var state0 = {a: arg0, b: arg1}; + var cb0 = (arg0, arg1) => { + const a = state0.a; + state0.a = 0; + try { + return __wbg_adapter_109(a, state0.b, arg0, arg1); + } finally { + state0.a = a; + } + }; + const ret = new Promise(cb0); + return ret; + } finally { + state0.a = state0.b = 0; + } + }; + imports.wbg.__wbg_new_8a6f238a6ece86ea = function() { + const ret = new Error(); + return ret; + }; + imports.wbg.__wbg_new_da9dc54c5db29dfa = function(arg0, arg1) { + var v0 = getCachedStringFromWasm0(arg0, arg1); + const ret = new Error(v0); + return ret; + }; + imports.wbg.__wbg_newnoargs_254190557c45b4ec = function(arg0, arg1) { + var v0 = getCachedStringFromWasm0(arg0, arg1); + const ret = new Function(v0); + return ret; + }; + imports.wbg.__wbg_newwithbyteoffsetandlength_e8f53910b4d42b45 = function(arg0, arg1, arg2) { + const ret = new Uint8Array(arg0, arg1 >>> 0, arg2 >>> 0); + return ret; + }; + imports.wbg.__wbg_nextSibling_1fb03516719cac0f = function(arg0) { + const ret = arg0.nextSibling; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_outerHTML_5fe297cb1fc146f2 = function(arg0, arg1) { + const ret = arg1.outerHTML; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_queueMicrotask_25d0739ac89e8c88 = function(arg0) { + queueMicrotask(arg0); + }; + imports.wbg.__wbg_queueMicrotask_4488407636f5bf24 = function(arg0) { + const ret = arg0.queueMicrotask; + return ret; + }; + imports.wbg.__wbg_removeAttribute_cf35412842be6ae4 = function() { return handleError(function (arg0, arg1, arg2) { + var v0 = getCachedStringFromWasm0(arg1, arg2); + arg0.removeAttribute(v0); + }, arguments) }; + imports.wbg.__wbg_resolve_4055c623acdd6a1b = function(arg0) { + const ret = Promise.resolve(arg0); + return ret; + }; + imports.wbg.__wbg_respond_6c2c4e20ef85138e = function() { return handleError(function (arg0, arg1) { + arg0.respond(arg1 >>> 0); + }, arguments) }; + imports.wbg.__wbg_setAttribute_d1baf9023ad5696f = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { + var v0 = getCachedStringFromWasm0(arg1, arg2); + var v1 = getCachedStringFromWasm0(arg3, arg4); + arg0.setAttribute(v0, v1); + }, arguments) }; + imports.wbg.__wbg_set_1353b2a5e96bc48c = function(arg0, arg1, arg2) { + arg0.set(getArrayU8FromWasm0(arg1, arg2)); + }; + imports.wbg.__wbg_setinnerHTML_34e240d6b8e8260c = function(arg0, arg1, arg2) { + var v0 = getCachedStringFromWasm0(arg1, arg2); + arg0.innerHTML = v0; + }; + imports.wbg.__wbg_settextContent_b55fe2f5f1399466 = function(arg0, arg1, arg2) { + var v0 = getCachedStringFromWasm0(arg1, arg2); + arg0.textContent = v0; + }; + imports.wbg.__wbg_stack_0ed75d68575b0f3c = function(arg0, arg1) { + const ret = arg1.stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_static_accessor_GLOBAL_8921f820c2ce3f12 = function() { + const ret = typeof global === 'undefined' ? null : global; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_static_accessor_GLOBAL_THIS_f0a4409105898184 = function() { + const ret = typeof globalThis === 'undefined' ? null : globalThis; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_static_accessor_SELF_995b214ae681ff99 = function() { + const ret = typeof self === 'undefined' ? null : self; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_static_accessor_WINDOW_cde3890479c675ea = function() { + const ret = typeof window === 'undefined' ? null : window; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_then_e22500defe16819f = function(arg0, arg1) { + const ret = arg0.then(arg1); + return ret; + }; + imports.wbg.__wbg_view_91cc97d57ab30530 = function(arg0) { + const ret = arg0.view; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }; + imports.wbg.__wbg_warn_e2ada06313f92f09 = function(arg0) { + console.warn(arg0); + }; + imports.wbg.__wbg_wbindgencbdrop_eb10308566512b88 = function(arg0) { + const obj = arg0.original; + if (obj.cnt-- == 1) { + obj.a = 0; + return true; + } + const ret = false; + return ret; + }; + imports.wbg.__wbg_wbindgendebugstring_99ef257a3ddda34d = function(arg0, arg1) { + const ret = debugString(arg1); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_wbindgenisfunction_8cee7dce3725ae74 = function(arg0) { + const ret = typeof(arg0) === 'function'; + return ret; + }; + imports.wbg.__wbg_wbindgenisundefined_c4b71d073b92f3c5 = function(arg0) { + const ret = arg0 === undefined; + return ret; + }; + imports.wbg.__wbg_wbindgenthrow_451ec1a8469d7eb6 = function(arg0, arg1) { + var v0 = getCachedStringFromWasm0(arg0, arg1); + throw new Error(v0); + }; + imports.wbg.__wbindgen_cast_7e9c58eeb11b0a6f = function(arg0, arg1) { + var v0 = getCachedStringFromWasm0(arg0, arg1); + // Cast intrinsic for `Ref(CachedString) -> Externref`. + const ret = v0; + return ret; + }; + imports.wbg.__wbindgen_cast_9843a8e5ee4f8c29 = function(arg0, arg1) { + // Cast intrinsic for `Closure(Closure { dtor_idx: 249, function: Function { arguments: [Externref], shim_idx: 251, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, 249, __wbg_adapter_8); + return ret; + }; + imports.wbg.__wbindgen_init_externref_table = function() { + const table = wasm.__wbindgen_export_2; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined') { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined') { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('control-center-ui_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/control-center-ui/dist/control-center-ui-d1956c1b430684b9_bg.wasm b/control-center-ui/dist/control-center-ui-d1956c1b430684b9_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..f2ec904fc02e20e51164abd188318f72b81f0e07 GIT binary patch literal 1622619 zcmdqK3!Ge2y8m7KQoE}9k}gT7B|3?RVA7x9N{Gr3GcJu7l$SihbFw^`9F^Tv4?ucC-{fJ$8q`?d#Har zG(I5e^Emf8_R!#X(e+7&I~;dtND87mK#h;b9hwvwdVC}!as(*(6G*9;1g&reF`Xwu z?Nd1Ic7!7nCyzVsxLEvgu%ZkpDp$fCV5IKj^19`D|B=`KSXc7cd}^#KGM0lcDSS{k zaH8}{A}k0(UYzG@J5IGFk4F=ibkf7)omh8()j!^e9Vg%mJJvh)P!BQQSdk>kAFDQxb^7xOCCNca-!)^bI5{OF7%PfCy|MmB zef9~CZvJ!Ss8M{5I-+U(VWV1F8>&Y(HMG_>)YR0q*ES^5J93Put8J{Q8`08MThlhO zwXQkl7?hXM)->U$@ol5pn@2PbuWzZTX{Z_A(m1>}Q6@3F#7u{e{qv}n=8x6OK2NEe(d;B6s&7*Y#Z5B+t6Oq z)La*9l9w^2?dVaBO%3hCYx!(zX=`j~Yf1#&WK5XY)NbBMq^{ow!Xwh8VUfYrw zE|y_&HKWJCG^V9(Z2PF+j~>%H_UKVH!&`?}x7OD;wzZEOUO#ep;wNI?HD+%e+j7(q zZDS^m8qqp@WNS_B$mZ4t+E`Z~bLGw4Jht_iQH_nmhqpA<*S9p+j;O6}&C3}Q%V`(BBP??1lj&-pT~?X`^~Yg%jD zs;k@D8WXOcdx+of@HWRYAGN;Z4nLvG}3g#UIl4w~7BUwzX|k%ZQq$ z`kLV*YTBDx+v{uUW8T3r@0g||+9n*?)YA5^zddkN_3-MZ#+tT<*5QpU!&^o+#AeNN zPH3Ardd!%%@dq4o(62_-*0l|$Q^KA9)ZNo>7Xlbr# zZ>g!HS7U*@#cbo-ju`vbw%o*t<3~4BVpL0eZGBzM@W#5~&20@$ZFRBCuG+geTWgw| z+DBFouWf3rZy4Fop7@z+9~g^mZfhTlFOO^*iE8a_%}vAG>zeA@68nj#o2xdojA*WJ zuWPTaZf;~)v?ul!L%zF@ZW=#kRNL^T)~4!)+L~J2roDP(%#p9A>BuA7#M%A~})wK+7YiStKG_ra`?eMs7t75(}bk*-h zHy=KF%%4Zqv^Q7R*4H$Qs2SPP)Kc9Zdttt3>4S;z{&eh^iSpRydKtLAz8$X}S=Z1I zTP!a$R`91%VN~OYriPZ5>ZZ2ln%dzl)eVWCOUrzBwH!WnOq=tR5zGt?%{7f!wPs{v zLv0Twn~xdW{M)v1N3~6uI0_lH4b3fWElqe!b?t~)$^0-!-UNEHr3LFXRM*$GwbeE? z)b}v&Uq>^}N7l5oj2zKgKccC*7PjhGNPbEhk5`Vxz704czE<7V-dJB#+t`-KN%I~x zwc_8*TQwtFTZY%RjjV}l%FAgRgT_a-jjF33-b{8~ZEH=-@b>nRu{-4Z^6<7Xf1dc4 zQEemel!mt2>b52f+Lmus-ts#r@kxea)xLHeMV_fOi^VZch zHr7>-XkfytZ*Cu67n`-)jMv(P?)7yo^{vfJLG4Y6;%?o;lsIN=)A&D6pw2obruzC3 zEp_$Hb!{y%Ti#<^nhrmFR84JNO?6WfvvYMjuMu%ScjsuTufySo*Ecmb)VH*^HYN^K zRsCZ>96e!FV=W%g(1NOMP3;&qvA^=W={mfvwxzzYsiwZYb|juRGFGCi*Tx?HSFDYe zEe(v%me$sWrkdus#d$p@{-sT0Yj}Nib!%IDTTMe_&B*px)8Vlm%-<77w~T6PX=$4< zfhFVTzdCr|+^BjXbJsd&e#et+P<{OsW0v!J#y6Ia)b7|DpOXAN?-d_$SMdW|E8*R(ed zuf}7UPHKk7WoimT{OF@cPy9>sF%wyr+8M`9V_FMt*VtZPOM{y0TABJ-cid7@n9YuA zZ*LnvsFjFUaYw#`or0t4MmE(q*Edu*R#!74H8#h5c~_tXcw2pK^Kje}i?W_s4qW(IrL{vmGU zsL^9aPaMU}+%|s9__p>@6Pub3Z%ZUPM{%C3rHQ$7MB7LPP#ZF9nycCBbQ|p5*+w?j z)iyP@)wi|PwX+&)oUI@F?9h_3vfg?n!_qQdVaWNwOePG&bb0S|x+Kh$gab>$u-v`E zACg^CmQH6fWfc{fm{<;5KfMy=C7Db~NhXomb=UImrqg@uu}7vnnapIfdB*rqmMQa8 zWl8T+2~%B}Olf(hG+CCZ$?z&EK?^BT(mSjv*=eT?ie*bmp_jl@R+cF#E7@a@tnz#J zPM4GkbN&YcO zCc`_EDJri-<#Yx^@Dc^hO4DeT=A$g#8x70CbV)KvW?8xnTR=^do0k6ZOS1DXRHuz4 z-z_W8&>UKVx+Si%k~HPiEg?MaRZ*GA?4C*PzPp%`N%5xlpknbQOG1uisFT^HEG$Eb zGH6iB(hZWx5qrC~my+g%;^~sz%hI8$=>94zDkZyjNlBIxd5uvqU8aV+kDb+a6yQTb z(v(K`T{+*iBwdjysleFk*$h@l%0`(IZ|5kYt9d&D<$EVfsE2COA(G0|o`mW}a|TFX ztc<3iNPX49WLc>U!z+_S`*b5(Qh)qP_Q}FqlFsr%b3SyI&En6cQZGbWHk*`}m-NnL zBBki2KGcmVGJP^-4e2CRtBtOTH0~w0~Lx?_GNj-nF-t zx6+5{GS8C*i!wAUo88?F0W3vlhm1pB={ou&mIU99ud=i>N2SgV$MtY*w37lQB?%hz zU0DRlYDh={Mun3Tf1;_JpBKGXg5A@lrJ-|R%&*tLkiMX_>-JvwW3OK6UiAFHGWt;x z(-|fsH+-3ul0`+C-DB^OE4krEx4F8UQ^Z=Rd!2O)9VhF=3KiN&O2tFhx!H6!6JmEH z;uh*h{o`$DfJAj(dVn_|GXNIMkxb$(>Xl@AH}R(XtMhotS}M@_VzB9)xhkFZqyTfB z#|VN^(-DT#_+~)i%FHUsGMSnJsGWavh%$u@)Hj59? z&SYi}`3J*3Hi-1%RZ2=)gg9!5`spOrl>4AH15yphYn^fKUXo@&XS|rEF^6BuI7zCb z;j#f`IG`%Z%HACFA{;ILh#TWfNUM@w*N{dO#XCi)1Dr9Xt;FGB&Jg7Y(xgGlXn}ZK zA5grMF6x66tl6g|(+7{z>=33$mZV1vW3FY;qY@2PAN9d?c+se^Y#_70=3DBZ0B0^o z{g8>Rpr-1@D56)?=?o%1dNboVCzLw$RIF=RI-7PAGQz06 zU-5EHR|T#f$)v_?5xpXNB;}20E@7ov=I^-0E{kTBXG#XSsTv;auW3Lw;3ai3>52-? z5EOz?QIW3rK2FFG5?kCldeQYZ$=+pn6~0vJ8derEkEt+yAyK${BJ2ZmT1zz+4$Crq zl4QzYC8D7~GysiDC5E?N$WF?=^@@F_vf%;Xg7Y4G&qBpizIwAd}mnxzvk? z7E=^X9BYitOKBkGn7J?&%!nY#OA8J?FGGv!%-#zQnZqq_FfxO=WJ#|wdTdxcRcKLk zx@bm;djW#eTe4M~()yPVg}pr~=7=-|c^EPsIiJmBw8_!BEicI=E5eeB45o*rzNDmr z$tIii=#SVXn9X#O?3MPsEN#yW=+%q0K(yVcsuvbT$nN|VUQ$3EqEROAXCC5I(-c*( ze{j0eUUiBak4{U?Ejp1DvM`)-HE=0WW(?Dj>)-(-)l2A`cSd)RZ{l^bO-VAtKwyq^ zqQrrK(X|>r7D* zVqD$vGAbHP?o@{?ox2fENzM{lF(gPdwMO%ke3YbwyO(PTTnta~${)i>n~Sa&)pR9# zoH5uKhq1#tN5Bu*x#&eRWz%#CYHI;Vrw3_$bUwh?*C~3$GlC2%3wFLpe~VYXG@S7g zry|`-;%!W?yD3*n_h^H2jqXkHNR(viBR9w7Ga^j`$)ZTZn=|dVNXs%vj>oO`Q{s-@ zM`!X1+UwCXvc9Gv8ml3vzSp$KJm_c)8Wl(;6K=qV5kh#CM9MC_pvFvm#@(PCrvxAI zA6fDCMpcO0si=zz?P+wBW!#G)D)o3dMk?01D}ZNEPA<^Z-DFEveylhJ<4kt{yqqdg z9k$Cae@^eZI$4EE^ya^hl&GvMsPN6l!Xnp$Bkw6aXkV9z$M4tWd|R4YLl-%A_4v1~ z`P<6x;-exGUnjqd_SNd8UsryYw0K9Pw5}e)-mbUQ1DX!w7oEy}pxfY}pFO#}{^M83 zn9ZNDr5xk7M&mIY-d9{%k@0bKSf$~>LqEvs_q)hnl;%;uzX;w(pp|Ir@M4yo6HkoUOGq}c=VCTk}e(M zdF)2K-X+7GV|2EK6WQIpk|}yI$^64XyDI#ND}RK0KA*lmypj@6q#a)>FDd#jb<@NS zHk0$CLF^T=Yv7Xk`4Cr?;_)j?gvI`m-ig79!PvwkFBy1=K2e6}*ttoQmM4l+k0dLj zBY0pm{un=zbCni3t43B6UJtlGCkobL(@?c$L0<{d~Ayz`~Bsp zF^Bzb^xxYO*OUzU#uBlP9}oHFN{>A1@WT@;hV1%{B3jhm!xLZh&foj($v9#3n8V_h z-PpU|*JK?%e)Pn)#N9)_F3&x-Nt`qE>++hK$70-jhU6ca?jX6FL8q4W|JqE~u9ZV7 zzcw@9rb~O5>rQa~CTQE=#*CUUktcbH*HSx=+VS4%D4uqVZAr{2>(isik*GOpxaXC1 zqq>fsxzkSFNJqq_AB=i;Bl7sx$viXq8kr4VqQ4BpQ}W^UHQltC@R!j?B;Fp2@H64Gsxzx5m(3eIFY|cxp?}HXnf{7i@0VO)PAtE$@5TMz$egzG1?6{U?(K7R zdS#zQ>2oXY?R#D7!M>N5U0m{9uP6I0?tMqEP35okpFQ}^vMY+$W}oe~rEGKAO~p@V zpUOU&JvY5>mzCk&{ijD~4V_!DIWxOr%Al+4iP_TzZRiq6Tb-Q}&!!+oFX zyFNQBd2z*@iYNQ7?t4kad4oRbJ+I>J%&lcp%jfr9)bE}0H~YTPcXQtj$w&LI?*Bml z2m3$V|DpbORV}DkSaC(g1LcqOzpUcML8oM&&OB23Z0gF26;*S~?=N3fzP|6;^7$3# zm%Z8VhC#o0vi#lhRaKW)Y|XsX_kpU@`#jX=jNrMx&-A^-Ke6Pxew+F}+jm{xi*~+X z=a;fC_C39LhBv+VOmAB8x!!5Tmw0CsKj?i}{#fuq`SQ%i${!CtD!(9kYWdZD zm-PFjd~)B{`@Yt9Uio{ODShAR`%cy3ipzJtV&}`s@6OCGzbCV<&uQ6b`b^6{-Di6C z**@2#pXzgM`sL(DeJ2lox9^9UGlpJYaqG@k?R;Iuhr6EK@0H%K`8V`hw#zMjH&?DN z`^mD>m;LL@ZYaC4Y)RRY%xlH37f(*Fj!sFRoIWG^JauAvYWj=Rr1Yujhm$9yzf7H! zo|4|2ym{xv<@aV@>2rO0W1kz+d*58~RIi&VCRZ%2xMJ`lmCMY6!O!%cU3GEQZRX0s zR}H>;@CB6%2cNw2?PgBtZ520~bNbBadw0<}gQr!z*=Je*i-X(y&k1fYGy7a`&h4|J z=!Su(R7|ayWnU>jZRn{(H-?*gUpH{^z=wx!Fw1v(yU((U#nB@}Zys{vkTpY>47qdX z+oDH@-ZbR;fsYJ%c*yjj7gtUj`qPL&d_s*oL(_=$Qczk4qQ6q{C;;v zj}Luf=-Q!A4}EIryF<<#I%DWYv%J@BWtZ?Aj4x2Su z3EwH#&-R9~cZcm``Y5B^l$)KX$Mlkv4U)0}DgDr^Z*GQfD<4=N9{R7(Bx|>>g$hvwMgA zjuiMVr0;gv@0st3w5QoqT7KVr$9zB5@&_tc4O4Z8tuZy`2OV~}%GE-u?XY#GPNaHM zFAZOb%y9EcL1VZ!O683Z7W=tjwt+-LhaF)?*haNrB!8Yc7JF;H~X8PA7l^6dGd^k0#IHN-Z_ID(Z*%iQ`#aLV>#&EIL+rnr-zTat&^<|HKWX-+0&{L#ktTnk=@kb&*l2GI2YJvlFcp|7Uz81LbAmrgJP`F zO0v}@{bFp;MzYN%y<)7;PO@D|8aj-F{WF9=(+hrV_P>z)OM|~5$ZhfMXcD74YzLlu z7^jCd_!}Mla1w`i*dxplb_}Oupu4W2$XMz)(u_4n?r+CY`*;+Z!2d)u&P*I=^&M}HGshofCwa)9?3qcPne2_TCwS%rj|#F2hT0Q7%AM%#l{i1|cT+@| z;^BFD!bu{W1Yv!iaIy#|L)e=4%~M1;1;PjN&Z$aGCAB5iG_nrEh?&FP+N@#)ei_SG}Qf2L>7@XVQ>{B?$h8PD>}49}e9;j=S5d$udp-EYm= zUJtjOA%%k6tk9k#jn45p>`c$h^z6A_?t{RdC*pY!&-cvvo}J~Hb3HT5%lj~;UXu^M zrYS4TZ42xL;=cg?3q5n8XD{+%N1pBFW`y=)WnN6?9M8=0>?NML$TPD&bBQO9ru1Af z%!Of|XXbhKQZIJv%RFxI88}@4iBWD`JB4?*$?(hzZWa z7mBbjCOFTyQiLlV!THA4z+NTNRgh-o`}ArNu72 z_c|r7BX_Z97JK%3C9fxUyX$a@-=O}w(K9!A=0=%~XO?=E_EzQH=9ybPa~pZL$8K@Ea|>iHQ!UG=^bXJ5;n_Qtypu{Nv91oI9ri9! z?t-!{KO&Zku-p+`ySIgQg*3U_Gb=oEH=cNps$A)rdpxs}D)05oy{@{o&oN`(=b8Jw z>`Nu~e#yB%9wO%lc9oK=P~-v6JmA>}J@cTKeRF5~ke55&uJ+7Bo>}cpun$Z2Bc6HK zGmjwqQO`WuC3}rztU2_T8VnnGiyEb zB%+@3%u`*Wo|dSm5w%gG)_G=KUeq(nc!rGC0f+1d);{ayW(W2;(Vs*A^`2Sp+2=iG z)E7MSyl0;E%nM%j>hj!H-@YiW7vb9AnGK$O$rXKB#Frty;+a=GyU{Z*dB`>!z3ilN zO+(IbuZrtcD&8WEUh~Xrd5vE8ati~yN!gna@`h*L@a&tO;r+Uooz{z;z-CXCZxPED zSl;ps@6DXO?aIERjCV+G^$c%iyz7~Fy*+}2eLXU7BSPV9e(V|E%Gl&}WIwmcwrx$ zIoAn#D>7&M=B+~8(f@6={cQ-VoYeDF_&kc7@0;^|J4?w~K3k1qS>XaDFCh0q-(2Y1 ziG+(j;Twvw~Sz1TMw`*x0R=J?rL%IqbgUjo}gH{cf*+qph2IM2t{m->eHJm1Xq zEA3^X%=gV@zM1cjvzPlUxtIGaK$=S^c7+68fuP03xwKv2b8Z$;-$LK;zQWI*R;2#B zQfyb!e{AVc`YI)_g6(SGTK3>y)~V z)U#2%^;j&zVv29e6RsEGdI;O|gd0S-0m8;qT;xU(Zd8paBrZ{E38@V!HETo4-Xv?> z?3bF+Vty+u}7>YH19vlJ`bDl6P7E5yt2ZQ{P&H@Erbc3;czGM{Pv4&N;E%^g0= z@G{@tNtvF1=1#xIGQ120mZWm)QuZ$Ca~I}W?wjSlUE$}Jr0m@y-VN~{-`wNdmA+Zw zo0Wck8K%@ba+`N>n>DH2(v-bd{P)6tpKtE-?frhd4C7O4QuYC5K0xM!zIo8M5BcVP z->mY@L%x<_O0O2fY8W2&&BMNZ#E+NZM}6~%Zyu#v;|=B-v8_Sz#i@81eoTbNVuD+S z9~a^AnBbP-Cq#H6Cb(sItq5ylf?I~46yZrnaNfB%WuFr1DM*WwaR)vv!qX78M!7{v zyH3ep7HIoNHh0_IV|rS6SEH6n{be^`dWH@Xd?<{&s`< z^Ck89%ldf5HyeEO3LU@EH!u0-W#4RMXuPVt*L?G;Z(bwsb=Se>b>|ky+@xAIQRy4L zdBeAFD*2{VDpa~zl+94Kq~eX~77?~Mf@}AdlzmH@yv_9Bo44`9cU0w8-@N0StyKB0 zZ{AgP+Md3r!tXIEp3Yn7eG%SA+NS&<_&|gYBtB30P=pU5Y|oF1k3{$g!lX3Seyr5T zq_#PYx25bhY4eG1w)y50wE0xpeCC@^ee)UGY>y4Fy=z>2F8(ik^SN)naO2`j*?Cf6 zzVywcfN}AqZzl&mM}@zSnH=;O7hj^nlvHkE%AOFQ(Fp-Feqc@v?35rkC1p<%@g#^R z2j=9!o)VZTfjK3}j|)m|)wtNoxR{&DO-?h;#v@b@^VuP=pI1 zY>0B}lJ+7cFGAhffni5;v62^)yV2#&QF0Esmjvb#w%$t4C3hFW1Kvfw?R&R|Mnig22oV%;kYu5LDWQ%DXZ!3j=c{c~`j(Hdh6j zE|Gb)YPp(97X@ZfV6Rc~8Y-P$sPtMVq5||~fx>eeq-V~Ud0&P!kmYkadH$^y8~@c?~$mLfw?CzD-m^XVD9Y_b)Q7thp5#Ob$?*)&x=~6j8$Z;k2q+1 z`T#zgv=55@Ao@QPn1=$pI$(SHaA4TPJ`k9P18q+iC+#ERdIYXV1M_HLxoV;4V!I;jN6<1M|8Q^j>5(2If5{C~Y@6L2rov4Y=M6 z4DU^xZFYjTC}RuBw*tdk8E*&XZ71mc$ZQVG`x2z>DQ*8ibIJ!07IS08v+tw3HKK~dsb+8&j`(#VWmA=lygFJc4*EC$Jv=7%g4+xzdfbcxe|0Pf>vpJdS1x6 zIgk3z4-M~g!~FJime^*6ZcB;M7btlFY!`;+!q8r%m1xj3|Q zl$=BMh73AhqSPgbdQqvlO3fwpLMGm~%oAZA%#(^@!lfcy3Sml~aG3~~LD-rn%okxk zgb#|4c)3!SliE_GNqS3>y+Wp05SlAOvmiXkE|f{G49&vOT!~4pl1Z+TN#ecg)#6?h znyW*zDAZo{nvgmE+R$7RnrlPWG&r@^LS{U2+fm>lc$vT zbZDLm&C}$qa~*8fIk!OOGpgkoDt$II&xZCnC7+|xNv=&WtQTdynotz4$$gytoxd^t2Pt2*sfUs2&#G)D3k+9<+Cq;1U)lUGG} z6~YI3!fPVD24QM(Y}D69cpbuYEl!)1+C*xK(`HJseM8#38Jagj^CsGCmNwjH-5i=N zX!BNVfVaBF#oOY4Cp2$|<{dXKw#v@$hGuJM-qpC+8rt{1IxgPpIWD$Jp`zU4BKy8H zdLNU15SkA{`(c=yUSvNK@gs;IGo^-hTWCHE&9=h0pwy=t7oRdN78d1ZFigb%3H+ai z=F`xAmLC_}c~($lKUe1GWPZVv9ojEL^I2%Pv-qVO7nGjF4L>s}$t<5VlbPj{@whmV zxt=@O$-=mpBDN_>Oq(AUCy8)UOmO4kWD!n|32t1RBEl&#!HtWlB20}5Zd{xy!l{nn zdSq&mJx!$3AZ^I^`ZN)yLD-bZZAjbcN=`@J)05`(q&-8)GsxZIa?e!qOmb&%i-mjK zN}fgTOedb=XD8{ebCTw4Hr~no?M&S`I5$bJpQn%W*?qH{PL8v)SPICFfA-tU{%ih;j*(8O8Cqm@C3uM{qnd zitRjUaw)Su^L+9kdzq@7&lJz3PL-E4o4e|kX|H+(H&c?@t1gh71xYtVUQFACN-ji^ zE4hu5v{!NWB&ogX)k*fMi`Y+d|0FrVUL)DpvY%!HjqK~#Hh0NhEE$VYZM{a!_1qz0 z{aD6c^#(HbWGvbnxkM>aL``$wq$N&+TJeu?dZRZThrVcNwQbHlS!M2otx81?Nyhi?Oo!!3$Eqdj!xPY zuISw&-VN~{=H{eb$sDdK%*tebuj&kUuek1|;tkU1KIY`SM)xOkThn%xvR5JG0j6HI z&TO2Sqm%Jo^`WFHUoDo^usobJydUE15m)w6Wjso94YxYtjK|nLvl&X*&m!{(dob;e z*sDJ71U(`CC*WVp?wNZZoIU9TJ*AANNIuQJInG$eT?;2@dt{zWn(a;y^RW~3toWaW z|2bx3=4Z~NxsJH8)v-EwCig6lI=D7$$Z;4IYDoT z{|)%x@ zIeX6udS4mull*{9be!=acQKrx$tm+5Q=J5_$9@5 zlI~JYjNc#GLxc8d!i^)B6A|Qprdj2q==d3q$s~vrP#^pr;{T#R@$qc5^-)$ zA>v_bWO$z(<@c(mitW_MZ7EUuG$l`iZ5lVEBRgHm=?Ga&XV1vk)0IA*>@y;BMr6;7 za$B@Fnh|LudzLcKBJ*tSK}YtS$ebCO8Id_B%FZv&txnjPk(n9oXU~PV@w7n>y=iz&@>$MlE)fYwP!pK}it7l8pY_&SKIBhRh z;fpCeCo*#)dr4$2iLzgmY6#C&)?C+2H#=qQJW0AVGV>yHDUvReq|2Nn%rIZ<^O1CU zWG;{F6_L3j%FcF@7AR{0l5qGB5_X}I3*o#nGFL|Ssz{BxTEwd%E{e>e$X*lWw#rP` zM!9>q;T+`_P9wEAGFL_Bn#f!mnd>66ILdy4d+o`6XnVbMyCE{yN9G1}yHUE`=yY3{ zv`Zv>3BqrR%uSKKIWjjFT6v4IZb7$aIoXrTN4r##ZjH>+$lQvg+a&2WCy5J_+r@r6 zl9okgS!C~s%pHYR-l?oRk@TFC^dOJSY#fH?BkJnG%|ep*>#ojz$YT}1Rl6n zRj!o>F6RNC$~;M#ry|5Yt<=+`)sMhFNF^@9obQzoZNBTJ?0<#-hJVUP2q9-PMY`d+$H|8s-h}dVbg9O=H(Ix zNS5)kmwCHT7^OSUsX0Dp<3$#?ZqU&?Y=u~hUGa48_+L0x5+;3E?#nNOaaCUSoNj{R z^H>n)oq|jRw>M6_NTSxbMcdOIP6s!=6dBH43#5_=XodwRJ& z4n_b@KGEXF{ywt9e#r82$9BNwTtG^oQoaJ0O6^Y@Ok`5O)W?B`S>oG^bH~eBDy`={ zrCVR}klMN2Fos}Nsj6h=L7P(7iKTLp(%kVK_($wds9lxHaWgk&^KyZd46V0s!VVU9 zDz_ch)Hs_eP~-lq_Y?aT9cKm~Tjl0}La*h?8u*<#Y1f}$mxHb8>96LfxE+jTvhtmj z43x_Eq^9j})Bxsu(TGNBvMDa^oS0}=sd|qdmv>C;FoPGU>q^yirRuuUc;Xty#1q?2 z*VJYF(_f}k-T!TDr%~?gSGA-4x^jB7psLeSvFCr)9`fq1x0ILr8XGd9#js!_Zi%xi%x)Wxj>qxmiNK z_f^|z{%|?}pSE3SGTbi+N`hkSfir4J(FC4x4jJ1oBZn-L{mL9Krc8^J&QIo59@Y$V zGm@IlwQkJ!;vK7_<+Rw?-dH_mW8?M}HfT9tY<)V})}?k}>zY))`3%97%LRz4DtA*( zU(I@&dQ4wa$|_RqR*_g+hB4vKVNSJk$^_|3bK1-FRw;s#`?%xI@!VM#>~&`ZsJTajhA{_qr|VBc_j|4yB#!L%R^$v5x{W3Te|-mj_2R`CE?L}t0j^#Cg(aG+AC7~$Ko3gTKg2t5 zt;g6jt$p0Vg9tUu>je!QJ|FRm6>N^wf8d*@gU&dgsU1hIbzlFUzuS>pi z#n+Xi(Q3T>rOE&KSA8@;e?v-FEW6q=*=<+ZZ72L*S1h|a+r^iFyUKQj9k;GnC_d0l z5d&3j;J2}1=kfWVW2Kn zwC(TO`g6;WWrJ&gZa0Uxg{E6v@eW`2J>2y|gm*=SiKZ++(NG;12bzC%mBVRiyk-od z4r-0K1H^%QG|J;Xfp+BV_uV~|!sh?r(m^G=5=+j_soXBH8gnYSp~4vIQtGSOJ#_wR z_J32_>n@xbwtH2>3aPhyqef58z!2WHfZJ%wgD+q1zf1L$^3TfYqP<(Qd(_Y~@1M$? zjgGlJbE~DQteKm>5WHejkt6?L<9I%UKQ1{_eC|7NEaks4d8}5>U z#LZP}zY|}Zv%g^j+F#r9lHBpqjl+a0cab^>9mu7;?j~z~KtgUyp`)pYG&frf!hYzb zIrQg_IR_$#b)`SIs6)5+U8(IVrMs+ejPTD+9$(4bejDaCq_`_jJjG!&o<{-PDNHo@ zhhQ~~Vp4l0e#dE=)AU}6-*PpZ;WQ(v$5nV_ilCYxySmEiMk5!8e=t6FVn_6)2j;lM zlei;!f;N<8+&$@Mn6v;r++w(rGk)p33!SEoDEEjtUF+>a4$`{xXI0V4LAT)|f=V*p!B43&t1 z(nLf=ghh-93`g2fM-2lx9k^Fwv(Gs`Vg~J%coV$mXLl!nFGprqVnzs_R8oZuxAyZ% zOVSd(lTUIl%v2FP6d;F?X zk-G;R-!Xfb?_?MEv)|1n!7+c=e2sQ{$kc#xHp2lqSDRXerbT-&0V`63Cz;q`15lL!>~m!59QN5ZB+N zf0FwX!xiMFd!U{p^YadSfH?rvb7T%AQp(YPLE;x3_Lt_DfSx1sEBHf+qev(Ad4GE_ zJ@9Kf=QsTS)*NhpI}S+mug!1F?<(yf(EimNV*YiU{WtZ3`8WJnRsJ4%zwfYrFn_TB z&gs8XWkK{GN&k_Uwt%rrOa4UiPfEI$Y!B>zP~U%=|1ke~ko_;jk23#dMvb$FnnUr4 z>}^AB69t;~O5BofX*0=Y+$-;zEhJkImru5mY{e{KaMc}cB-;qs38|x<^LCur=`|Hh zGqk^$KbyZCWJgnPhZ$`;#@WNnVchzPeerNOjxdLtBjk%?(0!~KW5(i(W9*RyA1oZr zkv)77wDZg$N2K{UY8}^M$D8p$oM#4LoFg-_1B~-g_OGCv|C;wjIEht?h*KiW*uhDU zCUta&{hRrlJtp?WzvmVQ;GHA$zdG!(=2-g=bBy`B`Ggmqq;@3T`yI2FQHKeyBq=s5!OOc;aU&H_D0V4j&lT<+;go=z@6 z=QBJZo(WYTm$+SgmEtqHznGf*FXA8AFPFUu11Z@V-TnV0;JmAdd z3(hPo5b9 za7L54!Z(|_-a&Srs=U-Q^8{xmhCz^K`PK#nfAJ7^zL$No#9l5rmwV2^Zvkha zy2Z7!a$Ds24|usMFvz(n zpObh<0A{es;F19)n}>~43T@43!Ka`D`+zD2{aIBBQXq| zEb?;;eY-~VH57CBWI>Z3_p)aW5j2@-1lZ>L(sr$qYheSS{G=yzG7$^pZuN5WefzYM zPm}AA$riA1w$Ge(nj8{5j(Yta1X_GuUb2nMoCA|D=h~ z4OtM(5g2A-Dm4}+`Cydeu`t=!cb%LdKk0-h15Y-*C;Qo%LU5nt%WNl$8j29=BwppuE|A_GV= zZ{e8%9G~q35!ZSq$Y3WZZO?In04Nj01($;;JJ|AhPSE+vIG+q4$h?JT27P>i6EugI zFu=vm&Ji#X-x3;2I2VK&tO?AfDtsaML^hNCfGOuTB`oMPXLmnh>B zl5>4f$Sz}^Ajt~3oJ$BU)O_17b%H=AM?jQ2?0mtLfiDvW<^)}#j4McjOy;c&#_mEV zXdaQb2+gudiSfI!eP-L(YJ{V+>$0TnecZtgdgG{&> zxwi;?EDZ8e2jIR{^jl$D>@L`W$lj(+`t3fZ26fEa;gKsrAw#)SIArj~2wIwAWUcTy2Uy%8xH0eL1pqgoV`f^qPy7FbU8&?s*gzTI%ap6+eF&NA z6=%=ejo{w&ie%#kJ*AsH6wZ71qAcu*gr3`ps-fKB~+Rqum zgNY0y<>0}N4n+7_#%jU>4u0AP9n5sdSX%GofDk4o4E`4!CU`w(FG|h^(KnEK$pL{y z2MqkO^Md(A;NpFGcY4Li*(m;vaDfr#{R(HVNzUt{zfNkCZ+MIThET%tZvw(!^N9)1 zdy`R2I6h2zsxC%_oSyH1tRRXb5XD5;@`VO`6$IZ#;AcM$gc)8X1HH}GNk>4#X@Q0# zFvG;t3Ns8sTNq-8D$a6!Im|B+fS6<2f*WS0r51465r|^841R8{Z-Ea-z=xT1eL%zZ zBPE3uUa0W)kCpnE?p~nOHl?C#=USfr*uamv*`s3IR!*{WT$fV+7m=P zC9=~*oW`@N=>ZsGL5NQiia5WWr_=)V5g>qeYQ+$E? zYoP$fW+6!AE7hM@sn4(0$09+EK@+p<4L}+LF9uRvX|Git=wT4W*O9l_bugG=ZSau^ zewc_|D!oC-Vd00Fh^cf{p;BHxC6qnJmF3e?u4)=KPv7LL3rb} z8WqcxT26{UTgL9{2-q>?0_2#l?U6R!0mtqN=iaVyai93X8s8_lvBt$J+4%tn27W-} zf;$=yesx?t*mGP6oV+%f+m;j*nJFEUt`-m(IC5^SgCH}LLo7g$K_{Cvg>gYC&@B<@ z7QXBSh>}Am6ATRh<9T#)JTBJq9f3)~keTAid`e(r3kVtXGDzj8-MFAMXk_Mk7@iRz z*#bm%Y9JUh+iY^d-;fKI znT3MfO@bubHXl;0!o{diow@7w~J0F;^Osq{kulm$*^rl-;kg-SmbauL^3F3p`N%&~Bo9Q2spAp$0G8|l3n0K_J9|*xf8TP{3|GacL<&s z$T6@ACupTIR+79o1U2k3?hAnnOJ!hs_W-%hxBY%6XqEU^!4F25_x+qb=mb5ajE6|B z4gm+d42KVvAW(h}V%kF6F(F7lE;t~}byC3)GyhWfQK5!~9p-KYPO~s2D*zW}wj~#| z@Z%vUVv!GKqW~Y~>mVF*_=N&O|0S`#ME|j+ zMCq56d>OS~2>}w@jY!DD>uZF;cvn$G&@ZV78 z8x&g4=5kL20~bcu%>oRA6CMX#7+trx@xMF-G7S4$$O0k!b||PYIN=zp1Vot4wNp-# z76>0-^8NB zo?Lo?7)CCrV35O~Aoo+r{nW{w%H0bU{tUU>g##8o`168>K!hVe!n%BuBrX@el%z=@ z*FrN1eCOmOk|sNZCzp38$bn8Ey6r>(h3ypKgYz1mq^y&G4{qj39io0~PfjA~6rgK@ z1dp>*C26W8#Sg(wP3kGwX+i^o{vBthi5&>YG=Y8h2kcAo3?Y62`;N1~e9ug(Xm(MV zVpnFUx*1gWTUGWuaKEqv@jXjG-*Mo5sq7qA8Mp9yaaSe<@|PkrQ68A@xk)|vyK$Ib zd3?Z=zTEQYuqsG}4gUZ17~_D9!}`Q1Aggnpf9?@vV| zlQd>;zr@gh98CL8;+04HaMPB{CTIn;Pu6#6AMB9Km3Lu%pvLH$WNrzMQ#;W$h-5n< zAso3-23=$R8M-Frwt-%Zu1OLB-vy*e<`zqGPasVy2GWR=tW=Dp5jsYXVqFRIb%>c{ z4(N28PsB(ZVjT$DV}e}Kfv#~d3pX6V5_`a+9kQ5^7wj*2)&lNf8EcxM+r73G!p zeqNBEhu7Y|39H~X!=qU}(Jsm(H1yc{ix_|riG@lW)S_6{KG_u4`-v%4bjHlh>w`&E zc5m*9dWL?BDaZXoOp4msk*OPtHHf4U+zQMc7lS4sI2euUumn^V5hLfC;-akKm&AOf zRH^v%qdTh7xeO1n3HV48ACg;l%c_K8z;fQiDnJ{6)p{65=3)Poh_M8nMoPyfMv&KT0NgTZW*!ySVd}mjJ3kA=!}jk^-fQ$RobM<>5jEZW82JuJmD`E z){1B8#3cx8MOn~L#1ZtsT9x4*L{b#t&kk$VOI{z39RZ|zgek^@Rc@is3qUPSIG!ir zf?B0x{Um~B?q8b8OLF*<7;1$|Ai2uOzcOVTu4UX=?@g= zzOmP+$q~kJ!{5a!7Q1*6Vh4!rC;{^2mEy`NRhB9#F3#n{Q)YKYwB!R=7IhNxAuh{0 z3HczHMOP8B(LGFNc7cFO-NSLdRFG0-w;-jS*~1FVUyU5X0ZZIy()>*5$0AQ7gb0+L zNH4AvcR+eMSLvL5iVI*bjV*l0WyC&&I}7h+j;&%9NT7JgfH&y^+2OtNIdtncV!~3tKY| zqXgiP$TFH~N@Oi9)tQ{f*XgHL;F#fxs_1|!ehd=;V0hRH6W}P(VJ0}RvZ~L1rKPN6 zU@9F9C&@N#hcyB*J9QX&jU;4Ecj6E}Wb z4&y;VP5A*#m{A@prdfs2s$lRE{WAa^kR;`TQzf7<{1}po+3OsIC2@$byWnOly3t4C z;8LH82MQtOp4sZ0Nw1G0q_n8^F_p0DaG0X2*lO`>1o_aaV#D$tM^F)X#Lt=P(n$~i zW>NtnN+{nQcrr*d#}d1HY{%}g`lW8#bhw(r%*l>B(dqx1MtU(JI+Uto)8tutpaEpl zZSw5(O_L{~VVXQk3X`Y9M09#wnL!MOZr$r9$n3Z6A(kyWNWJ1ZK;u|4$oyzzzm?LDFAu@QQD3aDcx_Ge{OEHWs`O@v!{}O60#V95S85q5F!o)3-PH zpl;AAojZf)p;dVgFBts4@o+s=`rl~q9X*c26vN~ zR==-$IFZHQZVvJ^Y&tz$=g#0I1rNuGV-IIBpeEbBX%k*v8Arlu z3WgTrf1LR-iwqO*Nw6I@`u2N~czgdfdlB1XFJk}i-ix^Xi>_j=cKi-|{?GR!-8G=A z^F_P%B2aqnM6`Z)?nLa@?L-7WQiQ91zo*ZEEC6gK*ga@5&YC_pQ$jCb_1t#tGQS!a zj-9*hD4BG+r&vRC)3x_h{P0(U+6Q%K{%Up)SzpcWQSpD5-D4{&SLyoWYJvqS;ryrY z)f4zn(YNs*jkK@d%y#BsP7rsET53adzCK{gO>i^fli_K_R|)q?exvc_x)$NMuWOhfC0Z_AKtZCD5j0 z&jkB~ait+ot_Vh-VtZoj=c|P^kD;{o?uptcD{bkTub>&;4ZDxG6=jx2Olu&gs z8i2b7u5Jea5GR)7GB6_y0EaFNfOEgBX8W4>4n>R!$W_xO*BbYYBJRUS2K&!q2Mvg? z7fo;Ep`cI#?0EM|=-Ur4D!*1Ky8;i;4l;%Z2x#sE#NRaInnhvm7MRY>EVsoJqA8KN zEwYscFxdnY=(=Kg6ypPwy}ppWV0Zt#;P}0`YiRjKvWR}=zT#m30#ZYeYk1f-fCG|; zaX`@bOo(Ho1QDp^sR+iAWs7p)i=lGkg>UKr43N@Qx5@3ror#oT-5O$m-3;Nv#K}5@ z13vf%4v74ZoY57PVJ6+l?8Fb0rA%*t0J)Vy ze#xx%uf+HpQ+JT9htgo`O~W`lqR?c2A2WhRyGH#gF4zd$NPfA@{is>W?A74^I=3ca ze+W|{@SoEkD;P@OV6``iy*v1Mv!B>~I3?PDx`SH%+U88om;>#;$onZ%=1<4jpP8S< z1~CNlr_6pGc7L@VQ_MQoE_#x{|jzb2kP zrFi}W;+E4X2e_6WU=Jb#zvaoZbGA)7^3!EJJ2w2-S<3uNhdtOF%#WC*%&&QF9mLiD zhU9Mq>A>NB%lU8jO7Kv(A3%VV`JICI={mXZA%YO(Hu!)7Qs!Sf_(`*Wv%iP$59I$l zW&db?&*Z8fF+0foF-!P0%EJ98tPqF&EAanMl|2Ig)f)=_rz3{>8-3fP<0juWQ$OD|X1(VUMa*29%0 zG`2%!mwWaw=pEQB$?-6TijJhG=F>bWap@V7MgC0PnZlHZ=N1Ma5mM%e4t`5*jDA*a ztgNo#eq;w2gK;8(F>pbz0l%zvQJ|-zsXb(ELVQw$`0zcm>b42FH9jbWR33$3CUo#S zYluG@Qj9kc=@@g2WDyMXSAv1^vf!E{S#uz)QJ~r1b6b5738_3H!Ti0${zKxAgA`*C zL}GrJNFLeMq$P*ke1W=x*%Z?P8SS;xGi!Cp!OBh#QCMc2(C-gmaZZ-1BSEQPa=Um zNC7|~l*^$HlmP-^rfdIY1a$!da3%Zc2iMl|g|*`E{J}MF3xo!^HeR5N3rJq5UsiJ& z4x7LZL+}K~lJE(7CV#OLG)Me%;0JxcTR*!t*9n@ZjCmw4bw8`7jLQT?Q2)*k%v^v7 z>Jr*A-wC>0{FlRZg$ED;l!CAbvd=W$)w79W1IzfOG zQot1WmPPklX*Y7lkEmfz!p&2}obx*mLLKlsYaK!)-0E~Boa|;m75T>A<^%ywNP$ow z7{CR%-^SS;PSBmoxRc~v4uznM<(^sY1TEy(A;4u68cVfTs
ASA4xU4du^Ur2#o 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∾ANw~hK-s3uHfZpe~qc&WkWjdj;1!y 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 z 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

*i++o9oa4n^o7x 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⁣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

??V};Rrh*u0_rhrk$Vuc4pu9 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 yaYQUy#SK + + + + + + Control Center - Infrastructure Management + + + + + + + + +

+ + \ No newline at end of file diff --git a/control-center-ui/index.html b/control-center-ui/index.html new file mode 100644 index 0000000..792ca72 --- /dev/null +++ b/control-center-ui/index.html @@ -0,0 +1,38 @@ + + + + + + + Control Center - Infrastructure Management + + + + + + + +
+
+ Loading Leptos app... +
+
+ + + + \ No newline at end of file diff --git a/control-center-ui/manifest.json b/control-center-ui/manifest.json new file mode 100644 index 0000000..c85fc5b --- /dev/null +++ b/control-center-ui/manifest.json @@ -0,0 +1,131 @@ +{ + "name": "Control Center UI", + "short_name": "Control Center", + "description": "Cloud Infrastructure Management Dashboard", + "start_url": "/", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#3b82f6", + "orientation": "portrait-primary", + "scope": "/", + "categories": ["productivity", "utilities", "business"], + "lang": "en", + "icons": [ + { + "src": "/assets/icon-72.png", + "sizes": "72x72", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-96.png", + "sizes": "96x96", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-128.png", + "sizes": "128x128", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-144.png", + "sizes": "144x144", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-152.png", + "sizes": "152x152", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/assets/icon-384.png", + "sizes": "384x384", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/assets/icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + } + ], + "shortcuts": [ + { + "name": "Dashboard", + "short_name": "Dashboard", + "description": "View infrastructure dashboard", + "url": "/dashboard", + "icons": [ + { + "src": "/assets/shortcut-dashboard.png", + "sizes": "96x96" + } + ] + }, + { + "name": "Servers", + "short_name": "Servers", + "description": "Manage servers", + "url": "/servers", + "icons": [ + { + "src": "/assets/shortcut-servers.png", + "sizes": "96x96" + } + ] + }, + { + "name": "Clusters", + "short_name": "Clusters", + "description": "Manage Kubernetes clusters", + "url": "/clusters", + "icons": [ + { + "src": "/assets/shortcut-clusters.png", + "sizes": "96x96" + } + ] + } + ], + "screenshots": [ + { + "src": "/assets/screenshot-desktop.png", + "sizes": "1280x800", + "type": "image/png", + "form_factor": "wide", + "label": "Control Center Dashboard" + }, + { + "src": "/assets/screenshot-mobile.png", + "sizes": "375x812", + "type": "image/png", + "form_factor": "narrow", + "label": "Control Center Mobile View" + } + ], + "prefer_related_applications": false, + "edge_side_panel": { + "preferred_width": 400 + }, + "launch_handler": { + "client_mode": "navigate-existing" + }, + "handle_links": "preferred", + "protocol_handlers": [ + { + "protocol": "control-center", + "url": "/?protocol=%s" + } + ] +} \ No newline at end of file diff --git a/control-center-ui/package.json b/control-center-ui/package.json new file mode 100644 index 0000000..8f56219 --- /dev/null +++ b/control-center-ui/package.json @@ -0,0 +1,35 @@ +{ + "name": "control-center-ui", + "version": "0.1.0", + "description": "Control Center UI - Leptos CSR with TailwindCSS and DaisyUI", + "private": true, + "scripts": { + "dev": "trunk serve", + "dev:open": "trunk serve --open", + "build": "trunk build --release", + "clean": "trunk clean", + "css:build": "tailwindcss -i ./style/input.css -o ./style/output.css", + "css:watch": "tailwindcss -i ./style/input.css -o ./style/output.css --watch", + "css:minify": "tailwindcss -i ./style/input.css -o ./style/output.css --minify", + "lint:css": "stylelint 'style/**/*.css'", + "format:css": "prettier --write 'style/**/*.css'", + "install:deps": "npm install" + }, + "devDependencies": { + "@tailwindcss/typography": "^0.5.10", + "@tailwindcss/forms": "^0.5.7", + "@tailwindcss/aspect-ratio": "^0.4.2", + "autoprefixer": "^10.4.16", + "daisyui": "^4.4.19", + "postcss": "^8.4.31", + "postcss-cli": "^11.0.0", + "prettier": "^3.1.0", + "stylelint": "^16.0.0", + "stylelint-config-standard": "^34.0.0", + "tailwindcss": "^3.3.6" + }, + "browserslist": [ + "defaults", + "not IE 11" + ] +} \ No newline at end of file diff --git a/control-center-ui/pnpm-lock.yaml b/control-center-ui/pnpm-lock.yaml new file mode 100644 index 0000000..605fd81 --- /dev/null +++ b/control-center-ui/pnpm-lock.yaml @@ -0,0 +1,1829 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@tailwindcss/aspect-ratio': + specifier: ^0.4.2 + version: 0.4.2(tailwindcss@3.4.17) + '@tailwindcss/forms': + specifier: ^0.5.7 + version: 0.5.10(tailwindcss@3.4.17) + '@tailwindcss/typography': + specifier: ^0.5.10 + version: 0.5.19(tailwindcss@3.4.17) + autoprefixer: + specifier: ^10.4.16 + version: 10.4.21(postcss@8.5.6) + daisyui: + specifier: ^4.4.19 + version: 4.12.24(postcss@8.5.6) + postcss: + specifier: ^8.4.31 + version: 8.5.6 + postcss-cli: + specifier: ^11.0.0 + version: 11.0.1(jiti@1.21.7)(postcss@8.5.6) + prettier: + specifier: ^3.1.0 + version: 3.6.2 + stylelint: + specifier: ^16.0.0 + version: 16.24.0 + stylelint-config-standard: + specifier: ^34.0.0 + version: 34.0.0(stylelint@16.24.0) + tailwindcss: + specifier: ^3.3.6 + version: 3.4.17 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@cacheable/memoize@2.0.2': + resolution: {integrity: sha512-wPrr7FUiq3Qt4yQyda2/NcOLTJCFcQSU3Am2adP+WLy+sz93/fKTokVTHmtz+rjp4PD7ee0AEOeRVNN6IvIfsg==} + + '@cacheable/memory@2.0.2': + resolution: {integrity: sha512-sJTITLfeCI1rg7P3ssaGmQryq235EGT8dXGcx6oZwX5NRnKq9IE6lddlllcOl+oXW+yaeTRddCjo0xrfU6ZySA==} + + '@cacheable/utils@2.0.2': + resolution: {integrity: sha512-JTFM3raFhVv8LH95T7YnZbf2YoE9wEtkPPStuRF9a6ExZ103hFvs+QyCuYJ6r0hA9wRtbzgZtwUCoDWxssZd4Q==} + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@csstools/media-query-list-parser@4.0.3': + resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@dual-bundle/import-meta-resolve@4.2.1': + resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@keyv/bigmap@1.0.2': + resolution: {integrity: sha512-KR03xkEZlAZNF4IxXgVXb+uNIVNvwdh8UwI0cnc7WI6a+aQcDp8GL80qVfeB4E5NpsKJzou5jU0r6yLSSbMOtA==} + engines: {node: '>= 18'} + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@tailwindcss/aspect-ratio@0.4.2': + resolution: {integrity: sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ==} + peerDependencies: + tailwindcss: '>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1' + + '@tailwindcss/forms@0.5.10': + resolution: {integrity: sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' + + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + + baseline-browser-mapping@2.8.7: + resolution: {integrity: sha512-bxxN2M3a4d1CRoQC//IqsR5XrLh0IJ8TCv2x6Y9N0nckNz/rTjZB3//GGscZziZOxmjP55rzxg/ze7usFI9FqQ==} + hasBin: true + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.26.2: + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + cacheable@2.0.2: + resolution: {integrity: sha512-dWjhLx8RWnPsAWVKwW/wI6OJpQ/hSVb1qS0NUif8TR9vRiSwci7Gey8x04kRU9iAF+Rnbtex5Kjjfg/aB5w8Pg==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001745: + resolution: {integrity: sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-functions-list@3.2.3: + resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} + engines: {node: '>=12 || >=16'} + + css-selector-tokenizer@0.8.0: + resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + culori@3.3.0: + resolution: {integrity: sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + daisyui@4.12.24: + resolution: {integrity: sha512-JYg9fhQHOfXyLadrBrEqCDM6D5dWCSSiM6eTNCRrBRzx/VlOCrLS8eDfIw9RVvs64v2mJdLooKXY8EwQzoszAA==} + engines: {node: '>=16.9.0'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dependency-graph@1.0.0: + resolution: {integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==} + engines: {node: '>=4'} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.224: + resolution: {integrity: sha512-kWAoUu/bwzvnhpdZSIc6KUyvkI1rbRXMT0Eq8pKReyOyaPZcctMli+EgvcN1PAvwVc7Tdo4Fxi2PsLNDU05mdg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastparse@1.1.2: + resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@10.1.4: + resolution: {integrity: sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + flat-cache@6.1.14: + resolution: {integrity: sha512-ExZSCSV9e7v/Zt7RzCbX57lY2dnPdxzU/h3UE6WJ6NtEMfwBd8jmi1n4otDEUfz+T/R+zxrFDpICFdjhD3H/zw==} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hookified@1.12.1: + resolution: {integrity: sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q==} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + keyv@5.5.2: + resolution: {integrity: sha512-TXcFHbmm/z7MGd1u9ASiCSfTS+ei6Z8B3a5JHzx3oPa/o7QzWVtPRpc4KGER5RR469IC+/nfg4U5YLIuDUua2g==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + postcss-cli@11.0.1: + resolution: {integrity: sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + postcss: ^8.0.0 + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-load-config@5.1.0: + resolution: {integrity: sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-reporter@7.1.0: + resolution: {integrity: sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.1.0 + + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + stylelint-config-recommended@13.0.0: + resolution: {integrity: sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + stylelint: ^15.10.0 + + stylelint-config-standard@34.0.0: + resolution: {integrity: sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + stylelint: ^15.10.0 + + stylelint@16.24.0: + resolution: {integrity: sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ==} + engines: {node: '>=18.12.0'} + hasBin: true + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} + engines: {node: '>=14.18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + + thenby@1.3.4: + resolution: {integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.27.1': {} + + '@cacheable/memoize@2.0.2': + dependencies: + '@cacheable/utils': 2.0.2 + + '@cacheable/memory@2.0.2': + dependencies: + '@cacheable/memoize': 2.0.2 + '@cacheable/utils': 2.0.2 + '@keyv/bigmap': 1.0.2 + hookified: 1.12.1 + keyv: 5.5.2 + + '@cacheable/utils@2.0.2': {} + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@dual-bundle/import-meta-resolve@4.2.1': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@keyv/bigmap@1.0.2': + dependencies: + hookified: 1.12.1 + + '@keyv/serialize@1.1.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.17)': + dependencies: + tailwindcss: 3.4.17 + + '@tailwindcss/forms@0.5.10(tailwindcss@3.4.17)': + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.4.17 + + '@tailwindcss/typography@0.5.19(tailwindcss@3.4.17)': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.17 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + astral-regex@2.0.0: {} + + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.26.2 + caniuse-lite: 1.0.30001745 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + balanced-match@1.0.2: {} + + balanced-match@2.0.0: {} + + baseline-browser-mapping@2.8.7: {} + + binary-extensions@2.3.0: {} + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.26.2: + dependencies: + baseline-browser-mapping: 2.8.7 + caniuse-lite: 1.0.30001745 + electron-to-chromium: 1.5.224 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.2) + + cacheable@2.0.2: + dependencies: + '@cacheable/memoize': 2.0.2 + '@cacheable/memory': 2.0.2 + '@cacheable/utils': 2.0.2 + hookified: 1.12.1 + keyv: 5.5.2 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001745: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colord@2.9.3: {} + + commander@4.1.1: {} + + cosmiconfig@9.0.0: + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-functions-list@3.2.3: {} + + css-selector-tokenizer@0.8.0: + dependencies: + cssesc: 3.0.0 + fastparse: 1.1.2 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + cssesc@3.0.0: {} + + culori@3.3.0: {} + + daisyui@4.12.24(postcss@8.5.6): + dependencies: + css-selector-tokenizer: 0.8.0 + culori: 3.3.0 + picocolors: 1.1.1 + postcss-js: 4.1.0(postcss@8.5.6) + transitivePeerDependencies: + - postcss + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + dependency-graph@1.0.0: {} + + didyoumean@1.2.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.224: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + env-paths@2.2.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + escalade@3.2.0: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-uri@3.1.0: {} + + fastest-levenshtein@1.0.16: {} + + fastparse@1.1.2: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@10.1.4: + dependencies: + flat-cache: 6.1.14 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + flat-cache@6.1.14: + dependencies: + cacheable: 2.0.2 + flatted: 3.3.3 + hookified: 1.12.1 + + flatted@3.3.3: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fraction.js@4.3.7: {} + + fs-extra@11.3.2: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globjoin@0.1.4: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hookified@1.12.1: {} + + html-tags@3.3.1: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + ini@1.3.8: {} + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-object@5.0.0: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.7: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@5.5.2: + dependencies: + '@keyv/serialize': 1.1.1 + + kind-of@6.0.3: {} + + known-css-properties@0.37.0: {} + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + lodash.truncate@4.4.2: {} + + lru-cache@10.4.3: {} + + mathml-tag-names@2.1.3: {} + + mdn-data@2.12.2: {} + + meow@13.2.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mini-svg-data-uri@1.4.4: {} + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + node-releases@2.0.21: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@2.3.0: {} + + pirates@4.0.7: {} + + postcss-cli@11.0.1(jiti@1.21.7)(postcss@8.5.6): + dependencies: + chokidar: 3.6.0 + dependency-graph: 1.0.0 + fs-extra: 11.3.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-load-config: 5.1.0(jiti@1.21.7)(postcss@8.5.6) + postcss-reporter: 7.1.0(postcss@8.5.6) + pretty-hrtime: 1.0.3 + read-cache: 1.0.0 + slash: 5.1.0 + tinyglobby: 0.2.15 + yargs: 17.7.2 + transitivePeerDependencies: + - jiti + - tsx + + postcss-import@15.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.1.0(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-load-config@4.0.2(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + yaml: 2.8.1 + optionalDependencies: + postcss: 8.5.6 + + postcss-load-config@5.1.0(jiti@1.21.7)(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + yaml: 2.8.1 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.6 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-reporter@7.1.0(postcss@8.5.6): + dependencies: + picocolors: 1.1.1 + postcss: 8.5.6 + thenby: 1.3.4 + + postcss-resolve-nested-selector@0.1.6: {} + + postcss-safe-parser@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.6.2: {} + + pretty-hrtime@1.0.3: {} + + queue-microtask@1.2.3: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + slash@5.1.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + source-map-js@1.2.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + stylelint-config-recommended@13.0.0(stylelint@16.24.0): + dependencies: + stylelint: 16.24.0 + + stylelint-config-standard@34.0.0(stylelint@16.24.0): + dependencies: + stylelint: 16.24.0 + stylelint-config-recommended: 13.0.0(stylelint@16.24.0) + + stylelint@16.24.0: + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + '@dual-bundle/import-meta-resolve': 4.2.1 + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.0 + css-functions-list: 3.2.3 + css-tree: 3.1.0 + debug: 4.4.3 + fast-glob: 3.3.3 + fastest-levenshtein: 1.0.16 + file-entry-cache: 10.1.4 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 7.0.5 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.37.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 7.0.1(postcss@8.5.6) + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + supports-hyperlinks: 3.2.0 + svg-tags: 1.0.0 + table: 6.9.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@3.2.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-tags@1.0.0: {} + + table@6.9.0: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + tailwindcss@3.4.17: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.1.0(postcss@8.5.6) + postcss-load-config: 4.0.2(postcss@8.5.6) + postcss-nested: 6.2.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + thenby@1.3.4: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-interface-checker@0.1.13: {} + + universalify@2.0.1: {} + + update-browserslist-db@1.1.3(browserslist@4.26.2): + dependencies: + browserslist: 4.26.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + util-deprecate@1.0.2: {} + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + y18n@5.0.8: {} + + yaml@2.8.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 diff --git a/control-center-ui/setup.sh b/control-center-ui/setup.sh new file mode 100755 index 0000000..56b2a85 --- /dev/null +++ b/control-center-ui/setup.sh @@ -0,0 +1,88 @@ +#!/bin/bash +set -e + +echo "🚀 Control Center UI - Setup Script" +echo "==================================" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Function to print colored output +print_status() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Check if we're in the right directory +if [ ! -f "Cargo.toml" ]; then + print_error "Please run this script from the control-center-ui directory" + exit 1 +fi + +print_status "Checking prerequisites..." + +# Check for Rust +if ! command -v rustc &> /dev/null; then + print_error "Rust is not installed. Please install Rust first:" + echo "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh" + exit 1 +fi + +# Check for Node.js +if ! command -v node &> /dev/null; then + print_error "Node.js is not installed. Please install Node.js first." + exit 1 +fi + +# Check for trunk +if ! command -v trunk &> /dev/null; then + print_status "Installing Trunk..." + cargo install trunk +fi + +# Add wasm32 target +print_status "Adding wasm32-unknown-unknown target..." +rustup target add wasm32-unknown-unknown + +# Install Node.js dependencies +print_status "Installing Node.js dependencies..." +pnpm install + +# Build TailwindCSS +print_status "Building TailwindCSS..." +pnpm run css:build + +# Check Rust dependencies +print_status "Checking Rust dependencies..." +cargo check + +print_success "Setup completed successfully!" +echo "" +echo "🎉 Ready to develop!" +echo "" +echo "Available commands:" +echo " npm run dev - Start development server" +echo " npm run dev:open - Start development server and open browser" +echo " npm run build - Build for production" +echo " npm run css:watch - Watch TailwindCSS changes" +echo " npm run clean - Clean build artifacts" +echo "" +echo "Development server will be available at: http://localhost:3000" +echo "API proxy configured for: http://localhost:8080" +echo "" +print_status "Happy coding! 🦀" diff --git a/control-center-ui/src/App.css b/control-center-ui/src/App.css new file mode 100644 index 0000000..f24dc32 --- /dev/null +++ b/control-center-ui/src/App.css @@ -0,0 +1,41 @@ +#root { + max-width: 1280px; + margin: 0 auto; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} \ No newline at end of file diff --git a/control-center-ui/src/App.tsx b/control-center-ui/src/App.tsx new file mode 100644 index 0000000..3d96ed6 --- /dev/null +++ b/control-center-ui/src/App.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import AuditLogViewer from './components/audit/AuditLogViewer'; +import './App.css'; + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: 5 * 60 * 1000, // 5 minutes + gcTime: 10 * 60 * 1000, // 10 minutes + retry: (failureCount, error: any) => { + if (error?.status >= 400 && error?.status < 500) { + return false; + } + return failureCount < 3; + }, + }, + }, +}); + +function App() { + return ( +
+
+
+
+
+

+ Control Center +

+

+ Audit Log Viewer & Compliance Management +

+
+
+
+ Cedar Policy Engine +
+
+ v1.0.0 +
+
+
+
+ + + } /> + } /> + } /> + } /> + +
+
+ ); +} + +export default App; \ No newline at end of file diff --git a/control-center-ui/src/api/auth.rs b/control-center-ui/src/api/auth.rs new file mode 100644 index 0000000..247a7b0 --- /dev/null +++ b/control-center-ui/src/api/auth.rs @@ -0,0 +1,6 @@ +use leptos::*; + +#[component] +pub fn Placeholder() -> impl IntoView { + view! {
"Placeholder"
} +} diff --git a/control-center-ui/src/api/client.rs b/control-center-ui/src/api/client.rs new file mode 100644 index 0000000..247a7b0 --- /dev/null +++ b/control-center-ui/src/api/client.rs @@ -0,0 +1,6 @@ +use leptos::*; + +#[component] +pub fn Placeholder() -> impl IntoView { + view! {
"Placeholder"
} +} diff --git a/control-center-ui/src/api/clusters.rs b/control-center-ui/src/api/clusters.rs new file mode 100644 index 0000000..247a7b0 --- /dev/null +++ b/control-center-ui/src/api/clusters.rs @@ -0,0 +1,6 @@ +use leptos::*; + +#[component] +pub fn Placeholder() -> impl IntoView { + view! {
"Placeholder"
} +} diff --git a/control-center-ui/src/api/dashboard.rs b/control-center-ui/src/api/dashboard.rs new file mode 100644 index 0000000..247a7b0 --- /dev/null +++ b/control-center-ui/src/api/dashboard.rs @@ -0,0 +1,6 @@ +use leptos::*; + +#[component] +pub fn Placeholder() -> impl IntoView { + view! {
"Placeholder"
} +} diff --git a/control-center-ui/src/api/mod.rs b/control-center-ui/src/api/mod.rs new file mode 100644 index 0000000..ac5f345 --- /dev/null +++ b/control-center-ui/src/api/mod.rs @@ -0,0 +1,15 @@ +pub mod client; +pub mod types; +pub mod auth; +pub mod dashboard; +pub mod servers; +pub mod clusters; +pub mod workflows; + +pub use client::*; +pub use types::*; +pub use auth::*; +pub use dashboard::*; +pub use servers::*; +pub use clusters::*; +pub use workflows::*; \ No newline at end of file diff --git a/control-center-ui/src/api/orchestrator.rs b/control-center-ui/src/api/orchestrator.rs new file mode 100644 index 0000000..9eb2598 --- /dev/null +++ b/control-center-ui/src/api/orchestrator.rs @@ -0,0 +1,503 @@ +use leptos::*; +use serde::{Deserialize, Serialize}; +use gloo_net::http::Request; +use std::collections::HashMap; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WorkflowTask { + pub id: String, + pub name: String, + pub command: String, + pub args: Vec, + pub dependencies: Vec, + pub status: TaskStatus, + pub created_at: String, + pub started_at: Option, + pub completed_at: Option, + pub output: Option, + pub error: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub enum TaskStatus { + Pending, + Running, + Completed, + Failed, + Cancelled, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CreateServerWorkflow { + pub infra: String, + pub settings: String, + pub servers: Vec, + pub check_mode: bool, + pub wait: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TaskservWorkflow { + pub infra: String, + pub settings: String, + pub taskserv: String, + pub operation: String, // create, delete, generate, check-updates + pub check_mode: bool, + pub wait: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ClusterWorkflow { + pub infra: String, + pub settings: String, + pub cluster_type: String, + pub operation: String, // create, delete + pub check_mode: bool, + pub wait: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BatchWorkflowRequest { + pub workflow: BatchWorkflow, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BatchWorkflow { + pub name: String, + pub version: String, + pub storage_backend: String, + pub parallel_limit: u32, + pub rollback_enabled: bool, + pub operations: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BatchOperation { + pub id: String, + pub operation_type: String, + pub provider: String, + pub dependencies: Vec, + pub server_configs: Option>, + pub taskservs: Option>, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServerConfig { + pub name: String, + pub plan: String, + pub zone: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Infrastructure { + pub id: String, + pub name: String, + pub provider: String, + pub status: String, + pub servers: Vec, + pub created_at: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Server { + pub id: String, + pub name: String, + pub status: String, + pub ip_address: Option, + pub plan: String, + pub zone: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProviderCredentials { + pub provider: String, + pub credentials: HashMap, + pub encrypted: bool, + pub last_used: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ApiResponse { + pub success: bool, + pub data: Option, + pub error: Option, +} + +pub struct OrchestratorClient { + base_url: String, +} + +impl OrchestratorClient { + pub fn new(base_url: String) -> Self { + Self { base_url } + } + + // Workflow Management + pub async fn create_server_workflow(&self, workflow: CreateServerWorkflow) -> Result { + let url = format!("{}/workflows/servers/create", self.base_url); + + let response = Request::post(&url) + .json(&workflow) + .map_err(|e| format!("Request creation failed: {}", e))? + .send() + .await + .map_err(|e| format!("Request failed: {}", e))?; + + let api_response: ApiResponse = response + .json() + .await + .map_err(|e| format!("Failed to parse response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No task ID returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Unknown error".to_string())) + } + } + + pub async fn create_taskserv_workflow(&self, workflow: TaskservWorkflow) -> Result { + let url = format!("{}/workflows/taskserv/create", self.base_url); + + let response = Request::post(&url) + .json(&workflow) + .map_err(|e| format!("Request creation failed: {}", e))? + .send() + .await + .map_err(|e| format!("Request failed: {}", e))?; + + let api_response: ApiResponse = response + .json() + .await + .map_err(|e| format!("Failed to parse response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No task ID returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Unknown error".to_string())) + } + } + + pub async fn create_cluster_workflow(&self, workflow: ClusterWorkflow) -> Result { + let url = format!("{}/workflows/cluster/create", self.base_url); + + let response = Request::post(&url) + .json(&workflow) + .map_err(|e| format!("Request creation failed: {}", e))? + .send() + .await + .map_err(|e| format!("Request failed: {}", e))?; + + let api_response: ApiResponse = response + .json() + .await + .map_err(|e| format!("Failed to parse response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No task ID returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Unknown error".to_string())) + } + } + + // Batch Workflows + pub async fn submit_batch_workflow(&self, request: BatchWorkflowRequest) -> Result { + let url = format!("{}/workflows/batch/submit", self.base_url); + + let response = Request::post(&url) + .json(&request) + .map_err(|e| format!("Request creation failed: {}", e))? + .send() + .await + .map_err(|e| format!("Request failed: {}", e))?; + + let api_response: ApiResponse = response + .json() + .await + .map_err(|e| format!("Failed to parse response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No batch ID returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Unknown error".to_string())) + } + } + + pub async fn get_batch_status(&self, batch_id: &str) -> Result { + let url = format!("{}/workflows/batch/{}", self.base_url, batch_id); + + let response = Request::get(&url) + .send() + .await + .map_err(|e| format!("Request failed: {}", e))?; + + let api_response: ApiResponse = response + .json() + .await + .map_err(|e| format!("Failed to parse response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No status data returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Unknown error".to_string())) + } + } + + // Task Management + pub async fn get_task_status(&self, task_id: &str) -> Result { + let url = format!("{}/tasks/{}", self.base_url, task_id); + + let response = Request::get(&url) + .send() + .await + .map_err(|e| format!("Request failed: {}", e))?; + + let api_response: ApiResponse = response + .json() + .await + .map_err(|e| format!("Failed to parse response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No task data returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Unknown error".to_string())) + } + } + + pub async fn list_tasks(&self) -> Result, String> { + let url = format!("{}/tasks", self.base_url); + + let response = Request::get(&url) + .send() + .await + .map_err(|e| format!("Request failed: {}", e))?; + + let api_response: ApiResponse> = response + .json() + .await + .map_err(|e| format!("Failed to parse response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No tasks data returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Unknown error".to_string())) + } + } + + // Health Check + pub async fn health_check(&self) -> Result { + let url = format!("{}/health", self.base_url); + + let response = Request::get(&url) + .send() + .await + .map_err(|e| format!("Health check failed: {}", e))?; + + let api_response: ApiResponse = response + .json() + .await + .map_err(|e| format!("Failed to parse health response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No health data returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Health check failed".to_string())) + } + } + + // Rollback Operations + pub async fn create_checkpoint(&self, name: String, description: Option) -> Result { + let url = format!("{}/rollback/checkpoints", self.base_url); + + let request_body = serde_json::json!({ + "name": name, + "description": description + }); + + let response = Request::post(&url) + .json(&request_body) + .map_err(|e| format!("Request creation failed: {}", e))? + .send() + .await + .map_err(|e| format!("Request failed: {}", e))?; + + let api_response: ApiResponse = response + .json() + .await + .map_err(|e| format!("Failed to parse response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No checkpoint ID returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Unknown error".to_string())) + } + } + + pub async fn execute_rollback(&self, checkpoint_id: Option, operation_ids: Option>) -> Result { + let url = format!("{}/rollback/execute", self.base_url); + + let request_body = serde_json::json!({ + "checkpoint_id": checkpoint_id, + "operation_ids": operation_ids + }); + + let response = Request::post(&url) + .json(&request_body) + .map_err(|e| format!("Request creation failed: {}", e))? + .send() + .await + .map_err(|e| format!("Request failed: {}", e))?; + + let api_response: ApiResponse = response + .json() + .await + .map_err(|e| format!("Failed to parse response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No rollback result returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Unknown error".to_string())) + } + } + + // System Metrics + pub async fn get_system_metrics(&self) -> Result { + let url = format!("{}/state/system/metrics", self.base_url); + + let response = Request::get(&url) + .send() + .await + .map_err(|e| format!("Request failed: {}", e))?; + + let api_response: ApiResponse = response + .json() + .await + .map_err(|e| format!("Failed to parse response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No metrics data returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Unknown error".to_string())) + } + } + + pub async fn get_system_health(&self) -> Result { + let url = format!("{}/state/system/health", self.base_url); + + let response = Request::get(&url) + .send() + .await + .map_err(|e| format!("Request failed: {}", e))?; + + let api_response: ApiResponse = response + .json() + .await + .map_err(|e| format!("Failed to parse response: {}", e))?; + + if api_response.success { + api_response.data.ok_or_else(|| "No health data returned".to_string()) + } else { + Err(api_response.error.unwrap_or_else(|| "Unknown error".to_string())) + } + } +} + +// Global client instance +thread_local! { + static ORCHESTRATOR_CLIENT: OrchestratorClient = OrchestratorClient::new("http://localhost:8080".to_string()); +} + +pub fn get_orchestrator_client() -> &'static OrchestratorClient { + ORCHESTRATOR_CLIENT.with(|client| { + // This is a workaround for thread_local limitation + // In a real app, you might want to use a different approach + unsafe { &*(client as *const OrchestratorClient) } + }) +} + +// Reactive hooks for Leptos components +pub fn use_task_status(task_id: String) -> (ReadSignal>, ReadSignal, Action<(), ()>) { + let (task, set_task) = create_signal(None::); + let (loading, set_loading) = create_signal(false); + + let refresh_action = create_action(move |_: &()| { + let task_id = task_id.clone(); + async move { + set_loading.set(true); + match get_orchestrator_client().get_task_status(&task_id).await { + Ok(task_data) => { + set_task.set(Some(task_data)); + } + Err(err) => { + logging::log!("Failed to fetch task status: {}", err); + } + } + set_loading.set(false); + } + }); + + // Auto-refresh every 5 seconds for running tasks + create_effect(move |_| { + if let Some(t) = task.get() { + if matches!(t.status, TaskStatus::Pending | TaskStatus::Running) { + set_timeout(move || refresh_action.dispatch(()), std::time::Duration::from_secs(5)); + } + } + }); + + (task, loading, refresh_action) +} + +pub fn use_tasks_list() -> (ReadSignal>, ReadSignal, Action<(), ()>) { + let (tasks, set_tasks) = create_signal(Vec::::new()); + let (loading, set_loading) = create_signal(false); + + let refresh_action = create_action(move |_: &()| { + async move { + set_loading.set(true); + match get_orchestrator_client().list_tasks().await { + Ok(tasks_data) => { + set_tasks.set(tasks_data); + } + Err(err) => { + logging::log!("Failed to fetch tasks: {}", err); + } + } + set_loading.set(false); + } + }); + + // Initial load + refresh_action.dispatch(()); + + (tasks, loading, refresh_action) +} + +pub fn use_system_health() -> (ReadSignal>, ReadSignal, Action<(), ()>) { + let (health, set_health) = create_signal(None::); + let (loading, set_loading) = create_signal(false); + + let refresh_action = create_action(move |_: &()| { + async move { + set_loading.set(true); + match get_orchestrator_client().get_system_health().await { + Ok(health_data) => { + set_health.set(Some(health_data)); + } + Err(err) => { + logging::log!("Failed to fetch system health: {}", err); + } + } + set_loading.set(false); + } + }); + + // Auto-refresh every 30 seconds + create_effect(move |_| { + set_timeout(move || refresh_action.dispatch(()), std::time::Duration::from_secs(30)); + }); + + // Initial load + refresh_action.dispatch(()); + + (health, loading, refresh_action) +} \ No newline at end of file diff --git a/control-center-ui/src/api/orchestrator_client.rs b/control-center-ui/src/api/orchestrator_client.rs new file mode 100644 index 0000000..5513cef --- /dev/null +++ b/control-center-ui/src/api/orchestrator_client.rs @@ -0,0 +1,408 @@ +use crate::api::orchestrator_types::*; +use gloo_net::http::{Request, RequestBuilder}; +use serde_json; +use std::collections::HashMap; +use thiserror::Error; +use url::Url; +use wasm_bindgen_futures::JsFuture; +use web_sys::{console, window}; + +#[derive(Error, Debug)] +pub enum OrchestratorError { + #[error("Network error: {0}")] + Network(String), + #[error("Serialization error: {0}")] + Serialization(String), + #[error("API error: {0}")] + Api(String), + #[error("Configuration error: {0}")] + Config(String), +} + +/// Configuration for the orchestrator client +#[derive(Debug, Clone)] +pub struct OrchestratorConfig { + pub base_url: String, + pub timeout_seconds: u32, + pub retry_attempts: u32, +} + +impl Default for OrchestratorConfig { + fn default() -> Self { + Self { + base_url: "http://localhost:8080".to_string(), + timeout_seconds: 30, + retry_attempts: 3, + } + } +} + +/// HTTP client for orchestrator API +#[derive(Debug, Clone)] +pub struct OrchestratorClient { + config: OrchestratorConfig, +} + +impl OrchestratorClient { + /// Create a new orchestrator client with default configuration + pub fn new() -> Self { + Self { + config: OrchestratorConfig::default(), + } + } + + /// Create a new orchestrator client with custom configuration + pub fn with_config(config: OrchestratorConfig) -> Self { + Self { config } + } + + /// Build a request with common headers and configuration + fn build_request(&self, method: &str, path: &str) -> Result { + let url = format!("{}{}", self.config.base_url, path); + + let request = match method.to_uppercase().as_str() { + "GET" => Request::get(&url), + "POST" => Request::post(&url), + "PUT" => Request::put(&url), + "DELETE" => Request::delete(&url), + _ => return Err(OrchestratorError::Config(format!("Unsupported HTTP method: {}", method))), + }; + + Ok(request + .header("Content-Type", "application/json") + .header("Accept", "application/json")) + } + + /// Execute a request and parse the response + async fn execute_request(&self, request: RequestBuilder) -> Result, OrchestratorError> + where + T: serde::de::DeserializeOwned, + { + let response = request + .send() + .await + .map_err(|e| OrchestratorError::Network(format!("Request failed: {}", e)))?; + + let status = response.status(); + let response_text = response + .text() + .await + .map_err(|e| OrchestratorError::Network(format!("Failed to read response: {}", e)))?; + + if !status.is_success() { + return Err(OrchestratorError::Api(format!( + "HTTP {} - {}", + status.as_u16(), + response_text + ))); + } + + serde_json::from_str::>(&response_text) + .map_err(|e| OrchestratorError::Serialization(format!("Failed to parse response: {}", e))) + } + + /// Execute a request with JSON body + async fn execute_json_request(&self, request: RequestBuilder, body: &B) -> Result, OrchestratorError> + where + T: serde::de::DeserializeOwned, + B: serde::Serialize, + { + let json_body = serde_json::to_string(body) + .map_err(|e| OrchestratorError::Serialization(format!("Failed to serialize request: {}", e)))?; + + let response = request + .body(json_body) + .send() + .await + .map_err(|e| OrchestratorError::Network(format!("Request failed: {}", e)))?; + + let status = response.status(); + let response_text = response + .text() + .await + .map_err(|e| OrchestratorError::Network(format!("Failed to read response: {}", e)))?; + + if !status.is_success() { + return Err(OrchestratorError::Api(format!( + "HTTP {} - {}", + status.as_u16(), + response_text + ))); + } + + serde_json::from_str::>(&response_text) + .map_err(|e| OrchestratorError::Serialization(format!("Failed to parse response: {}", e))) + } + + // Health and Status Operations + + /// Check orchestrator health + pub async fn health_check(&self) -> Result { + let request = self.build_request("GET", "/health")?; + let response = self.execute_request::(request).await?; + + if response.success { + Ok(response.data.unwrap_or_default()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Get system health status + pub async fn get_system_health(&self) -> Result { + let request = self.build_request("GET", "/state/system/health")?; + let response = self.execute_request::(request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Get system metrics + pub async fn get_system_metrics(&self) -> Result { + let request = self.build_request("GET", "/state/system/metrics")?; + let response = self.execute_request::(request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + // Task Management Operations + + /// List all tasks + pub async fn list_tasks(&self) -> Result, OrchestratorError> { + let request = self.build_request("GET", "/tasks")?; + let response = self.execute_request::>(request).await?; + + if response.success { + Ok(response.data.unwrap_or_default()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Get task status by ID + pub async fn get_task_status(&self, task_id: &str) -> Result { + let request = self.build_request("GET", &format!("/tasks/{}", task_id))?; + let response = self.execute_request::(request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + // Workflow Operations + + /// Create server workflow + pub async fn create_server_workflow(&self, workflow: &CreateServerWorkflow) -> Result { + let request = self.build_request("POST", "/workflows/servers/create")?; + let response = self.execute_json_request::(request, workflow).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Create taskserv workflow + pub async fn create_taskserv_workflow(&self, workflow: &TaskservWorkflow) -> Result { + let request = self.build_request("POST", "/workflows/taskserv/create")?; + let response = self.execute_json_request::(request, workflow).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Create cluster workflow + pub async fn create_cluster_workflow(&self, workflow: &ClusterWorkflow) -> Result { + let request = self.build_request("POST", "/workflows/cluster/create")?; + let response = self.execute_json_request::(request, workflow).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + // Batch Operations + + /// Execute batch operation + pub async fn execute_batch_operation(&self, request: &BatchOperationRequest) -> Result { + let req = self.build_request("POST", "/batch/execute")?; + let response = self.execute_json_request::(req, request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// List batch operations + pub async fn list_batch_operations(&self) -> Result, OrchestratorError> { + let request = self.build_request("GET", "/batch/operations")?; + let response = self.execute_request::>(request).await?; + + if response.success { + Ok(response.data.unwrap_or_default()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Get batch operation status + pub async fn get_batch_operation_status(&self, operation_id: &str) -> Result { + let request = self.build_request("GET", &format!("/batch/operations/{}", operation_id))?; + let response = self.execute_request::(request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Cancel batch operation + pub async fn cancel_batch_operation(&self, operation_id: &str) -> Result { + let request = self.build_request("POST", &format!("/batch/operations/{}/cancel", operation_id))?; + let response = self.execute_request::(request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + // Progress Tracking + + /// Get workflow progress + pub async fn get_workflow_progress(&self, workflow_id: &str) -> Result { + let request = self.build_request("GET", &format!("/state/workflows/{}/progress", workflow_id))?; + let response = self.execute_request::(request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Get workflow snapshots + pub async fn get_workflow_snapshots(&self, workflow_id: &str) -> Result, OrchestratorError> { + let request = self.build_request("GET", &format!("/state/workflows/{}/snapshots", workflow_id))?; + let response = self.execute_request::>(request).await?; + + if response.success { + Ok(response.data.unwrap_or_default()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + // Rollback Operations + + /// Create checkpoint + pub async fn create_checkpoint(&self, request: &CreateCheckpointRequest) -> Result { + let req = self.build_request("POST", "/rollback/checkpoints")?; + let response = self.execute_json_request::(req, request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// List checkpoints + pub async fn list_checkpoints(&self) -> Result, OrchestratorError> { + let request = self.build_request("GET", "/rollback/checkpoints")?; + let response = self.execute_request::>(request).await?; + + if response.success { + Ok(response.data.unwrap_or_default()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Get checkpoint by ID + pub async fn get_checkpoint(&self, checkpoint_id: &str) -> Result { + let request = self.build_request("GET", &format!("/rollback/checkpoints/{}", checkpoint_id))?; + let response = self.execute_request::(request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Execute rollback + pub async fn execute_rollback(&self, request: &RollbackRequest) -> Result { + let req = self.build_request("POST", "/rollback/execute")?; + let response = self.execute_json_request::(req, request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Get rollback statistics + pub async fn get_rollback_statistics(&self) -> Result { + let request = self.build_request("GET", "/rollback/statistics")?; + let response = self.execute_request::(request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + /// Restore from checkpoint + pub async fn restore_from_checkpoint(&self, checkpoint_id: &str) -> Result { + let request = self.build_request("POST", &format!("/rollback/restore/{}", checkpoint_id))?; + let response = self.execute_request::(request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } + + // State Management + + /// Get state statistics + pub async fn get_state_statistics(&self) -> Result { + let request = self.build_request("GET", "/state/statistics")?; + let response = self.execute_request::(request).await?; + + if response.success { + Ok(response.data.unwrap()) + } else { + Err(OrchestratorError::Api(response.error.unwrap_or_default())) + } + } +} + +impl Default for OrchestratorClient { + fn default() -> Self { + Self::new() + } +} \ No newline at end of file diff --git a/control-center-ui/src/api/orchestrator_types.rs b/control-center-ui/src/api/orchestrator_types.rs new file mode 100644 index 0000000..21c52bf --- /dev/null +++ b/control-center-ui/src/api/orchestrator_types.rs @@ -0,0 +1,220 @@ +use serde::{Deserialize, Serialize}; +use chrono::{DateTime, Utc}; + +/// API response wrapper used by the orchestrator +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ApiResponse { + pub success: bool, + pub data: Option, + pub error: Option, +} + +/// Task status enumeration +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub enum TaskStatus { + Pending, + Running, + Completed, + Failed, + Cancelled, +} + +/// Workflow task representation +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WorkflowTask { + pub id: String, + pub name: String, + pub command: String, + pub args: Vec, + pub dependencies: Vec, + pub status: TaskStatus, + pub created_at: DateTime, + pub started_at: Option>, + pub completed_at: Option>, + pub output: Option, + pub error: Option, +} + +/// Server creation workflow request +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CreateServerWorkflow { + pub infra: String, + pub settings: String, + pub servers: Vec, + pub check_mode: bool, + pub wait: bool, +} + +/// Task service workflow request +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TaskservWorkflow { + pub infra: String, + pub settings: String, + pub taskserv: String, + pub operation: String, // create, delete, generate, check-updates + pub check_mode: bool, + pub wait: bool, +} + +/// Cluster workflow request +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ClusterWorkflow { + pub infra: String, + pub settings: String, + pub cluster_type: String, + pub operation: String, // create, delete + pub check_mode: bool, + pub wait: bool, +} + +/// Batch operation request +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BatchOperationRequest { + pub workflow_id: String, + pub operations: Vec, + pub parallel_limit: Option, + pub rollback_enabled: Option, +} + +/// Individual batch operation +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BatchOperation { + pub id: String, + pub operation_type: String, + pub provider: String, + pub dependencies: Vec, + pub config: serde_json::Value, +} + +/// Batch operation result +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BatchOperationResult { + pub operation_id: String, + pub status: String, + pub message: String, +} + +/// Workflow execution state +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WorkflowExecutionState { + pub id: String, + pub status: String, + pub progress: f64, + pub current_operation: Option, + pub completed_operations: Vec, + pub failed_operations: Vec, + pub created_at: DateTime, + pub started_at: Option>, + pub completed_at: Option>, +} + +/// System health status +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SystemHealthStatus { + pub overall_status: String, + pub checks: Vec, + pub last_updated: DateTime, +} + +/// Individual health check +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct HealthCheck { + pub name: String, + pub status: String, + pub message: Option, + pub last_check: DateTime, +} + +/// Progress information +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProgressInfo { + pub workflow_id: String, + pub current_step: String, + pub progress_percentage: f64, + pub estimated_completion: Option>, + pub step_details: Vec, +} + +/// Step detail information +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct StepDetail { + pub step_name: String, + pub status: String, + pub progress: f64, + pub started_at: Option>, + pub completed_at: Option>, +} + +/// System metrics +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SystemMetrics { + pub cpu_usage: f64, + pub memory_usage: f64, + pub disk_usage: f64, + pub active_workflows: u32, + pub completed_workflows: u32, + pub failed_workflows: u32, + pub uptime_seconds: u64, +} + +/// State snapshot +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct StateSnapshot { + pub id: String, + pub workflow_id: String, + pub timestamp: DateTime, + pub state_data: serde_json::Value, +} + +/// Checkpoint information +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Checkpoint { + pub id: String, + pub name: String, + pub description: Option, + pub created_at: DateTime, + pub workflow_states: Vec, +} + +/// Create checkpoint request +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CreateCheckpointRequest { + pub name: String, + pub description: Option, +} + +/// Rollback request +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RollbackRequest { + pub checkpoint_id: Option, + pub operation_ids: Option>, +} + +/// Rollback result +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RollbackResult { + pub success: bool, + pub operations_executed: u32, + pub operations_failed: u32, + pub rollback_id: String, + pub message: String, +} + +/// Rollback statistics +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RollbackStatistics { + pub total_rollbacks: u32, + pub successful_rollbacks: u32, + pub failed_rollbacks: u32, + pub average_rollback_time_ms: u64, + pub checkpoints_created: u32, +} + +/// State manager statistics +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct StateManagerStatistics { + pub total_snapshots: u32, + pub active_workflows: u32, + pub storage_size_bytes: u64, + pub average_snapshot_size_bytes: u64, +} \ No newline at end of file diff --git a/control-center-ui/src/api/servers.rs b/control-center-ui/src/api/servers.rs new file mode 100644 index 0000000..247a7b0 --- /dev/null +++ b/control-center-ui/src/api/servers.rs @@ -0,0 +1,6 @@ +use leptos::*; + +#[component] +pub fn Placeholder() -> impl IntoView { + view! {
"Placeholder"
} +} diff --git a/control-center-ui/src/api/types.rs b/control-center-ui/src/api/types.rs new file mode 100644 index 0000000..247a7b0 --- /dev/null +++ b/control-center-ui/src/api/types.rs @@ -0,0 +1,6 @@ +use leptos::*; + +#[component] +pub fn Placeholder() -> impl IntoView { + view! {
"Placeholder"
} +} diff --git a/control-center-ui/src/api/workflows.rs b/control-center-ui/src/api/workflows.rs new file mode 100644 index 0000000..247a7b0 --- /dev/null +++ b/control-center-ui/src/api/workflows.rs @@ -0,0 +1,6 @@ +use leptos::*; + +#[component] +pub fn Placeholder() -> impl IntoView { + view! {
"Placeholder"
} +} diff --git a/control-center-ui/src/app.rs b/control-center-ui/src/app.rs new file mode 100644 index 0000000..92e51df --- /dev/null +++ b/control-center-ui/src/app.rs @@ -0,0 +1,15 @@ +use leptos::*; + +/// Main application component - simplified for testing +#[component] +pub fn App() -> impl IntoView { + view! { +
+

"🚀 Control Center UI"

+

"Leptos app is working!"

+
+ "If you can see this, the basic Leptos rendering is functioning correctly." +
+
+ } +} \ No newline at end of file diff --git a/control-center-ui/src/auth/crypto.rs b/control-center-ui/src/auth/crypto.rs new file mode 100644 index 0000000..cbea02b --- /dev/null +++ b/control-center-ui/src/auth/crypto.rs @@ -0,0 +1,305 @@ +use crate::auth::{AuthError, AuthResult}; +use sha2::{Digest, Sha256}; +use hmac::{Hmac, Mac}; +use rand::{Rng, thread_rng}; +use base64::{Engine as _, engine::general_purpose}; + +type HmacSha256 = Hmac; + +pub struct CryptoUtils; + +impl CryptoUtils { + /// Generate a cryptographically secure random string + pub fn generate_random_string(length: usize) -> String { + const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\ + abcdefghijklmnopqrstuvwxyz\ + 0123456789"; + let mut rng = thread_rng(); + + (0..length) + .map(|_| { + let idx = rng.gen_range(0..CHARSET.len()); + CHARSET[idx] as char + }) + .collect() + } + + /// Generate a cryptographically secure random bytes + pub fn generate_random_bytes(length: usize) -> Vec { + let mut rng = thread_rng(); + (0..length).map(|_| rng.gen()).collect() + } + + /// Create SHA256 hash of input data + pub fn sha256_hash(data: &[u8]) -> String { + let hash = Sha256::digest(data); + format!("{:x}", hash) + } + + /// Create SHA256 hash of a string + pub fn sha256_hash_string(data: &str) -> String { + Self::sha256_hash(data.as_bytes()) + } + + /// Create HMAC-SHA256 signature + pub fn hmac_sha256(key: &[u8], data: &[u8]) -> AuthResult> { + let mut mac = HmacSha256::new_from_slice(key) + .map_err(|e| AuthError { + message: format!("Failed to create HMAC: {}", e), + code: Some("HMAC_CREATE_ERROR".to_string()), + field: None, + })?; + + mac.update(data); + Ok(mac.finalize().into_bytes().to_vec()) + } + + /// Create HMAC-SHA256 signature of a string + pub fn hmac_sha256_string(key: &str, data: &str) -> AuthResult { + let signature = Self::hmac_sha256(key.as_bytes(), data.as_bytes())?; + Ok(general_purpose::STANDARD.encode(signature)) + } + + /// Verify HMAC-SHA256 signature + pub fn verify_hmac_sha256(key: &[u8], data: &[u8], signature: &[u8]) -> AuthResult { + let mut mac = HmacSha256::new_from_slice(key) + .map_err(|e| AuthError { + message: format!("Failed to create HMAC: {}", e), + code: Some("HMAC_CREATE_ERROR".to_string()), + field: None, + })?; + + mac.update(data); + + match mac.verify_slice(signature) { + Ok(()) => Ok(true), + Err(_) => Ok(false), + } + } + + /// Generate a secure token for password reset, email verification, etc. + pub fn generate_secure_token() -> String { + let random_bytes = Self::generate_random_bytes(32); + general_purpose::URL_SAFE_NO_PAD.encode(random_bytes) + } + + /// Generate a numeric code (for MFA, etc.) + pub fn generate_numeric_code(digits: usize) -> String { + let mut rng = thread_rng(); + (0..digits) + .map(|_| rng.gen_range(0..10).to_string()) + .collect() + } + + /// Constant-time string comparison to prevent timing attacks + pub fn secure_compare(a: &str, b: &str) -> bool { + if a.len() != b.len() { + return false; + } + + let a_bytes = a.as_bytes(); + let b_bytes = b.as_bytes(); + + let mut result = 0u8; + for i in 0..a_bytes.len() { + result |= a_bytes[i] ^ b_bytes[i]; + } + + result == 0 + } + + /// Generate a device fingerprint based on available browser information + pub fn generate_device_fingerprint( + user_agent: &str, + screen_resolution: &str, + timezone_offset: i32, + language: &str, + ) -> String { + let combined = format!( + "{}|{}|{}|{}", + user_agent, + screen_resolution, + timezone_offset, + language + ); + + Self::sha256_hash_string(&combined) + } + + /// Create a time-based hash for session validation + pub fn create_time_based_hash(data: &str, timestamp: u64, secret: &str) -> AuthResult { + let combined = format!("{}|{}|{}", data, timestamp, secret); + Ok(Self::sha256_hash_string(&combined)) + } + + /// Verify a time-based hash + pub fn verify_time_based_hash( + data: &str, + timestamp: u64, + secret: &str, + expected_hash: &str, + max_age_seconds: u64, + ) -> AuthResult { + // Check if timestamp is within acceptable range + let current_timestamp = js_sys::Date::now() as u64 / 1000; + if current_timestamp.saturating_sub(timestamp) > max_age_seconds { + return Ok(false); + } + + let computed_hash = Self::create_time_based_hash(data, timestamp, secret)?; + Ok(Self::secure_compare(&computed_hash, expected_hash)) + } + + /// Generate a JWT-like token structure (simplified) + pub fn generate_token_with_expiry( + payload: &str, + secret: &str, + expires_in_seconds: u64, + ) -> AuthResult { + let current_timestamp = js_sys::Date::now() as u64 / 1000; + let expires_at = current_timestamp + expires_in_seconds; + + let header = r#"{"alg":"HS256","typ":"JWT"}"#; + let claims = format!( + r#"{{"sub":"{}","exp":{},"iat":{}}}"#, + payload, + expires_at, + current_timestamp + ); + + let header_b64 = general_purpose::URL_SAFE_NO_PAD.encode(header.as_bytes()); + let claims_b64 = general_purpose::URL_SAFE_NO_PAD.encode(claims.as_bytes()); + + let unsigned_token = format!("{}.{}", header_b64, claims_b64); + let signature = Self::hmac_sha256_string(secret, &unsigned_token)?; + let signature_b64 = general_purpose::URL_SAFE_NO_PAD.encode( + general_purpose::STANDARD.decode(signature) + .map_err(|e| AuthError { + message: format!("Failed to decode signature: {}", e), + code: Some("SIGNATURE_DECODE_ERROR".to_string()), + field: None, + })? + ); + + Ok(format!("{}.{}", unsigned_token, signature_b64)) + } + + /// Encode data using URL-safe base64 + pub fn base64_url_encode(data: &[u8]) -> String { + general_purpose::URL_SAFE_NO_PAD.encode(data) + } + + /// Decode URL-safe base64 data + pub fn base64_url_decode(data: &str) -> AuthResult> { + general_purpose::URL_SAFE_NO_PAD.decode(data) + .map_err(|e| AuthError { + message: format!("Base64 decode error: {}", e), + code: Some("BASE64_DECODE_ERROR".to_string()), + field: None, + }) + } + + /// Generate a CSRF token + pub fn generate_csrf_token() -> String { + Self::generate_secure_token() + } + + /// Create a secure session identifier + pub fn generate_session_id() -> String { + let timestamp = js_sys::Date::now() as u64; + let random_data = Self::generate_random_bytes(16); + let combined = format!("{}{}", timestamp, general_purpose::STANDARD.encode(random_data)); + Self::sha256_hash_string(&combined) + } + + /// Create a password hash (simplified - in production use bcrypt or similar) + pub fn hash_password(password: &str, salt: &str) -> String { + let combined = format!("{}${}", password, salt); + Self::sha256_hash_string(&combined) + } + + /// Generate a random salt for password hashing + pub fn generate_salt() -> String { + let salt_bytes = Self::generate_random_bytes(16); + general_purpose::STANDARD.encode(salt_bytes) + } + + /// Verify password against hash + pub fn verify_password(password: &str, hash: &str, salt: &str) -> bool { + let computed_hash = Self::hash_password(password, salt); + Self::secure_compare(&computed_hash, hash) + } +} + +/// Utility functions for working with browser crypto APIs +pub struct BrowserCrypto; + +impl BrowserCrypto { + /// Get random values using browser's crypto API + pub fn get_random_values(length: usize) -> AuthResult> { + use web_sys::window; + + let window = window().ok_or_else(|| AuthError { + message: "Window not available".to_string(), + code: Some("WINDOW_NOT_AVAILABLE".to_string()), + field: None, + })?; + + let crypto = window.crypto().map_err(|_| AuthError { + message: "Crypto API not available".to_string(), + code: Some("CRYPTO_NOT_AVAILABLE".to_string()), + field: None, + })?; + + let mut buffer = vec![0u8; length]; + let uint8_array = js_sys::Uint8Array::new_with_length(length as u32); + + crypto.get_random_values_with_u8_array(&uint8_array).map_err(|_| AuthError { + message: "Failed to get random values".to_string(), + code: Some("GET_RANDOM_VALUES_ERROR".to_string()), + field: None, + })?; + + uint8_array.copy_to(&mut buffer); + Ok(buffer) + } + + /// Check if Web Crypto API is available + pub fn is_available() -> bool { + web_sys::window() + .and_then(|w| w.crypto().ok()) + .is_some() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_generate_random_string() { + let result = CryptoUtils::generate_random_string(10); + assert_eq!(result.len(), 10); + } + + #[test] + fn test_sha256_hash() { + let result = CryptoUtils::sha256_hash_string("hello world"); + assert_eq!(result.len(), 64); // SHA256 produces 32 bytes = 64 hex chars + } + + #[test] + fn test_secure_compare() { + assert!(CryptoUtils::secure_compare("hello", "hello")); + assert!(!CryptoUtils::secure_compare("hello", "world")); + assert!(!CryptoUtils::secure_compare("hello", "hello world")); + } + + #[test] + fn test_base64_url_encode_decode() { + let data = b"hello world"; + let encoded = CryptoUtils::base64_url_encode(data); + let decoded = CryptoUtils::base64_url_decode(&encoded).unwrap(); + assert_eq!(data, decoded.as_slice()); + } +} \ No newline at end of file diff --git a/control-center-ui/src/auth/http_interceptor.rs b/control-center-ui/src/auth/http_interceptor.rs new file mode 100644 index 0000000..40d355c --- /dev/null +++ b/control-center-ui/src/auth/http_interceptor.rs @@ -0,0 +1,430 @@ +use crate::auth::{use_auth_context, AuthResult, AuthError}; +use gloo_net::http::{Request, Response, Headers}; +use leptos::*; +use leptos_router::*; +use serde_json::Value; +use std::collections::HashMap; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::JsFuture; +use web_sys::{console, AbortController}; + +pub struct HttpInterceptor { + auth_context: crate::auth::token_manager::AuthContext, + navigate: leptos_router::NavigateOptions, +} + +impl HttpInterceptor { + pub fn new( + auth_context: crate::auth::token_manager::AuthContext, + navigate: leptos_router::NavigateOptions, + ) -> Self { + Self { + auth_context, + navigate, + } + } + + pub async fn request(&self, mut request: Request) -> AuthResult { + // Add authentication header if available + if let Ok(Some(auth_header)) = self.auth_context.token_manager.get_auth_header() { + request = request.header("Authorization", &auth_header); + } + + // Add common headers + request = request + .header("Content-Type", "application/json") + .header("Accept", "application/json") + .header("X-Requested-With", "XMLHttpRequest"); + + Ok(request) + } + + pub async fn response(&self, response: Response) -> AuthResult { + match response.status() { + 401 => { + // Unauthorized - token might be expired or invalid + self.handle_401_response().await?; + Err(AuthError { + message: "Authentication required".to_string(), + code: Some("UNAUTHORIZED".to_string()), + field: None, + }) + } + 403 => { + // Forbidden - user doesn't have permission + console::warn_1(&"Access denied - insufficient permissions".into()); + Ok(response) + } + 429 => { + // Too Many Requests - rate limited + console::warn_1(&"Rate limit exceeded".into()); + Ok(response) + } + 500..=599 => { + // Server errors + console::error_1(&format!("Server error: {}", response.status()).into()); + Ok(response) + } + _ => Ok(response), + } + } + + async fn handle_401_response(&self) -> AuthResult<()> { + console::log_1(&"Handling 401 response - attempting token refresh".into()); + + // Try to refresh the token + match self.auth_context.token_manager.refresh_if_needed().await { + Ok(Some(_new_token)) => { + console::log_1(&"Token refreshed successfully".into()); + Ok(()) + } + Ok(None) => { + console::log_1(&"No token to refresh - redirecting to login".into()); + self.logout_and_redirect().await; + Err(AuthError { + message: "No authentication token available".to_string(), + code: Some("NO_TOKEN".to_string()), + field: None, + }) + } + Err(e) => { + console::error_1(&format!("Token refresh failed: {}", e).into()); + self.logout_and_redirect().await; + Err(e) + } + } + } + + async fn logout_and_redirect(&self) { + // Clear authentication state + let _ = self.auth_context.token_manager.clear_token(); + self.auth_context.auth_state.update(|state| { + *state = crate::auth::AuthState::default(); + }); + + // Redirect to login page + self.navigate("/login", Default::default()); + } +} + +// Global HTTP interceptor setup +pub fn setup_http_interceptor() { + let auth_context = use_auth_context(); + let navigate = use_navigate(); + + let interceptor = HttpInterceptor::new(auth_context, navigate); + + // Store interceptor in global context for use with HTTP requests + provide_context(interceptor); +} + +pub fn use_http_interceptor() -> HttpInterceptor { + expect_context::() +} + +// Enhanced HTTP client with automatic token refresh and error handling +pub struct AuthenticatedHttpClient { + interceptor: HttpInterceptor, + base_url: String, + default_headers: HashMap, +} + +impl AuthenticatedHttpClient { + pub fn new( + auth_context: crate::auth::token_manager::AuthContext, + navigate: leptos_router::NavigateOptions, + base_url: String, + ) -> Self { + let interceptor = HttpInterceptor::new(auth_context, navigate); + let mut default_headers = HashMap::new(); + default_headers.insert("Content-Type".to_string(), "application/json".to_string()); + default_headers.insert("Accept".to_string(), "application/json".to_string()); + + Self { + interceptor, + base_url, + default_headers, + } + } + + pub async fn get(&self, path: &str) -> AuthResult { + let url = format!("{}{}", self.base_url, path); + let mut request = Request::get(&url); + + // Add default headers + for (key, value) in &self.default_headers { + request = request.header(key, value); + } + + self.execute_request(request).await + } + + pub async fn post(&self, path: &str, body: &T) -> AuthResult { + let url = format!("{}{}", self.base_url, path); + let mut request = Request::post(&url); + + // Add default headers + for (key, value) in &self.default_headers { + request = request.header(key, value); + } + + let request = request.json(body).map_err(|e| AuthError { + message: format!("Failed to serialize request body: {}", e), + code: Some("SERIALIZATION_ERROR".to_string()), + field: None, + })?; + + self.execute_request(request).await + } + + pub async fn put(&self, path: &str, body: &T) -> AuthResult { + let url = format!("{}{}", self.base_url, path); + let mut request = Request::put(&url); + + // Add default headers + for (key, value) in &self.default_headers { + request = request.header(key, value); + } + + let request = request.json(body).map_err(|e| AuthError { + message: format!("Failed to serialize request body: {}", e), + code: Some("SERIALIZATION_ERROR".to_string()), + field: None, + })?; + + self.execute_request(request).await + } + + pub async fn delete(&self, path: &str) -> AuthResult { + let url = format!("{}{}", self.base_url, path); + let mut request = Request::delete(&url); + + // Add default headers + for (key, value) in &self.default_headers { + request = request.header(key, value); + } + + self.execute_request(request).await + } + + pub async fn patch(&self, path: &str, body: &T) -> AuthResult { + let url = format!("{}{}", self.base_url, path); + let mut request = Request::patch(&url); + + // Add default headers + for (key, value) in &self.default_headers { + request = request.header(key, value); + } + + let request = request.json(body).map_err(|e| AuthError { + message: format!("Failed to serialize request body: {}", e), + code: Some("SERIALIZATION_ERROR".to_string()), + field: None, + })?; + + self.execute_request(request).await + } + + async fn execute_request(&self, request: Request) -> AuthResult { + // Apply request interceptor + let request = self.interceptor.request(request).await?; + + // Execute request with retry logic for 401 responses + let mut retries = 0; + const MAX_RETRIES: u32 = 1; + + loop { + let response = request.send().await.map_err(|e| AuthError { + message: format!("HTTP request failed: {:?}", e), + code: Some("REQUEST_FAILED".to_string()), + field: None, + })?; + + // Check if this is a 401 and we haven't exceeded retry limit + if response.status() == 401 && retries < MAX_RETRIES { + console::log_1(&"Received 401, attempting token refresh and retry".into()); + + // Try to refresh token + match self.interceptor.auth_context.token_manager.refresh_if_needed().await { + Ok(Some(_)) => { + console::log_1(&"Token refreshed, retrying request".into()); + retries += 1; + continue; + } + _ => { + console::log_1(&"Token refresh failed, handling 401".into()); + return self.interceptor.response(response).await; + } + } + } + + // Apply response interceptor + return self.interceptor.response(response).await; + } + } +} + +// Request timeout handler +pub struct RequestTimeoutHandler { + timeout_ms: u32, +} + +impl RequestTimeoutHandler { + pub fn new(timeout_ms: u32) -> Self { + Self { timeout_ms } + } + + pub async fn execute_with_timeout(&self, future: F) -> AuthResult + where + F: std::future::Future>, + { + let timeout_future = self.create_timeout(); + + match futures::future::select( + Box::pin(future), + Box::pin(timeout_future) + ).await { + futures::future::Either::Left((result, _)) => result, + futures::future::Either::Right((_, _)) => Err(AuthError { + message: format!("Request timeout after {}ms", self.timeout_ms), + code: Some("REQUEST_TIMEOUT".to_string()), + field: None, + }), + } + } + + async fn create_timeout(&self) -> AuthResult<()> { + let promise = js_sys::Promise::new(&mut |resolve, _reject| { + let timeout = gloo_timers::callback::Timeout::new(self.timeout_ms, move || { + resolve.call0(&JsValue::UNDEFINED).unwrap(); + }); + timeout.forget(); + }); + + JsFuture::from(promise).await.map_err(|_| AuthError { + message: "Timeout promise failed".to_string(), + code: Some("TIMEOUT_PROMISE_FAILED".to_string()), + field: None, + })?; + + Ok(()) + } +} + +// Error response parser +pub fn parse_error_response(response: &Response) -> Option { + // Try to parse error from response body + // This is a simplified version - in practice you'd handle this asynchronously + None +} + +// Network status monitor +pub struct NetworkStatusMonitor { + is_online: RwSignal, +} + +impl NetworkStatusMonitor { + pub fn new() -> Self { + let is_online = create_rw_signal(true); + + // Monitor online/offline events + if let Some(window) = web_sys::window() { + let online_closure = { + let is_online = is_online.clone(); + Closure::wrap(Box::new(move |_: web_sys::Event| { + is_online.set(true); + console::log_1(&"Network connection restored".into()); + }) as Box) + }; + + let offline_closure = { + let is_online = is_online.clone(); + Closure::wrap(Box::new(move |_: web_sys::Event| { + is_online.set(false); + console::log_1(&"Network connection lost".into()); + }) as Box) + }; + + let _ = window.add_event_listener_with_callback("online", online_closure.as_ref().unchecked_ref()); + let _ = window.add_event_listener_with_callback("offline", offline_closure.as_ref().unchecked_ref()); + + online_closure.forget(); + offline_closure.forget(); + } + + Self { is_online } + } + + pub fn is_online(&self) -> bool { + self.is_online.get() + } + + pub fn on_network_change(&self, callback: F) + where + F: Fn(bool) + 'static, + { + create_effect({ + let is_online = self.is_online; + move |_| { + callback(is_online.get()); + } + }); + } +} + +// Request queue for offline support +pub struct OfflineRequestQueue { + queue: RwSignal>, + network_monitor: NetworkStatusMonitor, +} + +#[derive(Clone, Debug)] +pub struct QueuedRequest { + pub method: String, + pub url: String, + pub headers: HashMap, + pub body: Option, + pub timestamp: chrono::DateTime, +} + +impl OfflineRequestQueue { + pub fn new() -> Self { + let queue = create_rw_signal(Vec::new()); + let network_monitor = NetworkStatusMonitor::new(); + + // Process queue when network comes back online + network_monitor.on_network_change({ + let queue = queue.clone(); + move |is_online| { + if is_online { + // Process queued requests + let queued_requests = queue.get(); + for request in queued_requests { + // TODO: Implement request replay logic + console::log_1(&format!("Replaying request: {} {}", request.method, request.url).into()); + } + queue.set(Vec::new()); + } + } + }); + + Self { + queue, + network_monitor, + } + } + + pub fn enqueue_request(&self, request: QueuedRequest) { + self.queue.update(|queue| { + queue.push(request); + }); + } + + pub fn is_online(&self) -> bool { + self.network_monitor.is_online() + } + + pub fn queue_size(&self) -> usize { + self.queue.get().len() + } +} \ No newline at end of file diff --git a/control-center-ui/src/auth/mod.rs b/control-center-ui/src/auth/mod.rs new file mode 100644 index 0000000..8f5368c --- /dev/null +++ b/control-center-ui/src/auth/mod.rs @@ -0,0 +1,128 @@ +// pub mod token_manager; +// pub mod crypto; +// pub mod webauthn; +// pub mod storage; +// pub mod http_interceptor; + +// pub use token_manager::*; +// pub use crypto::*; +// pub use webauthn::*; +// pub use storage::*; +// pub use http_interceptor::*; + +use serde::{Deserialize, Serialize}; +use chrono::{DateTime, Utc}; +use uuid::Uuid; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct AuthToken { + pub access_token: String, + pub refresh_token: String, + pub expires_at: DateTime, + pub token_type: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct LoginCredentials { + pub email: String, + pub password: String, + pub remember_me: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MfaCredentials { + pub token: String, + pub code: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct User { + pub id: Uuid, + pub email: String, + pub name: String, + pub mfa_enabled: bool, + pub device_trust_enabled: bool, + pub last_login: Option>, + pub created_at: DateTime, + pub updated_at: DateTime, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AuthState { + pub user: Option, + pub token: Option, + pub is_authenticated: bool, + pub is_loading: bool, + pub mfa_required: bool, + pub trusted_device: bool, +} + +impl Default for AuthState { + fn default() -> Self { + Self { + user: None, + token: None, + is_authenticated: false, + is_loading: false, + mfa_required: false, + trusted_device: false, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AuthError { + pub message: String, + pub code: Option, + pub field: Option, +} + +impl std::fmt::Display for AuthError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.message) + } +} + +impl std::error::Error for AuthError {} + +pub type AuthResult = Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TrustedDevice { + pub id: Uuid, + pub name: String, + pub device_fingerprint: String, + pub user_agent: String, + pub ip_address: String, + pub created_at: DateTime, + pub last_used: DateTime, + pub is_current: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SsoProvider { + pub id: String, + pub name: String, + pub provider_type: SsoProviderType, + pub icon: String, + pub enabled: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub enum SsoProviderType { + OAuth2, + SAML, + OIDC, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PasswordResetRequest { + pub email: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PasswordResetConfirm { + pub token: String, + pub new_password: String, + pub confirm_password: String, +} \ No newline at end of file diff --git a/control-center-ui/src/auth/storage.rs b/control-center-ui/src/auth/storage.rs new file mode 100644 index 0000000..68c0c15 --- /dev/null +++ b/control-center-ui/src/auth/storage.rs @@ -0,0 +1,196 @@ +use crate::auth::{AuthToken, AuthResult, AuthError}; +use aes_gcm::{ + aead::{Aead, KeyInit, OsRng}, + Aes256Gcm, Nonce +}; +use base64::{Engine as _, engine::general_purpose}; +use gloo_storage::{LocalStorage, Storage}; +use rand::RngCore; +use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::*; +use web_sys::window; + +const TOKEN_KEY: &str = "cc_auth_token"; +const ENCRYPTION_KEY: &str = "cc_encryption_key"; + +#[derive(Serialize, Deserialize)] +struct EncryptedData { + data: String, + nonce: String, +} + +pub struct SecureTokenStorage { + cipher: Aes256Gcm, +} + +impl SecureTokenStorage { + pub fn new() -> AuthResult { + let key = Self::get_or_create_encryption_key()?; + let cipher = Aes256Gcm::new_from_slice(&key) + .map_err(|e| AuthError { + message: format!("Failed to initialize cipher: {}", e), + code: Some("CIPHER_INIT_ERROR".to_string()), + field: None, + })?; + + Ok(Self { cipher }) + } + + fn get_or_create_encryption_key() -> AuthResult> { + // Try to get existing key from sessionStorage (more secure than localStorage for keys) + if let Some(storage) = window().and_then(|w| w.session_storage().ok().flatten()) { + if let Ok(encoded_key) = storage.get_item(ENCRYPTION_KEY) { + if let Some(key_str) = encoded_key { + if let Ok(key_bytes) = general_purpose::STANDARD.decode(key_str) { + if key_bytes.len() == 32 { + return Ok(key_bytes); + } + } + } + } + } + + // Generate new key if none exists + let mut key = vec![0u8; 32]; + OsRng.fill_bytes(&mut key); + let encoded_key = general_purpose::STANDARD.encode(&key); + + // Store in sessionStorage + if let Some(storage) = window().and_then(|w| w.session_storage().ok().flatten()) { + storage.set_item(ENCRYPTION_KEY, &encoded_key) + .map_err(|_| AuthError { + message: "Failed to store encryption key".to_string(), + code: Some("KEY_STORAGE_ERROR".to_string()), + field: None, + })?; + } + + Ok(key) + } + + pub fn store_token(&self, token: &AuthToken) -> AuthResult<()> { + let serialized = serde_json::to_string(token) + .map_err(|e| AuthError { + message: format!("Failed to serialize token: {}", e), + code: Some("SERIALIZATION_ERROR".to_string()), + field: None, + })?; + + let encrypted_data = self.encrypt_data(&serialized)?; + let encrypted_json = serde_json::to_string(&encrypted_data) + .map_err(|e| AuthError { + message: format!("Failed to serialize encrypted data: {}", e), + code: Some("SERIALIZATION_ERROR".to_string()), + field: None, + })?; + + LocalStorage::set(TOKEN_KEY, encrypted_json) + .map_err(|_| AuthError { + message: "Failed to store token in localStorage".to_string(), + code: Some("STORAGE_ERROR".to_string()), + field: None, + })?; + + Ok(()) + } + + pub fn retrieve_token(&self) -> AuthResult> { + let encrypted_json: String = match LocalStorage::get(TOKEN_KEY) { + Ok(data) => data, + Err(_) => return Ok(None), + }; + + let encrypted_data: EncryptedData = serde_json::from_str(&encrypted_json) + .map_err(|e| AuthError { + message: format!("Failed to deserialize encrypted data: {}", e), + code: Some("DESERIALIZATION_ERROR".to_string()), + field: None, + })?; + + let decrypted_data = self.decrypt_data(&encrypted_data)?; + let token: AuthToken = serde_json::from_str(&decrypted_data) + .map_err(|e| AuthError { + message: format!("Failed to deserialize token: {}", e), + code: Some("DESERIALIZATION_ERROR".to_string()), + field: None, + })?; + + Ok(Some(token)) + } + + pub fn remove_token(&self) -> AuthResult<()> { + LocalStorage::delete(TOKEN_KEY); + + // Also clear encryption key from sessionStorage + if let Some(storage) = window().and_then(|w| w.session_storage().ok().flatten()) { + let _ = storage.remove_item(ENCRYPTION_KEY); + } + + Ok(()) + } + + fn encrypt_data(&self, data: &str) -> AuthResult { + let mut nonce_bytes = vec![0u8; 12]; + OsRng.fill_bytes(&mut nonce_bytes); + let nonce = Nonce::from_slice(&nonce_bytes); + + let ciphertext = self.cipher.encrypt(nonce, data.as_bytes()) + .map_err(|e| AuthError { + message: format!("Encryption failed: {}", e), + code: Some("ENCRYPTION_ERROR".to_string()), + field: None, + })?; + + Ok(EncryptedData { + data: general_purpose::STANDARD.encode(ciphertext), + nonce: general_purpose::STANDARD.encode(nonce_bytes), + }) + } + + fn decrypt_data(&self, encrypted_data: &EncryptedData) -> AuthResult { + let ciphertext = general_purpose::STANDARD.decode(&encrypted_data.data) + .map_err(|e| AuthError { + message: format!("Failed to decode ciphertext: {}", e), + code: Some("DECODE_ERROR".to_string()), + field: None, + })?; + + let nonce_bytes = general_purpose::STANDARD.decode(&encrypted_data.nonce) + .map_err(|e| AuthError { + message: format!("Failed to decode nonce: {}", e), + code: Some("DECODE_ERROR".to_string()), + field: None, + })?; + + let nonce = Nonce::from_slice(&nonce_bytes); + let plaintext = self.cipher.decrypt(nonce, ciphertext.as_ref()) + .map_err(|e| AuthError { + message: format!("Decryption failed: {}", e), + code: Some("DECRYPTION_ERROR".to_string()), + field: None, + })?; + + String::from_utf8(plaintext) + .map_err(|e| AuthError { + message: format!("Failed to convert decrypted data to string: {}", e), + code: Some("UTF8_ERROR".to_string()), + field: None, + }) + } + + pub fn clear_all_data(&self) -> AuthResult<()> { + LocalStorage::clear(); + + if let Some(storage) = window().and_then(|w| w.session_storage().ok().flatten()) { + let _ = storage.clear(); + } + + Ok(()) + } +} + +impl Default for SecureTokenStorage { + fn default() -> Self { + Self::new().expect("Failed to create SecureTokenStorage") + } +} \ No newline at end of file diff --git a/control-center-ui/src/auth/token_manager.rs b/control-center-ui/src/auth/token_manager.rs new file mode 100644 index 0000000..8ce2130 --- /dev/null +++ b/control-center-ui/src/auth/token_manager.rs @@ -0,0 +1,220 @@ +use crate::auth::{AuthToken, AuthResult, AuthError, SecureTokenStorage}; +use chrono::{DateTime, Utc, Duration}; +use gloo_net::http::Request; +use gloo_timers::callback::Timeout; +use leptos::*; +use serde::{Deserialize, Serialize}; +use std::rc::Rc; +use wasm_bindgen::prelude::*; + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct TokenRefreshResponse { + access_token: String, + refresh_token: Option, + expires_in: i64, + token_type: String, +} + +#[derive(Debug, Clone)] +pub struct TokenManager { + storage: SecureTokenStorage, + refresh_timeout: RwSignal>, + api_base_url: String, +} + +impl TokenManager { + pub fn new(api_base_url: String) -> AuthResult { + let storage = SecureTokenStorage::new()?; + + Ok(Self { + storage, + refresh_timeout: create_rw_signal(None), + api_base_url, + }) + } + + pub fn store_token(&self, token: AuthToken) -> AuthResult<()> { + // Store the token securely + self.storage.store_token(&token)?; + + // Schedule automatic refresh + self.schedule_token_refresh(&token)?; + + Ok(()) + } + + pub fn get_current_token(&self) -> AuthResult> { + self.storage.retrieve_token() + } + + pub fn is_token_valid(&self, token: &AuthToken) -> bool { + let now = Utc::now(); + token.expires_at > now + Duration::minutes(5) // 5-minute buffer + } + + pub fn clear_token(&self) -> AuthResult<()> { + // Clear refresh timeout + self.refresh_timeout.set(None); + + // Remove token from storage + self.storage.remove_token()?; + + Ok(()) + } + + fn schedule_token_refresh(&self, token: &AuthToken) -> AuthResult<()> { + let refresh_time = token.expires_at - Duration::minutes(10); // Refresh 10 minutes before expiry + let now = Utc::now(); + + if refresh_time <= now { + // Token expires soon, refresh immediately + self.refresh_token_now(token.clone())?; + return Ok(()); + } + + let duration_ms = (refresh_time - now).num_milliseconds() as u32; + let token_clone = token.clone(); + let manager_clone = Rc::new(self.clone()); + + let timeout = Timeout::new(duration_ms, move || { + let manager = manager_clone.clone(); + let token = token_clone.clone(); + + wasm_bindgen_futures::spawn_local(async move { + if let Err(e) = manager.refresh_token_now(token).await { + web_sys::console::error_1(&format!("Token refresh failed: {}", e).into()); + } + }); + }); + + self.refresh_timeout.set(Some(timeout)); + + Ok(()) + } + + async fn refresh_token_now(&self, current_token: AuthToken) -> AuthResult { + let refresh_url = format!("{}/auth/refresh", self.api_base_url); + + let response = Request::post(&refresh_url) + .header("Content-Type", "application/json") + .header("Authorization", &format!("Bearer {}", current_token.refresh_token)) + .send() + .await + .map_err(|e| AuthError { + message: format!("Token refresh request failed: {}", e), + code: Some("REFRESH_REQUEST_ERROR".to_string()), + field: None, + })?; + + if !response.ok() { + return Err(AuthError { + message: format!("Token refresh failed with status: {}", response.status()), + code: Some("REFRESH_FAILED".to_string()), + field: None, + }); + } + + let refresh_data: TokenRefreshResponse = response.json() + .await + .map_err(|e| AuthError { + message: format!("Failed to parse refresh response: {}", e), + code: Some("REFRESH_PARSE_ERROR".to_string()), + field: None, + })?; + + let new_token = AuthToken { + access_token: refresh_data.access_token, + refresh_token: refresh_data.refresh_token.unwrap_or(current_token.refresh_token), + expires_at: Utc::now() + Duration::seconds(refresh_data.expires_in), + token_type: refresh_data.token_type, + }; + + // Store the new token and schedule next refresh + self.store_token(new_token.clone())?; + + Ok(new_token) + } + + pub async fn refresh_if_needed(&self) -> AuthResult> { + if let Some(current_token) = self.get_current_token()? { + if !self.is_token_valid(¤t_token) { + let new_token = self.refresh_token_now(current_token).await?; + return Ok(Some(new_token)); + } + return Ok(Some(current_token)); + } + Ok(None) + } + + pub fn get_auth_header(&self) -> AuthResult> { + if let Some(token) = self.get_current_token()? { + if self.is_token_valid(&token) { + return Ok(Some(format!("{} {}", token.token_type, token.access_token))); + } + } + Ok(None) + } +} + +impl Clone for TokenManager { + fn clone(&self) -> Self { + Self { + storage: SecureTokenStorage::new().expect("Failed to create storage"), + refresh_timeout: create_rw_signal(None), + api_base_url: self.api_base_url.clone(), + } + } +} + +// Global token manager context +#[derive(Clone)] +pub struct AuthContext { + pub token_manager: TokenManager, + pub auth_state: RwSignal, +} + +pub fn provide_auth_context(api_base_url: String) -> AuthResult<()> { + let token_manager = TokenManager::new(api_base_url)?; + let auth_state = create_rw_signal(crate::auth::AuthState::default()); + + // Check for existing token on initialization + if let Ok(Some(token)) = token_manager.get_current_token() { + if token_manager.is_token_valid(&token) { + auth_state.update(|state| { + state.token = Some(token); + state.is_authenticated = true; + }); + } else { + // Token exists but is invalid, try to refresh + let token_manager_clone = token_manager.clone(); + wasm_bindgen_futures::spawn_local(async move { + if let Ok(Some(new_token)) = token_manager_clone.refresh_if_needed().await { + auth_state.update(|state| { + state.token = Some(new_token); + state.is_authenticated = true; + }); + } else { + // Failed to refresh, clear token + let _ = token_manager_clone.clear_token(); + } + }); + } + } + + let context = AuthContext { + token_manager, + auth_state, + }; + + provide_context(context); + Ok(()) +} + +pub fn use_auth_context() -> AuthContext { + expect_context::() +} + +pub fn use_token_manager() -> TokenManager { + let context = use_auth_context(); + context.token_manager +} \ No newline at end of file diff --git a/control-center-ui/src/auth/webauthn.rs b/control-center-ui/src/auth/webauthn.rs new file mode 100644 index 0000000..e05819f --- /dev/null +++ b/control-center-ui/src/auth/webauthn.rs @@ -0,0 +1,525 @@ +use crate::auth::{AuthError, AuthResult}; +use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::JsFuture; +use web_sys::{ + window, AuthenticatorAttestationResponse, AuthenticatorAssertionResponse, + CredentialsContainer, PublicKeyCredential, PublicKeyCredentialCreationOptions, + PublicKeyCredentialRequestOptions, +}; +use base64::{Engine as _, engine::general_purpose}; +use js_sys::{Array, Object, Uint8Array}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WebAuthnRegistrationOptions { + pub challenge: String, + pub rp: RelyingParty, + pub user: WebAuthnUser, + pub pub_key_cred_params: Vec, + pub timeout: Option, + pub exclude_credentials: Option>, + pub authenticator_selection: Option, + pub attestation: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WebAuthnAuthenticationOptions { + pub challenge: String, + pub timeout: Option, + pub rp_id: Option, + pub allow_credentials: Option>, + pub user_verification: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RelyingParty { + pub id: String, + pub name: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WebAuthnUser { + pub id: String, + pub name: String, + pub display_name: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PubKeyCredParam { + pub type_: String, + pub alg: i32, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CredentialDescriptor { + pub type_: String, + pub id: String, + pub transports: Option>, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AuthenticatorSelection { + pub authenticator_attachment: Option, + pub resident_key: Option, + pub require_resident_key: Option, + pub user_verification: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WebAuthnRegistrationResult { + pub id: String, + pub raw_id: String, + pub type_: String, + pub response: AttestationResponse, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WebAuthnAuthenticationResult { + pub id: String, + pub raw_id: String, + pub type_: String, + pub response: AssertionResponse, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AttestationResponse { + pub client_data_json: String, + pub attestation_object: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AssertionResponse { + pub client_data_json: String, + pub authenticator_data: String, + pub signature: String, + pub user_handle: Option, +} + +pub struct WebAuthnManager; + +impl WebAuthnManager { + pub fn new() -> Self { + Self + } + + pub fn is_supported(&self) -> bool { + window() + .and_then(|w| w.navigator().credentials().ok()) + .and_then(|c| js_sys::Reflect::has(&c, &"create".into()).ok()) + .unwrap_or(false) + } + + pub async fn register_credential( + &self, + options: WebAuthnRegistrationOptions, + ) -> AuthResult { + if !self.is_supported() { + return Err(AuthError { + message: "WebAuthn is not supported in this browser".to_string(), + code: Some("WEBAUTHN_NOT_SUPPORTED".to_string()), + field: None, + }); + } + + let window = window().ok_or_else(|| AuthError { + message: "Window not available".to_string(), + code: Some("WINDOW_NOT_AVAILABLE".to_string()), + field: None, + })?; + + let credentials = window + .navigator() + .credentials() + .map_err(|_| AuthError { + message: "Credentials API not available".to_string(), + code: Some("CREDENTIALS_API_NOT_AVAILABLE".to_string()), + field: None, + })?; + + let creation_options = self.build_creation_options(options)?; + + let credential_promise = credentials + .create_with_options(&creation_options) + .map_err(|e| AuthError { + message: format!("Failed to create credential: {:?}", e), + code: Some("CREDENTIAL_CREATION_FAILED".to_string()), + field: None, + })?; + + let credential = JsFuture::from(credential_promise) + .await + .map_err(|e| AuthError { + message: format!("Credential creation promise failed: {:?}", e), + code: Some("CREDENTIAL_PROMISE_FAILED".to_string()), + field: None, + })?; + + self.parse_registration_result(credential) + } + + pub async fn authenticate_credential( + &self, + options: WebAuthnAuthenticationOptions, + ) -> AuthResult { + if !self.is_supported() { + return Err(AuthError { + message: "WebAuthn is not supported in this browser".to_string(), + code: Some("WEBAUTHN_NOT_SUPPORTED".to_string()), + field: None, + }); + } + + let window = window().ok_or_else(|| AuthError { + message: "Window not available".to_string(), + code: Some("WINDOW_NOT_AVAILABLE".to_string()), + field: None, + })?; + + let credentials = window + .navigator() + .credentials() + .map_err(|_| AuthError { + message: "Credentials API not available".to_string(), + code: Some("CREDENTIALS_API_NOT_AVAILABLE".to_string()), + field: None, + })?; + + let request_options = self.build_request_options(options)?; + + let credential_promise = credentials + .get_with_options(&request_options) + .map_err(|e| AuthError { + message: format!("Failed to get credential: {:?}", e), + code: Some("CREDENTIAL_GET_FAILED".to_string()), + field: None, + })?; + + let credential = JsFuture::from(credential_promise) + .await + .map_err(|e| AuthError { + message: format!("Credential get promise failed: {:?}", e), + code: Some("CREDENTIAL_PROMISE_FAILED".to_string()), + field: None, + })?; + + self.parse_authentication_result(credential) + } + + fn build_creation_options( + &self, + options: WebAuthnRegistrationOptions, + ) -> AuthResult { + let creation_options = PublicKeyCredentialCreationOptions::new(); + + // Set challenge + let challenge_bytes = general_purpose::STANDARD + .decode(&options.challenge) + .map_err(|e| AuthError { + message: format!("Failed to decode challenge: {}", e), + code: Some("CHALLENGE_DECODE_ERROR".to_string()), + field: None, + })?; + let challenge_array = Uint8Array::from(&challenge_bytes[..]); + creation_options.set_challenge(&challenge_array); + + // Set relying party + let rp = Object::new(); + js_sys::Reflect::set(&rp, &"id".into(), &options.rp.id.into()).unwrap(); + js_sys::Reflect::set(&rp, &"name".into(), &options.rp.name.into()).unwrap(); + creation_options.set_rp(&rp); + + // Set user + let user = Object::new(); + let user_id_bytes = general_purpose::STANDARD + .decode(&options.user.id) + .map_err(|e| AuthError { + message: format!("Failed to decode user ID: {}", e), + code: Some("USER_ID_DECODE_ERROR".to_string()), + field: None, + })?; + let user_id_array = Uint8Array::from(&user_id_bytes[..]); + js_sys::Reflect::set(&user, &"id".into(), &user_id_array).unwrap(); + js_sys::Reflect::set(&user, &"name".into(), &options.user.name.into()).unwrap(); + js_sys::Reflect::set(&user, &"displayName".into(), &options.user.display_name.into()).unwrap(); + creation_options.set_user(&user); + + // Set public key credential parameters + let cred_params = Array::new(); + for param in options.pub_key_cred_params { + let param_obj = Object::new(); + js_sys::Reflect::set(¶m_obj, &"type".into(), ¶m.type_.into()).unwrap(); + js_sys::Reflect::set(¶m_obj, &"alg".into(), ¶m.alg.into()).unwrap(); + cred_params.push(¶m_obj); + } + creation_options.set_pub_key_cred_params(&cred_params); + + // Set timeout + if let Some(timeout) = options.timeout { + creation_options.set_timeout(timeout); + } + + // Set exclude credentials + if let Some(exclude_creds) = options.exclude_credentials { + let exclude_array = Array::new(); + for cred in exclude_creds { + let cred_obj = Object::new(); + js_sys::Reflect::set(&cred_obj, &"type".into(), &cred.type_.into()).unwrap(); + + let cred_id_bytes = general_purpose::STANDARD + .decode(&cred.id) + .map_err(|e| AuthError { + message: format!("Failed to decode credential ID: {}", e), + code: Some("CRED_ID_DECODE_ERROR".to_string()), + field: None, + })?; + let cred_id_array = Uint8Array::from(&cred_id_bytes[..]); + js_sys::Reflect::set(&cred_obj, &"id".into(), &cred_id_array).unwrap(); + + if let Some(transports) = cred.transports { + let transports_array = Array::new(); + for transport in transports { + transports_array.push(&transport.into()); + } + js_sys::Reflect::set(&cred_obj, &"transports".into(), &transports_array).unwrap(); + } + + exclude_array.push(&cred_obj); + } + creation_options.set_exclude_credentials(&exclude_array); + } + + // Set authenticator selection + if let Some(auth_sel) = options.authenticator_selection { + let auth_sel_obj = Object::new(); + + if let Some(attachment) = auth_sel.authenticator_attachment { + js_sys::Reflect::set(&auth_sel_obj, &"authenticatorAttachment".into(), &attachment.into()).unwrap(); + } + + if let Some(resident_key) = auth_sel.resident_key { + js_sys::Reflect::set(&auth_sel_obj, &"residentKey".into(), &resident_key.into()).unwrap(); + } + + if let Some(require_resident_key) = auth_sel.require_resident_key { + js_sys::Reflect::set(&auth_sel_obj, &"requireResidentKey".into(), &require_resident_key.into()).unwrap(); + } + + if let Some(user_verification) = auth_sel.user_verification { + js_sys::Reflect::set(&auth_sel_obj, &"userVerification".into(), &user_verification.into()).unwrap(); + } + + creation_options.set_authenticator_selection(&auth_sel_obj); + } + + // Set attestation + if let Some(attestation) = options.attestation { + creation_options.set_attestation(&attestation.into()); + } + + Ok(creation_options) + } + + fn build_request_options( + &self, + options: WebAuthnAuthenticationOptions, + ) -> AuthResult { + let request_options = PublicKeyCredentialRequestOptions::new(); + + // Set challenge + let challenge_bytes = general_purpose::STANDARD + .decode(&options.challenge) + .map_err(|e| AuthError { + message: format!("Failed to decode challenge: {}", e), + code: Some("CHALLENGE_DECODE_ERROR".to_string()), + field: None, + })?; + let challenge_array = Uint8Array::from(&challenge_bytes[..]); + request_options.set_challenge(&challenge_array); + + // Set timeout + if let Some(timeout) = options.timeout { + request_options.set_timeout(timeout); + } + + // Set RP ID + if let Some(rp_id) = options.rp_id { + request_options.set_rp_id(&rp_id); + } + + // Set allow credentials + if let Some(allow_creds) = options.allow_credentials { + let allow_array = Array::new(); + for cred in allow_creds { + let cred_obj = Object::new(); + js_sys::Reflect::set(&cred_obj, &"type".into(), &cred.type_.into()).unwrap(); + + let cred_id_bytes = general_purpose::STANDARD + .decode(&cred.id) + .map_err(|e| AuthError { + message: format!("Failed to decode credential ID: {}", e), + code: Some("CRED_ID_DECODE_ERROR".to_string()), + field: None, + })?; + let cred_id_array = Uint8Array::from(&cred_id_bytes[..]); + js_sys::Reflect::set(&cred_obj, &"id".into(), &cred_id_array).unwrap(); + + if let Some(transports) = cred.transports { + let transports_array = Array::new(); + for transport in transports { + transports_array.push(&transport.into()); + } + js_sys::Reflect::set(&cred_obj, &"transports".into(), &transports_array).unwrap(); + } + + allow_array.push(&cred_obj); + } + request_options.set_allow_credentials(&allow_array); + } + + // Set user verification + if let Some(user_verification) = options.user_verification { + request_options.set_user_verification(&user_verification.into()); + } + + Ok(request_options) + } + + fn parse_registration_result( + &self, + credential: JsValue, + ) -> AuthResult { + let credential: PublicKeyCredential = credential + .dyn_into() + .map_err(|_| AuthError { + message: "Invalid credential type".to_string(), + code: Some("INVALID_CREDENTIAL_TYPE".to_string()), + field: None, + })?; + + let response: AuthenticatorAttestationResponse = credential + .response() + .dyn_into() + .map_err(|_| AuthError { + message: "Invalid response type".to_string(), + code: Some("INVALID_RESPONSE_TYPE".to_string()), + field: None, + })?; + + let id = credential.id(); + let raw_id = general_purpose::STANDARD.encode(Uint8Array::from(credential.raw_id()).to_vec()); + let type_ = credential.type_(); + + let client_data_json = general_purpose::STANDARD.encode( + Uint8Array::from(response.client_data_json()).to_vec() + ); + let attestation_object = general_purpose::STANDARD.encode( + Uint8Array::from(response.attestation_object()).to_vec() + ); + + Ok(WebAuthnRegistrationResult { + id, + raw_id, + type_, + response: AttestationResponse { + client_data_json, + attestation_object, + }, + }) + } + + fn parse_authentication_result( + &self, + credential: JsValue, + ) -> AuthResult { + let credential: PublicKeyCredential = credential + .dyn_into() + .map_err(|_| AuthError { + message: "Invalid credential type".to_string(), + code: Some("INVALID_CREDENTIAL_TYPE".to_string()), + field: None, + })?; + + let response: AuthenticatorAssertionResponse = credential + .response() + .dyn_into() + .map_err(|_| AuthError { + message: "Invalid response type".to_string(), + code: Some("INVALID_RESPONSE_TYPE".to_string()), + field: None, + })?; + + let id = credential.id(); + let raw_id = general_purpose::STANDARD.encode(Uint8Array::from(credential.raw_id()).to_vec()); + let type_ = credential.type_(); + + let client_data_json = general_purpose::STANDARD.encode( + Uint8Array::from(response.client_data_json()).to_vec() + ); + let authenticator_data = general_purpose::STANDARD.encode( + Uint8Array::from(response.authenticator_data()).to_vec() + ); + let signature = general_purpose::STANDARD.encode( + Uint8Array::from(response.signature()).to_vec() + ); + + let user_handle = response.user_handle().map(|handle| { + general_purpose::STANDARD.encode(Uint8Array::from(handle).to_vec()) + }); + + Ok(WebAuthnAuthenticationResult { + id, + raw_id, + type_, + response: AssertionResponse { + client_data_json, + authenticator_data, + signature, + user_handle, + }, + }) + } + + pub fn get_supported_authenticator_types(&self) -> Vec { + let mut types = Vec::new(); + + if self.is_platform_authenticator_available() { + types.push("platform".to_string()); + } + + if self.is_cross_platform_authenticator_available() { + types.push("cross-platform".to_string()); + } + + types + } + + pub fn is_platform_authenticator_available(&self) -> bool { + // Check if platform authenticator (like Touch ID, Face ID, Windows Hello) is available + window() + .and_then(|w| { + let promise = js_sys::Reflect::get(&w.navigator(), &"credentials".into()) + .ok() + .and_then(|creds| { + js_sys::Reflect::get(&creds, &"isUserVerifyingPlatformAuthenticatorAvailable".into()) + .ok() + }); + + promise.and_then(|func| { + if func.is_function() { + // This would normally return a Promise, but for simplicity + // we'll return true if the function exists + Some(true) + } else { + None + } + }) + }) + .unwrap_or(false) + } + + pub fn is_cross_platform_authenticator_available(&self) -> bool { + // Cross-platform authenticators (USB security keys) are generally available + // if WebAuthn is supported + self.is_supported() + } +} \ No newline at end of file diff --git a/control-center-ui/src/components/audit/AuditLogViewer.tsx b/control-center-ui/src/components/audit/AuditLogViewer.tsx new file mode 100644 index 0000000..3672a1b --- /dev/null +++ b/control-center-ui/src/components/audit/AuditLogViewer.tsx @@ -0,0 +1,433 @@ +import React, { useState, useCallback, useEffect } from 'react'; +import { useInfiniteQuery, useQuery } from '@tanstack/react-query'; +import { useParams, useNavigate } from 'react-router-dom'; +import { toast } from 'react-toastify'; +import { + Download, + RefreshCw, + Settings, + AlertCircle, + Activity, + TrendingUp, + Clock, + Users, + Shield +} from 'lucide-react'; + +import { SearchFilters } from './SearchFilters'; +import { VirtualizedLogTable } from './VirtualizedLogTable'; +import { LogDetailModal } from './LogDetailModal'; +import { ExportModal } from './ExportModal'; +import { RealTimeIndicator } from './RealTimeIndicator'; +import { useWebSocket } from '@/hooks/useWebSocket'; +import auditApi from '@/services/api'; +import { + AuditLogEntry, + AuditSearchFilters, + SavedSearch, + AuditDashboardStats, + AuditExportRequest +} from '@/types/audit'; + +const WEBSOCKET_URL = process.env.NODE_ENV === 'production' + ? `wss://${window.location.host}/ws/audit` + : 'ws://localhost:8080/ws/audit'; + +export const AuditLogViewer: React.FC = () => { + const { logId } = useParams<{ logId?: string }>(); + const navigate = useNavigate(); + + // Component state + const [filters, setFilters] = useState({ + dateRange: {}, + users: [], + actions: [], + resources: [], + severity: [], + complianceFrameworks: [], + tags: [] + }); + + const [selectedLogIds, setSelectedLogIds] = useState>(new Set()); + const [selectedLog, setSelectedLog] = useState(null); + const [isDetailModalOpen, setIsDetailModalOpen] = useState(false); + const [isExportModalOpen, setIsExportModalOpen] = useState(false); + const [realTimeEnabled, setRealTimeEnabled] = useState(true); + const [newLogCount, setNewLogCount] = useState(0); + const [realtimeQueue, setRealtimeQueue] = useState([]); + + // Fetch logs with infinite query for pagination + const { + data: logsData, + fetchNextPage, + hasNextPage, + isFetchingNextPage, + isLoading: isLogsLoading, + refetch: refetchLogs, + error: logsError + } = useInfiniteQuery({ + queryKey: ['auditLogs', filters], + queryFn: ({ pageParam = 0 }) => + auditApi.getLogs(filters, pageParam, 50), + getNextPageParam: (lastPage) => + lastPage.hasMore ? lastPage.page + 1 : undefined, + staleTime: 30 * 1000, // 30 seconds + enabled: true, + refetchOnWindowFocus: false + }); + + // Fetch saved searches + const { data: savedSearches = [] } = useQuery({ + queryKey: ['savedSearches'], + queryFn: () => auditApi.getSavedSearches(), + staleTime: 5 * 60 * 1000 + }); + + // Fetch dashboard stats + const { data: dashboardStats } = useQuery({ + queryKey: ['dashboardStats'], + queryFn: () => auditApi.getDashboardStats(), + refetchInterval: 30 * 1000 // Refresh every 30 seconds + }); + + // Flatten logs from all pages + const allLogs = React.useMemo(() => { + if (!logsData) return []; + return [ + ...realtimeQueue, // New logs from WebSocket at the top + ...logsData.pages.flatMap(page => page.logs) + ]; + }, [logsData, realtimeQueue]); + + const totalCount = logsData?.pages[0]?.total || 0; + + // WebSocket for real-time updates + const { isConnected, lastMessage, reconnect, readyState, reconnectAttempts } = useWebSocket({ + url: WEBSOCKET_URL, + shouldReconnect: realTimeEnabled, + onNewAuditLog: (log: AuditLogEntry) => { + if (realTimeEnabled) { + setRealtimeQueue(prev => [log, ...prev.slice(0, 49)]); // Keep last 50 realtime logs + setNewLogCount(prev => prev + 1); + + // Show toast for critical severity logs + if (log.severity === 'critical') { + toast.error(`Critical audit event: ${log.action.description}`, { + position: 'top-right', + autoClose: 10000 + }); + } + } + }, + onComplianceAlert: (alert: any) => { + toast.warning(`Compliance alert: ${alert.message}`, { + position: 'top-right', + autoClose: 8000 + }); + }, + onError: (error) => { + console.error('WebSocket error:', error); + toast.error('Real-time connection error'); + } + }); + + // Load specific log from URL parameter + useEffect(() => { + if (logId) { + auditApi.getLog(logId) + .then(log => { + setSelectedLog(log); + setIsDetailModalOpen(true); + }) + .catch(error => { + toast.error(`Failed to load log: ${error.message}`); + navigate('/audit'); + }); + } + }, [logId, navigate]); + + // Reset new log count when real-time is disabled or filters change + useEffect(() => { + setNewLogCount(0); + setRealtimeQueue([]); + }, [realTimeEnabled, filters]); + + // Handle filter changes + const handleFiltersChange = useCallback((newFilters: AuditSearchFilters) => { + setFilters(newFilters); + setNewLogCount(0); + setRealtimeQueue([]); + }, []); + + // Handle save search + const handleSaveSearch = useCallback(async (name: string, description?: string) => { + try { + await auditApi.createSavedSearch({ + name, + description, + filters, + isPublic: false, + createdBy: 'current-user' // This would come from auth context + }); + toast.success('Search saved successfully'); + } catch (error) { + toast.error('Failed to save search'); + } + }, [filters]); + + // Handle load saved search + const handleLoadSavedSearch = useCallback((search: SavedSearch) => { + setFilters(search.filters); + toast.success(`Loaded search: ${search.name}`); + }, []); + + // Handle row click + const handleRowClick = useCallback((log: AuditLogEntry) => { + setSelectedLog(log); + setIsDetailModalOpen(true); + navigate(`/audit/${log.id}`, { replace: true }); + }, [navigate]); + + // Handle modal close + const handleCloseDetailModal = useCallback(() => { + setIsDetailModalOpen(false); + setSelectedLog(null); + navigate('/audit', { replace: true }); + }, [navigate]); + + // Handle view correlated logs + const handleViewCorrelated = useCallback(async (requestId: string) => { + try { + const correlatedLogs = await auditApi.getCorrelatedLogs(requestId); + // Set filters to show only correlated logs + setFilters({ + ...filters, + requestId + }); + handleCloseDetailModal(); + toast.success(`Found ${correlatedLogs.length} correlated logs`); + } catch (error) { + toast.error('Failed to load correlated logs'); + } + }, [filters, handleCloseDetailModal]); + + // Handle view session logs + const handleViewSession = useCallback(async (sessionId: string) => { + try { + const sessionLogs = await auditApi.getLogsBySession(sessionId); + setFilters({ + ...filters, + sessionId + }); + handleCloseDetailModal(); + toast.success(`Found ${sessionLogs.length} session logs`); + } catch (error) { + toast.error('Failed to load session logs'); + } + }, [filters, handleCloseDetailModal]); + + // Handle export + const handleExport = useCallback(async (request: AuditExportRequest) => { + try { + const blob = await auditApi.exportLogs({ + ...request, + filters + }); + return blob; + } catch (error) { + toast.error('Export failed'); + throw error; + } + }, [filters]); + + // Handle real-time toggle + const handleToggleRealTime = useCallback(() => { + setRealTimeEnabled(prev => !prev); + if (!realTimeEnabled) { + setNewLogCount(0); + } + }, [realTimeEnabled]); + + // Handle refresh + const handleRefresh = useCallback(() => { + refetchLogs(); + setNewLogCount(0); + setRealtimeQueue([]); + }, [refetchLogs]); + + if (logsError) { + return ( +
+ +

Error Loading Logs

+

+ {logsError.message || 'An unexpected error occurred while loading audit logs.'} +

+ +
+ ); + } + + return ( +
+ {/* Dashboard Stats */} + {dashboardStats && ( +
+
+
+
+

Total Events

+

{dashboardStats.totalEvents.toLocaleString()}

+
+ +
+
+
+
+
+

Success Rate

+

{(dashboardStats.successRate * 100).toFixed(1)}%

+
+ +
+
+
+
+
+

Critical Events

+

{dashboardStats.criticalEvents}

+
+ +
+
+
+
+
+

Compliance Score

+

{dashboardStats.complianceScore}%

+
+ +
+
+
+ )} + + {/* Controls Bar */} +
+
+ +
+ +
+ + + + + {selectedLogIds.size > 0 && ( +
+ + {selectedLogIds.size} selected + + +
+ )} +
+
+ + {/* Search Filters */} + + + {/* Results Info */} + {!isLogsLoading && ( +
+
+ + Showing {allLogs.length.toLocaleString()} of {totalCount.toLocaleString()} logs + + {newLogCount > 0 && ( + + ({newLogCount} new in real-time) + + )} +
+ {isConnected && ( +
+
+ Live +
+ )} +
+ )} + + {/* Log Table */} + + + {/* Log Detail Modal */} + + + {/* Export Modal */} + setIsExportModalOpen(false)} + logs={allLogs} + filters={filters} + totalCount={totalCount} + onExport={handleExport} + /> +
+ ); +}; + +export default AuditLogViewer; \ No newline at end of file diff --git a/control-center-ui/src/components/audit/ComplianceReportGenerator.tsx b/control-center-ui/src/components/audit/ComplianceReportGenerator.tsx new file mode 100644 index 0000000..4e3bdd3 --- /dev/null +++ b/control-center-ui/src/components/audit/ComplianceReportGenerator.tsx @@ -0,0 +1,668 @@ +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { useForm, Controller } from 'react-hook-form'; +import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { format, subDays, startOfMonth, endOfMonth, startOfQuarter, endOfQuarter, startOfYear, endOfYear } from 'date-fns'; +import { + FileText, + Download, + Calendar, + Shield, + AlertTriangle, + CheckCircle, + Clock, + Settings, + X, + Play, + RefreshCw, + Eye, + Filter +} from 'lucide-react'; +import { toast } from 'react-toastify'; +import auditApi from '@/services/api'; +import { ComplianceReport } from '@/types/audit'; + +interface ReportGeneratorProps { + isOpen: boolean; + onClose: () => void; +} + +interface FormData { + type: 'soc2' | 'hipaa' | 'pci' | 'gdpr' | 'custom'; + startDate: string; + endDate: string; + template: string; + includeFindings: boolean; + includeRecommendations: boolean; + includeEvidence: boolean; + executiveSummary: boolean; + customTitle: string; + customDescription: string; +} + +const complianceFrameworks = [ + { + value: 'soc2' as const, + label: 'SOC 2 Type II', + description: 'Service Organization Control 2 Type II assessment', + icon: Shield, + color: 'text-blue-600', + requirements: ['Trust Services Criteria', 'Security', 'Availability', 'Confidentiality', 'Processing Integrity', 'Privacy'] + }, + { + value: 'hipaa' as const, + label: 'HIPAA', + description: 'Health Insurance Portability and Accountability Act', + icon: Shield, + color: 'text-green-600', + requirements: ['Administrative Safeguards', 'Physical Safeguards', 'Technical Safeguards', 'Breach Notification'] + }, + { + value: 'pci' as const, + label: 'PCI DSS', + description: 'Payment Card Industry Data Security Standard', + icon: Shield, + color: 'text-purple-600', + requirements: ['Network Security', 'Cardholder Data Protection', 'Vulnerability Management', 'Access Control'] + }, + { + value: 'gdpr' as const, + label: 'GDPR', + description: 'General Data Protection Regulation', + icon: Shield, + color: 'text-indigo-600', + requirements: ['Data Minimization', 'Consent Management', 'Data Subject Rights', 'Breach Notification'] + }, + { + value: 'custom' as const, + label: 'Custom Report', + description: 'Create a custom compliance report', + icon: FileText, + color: 'text-gray-600', + requirements: ['Flexible Requirements', 'Custom Controls', 'Tailored Assessment'] + } +]; + +const predefinedPeriods = [ + { + label: 'Last 7 days', + getValue: () => ({ + start: format(subDays(new Date(), 7), 'yyyy-MM-dd'), + end: format(new Date(), 'yyyy-MM-dd') + }) + }, + { + label: 'Last 30 days', + getValue: () => ({ + start: format(subDays(new Date(), 30), 'yyyy-MM-dd'), + end: format(new Date(), 'yyyy-MM-dd') + }) + }, + { + label: 'Current Month', + getValue: () => ({ + start: format(startOfMonth(new Date()), 'yyyy-MM-dd'), + end: format(endOfMonth(new Date()), 'yyyy-MM-dd') + }) + }, + { + label: 'Current Quarter', + getValue: () => ({ + start: format(startOfQuarter(new Date()), 'yyyy-MM-dd'), + end: format(endOfQuarter(new Date()), 'yyyy-MM-dd') + }) + }, + { + label: 'Current Year', + getValue: () => ({ + start: format(startOfYear(new Date()), 'yyyy-MM-dd'), + end: format(endOfYear(new Date()), 'yyyy-MM-dd') + }) + } +]; + +export const ComplianceReportGenerator: React.FC = ({ + isOpen, + onClose +}) => { + const queryClient = useQueryClient(); + const [generatingReportId, setGeneratingReportId] = useState(null); + + const { control, watch, setValue, getValues, handleSubmit } = useForm({ + defaultValues: { + type: 'soc2', + startDate: format(subDays(new Date(), 30), 'yyyy-MM-dd'), + endDate: format(new Date(), 'yyyy-MM-dd'), + template: 'standard', + includeFindings: true, + includeRecommendations: true, + includeEvidence: true, + executiveSummary: true, + customTitle: '', + customDescription: '' + } + }); + + const watchedType = watch('type'); + + // Fetch available templates + const { data: templates = [] } = useQuery({ + queryKey: ['complianceTemplates'], + queryFn: () => auditApi.getComplianceTemplates(), + enabled: isOpen + }); + + // Fetch existing reports + const { data: existingReports = [], refetch: refetchReports } = useQuery({ + queryKey: ['complianceReports'], + queryFn: () => auditApi.getComplianceReports(), + enabled: isOpen + }); + + // Generate report mutation + const generateReportMutation = useMutation({ + mutationFn: (data: { type: FormData['type'], period: { start: Date; end: Date }, template?: string }) => + auditApi.generateComplianceReport(data.type, data.period, data.template), + onSuccess: (result) => { + setGeneratingReportId(result.reportId); + toast.success('Report generation started'); + + // Poll for completion + const pollInterval = setInterval(async () => { + try { + const report = await auditApi.getComplianceReport(result.reportId); + if (report) { + clearInterval(pollInterval); + setGeneratingReportId(null); + queryClient.invalidateQueries({ queryKey: ['complianceReports'] }); + toast.success('Report generated successfully'); + } + } catch (error) { + // Report might not be ready yet, continue polling + } + }, 2000); + + // Stop polling after 5 minutes + setTimeout(() => { + clearInterval(pollInterval); + setGeneratingReportId(null); + }, 5 * 60 * 1000); + }, + onError: (error) => { + toast.error('Failed to generate report'); + setGeneratingReportId(null); + } + }); + + const selectedFramework = complianceFrameworks.find(f => f.value === watchedType); + + const handlePeriodSelect = (period: { start: string; end: string }) => { + setValue('startDate', period.start); + setValue('endDate', period.end); + }; + + const onSubmit = (data: FormData) => { + generateReportMutation.mutate({ + type: data.type, + period: { + start: new Date(data.startDate), + end: new Date(data.endDate) + }, + template: data.template + }); + }; + + const handleDownloadReport = async (report: ComplianceReport) => { + try { + const blob = await auditApi.exportLogs({ + format: 'pdf', + filters: { + dateRange: { + start: report.period.start, + end: report.period.end + }, + complianceFrameworks: [report.type] + }, + includeMetadata: true, + includeCompliance: true, + template: `compliance_${report.type}` + }); + + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `${report.type}_compliance_report_${format(new Date(), 'yyyy-MM-dd')}.pdf`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + + toast.success('Report downloaded successfully'); + } catch (error) { + toast.error('Failed to download report'); + } + }; + + if (!isOpen) return null; + + return ( + + + + {/* Header */} +
+
+

+ Compliance Report Generator +

+

+ Generate comprehensive compliance reports for various frameworks +

+
+ +
+ +
+ {/* Configuration Panel */} +
+
+ {/* Framework Selection */} +
+

+ + Compliance Framework +

+ ( +
+ {complianceFrameworks.map((framework) => { + const Icon = framework.icon; + return ( + + ); + })} +
+ )} + /> +
+ + {/* Time Period */} +
+

+ + Reporting Period +

+ + {/* Quick Period Selection */} +
+ {predefinedPeriods.map((period) => ( + + ))} +
+ +
+ ( +
+ + +
+ )} + /> + ( +
+ + +
+ )} + /> +
+
+ + {/* Template Selection */} +
+

+ + Report Template +

+ ( + + )} + /> +
+ + {/* Report Options */} +
+

+ + Report Options +

+
+ ( + + )} + /> + ( + + )} + /> + ( + + )} + /> + ( + + )} + /> +
+
+ + {/* Custom Fields for Custom Reports */} + {watchedType === 'custom' && ( +
+

Custom Report Details

+
+ ( +
+ + +
+ )} + /> + ( +
+ +

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