commit eeb6174de0b806b04ffc0dec5353d2ee67f8e36f Author: Bao Date: Tue Jun 9 16:31:42 2026 +0200 Initial commit: Nexus Mission Control Platform - ASP.NET Core 10 Backend (JWT Auth, Agent config API) - Vue 3 Frontend (Dashboard, Team, Agents, Config Editor) - PostgreSQL Database - Docker Compose setup - Mission Control Dashboard redesign diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..1dcc95a --- /dev/null +++ b/.env.example @@ -0,0 +1,12 @@ +POSTGRES_DB=nexus +POSTGRES_USER=nexus +POSTGRES_PASSWORD=replace-with-a-strong-database-password +JWT_KEY=replace-with-at-least-32-random-bytes +OWNER_EMAIL=owner@example.com +OWNER_PASSWORD=replace-with-at-least-14-characters +OWNER_DISPLAY_NAME=Owner +OPENCLAW_BASE_URL=http://host.docker.internal:18789 +OPENCLAW_GATEWAY_TOKEN= +OPENCLAW_GATEWAY_PASSWORD= +OLLAMA_BASE_URL=http://host.docker.internal:11434 +NVIDIA_API_KEY= diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..cf01fd4 --- /dev/null +++ b/.env.template @@ -0,0 +1,27 @@ +# Nexus Production Environment Configuration +# Copy this file to .env and fill in all values before deploying. + +# ── PostgreSQL ────────────────────────────────────────── +POSTGRES_DB=nexus +POSTGRES_USER=nexus +POSTGRES_PASSWORD=*** + +# ── Connection String (inferred from above when using compose) ── +# ConnectionStrings__Nexus=Host=localhost;Database=${POSTGRES_DB};Username=${POSTGRES_USER};Password=${POSTGRES_PASSWORD} + +# ── JWT ───────────────────────────────────────────────── +# Generate with: openssl rand -base64 48 +JWT_KEY=*** # at least 32 bytes (base64-encoded) +JWT_ISSUER=nexus +JWT_AUDIENCE=nexus-web + +# ── Owner Account ─────────────────────────────────────── +OWNER_EMAIL=*** +OWNER_PASSWORD=*** # at least 14 characters; leave empty for auto-generated +OWNER_DISPLAY_NAME=*** # leave empty for auto-generated from email + +# ── OpenClaw Integration ──────────────────────────────── +# Base URL of the OpenClaw gateway (host.docker.internal from inside container) +OPENCLAW_BASE_URL=http://host.docker.internal:18789 +OPENCLAW_GATEWAY_TOKEN=*** +OPENCLAW_GATEWAY_PASSWORD=*** diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..475f9b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# Nexus .gitignore + +# Build outputs +backend/bin/ +backend/obj/ +frontend/dist/ +frontend/node_modules/ + +# Environment +.env +!.env.example + +# IDE +.idea/ +.vs/ +.vscode/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Docker +docker-compose.override.yml + +# Logs +*.log + +# OS temp +*.tmp diff --git a/DEPLOYMENT_PLAN.md b/DEPLOYMENT_PLAN.md new file mode 100644 index 0000000..e3fc2ff --- /dev/null +++ b/DEPLOYMENT_PLAN.md @@ -0,0 +1,155 @@ +# Nexus Phase 1 Deployment Plan + +> Generiert: 2026-06-09T02:49 CEST | Agent: architekt + +## Status: ✅ Bereit zum Deployment + +### Build-Artefakte + +| Komponente | Build-Methode | Status | +|---|---|---| +| Backend | Docker Multi-Stage (`dotnet publish` in Container) | ✅ Dockerfile bereit | +| Frontend | Docker Multi-Stage (`pnpm build` in Container) | ✅ Dockerfile bereit | +| Compose | `compose.yaml` | ✅ 3 Services definiert | +| Env | `.env` | ✅ Alle Secrets gesetzt | + +### Architektur + +``` +┌──────────────────────────────────────────────────────┐ +│ VPS Host (Debian 12) │ +│ ┌───────────────────────────────────────────────┐ │ +│ │ Docker Network: nexus │ │ +│ │ ┌─────────┐ ┌──────────┐ ┌────────────┐ │ │ +│ │ │postgres │ │ api │ │ web │ │ │ +│ │ │ :5432 │ │ :8080 │ │ :80 │ │ │ +│ │ │ 17-alp. │ │ .NET 10 │ │ nginx 1.27 │ │ │ +│ │ └─────────┘ └──────────┘ └─────┬──────┘ │ │ +│ │ │ │ │ +│ └───────────────────────────────────┼───────────┘ │ +│ │ │ +│ 127.0.0.1:18880 │ +│ │ │ +│ ┌───────────────────────────┼───────────────────┐ │ +│ │ Host nginx reverse proxy │ │ │ +│ │ nexus.noveria.net :443 ───┘ │ │ +│ └───────────────────────────────────────────────┘ │ +│ │ +│ ┌───────────────────────────────────────────────┐ │ +│ │ OpenClaw Gateway (Container) │ │ +│ │ Port 18789 ← host.docker.internal │ │ +│ └───────────────────────────────────────────────┘ │ +└──────────────────────────────────────────────────────┘ +``` + +--- + +## 1. Deployment (vom VPS-Host ausführen) + +```bash +# Ins Nexus-Verzeichnis wechseln +cd /opt/openclaw/data/openclaw/workspace/nexus + +# Prüfen ob compose.yaml und .env da sind +ls -la compose.yaml .env + +# Deployment starten +docker compose up -d --build + +# Logs verfolgen +docker compose logs -f +``` + +**Erwartet:** +- 3 Container starten: `postgres`, `api`, `web` +- PostgreSQL wird healthy +- API migriert Datenbank und seedet Owner-Account +- Web (nginx) lauscht auf `127.0.0.1:18880` + +--- + +## 2. Post-Deployment-Verifikation + +### 2.1 Health Check +```bash +curl -s https://nexus.noveria.net/health | jq +``` +Erwartet: JSON mit `status: "Healthy"`, DB-Check `healthy`, OpenClaw-Check Status. + +### 2.2 Agent-Inventar +```bash +curl -s https://nexus.noveria.net/api/v1/agents | jq +``` +Erwartet: Array von Agenten oder leere Liste (404/401 möglich vor Login). + +### 2.3 SPA-Routing +```bash +curl -sI https://nexus.noveria.net/dashboard | head -20 +``` +Erwartet: HTTP 200, `content-type: text/html` (nginx liefert `index.html` für alle Routes). + +### 2.4 API-Dokumentation +```bash +curl -sI https://nexus.noveria.net/swagger/index.html +``` + +### 2.5 Container-Status +```bash +docker compose ps +``` +Erwartet: Alle 3 Services `Up` (healthy). + +--- + +## 3. Gateway-Neustart + +Nach erfolgreichem Deployment muss der OpenClaw-Gateway neu gestartet werden, damit der Researcher-Agent aktiv wird. + +⚠️ **Kein `docker restart` möglich** — kein Docker-Socket im Gateway-Container. + +**Im Gateway-Container (über OpenClaw-Session):** +```bash +PID=$(pgrep -f "node dist/index.js gateway" | head -1) +kill -HUP $PID +``` + +> Der Gateway-Container hat `restart: unless-stopped` in seiner eigenen Compose-Konfiguration. Ein `kill` (SIGTERM) auf den Node-Prozess führt automatisch zum Container-Neustart via Docker. Für graceful reload ist `kill -HUP` bevorzugt. + +--- + +## 4. Troubleshooting + +### API startet nicht +```bash +docker compose logs api +``` +Häufige Ursachen: +- PostgreSQL nicht healthy → `docker compose logs postgres` +- JWT_KEY / DB-Passwort falsch + +### Web nicht erreichbar +```bash +# Prüfen ob nginx im Container läuft +docker compose exec web nginx -t +# Prüfen ob Port gebunden ist +ss -tlnp | grep 18880 +``` + +### Host nginx Reverse Proxy +Falls `nexus.noveria.net` nicht erreichbar: +- Host nginx Config prüfen: Proxy-Pass auf `http://127.0.0.1:18880` +- TLS-Zertifikat gültig? + +--- + +## Abhängigkeiten + +| Was | Status | +|---|---| +| compose.yaml | ✅ Vorhanden | +| .env mit Secrets | ✅ Vorhanden | +| backend/Dockerfile | ✅ Multi-Stage .NET 10 | +| frontend/Dockerfile | ✅ Multi-Stage Node 24 + nginx | +| frontend/nginx.conf | ✅ CSP, Proxy, SPA-Routing | +| Host nginx Reverse Proxy | ⚠️ Muss auf Port 18880 zeigen | +| Docker installiert auf VPS | ⚠️ Vorausgesetzt | diff --git a/README.md b/README.md new file mode 100644 index 0000000..31a162a --- /dev/null +++ b/README.md @@ -0,0 +1,101 @@ +# Nexus + +Nexus is the operations platform for the Noveria ecosystem. OpenClaw is an +adapter-backed agent runtime, not a dependency of the frontend or domain model. + +## Current foundation + +- Vue 3, TypeScript, Pinia, Vue Router and Tailwind CSS +- ASP.NET Core 10 REST API +- Entity Framework Core and PostgreSQL +- JWT owner authentication with rotating refresh sessions +- `IAgentRuntime` abstraction with an OpenClaw adapter +- `IModelProvider` abstractions for Ollama and NVIDIA +- Responsive dark-mode operations dashboard +- Container-only entry point on `127.0.0.1:18880` + +## Local/container start + +```bash +cp .env.example .env +# Replace every placeholder, especially POSTGRES_PASSWORD, JWT_KEY, +# OWNER_EMAIL and OWNER_PASSWORD. +docker compose up --build -d +curl http://127.0.0.1:18880/health +``` + +On an empty database the API creates exactly one owner from `OWNER_EMAIL`, +`OWNER_PASSWORD` and `OWNER_DISPLAY_NAME`. The password must contain at least 14 +characters. Existing databases are never overwritten by the bootstrap process. + +The web service is loopback-only. Public reverse-proxy activation for +`nexus.noveria.net` remains a separate infrastructure change and must terminate +TLS before forwarding to port `18880`. + +## Authentication + +- Passwords use versioned PBKDF2-SHA256 hashes with random salts and 210,000 iterations. +- Access tokens expire after 15 minutes and are held only in browser memory. +- Refresh tokens are random, stored only as SHA-256 hashes in PostgreSQL, rotated on use and checked for reuse. +- The browser receives the refresh token only as a `HttpOnly`, `Secure`, `SameSite=Strict` cookie. +- Login and refresh endpoints are rate-limited per forwarded client IP. +- All `/api/v1` operations routes require a valid access token; `/health` remains public. +- Swagger is enabled only in the Development environment. + +## Security + +- Never commit `.env`. +- Generate `JWT_KEY` from at least 32 random bytes. +- Rotate any credential that has appeared in chat before using it. +- Do not expose PostgreSQL or the API container directly. +- Keep OpenClaw behind the `IAgentRuntime` contract. +- Keep the API reachable only through the bundled web proxy or another trusted reverse proxy. + +## Implemented Phase 1 modules + +The SPA uses history-mode routes: + +- `/login` owner login +- `/dashboard` operations snapshot +- `/projects` project portfolio +- `/tasks` task board +- `/agents` runtime and agent inventory +- `/models` provider routing status +- `/activity` audit timeline +- `/chat` mobile owner-chat preview +- `/settings` runtime and provider overview + +The API currently exposes: + +- `POST /api/v1/auth/login` +- `POST /api/v1/auth/refresh` +- `POST /api/v1/auth/logout` +- `GET /api/v1/auth/me` +- `GET /api/v1/operations/snapshot` +- `GET|POST /api/v1/projects` +- `GET|POST /api/v1/tasks` +- `PATCH /api/v1/tasks/{id}/state` +- `GET /api/v1/activity` +- `GET /api/v1/agents` +- `GET /api/v1/models` +- `GET /health` + +Project and task mutations create activity records. The API applies committed EF +Core migrations after PostgreSQL becomes healthy. No destructive endpoints are +implemented. + +## Runtime chat and model routing + +`POST /api/v1/chat` routes authenticated owner messages through the +`IAgentRuntime` contract. The browser never receives a Gateway password or model +provider key. Conversation IDs are stable per browser and Iris is the default +agent target. + +The configured model-routing policy is: + +1. `qwen3:4b` through Ollama for routine and monitoring work +2. `moonshotai/kimi-k2.6` through NVIDIA for primary work +3. `gpt-5.5` through OpenClaw for strategic and critical review + +The Settings module reports runtime and provider state without exposing +credentials. diff --git a/backend-tests/AgentServiceTests.cs b/backend-tests/AgentServiceTests.cs new file mode 100644 index 0000000..ae1f572 --- /dev/null +++ b/backend-tests/AgentServiceTests.cs @@ -0,0 +1,78 @@ +using Nexus.Api.Services; +using Nexus.Api.Integrations; +using Nexus.Api.Domain; +using Microsoft.Extensions.Configuration; +using Xunit; + +namespace Nexus.Api.Tests; + +public class AgentServiceTests +{ + [Fact] + public async Task GetAgentsAsync_ReturnsCorrectCount() + { + var config = new ConfigurationBuilder() + .AddInMemoryCollection(new Dictionary + { + ["AgentConfigPath"] = "/home/node/.openclaw/openclaw.json" + }) + .Build(); + var runtime = new FakeRuntime(); + var service = new AgentService(config, runtime); + + var agents = await service.GetAgentsAsync(CancellationToken.None); + Assert.True(agents.Count >= 4, $"Expected at least 4 agents, got {agents.Count}"); + } + + [Fact] + public async Task GetAgentAsync_Iris_ReturnsOrchestrator() + { + var config = new ConfigurationBuilder() + .AddInMemoryCollection(new Dictionary + { + ["AgentConfigPath"] = "/home/node/.openclaw/openclaw.json" + }) + .Build(); + var runtime = new FakeRuntime(); + var service = new AgentService(config, runtime); + + var agent = await service.GetAgentAsync("iris", CancellationToken.None); + Assert.NotNull(agent); + Assert.Equal("Orchestrator", agent.Role); + } + + [Fact] + public async Task GetAgentAsync_Unknown_ReturnsNull() + { + var config = new ConfigurationBuilder() + .AddInMemoryCollection(new Dictionary + { + ["AgentConfigPath"] = "/home/node/.openclaw/openclaw.json" + }) + .Build(); + var runtime = new FakeRuntime(); + var service = new AgentService(config, runtime); + + var agent = await service.GetAgentAsync("nonexistent", CancellationToken.None); + Assert.Null(agent); + } +} + +public sealed class FakeRuntime : IAgentRuntime +{ + public string Name => "FakeRuntime"; + + public Task GetStatusAsync(CancellationToken cancellationToken = default) + => Task.FromResult(new AgentRuntimeStatus( + Runtime: "OpenClaw", + Status: OperationalStatus.Online, + Latency: TimeSpan.FromMilliseconds(10), + Detail: "Fake runtime for testing")); + + public Task ChatAsync(string message, string conversationId, string agentId, CancellationToken cancellationToken = default) + => Task.FromResult(new AgentChatResult( + Runtime: "OpenClaw", + AgentId: agentId, + ConversationId: conversationId, + Content: "Echo: " + message)); +} diff --git a/backend-tests/Nexus.Api.Tests.csproj b/backend-tests/Nexus.Api.Tests.csproj new file mode 100644 index 0000000..202ccb2 --- /dev/null +++ b/backend-tests/Nexus.Api.Tests.csproj @@ -0,0 +1,24 @@ + + + + net10.0 + enable + enable + false + true + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/backend-tests/bin/Debug/net10.0/.msCoverageSourceRootsMapping_Nexus.Api.Tests b/backend-tests/bin/Debug/net10.0/.msCoverageSourceRootsMapping_Nexus.Api.Tests new file mode 100644 index 0000000..19c4b73 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/.msCoverageSourceRootsMapping_Nexus.Api.Tests differ diff --git a/backend-tests/bin/Debug/net10.0/HealthChecks.NpgSql.dll b/backend-tests/bin/Debug/net10.0/HealthChecks.NpgSql.dll new file mode 100755 index 0000000..3c061a9 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/HealthChecks.NpgSql.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll b/backend-tests/bin/Debug/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll new file mode 100755 index 0000000..d1474c0 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll b/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll new file mode 100755 index 0000000..18fb191 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Relational.dll b/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Relational.dll new file mode 100755 index 0000000..7464efc Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Relational.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.dll b/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.dll new file mode 100755 index 0000000..8092894 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Abstractions.dll b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Abstractions.dll new file mode 100755 index 0000000..e981f87 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Abstractions.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.JsonWebTokens.dll b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.JsonWebTokens.dll new file mode 100755 index 0000000..25f2a7e Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.JsonWebTokens.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Logging.dll b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Logging.dll new file mode 100755 index 0000000..4ffdb25 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Logging.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll new file mode 100755 index 0000000..6c736d2 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.dll b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.dll new file mode 100755 index 0000000..9f30508 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Tokens.dll b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Tokens.dll new file mode 100755 index 0000000..83ec83a Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Tokens.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.OpenApi.dll b/backend-tests/bin/Debug/net10.0/Microsoft.OpenApi.dll new file mode 100755 index 0000000..fc8cd69 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.OpenApi.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CommunicationUtilities.dll b/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CommunicationUtilities.dll new file mode 100755 index 0000000..7069e7d Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CommunicationUtilities.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CoreUtilities.dll b/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CoreUtilities.dll new file mode 100755 index 0000000..808c8d6 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CoreUtilities.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CrossPlatEngine.dll b/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CrossPlatEngine.dll new file mode 100755 index 0000000..f582aa4 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CrossPlatEngine.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.PlatformAbstractions.dll b/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.PlatformAbstractions.dll new file mode 100755 index 0000000..03d9766 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.PlatformAbstractions.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.Utilities.dll b/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.Utilities.dll new file mode 100755 index 0000000..3e61362 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.Utilities.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll b/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll new file mode 100755 index 0000000..2774af7 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.TestPlatform.Common.dll b/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.TestPlatform.Common.dll new file mode 100755 index 0000000..1b4a1f2 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.TestPlatform.Common.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll b/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll new file mode 100755 index 0000000..21a16ca Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Newtonsoft.Json.dll b/backend-tests/bin/Debug/net10.0/Newtonsoft.Json.dll new file mode 100755 index 0000000..1ffeabe Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Newtonsoft.Json.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Nexus.Api b/backend-tests/bin/Debug/net10.0/Nexus.Api new file mode 100755 index 0000000..ccf2465 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Nexus.Api differ diff --git a/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.deps.json b/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.deps.json new file mode 100644 index 0000000..9fee99d --- /dev/null +++ b/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.deps.json @@ -0,0 +1,766 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v10.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v10.0": { + "Nexus.Api.Tests/1.0.0": { + "dependencies": { + "Microsoft.NET.Test.Sdk": "17.13.0", + "Nexus.Api": "1.0.0", + "xunit": "2.9.3" + }, + "runtime": { + "Nexus.Api.Tests.dll": {} + } + }, + "AspNetCore.HealthChecks.NpgSql/9.0.0": { + "dependencies": { + "Npgsql": "10.0.3" + }, + "runtime": { + "lib/net8.0/HealthChecks.NpgSql.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.0.0" + } + } + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.8": { + "dependencies": { + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "8.0.1" + }, + "runtime": { + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.CodeCoverage/17.13.0": { + "runtime": { + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "17.1300.124.60202" + } + } + }, + "Microsoft.EntityFrameworkCore/10.0.4": { + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "10.0.4" + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.dll": { + "assemblyVersion": "10.0.4.0", + "fileVersion": "10.0.426.12010" + } + } + }, + "Microsoft.EntityFrameworkCore.Abstractions/10.0.4": { + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { + "assemblyVersion": "10.0.4.0", + "fileVersion": "10.0.426.12010" + } + } + }, + "Microsoft.EntityFrameworkCore.Relational/10.0.4": { + "dependencies": { + "Microsoft.EntityFrameworkCore": "10.0.4" + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Relational.dll": { + "assemblyVersion": "10.0.4.0", + "fileVersion": "10.0.426.12010" + } + } + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Abstractions.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Logging.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Protocols": "8.0.1", + "System.IdentityModel.Tokens.Jwt": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Logging": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Tokens.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.NET.Test.Sdk/17.13.0": { + "dependencies": { + "Microsoft.CodeCoverage": "17.13.0", + "Microsoft.TestPlatform.TestHost": "17.13.0" + } + }, + "Microsoft.OpenApi/2.7.5": { + "runtime": { + "lib/net8.0/Microsoft.OpenApi.dll": { + "assemblyVersion": "2.7.5.0", + "fileVersion": "2.7.5.0" + } + } + }, + "Microsoft.TestPlatform.ObjectModel/17.13.0": { + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "17.1300.25.10604" + }, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "17.1300.25.10604" + }, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "17.1300.25.10604" + } + }, + "resources": { + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.TestPlatform.TestHost/17.13.0": { + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.13.0", + "Newtonsoft.Json": "13.0.1" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "17.1300.25.10604" + }, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "17.1300.25.10604" + }, + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "17.1300.25.10604" + }, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "17.1300.25.10604" + }, + "lib/netcoreapp3.1/testhost.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "17.1300.25.10604" + } + }, + "resources": { + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Newtonsoft.Json/13.0.1": { + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "assemblyVersion": "13.0.0.0", + "fileVersion": "13.0.1.25517" + } + } + }, + "Npgsql/10.0.3": { + "runtime": { + "lib/net10.0/Npgsql.dll": { + "assemblyVersion": "10.0.3.0", + "fileVersion": "10.0.3.0" + } + } + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/10.0.2": { + "dependencies": { + "Microsoft.EntityFrameworkCore": "10.0.4", + "Microsoft.EntityFrameworkCore.Relational": "10.0.4", + "Npgsql": "10.0.3" + }, + "runtime": { + "lib/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": { + "assemblyVersion": "10.0.2.0", + "fileVersion": "10.0.2.0" + } + } + }, + "Swashbuckle.AspNetCore/10.2.1": { + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "10.2.1", + "Swashbuckle.AspNetCore.SwaggerGen": "10.2.1", + "Swashbuckle.AspNetCore.SwaggerUI": "10.2.1" + } + }, + "Swashbuckle.AspNetCore.Swagger/10.2.1": { + "dependencies": { + "Microsoft.OpenApi": "2.7.5" + }, + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.Swagger.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "Swashbuckle.AspNetCore.SwaggerGen/10.2.1": { + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "10.2.1" + }, + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "Swashbuckle.AspNetCore.SwaggerUI/10.2.1": { + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.0.1", + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/System.IdentityModel.Tokens.Jwt.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "xunit/2.9.3": { + "dependencies": { + "xunit.assert": "2.9.3", + "xunit.core": "2.9.3" + } + }, + "xunit.abstractions/2.0.3": { + "runtime": { + "lib/netstandard2.0/xunit.abstractions.dll": { + "assemblyVersion": "2.0.0.0", + "fileVersion": "0.0.0.0" + } + } + }, + "xunit.assert/2.9.3": { + "runtime": { + "lib/net6.0/xunit.assert.dll": { + "assemblyVersion": "2.9.3.0", + "fileVersion": "2.9.3.0" + } + } + }, + "xunit.core/2.9.3": { + "dependencies": { + "xunit.extensibility.core": "2.9.3", + "xunit.extensibility.execution": "2.9.3" + } + }, + "xunit.extensibility.core/2.9.3": { + "dependencies": { + "xunit.abstractions": "2.0.3" + }, + "runtime": { + "lib/netstandard1.1/xunit.core.dll": { + "assemblyVersion": "2.9.3.0", + "fileVersion": "2.9.3.0" + } + } + }, + "xunit.extensibility.execution/2.9.3": { + "dependencies": { + "xunit.extensibility.core": "2.9.3" + }, + "runtime": { + "lib/netstandard1.1/xunit.execution.dotnet.dll": { + "assemblyVersion": "2.9.3.0", + "fileVersion": "2.9.3.0" + } + } + }, + "Nexus.Api/1.0.0": { + "dependencies": { + "AspNetCore.HealthChecks.NpgSql": "9.0.0", + "Microsoft.AspNetCore.Authentication.JwtBearer": "10.0.8", + "Npgsql.EntityFrameworkCore.PostgreSQL": "10.0.2", + "Swashbuckle.AspNetCore": "10.2.1" + }, + "runtime": { + "Nexus.Api.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + } + } + }, + "libraries": { + "Nexus.Api.Tests/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "AspNetCore.HealthChecks.NpgSql/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-npc58/AD5zuVxERdhCl2Kb7WnL37mwX42SJcXIwvmEig0/dugOLg3SIwtfvvh3TnvTwR/sk5LYNkkPaBdks61A==", + "path": "aspnetcore.healthchecks.npgsql/9.0.0", + "hashPath": "aspnetcore.healthchecks.npgsql.9.0.0.nupkg.sha512" + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-oGnE+X/SN6jdqao9WOkOIfyZ5+a0AtluJWy1Mxndq+kcWG6sx5k6l6tucu8/wJ7o9fHfLgVCzm/c4v/KVgVk6w==", + "path": "microsoft.aspnetcore.authentication.jwtbearer/10.0.8", + "hashPath": "microsoft.aspnetcore.authentication.jwtbearer.10.0.8.nupkg.sha512" + }, + "Microsoft.CodeCoverage/17.13.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-9LIUy0y+DvUmEPtbRDw6Bay3rzwqFV8P4efTrK4CZhQle3M/QwLPjISghfcolmEGAPWxuJi6m98ZEfk4VR4Lfg==", + "path": "microsoft.codecoverage/17.13.0", + "hashPath": "microsoft.codecoverage.17.13.0.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore/10.0.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kzTsfFK2GCytp6DDTfQOmxPU4gbGdrIlP7PxrxF3ESNLtfXrC8BoUVZENBN2WORlZPAD7CVX6AYIglgkpXQooA==", + "path": "microsoft.entityframeworkcore/10.0.4", + "hashPath": "microsoft.entityframeworkcore.10.0.4.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Abstractions/10.0.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-qDcJqCfN1XYyX0ID/Hd9/kQTRvlia8S+Yuwyl9uFhBIKnOCbl9WMdGQCzbZUKbkpkfvf3P9CDdXsnxHyE3O0Aw==", + "path": "microsoft.entityframeworkcore.abstractions/10.0.4", + "hashPath": "microsoft.entityframeworkcore.abstractions.10.0.4.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Relational/10.0.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DOTjTHy93W3TwpMLM4SCm0n57Sc0Jj3+m2S6LSTstKyBB34eT1UouaMS19mpWwvtj42+sRiEjA3+rOTNoNzXFQ==", + "path": "microsoft.entityframeworkcore.relational/10.0.4", + "hashPath": "microsoft.entityframeworkcore.relational.10.0.4.nupkg.sha512" + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OtlIWcyX01olfdevPKZdIPfBEvbcioDyBiE/Z2lHsopsMD7twcKtlN9kMevHmI5IIPhFpfwCIiR6qHQz1WHUIw==", + "path": "microsoft.identitymodel.abstractions/8.0.1", + "hashPath": "microsoft.identitymodel.abstractions.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-s6++gF9x0rQApQzOBbSyp4jUaAlwm+DroKfL8gdOHxs83k8SJfUXhuc46rDB3rNXBQ1MVRxqKUrqFhO/M0E97g==", + "path": "microsoft.identitymodel.jsonwebtokens/8.0.1", + "hashPath": "microsoft.identitymodel.jsonwebtokens.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UCPF2exZqBXe7v/6sGNiM6zCQOUXXQ9+v5VTb9gPB8ZSUPnX53BxlN78v2jsbIvK9Dq4GovQxo23x8JgWvm/Qg==", + "path": "microsoft.identitymodel.logging/8.0.1", + "hashPath": "microsoft.identitymodel.logging.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uA2vpKqU3I2mBBEaeJAWPTjT9v1TZrGWKdgK6G5qJd03CLx83kdiqO9cmiK8/n1erkHzFBwU/RphP83aAe3i3g==", + "path": "microsoft.identitymodel.protocols/8.0.1", + "hashPath": "microsoft.identitymodel.protocols.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AQDbfpL+yzuuGhO/mQhKNsp44pm5Jv8/BI4KiFXR7beVGZoSH35zMV3PrmcfvSTsyI6qrcR898NzUauD6SRigg==", + "path": "microsoft.identitymodel.protocols.openidconnect/8.0.1", + "hashPath": "microsoft.identitymodel.protocols.openidconnect.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kDimB6Dkd3nkW2oZPDkMkVHfQt3IDqO5gL0oa8WVy3OP4uE8Ij+8TXnqg9TOd9ufjsY3IDiGz7pCUbnfL18tjg==", + "path": "microsoft.identitymodel.tokens/8.0.1", + "hashPath": "microsoft.identitymodel.tokens.8.0.1.nupkg.sha512" + }, + "Microsoft.NET.Test.Sdk/17.13.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-W19wCPizaIC9Zh47w8wWI/yxuqR7/dtABwOrc8r2jX/8mUNxM2vw4fXDh+DJTeogxV+KzKwg5jNNGQVwf3LXyA==", + "path": "microsoft.net.test.sdk/17.13.0", + "hashPath": "microsoft.net.test.sdk.17.13.0.nupkg.sha512" + }, + "Microsoft.OpenApi/2.7.5": { + "type": "package", + "serviceable": true, + "sha512": "sha512-0FA67RSnRM4tcBKqiqVu/HPdZ9+QOKbmeRjxRUGTCjPU4C0bmUhd97Dso7Yild5P7nOV6GxJ2xrK0Kv/O9xp0w==", + "path": "microsoft.openapi/2.7.5", + "hashPath": "microsoft.openapi.2.7.5.nupkg.sha512" + }, + "Microsoft.TestPlatform.ObjectModel/17.13.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bt0E0Dx+iqW97o4A59RCmUmz/5NarJ7LRL+jXbSHod72ibL5XdNm1Ke+UO5tFhBG4VwHLcSjqq9BUSblGNWamw==", + "path": "microsoft.testplatform.objectmodel/17.13.0", + "hashPath": "microsoft.testplatform.objectmodel.17.13.0.nupkg.sha512" + }, + "Microsoft.TestPlatform.TestHost/17.13.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-9GGw08Dc3AXspjekdyTdZ/wYWFlxbgcF0s7BKxzVX+hzAwpifDOdxM+ceVaaJSQOwqt3jtuNlHn3XTpKUS9x9Q==", + "path": "microsoft.testplatform.testhost/17.13.0", + "hashPath": "microsoft.testplatform.testhost.17.13.0.nupkg.sha512" + }, + "Newtonsoft.Json/13.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==", + "path": "newtonsoft.json/13.0.1", + "hashPath": "newtonsoft.json.13.0.1.nupkg.sha512" + }, + "Npgsql/10.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7nb5YzXuvWWJxB0J8DiyL3we+X4FOctZrt0fIBnucOIaIevFEEwGQVZKtiu9olXdlNAK1eNgqSral6r/jlhI4w==", + "path": "npgsql/10.0.3", + "hashPath": "npgsql.10.0.3.nupkg.sha512" + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/10.0.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-PsNYgPOSW41Xx19gin7y4EdZAPteWr9Cb01XkdObxOsPzi+mgBupBEN7J7+erXFsROPOILM7MlIoO9QzL8+LGQ==", + "path": "npgsql.entityframeworkcore.postgresql/10.0.2", + "hashPath": "npgsql.entityframeworkcore.postgresql.10.0.2.nupkg.sha512" + }, + "Swashbuckle.AspNetCore/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SDU6akgCV/H4jFMRfyJ0mgO5jWOuuAqekvEThXg8c/LjnfNz5Nkaz+RUpeTVJKWIRX4wDKC/6R3ogJ4AsRE32A==", + "path": "swashbuckle.aspnetcore/10.2.1", + "hashPath": "swashbuckle.aspnetcore.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.Swagger/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ej4inPhiWCq+0utG8yaKhIhE8M3k3R/qRaGhpgDZB+O/s+o62/zRMO1Cn2CtQccsrqPE9PYnzCp6hQGYGpJOyQ==", + "path": "swashbuckle.aspnetcore.swagger/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swagger.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.SwaggerGen/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JYX6i/y0xEtQWH/hZyfcage1/ldwww83ueD/gBc34uSnMwyvRLUsOpYcxlliFFxFbZMrY6t+R9ENqolE7zTEOg==", + "path": "swashbuckle.aspnetcore.swaggergen/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swaggergen.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.SwaggerUI/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vzB8ZAGqXus3fdareJ9GHctaRP9ZL+wW9x8U7s1Y+BWprInFvSg6rpD9VhANNpwXA8fUHqu5Agjl/+hHG1BCQA==", + "path": "swashbuckle.aspnetcore.swaggerui/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swaggerui.10.2.1.nupkg.sha512" + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GJw3bYkWpOgvN3tJo5X4lYUeIFA2HD293FPUhKmp7qxS+g5ywAb34Dnd3cDAFLkcMohy5XTpoaZ4uAHuw0uSPQ==", + "path": "system.identitymodel.tokens.jwt/8.0.1", + "hashPath": "system.identitymodel.tokens.jwt.8.0.1.nupkg.sha512" + }, + "xunit/2.9.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", + "path": "xunit/2.9.3", + "hashPath": "xunit.2.9.3.nupkg.sha512" + }, + "xunit.abstractions/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==", + "path": "xunit.abstractions/2.0.3", + "hashPath": "xunit.abstractions.2.0.3.nupkg.sha512" + }, + "xunit.assert/2.9.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA==", + "path": "xunit.assert/2.9.3", + "hashPath": "xunit.assert.2.9.3.nupkg.sha512" + }, + "xunit.core/2.9.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", + "path": "xunit.core/2.9.3", + "hashPath": "xunit.core.2.9.3.nupkg.sha512" + }, + "xunit.extensibility.core/2.9.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kf3si0YTn2a8J8eZNb+zFpwfoyvIrQ7ivNk5ZYA5yuYk1bEtMe4DxJ2CF/qsRgmEnDr7MnW1mxylBaHTZ4qErA==", + "path": "xunit.extensibility.core/2.9.3", + "hashPath": "xunit.extensibility.core.2.9.3.nupkg.sha512" + }, + "xunit.extensibility.execution/2.9.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-yMb6vMESlSrE3Wfj7V6cjQ3S4TXdXpRqYeNEI3zsX31uTsGMJjEw6oD5F5u1cHnMptjhEECnmZSsPxB6ChZHDQ==", + "path": "xunit.extensibility.execution/2.9.3", + "hashPath": "xunit.extensibility.execution.2.9.3.nupkg.sha512" + }, + "Nexus.Api/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.dll b/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.dll new file mode 100644 index 0000000..3c5f8d6 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.pdb b/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.pdb new file mode 100644 index 0000000..8c70229 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.pdb differ diff --git a/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.runtimeconfig.json b/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.runtimeconfig.json new file mode 100644 index 0000000..58fbaf1 --- /dev/null +++ b/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.runtimeconfig.json @@ -0,0 +1,19 @@ +{ + "runtimeOptions": { + "tfm": "net10.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "10.0.0" + }, + { + "name": "Microsoft.AspNetCore.App", + "version": "10.0.0" + } + ], + "configProperties": { + "System.Reflection.NullabilityInfoContext.IsSupported": true, + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false + } + } +} \ No newline at end of file diff --git a/backend-tests/bin/Debug/net10.0/Nexus.Api.deps.json b/backend-tests/bin/Debug/net10.0/Nexus.Api.deps.json new file mode 100644 index 0000000..b34abb0 --- /dev/null +++ b/backend-tests/bin/Debug/net10.0/Nexus.Api.deps.json @@ -0,0 +1,900 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v10.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v10.0": { + "Nexus.Api/1.0.0": { + "dependencies": { + "AspNetCore.HealthChecks.NpgSql": "9.0.0", + "Microsoft.AspNetCore.Authentication.JwtBearer": "10.0.8", + "Microsoft.EntityFrameworkCore.Design": "10.0.8", + "Npgsql.EntityFrameworkCore.PostgreSQL": "10.0.2", + "Swashbuckle.AspNetCore": "10.2.1" + }, + "runtime": { + "Nexus.Api.dll": {} + } + }, + "AspNetCore.HealthChecks.NpgSql/9.0.0": { + "dependencies": { + "Npgsql": "10.0.3" + }, + "runtime": { + "lib/net8.0/HealthChecks.NpgSql.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.0.0" + } + } + }, + "Humanizer.Core/2.14.1": { + "runtime": { + "lib/net6.0/Humanizer.dll": { + "assemblyVersion": "2.14.0.0", + "fileVersion": "2.14.1.48190" + } + } + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.8": { + "dependencies": { + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "8.0.1" + }, + "runtime": { + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.Build.Framework/18.0.2": { + "runtime": { + "lib/net10.0/Microsoft.Build.Framework.dll": { + "assemblyVersion": "15.1.0.0", + "fileVersion": "18.0.2.52102" + } + } + }, + "Microsoft.CodeAnalysis.Common/5.0.0": { + "runtime": { + "lib/net9.0/Microsoft.CodeAnalysis.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.25.56712" + } + }, + "resources": { + "lib/net9.0/cs/Microsoft.CodeAnalysis.resources.dll": { + "locale": "cs" + }, + "lib/net9.0/de/Microsoft.CodeAnalysis.resources.dll": { + "locale": "de" + }, + "lib/net9.0/es/Microsoft.CodeAnalysis.resources.dll": { + "locale": "es" + }, + "lib/net9.0/fr/Microsoft.CodeAnalysis.resources.dll": { + "locale": "fr" + }, + "lib/net9.0/it/Microsoft.CodeAnalysis.resources.dll": { + "locale": "it" + }, + "lib/net9.0/ja/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ja" + }, + "lib/net9.0/ko/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ko" + }, + "lib/net9.0/pl/Microsoft.CodeAnalysis.resources.dll": { + "locale": "pl" + }, + "lib/net9.0/pt-BR/Microsoft.CodeAnalysis.resources.dll": { + "locale": "pt-BR" + }, + "lib/net9.0/ru/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ru" + }, + "lib/net9.0/tr/Microsoft.CodeAnalysis.resources.dll": { + "locale": "tr" + }, + "lib/net9.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net9.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.CSharp/5.0.0": { + "dependencies": { + "Microsoft.CodeAnalysis.Common": "5.0.0" + }, + "runtime": { + "lib/net9.0/Microsoft.CodeAnalysis.CSharp.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.25.56712" + } + }, + "resources": { + "lib/net9.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "cs" + }, + "lib/net9.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "de" + }, + "lib/net9.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "es" + }, + "lib/net9.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "fr" + }, + "lib/net9.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "it" + }, + "lib/net9.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ja" + }, + "lib/net9.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ko" + }, + "lib/net9.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "pl" + }, + "lib/net9.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "pt-BR" + }, + "lib/net9.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ru" + }, + "lib/net9.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "tr" + }, + "lib/net9.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net9.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces/5.0.0": { + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "5.0.0", + "Microsoft.CodeAnalysis.Common": "5.0.0", + "Microsoft.CodeAnalysis.Workspaces.Common": "5.0.0", + "System.Composition": "9.0.0" + }, + "runtime": { + "lib/net9.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.25.56712" + } + }, + "resources": { + "lib/net9.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "cs" + }, + "lib/net9.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "de" + }, + "lib/net9.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "es" + }, + "lib/net9.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "fr" + }, + "lib/net9.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "it" + }, + "lib/net9.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ja" + }, + "lib/net9.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ko" + }, + "lib/net9.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "pl" + }, + "lib/net9.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "pt-BR" + }, + "lib/net9.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ru" + }, + "lib/net9.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "tr" + }, + "lib/net9.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net9.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common/5.0.0": { + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.Common": "5.0.0", + "System.Composition": "9.0.0" + }, + "runtime": { + "lib/net9.0/Microsoft.CodeAnalysis.Workspaces.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.25.56712" + } + }, + "resources": { + "lib/net9.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "cs" + }, + "lib/net9.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "de" + }, + "lib/net9.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "es" + }, + "lib/net9.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "fr" + }, + "lib/net9.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "it" + }, + "lib/net9.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ja" + }, + "lib/net9.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ko" + }, + "lib/net9.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "pl" + }, + "lib/net9.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "pt-BR" + }, + "lib/net9.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ru" + }, + "lib/net9.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "tr" + }, + "lib/net9.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net9.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.Workspaces.MSBuild/5.0.0": { + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Build.Framework": "18.0.2", + "Microsoft.CodeAnalysis.Workspaces.Common": "5.0.0", + "Microsoft.VisualStudio.SolutionPersistence": "1.0.52", + "Newtonsoft.Json": "13.0.3", + "System.Composition": "9.0.0" + }, + "runtime": { + "lib/net9.0/Microsoft.CodeAnalysis.ExternalAccess.RazorCompiler.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.25.56712" + }, + "lib/net9.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.25.56712" + } + }, + "resources": { + "lib/net9.0/cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "cs" + }, + "lib/net9.0/de/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "de" + }, + "lib/net9.0/es/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "es" + }, + "lib/net9.0/fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "fr" + }, + "lib/net9.0/it/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "it" + }, + "lib/net9.0/ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "ja" + }, + "lib/net9.0/ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "ko" + }, + "lib/net9.0/pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "pl" + }, + "lib/net9.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "pt-BR" + }, + "lib/net9.0/ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "ru" + }, + "lib/net9.0/tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "tr" + }, + "lib/net9.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net9.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.EntityFrameworkCore/10.0.8": { + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "10.0.8" + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.EntityFrameworkCore.Abstractions/10.0.8": { + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.EntityFrameworkCore.Design/10.0.8": { + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Build.Framework": "18.0.2", + "Microsoft.CodeAnalysis.CSharp": "5.0.0", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "5.0.0", + "Microsoft.CodeAnalysis.Workspaces.MSBuild": "5.0.0", + "Microsoft.EntityFrameworkCore.Relational": "10.0.8", + "Microsoft.Extensions.DependencyModel": "10.0.8", + "Mono.TextTemplating": "3.0.0", + "Newtonsoft.Json": "13.0.3" + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Design.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.EntityFrameworkCore.Relational/10.0.8": { + "dependencies": { + "Microsoft.EntityFrameworkCore": "10.0.8" + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Relational.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.Extensions.DependencyModel/10.0.8": { + "runtime": { + "lib/net10.0/Microsoft.Extensions.DependencyModel.dll": { + "assemblyVersion": "10.0.0.8", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Abstractions.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Logging.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Protocols": "8.0.1", + "System.IdentityModel.Tokens.Jwt": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Logging": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Tokens.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.OpenApi/2.7.5": { + "runtime": { + "lib/net8.0/Microsoft.OpenApi.dll": { + "assemblyVersion": "2.7.5.0", + "fileVersion": "2.7.5.0" + } + } + }, + "Microsoft.VisualStudio.SolutionPersistence/1.0.52": { + "runtime": { + "lib/net8.0/Microsoft.VisualStudio.SolutionPersistence.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.52.6595" + } + } + }, + "Mono.TextTemplating/3.0.0": { + "dependencies": { + "System.CodeDom": "6.0.0" + }, + "runtime": { + "lib/net6.0/Mono.TextTemplating.dll": { + "assemblyVersion": "3.0.0.0", + "fileVersion": "3.0.0.1" + } + } + }, + "Newtonsoft.Json/13.0.3": { + "runtime": { + "lib/net6.0/Newtonsoft.Json.dll": { + "assemblyVersion": "13.0.0.0", + "fileVersion": "13.0.3.27908" + } + } + }, + "Npgsql/10.0.3": { + "runtime": { + "lib/net10.0/Npgsql.dll": { + "assemblyVersion": "10.0.3.0", + "fileVersion": "10.0.3.0" + } + } + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/10.0.2": { + "dependencies": { + "Microsoft.EntityFrameworkCore": "10.0.8", + "Microsoft.EntityFrameworkCore.Relational": "10.0.8", + "Npgsql": "10.0.3" + }, + "runtime": { + "lib/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": { + "assemblyVersion": "10.0.2.0", + "fileVersion": "10.0.2.0" + } + } + }, + "Swashbuckle.AspNetCore/10.2.1": { + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "10.2.1", + "Swashbuckle.AspNetCore.SwaggerGen": "10.2.1", + "Swashbuckle.AspNetCore.SwaggerUI": "10.2.1" + } + }, + "Swashbuckle.AspNetCore.Swagger/10.2.1": { + "dependencies": { + "Microsoft.OpenApi": "2.7.5" + }, + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.Swagger.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "Swashbuckle.AspNetCore.SwaggerGen/10.2.1": { + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "10.2.1" + }, + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "Swashbuckle.AspNetCore.SwaggerUI/10.2.1": { + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "System.CodeDom/6.0.0": { + "runtime": { + "lib/net6.0/System.CodeDom.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.21.52210" + } + } + }, + "System.Composition/9.0.0": { + "dependencies": { + "System.Composition.AttributedModel": "9.0.0", + "System.Composition.Convention": "9.0.0", + "System.Composition.Hosting": "9.0.0", + "System.Composition.Runtime": "9.0.0", + "System.Composition.TypedParts": "9.0.0" + } + }, + "System.Composition.AttributedModel/9.0.0": { + "runtime": { + "lib/net9.0/System.Composition.AttributedModel.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.24.52809" + } + } + }, + "System.Composition.Convention/9.0.0": { + "dependencies": { + "System.Composition.AttributedModel": "9.0.0" + }, + "runtime": { + "lib/net9.0/System.Composition.Convention.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.24.52809" + } + } + }, + "System.Composition.Hosting/9.0.0": { + "dependencies": { + "System.Composition.Runtime": "9.0.0" + }, + "runtime": { + "lib/net9.0/System.Composition.Hosting.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.24.52809" + } + } + }, + "System.Composition.Runtime/9.0.0": { + "runtime": { + "lib/net9.0/System.Composition.Runtime.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.24.52809" + } + } + }, + "System.Composition.TypedParts/9.0.0": { + "dependencies": { + "System.Composition.AttributedModel": "9.0.0", + "System.Composition.Hosting": "9.0.0", + "System.Composition.Runtime": "9.0.0" + }, + "runtime": { + "lib/net9.0/System.Composition.TypedParts.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.24.52809" + } + } + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.0.1", + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/System.IdentityModel.Tokens.Jwt.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + } + } + }, + "libraries": { + "Nexus.Api/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "AspNetCore.HealthChecks.NpgSql/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-npc58/AD5zuVxERdhCl2Kb7WnL37mwX42SJcXIwvmEig0/dugOLg3SIwtfvvh3TnvTwR/sk5LYNkkPaBdks61A==", + "path": "aspnetcore.healthchecks.npgsql/9.0.0", + "hashPath": "aspnetcore.healthchecks.npgsql.9.0.0.nupkg.sha512" + }, + "Humanizer.Core/2.14.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==", + "path": "humanizer.core/2.14.1", + "hashPath": "humanizer.core.2.14.1.nupkg.sha512" + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-oGnE+X/SN6jdqao9WOkOIfyZ5+a0AtluJWy1Mxndq+kcWG6sx5k6l6tucu8/wJ7o9fHfLgVCzm/c4v/KVgVk6w==", + "path": "microsoft.aspnetcore.authentication.jwtbearer/10.0.8", + "hashPath": "microsoft.aspnetcore.authentication.jwtbearer.10.0.8.nupkg.sha512" + }, + "Microsoft.Build.Framework/18.0.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-sOSb+0J4G/jCBW/YqmRuL0eOMXgfw1KQLdC9TkbvfA5xs7uNm+PBQXJCOzSJGXtZcZrtXozcwxPmUiRUbmd7FA==", + "path": "microsoft.build.framework/18.0.2", + "hashPath": "microsoft.build.framework.18.0.2.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Common/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZXRAdvH6GiDeHRyd3q/km8Z44RoM6FBWHd+gen/la81mVnAdHTEsEkO5J0TCNXBymAcx5UYKt5TvgKBhaLJEow==", + "path": "microsoft.codeanalysis.common/5.0.0", + "hashPath": "microsoft.codeanalysis.common.5.0.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.CSharp/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5DSyJ9bk+ATuDy7fp2Zt0mJStDVKbBoiz1DyfAwSa+k4H4IwykAUcV3URelw5b8/iVbfSaOwkwmPUZH6opZKCw==", + "path": "microsoft.codeanalysis.csharp/5.0.0", + "hashPath": "microsoft.codeanalysis.csharp.5.0.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Al/Q8B+yO8odSqGVpSvrShMFDvlQdIBU//F3E6Rb0YdiLSALE9wh/pvozPNnfmh5HDnvU+mkmSjpz4hQO++jaA==", + "path": "microsoft.codeanalysis.csharp.workspaces/5.0.0", + "hashPath": "microsoft.codeanalysis.csharp.workspaces.5.0.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Workspaces.Common/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZbUmIvT6lqTNKiv06Jl5wf0MTMi1vQ1oH7ou4CLcs2C/no/L7EhP3T8y3XXvn9VbqMcJaJnEsNA1jwYUMgc5jg==", + "path": "microsoft.codeanalysis.workspaces.common/5.0.0", + "hashPath": "microsoft.codeanalysis.workspaces.common.5.0.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Workspaces.MSBuild/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/G+LVoAGMz6Ae8nm+PGLxSw+F5RjYx/J7irbTO5uKAPw1bxHyQJLc/YOnpDxt+EpPtYxvC9wvBsg/kETZp1F9Q==", + "path": "microsoft.codeanalysis.workspaces.msbuild/5.0.0", + "hashPath": "microsoft.codeanalysis.workspaces.msbuild.5.0.0.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-EJx+fIBMgBlgD+ublKCn+GTOJkw3UqV7xOjYWBRVdUYyIm8UfvAsmSOPFiIInsWTHyMEYUJ9gCJY1jwX+6UB7w==", + "path": "microsoft.entityframeworkcore/10.0.8", + "hashPath": "microsoft.entityframeworkcore.10.0.8.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Abstractions/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-jbKDXWPZQhuPHygMnwzNOqxBADVcpRVytcKYZsA++QqhPkpF93Ta8o5mbJQGrARSjlkr9WtOaADV97EDMOZ7DA==", + "path": "microsoft.entityframeworkcore.abstractions/10.0.8", + "hashPath": "microsoft.entityframeworkcore.abstractions.10.0.8.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Design/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LlUUXdfqKFk7RlGExojVP8GI6hN9O21WjpxFnp5mLeGjd9iYdwywIgK9WOLvPM2hrknrRyHR/i43FQdw/oCrOw==", + "path": "microsoft.entityframeworkcore.design/10.0.8", + "hashPath": "microsoft.entityframeworkcore.design.10.0.8.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Relational/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UU3diAD2wwZveye2rnrwaF/wvJ9tm5iL2fuY9TTap6/iGQK1OO29M1BzXZRlRPVH/dByt5w/pISBSFtyR7hTqw==", + "path": "microsoft.entityframeworkcore.relational/10.0.8", + "hashPath": "microsoft.entityframeworkcore.relational.10.0.8.nupkg.sha512" + }, + "Microsoft.Extensions.DependencyModel/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vLyZVpxmduO2jx+76ggqnsA3m81kwMY3NkWciNTj5E+Nvqb0VihqCvQP89QsGONWp0AJwMZG+u9GzaCjDdFGNw==", + "path": "microsoft.extensions.dependencymodel/10.0.8", + "hashPath": "microsoft.extensions.dependencymodel.10.0.8.nupkg.sha512" + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OtlIWcyX01olfdevPKZdIPfBEvbcioDyBiE/Z2lHsopsMD7twcKtlN9kMevHmI5IIPhFpfwCIiR6qHQz1WHUIw==", + "path": "microsoft.identitymodel.abstractions/8.0.1", + "hashPath": "microsoft.identitymodel.abstractions.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-s6++gF9x0rQApQzOBbSyp4jUaAlwm+DroKfL8gdOHxs83k8SJfUXhuc46rDB3rNXBQ1MVRxqKUrqFhO/M0E97g==", + "path": "microsoft.identitymodel.jsonwebtokens/8.0.1", + "hashPath": "microsoft.identitymodel.jsonwebtokens.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UCPF2exZqBXe7v/6sGNiM6zCQOUXXQ9+v5VTb9gPB8ZSUPnX53BxlN78v2jsbIvK9Dq4GovQxo23x8JgWvm/Qg==", + "path": "microsoft.identitymodel.logging/8.0.1", + "hashPath": "microsoft.identitymodel.logging.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uA2vpKqU3I2mBBEaeJAWPTjT9v1TZrGWKdgK6G5qJd03CLx83kdiqO9cmiK8/n1erkHzFBwU/RphP83aAe3i3g==", + "path": "microsoft.identitymodel.protocols/8.0.1", + "hashPath": "microsoft.identitymodel.protocols.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AQDbfpL+yzuuGhO/mQhKNsp44pm5Jv8/BI4KiFXR7beVGZoSH35zMV3PrmcfvSTsyI6qrcR898NzUauD6SRigg==", + "path": "microsoft.identitymodel.protocols.openidconnect/8.0.1", + "hashPath": "microsoft.identitymodel.protocols.openidconnect.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kDimB6Dkd3nkW2oZPDkMkVHfQt3IDqO5gL0oa8WVy3OP4uE8Ij+8TXnqg9TOd9ufjsY3IDiGz7pCUbnfL18tjg==", + "path": "microsoft.identitymodel.tokens/8.0.1", + "hashPath": "microsoft.identitymodel.tokens.8.0.1.nupkg.sha512" + }, + "Microsoft.OpenApi/2.7.5": { + "type": "package", + "serviceable": true, + "sha512": "sha512-0FA67RSnRM4tcBKqiqVu/HPdZ9+QOKbmeRjxRUGTCjPU4C0bmUhd97Dso7Yild5P7nOV6GxJ2xrK0Kv/O9xp0w==", + "path": "microsoft.openapi/2.7.5", + "hashPath": "microsoft.openapi.2.7.5.nupkg.sha512" + }, + "Microsoft.VisualStudio.SolutionPersistence/1.0.52": { + "type": "package", + "serviceable": true, + "sha512": "sha512-oNv2JtYXhpdJrX63nibx1JT3uCESOBQ1LAk7Dtz/sr0+laW0KRM6eKp4CZ3MHDR2siIkKsY8MmUkeP5DKkQQ5w==", + "path": "microsoft.visualstudio.solutionpersistence/1.0.52", + "hashPath": "microsoft.visualstudio.solutionpersistence.1.0.52.nupkg.sha512" + }, + "Mono.TextTemplating/3.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YqueG52R/Xej4VVbKuRIodjiAhV0HR/XVbLbNrJhCZnzjnSjgMJ/dCdV0akQQxavX6hp/LC6rqLGLcXeQYU7XA==", + "path": "mono.texttemplating/3.0.0", + "hashPath": "mono.texttemplating.3.0.0.nupkg.sha512" + }, + "Newtonsoft.Json/13.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==", + "path": "newtonsoft.json/13.0.3", + "hashPath": "newtonsoft.json.13.0.3.nupkg.sha512" + }, + "Npgsql/10.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7nb5YzXuvWWJxB0J8DiyL3we+X4FOctZrt0fIBnucOIaIevFEEwGQVZKtiu9olXdlNAK1eNgqSral6r/jlhI4w==", + "path": "npgsql/10.0.3", + "hashPath": "npgsql.10.0.3.nupkg.sha512" + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/10.0.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-PsNYgPOSW41Xx19gin7y4EdZAPteWr9Cb01XkdObxOsPzi+mgBupBEN7J7+erXFsROPOILM7MlIoO9QzL8+LGQ==", + "path": "npgsql.entityframeworkcore.postgresql/10.0.2", + "hashPath": "npgsql.entityframeworkcore.postgresql.10.0.2.nupkg.sha512" + }, + "Swashbuckle.AspNetCore/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SDU6akgCV/H4jFMRfyJ0mgO5jWOuuAqekvEThXg8c/LjnfNz5Nkaz+RUpeTVJKWIRX4wDKC/6R3ogJ4AsRE32A==", + "path": "swashbuckle.aspnetcore/10.2.1", + "hashPath": "swashbuckle.aspnetcore.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.Swagger/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ej4inPhiWCq+0utG8yaKhIhE8M3k3R/qRaGhpgDZB+O/s+o62/zRMO1Cn2CtQccsrqPE9PYnzCp6hQGYGpJOyQ==", + "path": "swashbuckle.aspnetcore.swagger/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swagger.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.SwaggerGen/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JYX6i/y0xEtQWH/hZyfcage1/ldwww83ueD/gBc34uSnMwyvRLUsOpYcxlliFFxFbZMrY6t+R9ENqolE7zTEOg==", + "path": "swashbuckle.aspnetcore.swaggergen/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swaggergen.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.SwaggerUI/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vzB8ZAGqXus3fdareJ9GHctaRP9ZL+wW9x8U7s1Y+BWprInFvSg6rpD9VhANNpwXA8fUHqu5Agjl/+hHG1BCQA==", + "path": "swashbuckle.aspnetcore.swaggerui/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swaggerui.10.2.1.nupkg.sha512" + }, + "System.CodeDom/6.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-CPc6tWO1LAer3IzfZufDBRL+UZQcj5uS207NHALQzP84Vp/z6wF0Aa0YZImOQY8iStY0A2zI/e3ihKNPfUm8XA==", + "path": "system.codedom/6.0.0", + "hashPath": "system.codedom.6.0.0.nupkg.sha512" + }, + "System.Composition/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3Djj70fFTraOarSKmRnmRy/zm4YurICm+kiCtI0dYRqGJnLX6nJ+G3WYuFJ173cAPax/gh96REcbNiVqcrypFQ==", + "path": "system.composition/9.0.0", + "hashPath": "system.composition.9.0.0.nupkg.sha512" + }, + "System.Composition.AttributedModel/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-iri00l/zIX9g4lHMY+Nz0qV1n40+jFYAmgsaiNn16xvt2RDwlqByNG4wgblagnDYxm3YSQQ0jLlC/7Xlk9CzyA==", + "path": "system.composition.attributedmodel/9.0.0", + "hashPath": "system.composition.attributedmodel.9.0.0.nupkg.sha512" + }, + "System.Composition.Convention/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+vuqVP6xpi582XIjJi6OCsIxuoTZfR0M7WWufk3uGDeCl3wGW6KnpylUJ3iiXdPByPE0vR5TjJgR6hDLez4FQg==", + "path": "system.composition.convention/9.0.0", + "hashPath": "system.composition.convention.9.0.0.nupkg.sha512" + }, + "System.Composition.Hosting/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OFqSeFeJYr7kHxDfaViGM1ymk7d4JxK//VSoNF9Ux0gpqkLsauDZpu89kTHHNdCWfSljbFcvAafGyBoY094btQ==", + "path": "system.composition.hosting/9.0.0", + "hashPath": "system.composition.hosting.9.0.0.nupkg.sha512" + }, + "System.Composition.Runtime/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-w1HOlQY1zsOWYussjFGZCEYF2UZXgvoYnS94NIu2CBnAGMbXFAX8PY8c92KwUItPmowal68jnVLBCzdrWLeEKA==", + "path": "system.composition.runtime/9.0.0", + "hashPath": "system.composition.runtime.9.0.0.nupkg.sha512" + }, + "System.Composition.TypedParts/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-aRZlojCCGEHDKqh43jaDgaVpYETsgd7Nx4g1zwLKMtv4iTo0627715ajEFNpEEBTgLmvZuv8K0EVxc3sM4NWJA==", + "path": "system.composition.typedparts/9.0.0", + "hashPath": "system.composition.typedparts.9.0.0.nupkg.sha512" + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GJw3bYkWpOgvN3tJo5X4lYUeIFA2HD293FPUhKmp7qxS+g5ywAb34Dnd3cDAFLkcMohy5XTpoaZ4uAHuw0uSPQ==", + "path": "system.identitymodel.tokens.jwt/8.0.1", + "hashPath": "system.identitymodel.tokens.jwt.8.0.1.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/backend-tests/bin/Debug/net10.0/Nexus.Api.dll b/backend-tests/bin/Debug/net10.0/Nexus.Api.dll new file mode 100644 index 0000000..0b12fc6 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Nexus.Api.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Nexus.Api.pdb b/backend-tests/bin/Debug/net10.0/Nexus.Api.pdb new file mode 100644 index 0000000..220a319 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Nexus.Api.pdb differ diff --git a/backend-tests/bin/Debug/net10.0/Nexus.Api.runtimeconfig.json b/backend-tests/bin/Debug/net10.0/Nexus.Api.runtimeconfig.json new file mode 100644 index 0000000..bf15a00 --- /dev/null +++ b/backend-tests/bin/Debug/net10.0/Nexus.Api.runtimeconfig.json @@ -0,0 +1,20 @@ +{ + "runtimeOptions": { + "tfm": "net10.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "10.0.0" + }, + { + "name": "Microsoft.AspNetCore.App", + "version": "10.0.0" + } + ], + "configProperties": { + "System.GC.Server": true, + "System.Reflection.NullabilityInfoContext.IsSupported": true, + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false + } + } +} \ No newline at end of file diff --git a/backend-tests/bin/Debug/net10.0/Nexus.Api.staticwebassets.endpoints.json b/backend-tests/bin/Debug/net10.0/Nexus.Api.staticwebassets.endpoints.json new file mode 100644 index 0000000..5576e88 --- /dev/null +++ b/backend-tests/bin/Debug/net10.0/Nexus.Api.staticwebassets.endpoints.json @@ -0,0 +1 @@ +{"Version":1,"ManifestType":"Build","Endpoints":[]} \ No newline at end of file diff --git a/backend-tests/bin/Debug/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll b/backend-tests/bin/Debug/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll new file mode 100755 index 0000000..14a1321 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Npgsql.dll b/backend-tests/bin/Debug/net10.0/Npgsql.dll new file mode 100755 index 0000000..184db8d Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Npgsql.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.Swagger.dll b/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.Swagger.dll new file mode 100755 index 0000000..c6da386 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.Swagger.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll b/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll new file mode 100755 index 0000000..03b2b60 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll differ diff --git a/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll b/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll new file mode 100755 index 0000000..ac14edd Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll differ diff --git a/backend-tests/bin/Debug/net10.0/System.IdentityModel.Tokens.Jwt.dll b/backend-tests/bin/Debug/net10.0/System.IdentityModel.Tokens.Jwt.dll new file mode 100755 index 0000000..c42b8d7 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/System.IdentityModel.Tokens.Jwt.dll differ diff --git a/backend-tests/bin/Debug/net10.0/appsettings.json b/backend-tests/bin/Debug/net10.0/appsettings.json new file mode 100644 index 0000000..e7cf4d6 --- /dev/null +++ b/backend-tests/bin/Debug/net10.0/appsettings.json @@ -0,0 +1,25 @@ +{ + "ConnectionStrings": { + "Nexus": "Host=localhost;Port=5432;Database=nexus;Username=nexus;Password=nexus" + }, + "Integrations": { + "OpenClaw": { + "BaseUrl": "http://127.0.0.1:18789", + "Token": "", + "Password": "" + }, + "Ollama": { + "BaseUrl": "http://127.0.0.1:11434" + }, + "Nvidia": { + "ApiKey": "" + } + }, + "Jwt": { + "Issuer": "nexus", + "Audience": "nexus-web", + "AccessTokenExpirationMinutes": 15, + "RefreshTokenExpirationDays": 7 + }, + "AllowedHosts": "*" +} diff --git a/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..64f02c7 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..a637d16 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..d3d28ed Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..079f602 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..c546fb5 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..5d7f249 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..542a296 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..6a6f562 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..150ee05 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..a07da23 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.deps.json b/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.deps.json new file mode 100644 index 0000000..162313d --- /dev/null +++ b/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.deps.json @@ -0,0 +1,337 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v10.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v10.0": { + "Nexus.Api/1.0.0": { + "dependencies": { + "Microsoft.AspNetCore.Authentication.JwtBearer": "10.0.8", + "Npgsql.EntityFrameworkCore.PostgreSQL": "10.0.2", + "Swashbuckle.AspNetCore": "10.2.1" + }, + "runtime": { + "Nexus.Api.dll": {} + } + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.8": { + "dependencies": { + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "8.0.1" + }, + "runtime": { + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.EntityFrameworkCore/10.0.8": { + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "10.0.8" + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.EntityFrameworkCore.Abstractions/10.0.8": { + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.EntityFrameworkCore.Relational/10.0.8": { + "dependencies": { + "Microsoft.EntityFrameworkCore": "10.0.8" + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Relational.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Abstractions.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Logging.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Protocols": "8.0.1", + "System.IdentityModel.Tokens.Jwt": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Logging": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Tokens.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.OpenApi/2.7.5": { + "runtime": { + "lib/net8.0/Microsoft.OpenApi.dll": { + "assemblyVersion": "2.7.5.0", + "fileVersion": "2.7.5.0" + } + } + }, + "Npgsql/10.0.3": { + "runtime": { + "lib/net10.0/Npgsql.dll": { + "assemblyVersion": "10.0.3.0", + "fileVersion": "10.0.3.0" + } + } + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/10.0.2": { + "dependencies": { + "Microsoft.EntityFrameworkCore": "10.0.8", + "Microsoft.EntityFrameworkCore.Relational": "10.0.8", + "Npgsql": "10.0.3" + }, + "runtime": { + "lib/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": { + "assemblyVersion": "10.0.2.0", + "fileVersion": "10.0.2.0" + } + } + }, + "Swashbuckle.AspNetCore/10.2.1": { + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "10.2.1", + "Swashbuckle.AspNetCore.SwaggerGen": "10.2.1", + "Swashbuckle.AspNetCore.SwaggerUI": "10.2.1" + } + }, + "Swashbuckle.AspNetCore.Swagger/10.2.1": { + "dependencies": { + "Microsoft.OpenApi": "2.7.5" + }, + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.Swagger.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "Swashbuckle.AspNetCore.SwaggerGen/10.2.1": { + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "10.2.1" + }, + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "Swashbuckle.AspNetCore.SwaggerUI/10.2.1": { + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.0.1", + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/System.IdentityModel.Tokens.Jwt.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + } + } + }, + "libraries": { + "Nexus.Api/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-oGnE+X/SN6jdqao9WOkOIfyZ5+a0AtluJWy1Mxndq+kcWG6sx5k6l6tucu8/wJ7o9fHfLgVCzm/c4v/KVgVk6w==", + "path": "microsoft.aspnetcore.authentication.jwtbearer/10.0.8", + "hashPath": "microsoft.aspnetcore.authentication.jwtbearer.10.0.8.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-EJx+fIBMgBlgD+ublKCn+GTOJkw3UqV7xOjYWBRVdUYyIm8UfvAsmSOPFiIInsWTHyMEYUJ9gCJY1jwX+6UB7w==", + "path": "microsoft.entityframeworkcore/10.0.8", + "hashPath": "microsoft.entityframeworkcore.10.0.8.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Abstractions/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-jbKDXWPZQhuPHygMnwzNOqxBADVcpRVytcKYZsA++QqhPkpF93Ta8o5mbJQGrARSjlkr9WtOaADV97EDMOZ7DA==", + "path": "microsoft.entityframeworkcore.abstractions/10.0.8", + "hashPath": "microsoft.entityframeworkcore.abstractions.10.0.8.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Relational/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UU3diAD2wwZveye2rnrwaF/wvJ9tm5iL2fuY9TTap6/iGQK1OO29M1BzXZRlRPVH/dByt5w/pISBSFtyR7hTqw==", + "path": "microsoft.entityframeworkcore.relational/10.0.8", + "hashPath": "microsoft.entityframeworkcore.relational.10.0.8.nupkg.sha512" + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OtlIWcyX01olfdevPKZdIPfBEvbcioDyBiE/Z2lHsopsMD7twcKtlN9kMevHmI5IIPhFpfwCIiR6qHQz1WHUIw==", + "path": "microsoft.identitymodel.abstractions/8.0.1", + "hashPath": "microsoft.identitymodel.abstractions.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-s6++gF9x0rQApQzOBbSyp4jUaAlwm+DroKfL8gdOHxs83k8SJfUXhuc46rDB3rNXBQ1MVRxqKUrqFhO/M0E97g==", + "path": "microsoft.identitymodel.jsonwebtokens/8.0.1", + "hashPath": "microsoft.identitymodel.jsonwebtokens.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UCPF2exZqBXe7v/6sGNiM6zCQOUXXQ9+v5VTb9gPB8ZSUPnX53BxlN78v2jsbIvK9Dq4GovQxo23x8JgWvm/Qg==", + "path": "microsoft.identitymodel.logging/8.0.1", + "hashPath": "microsoft.identitymodel.logging.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uA2vpKqU3I2mBBEaeJAWPTjT9v1TZrGWKdgK6G5qJd03CLx83kdiqO9cmiK8/n1erkHzFBwU/RphP83aAe3i3g==", + "path": "microsoft.identitymodel.protocols/8.0.1", + "hashPath": "microsoft.identitymodel.protocols.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AQDbfpL+yzuuGhO/mQhKNsp44pm5Jv8/BI4KiFXR7beVGZoSH35zMV3PrmcfvSTsyI6qrcR898NzUauD6SRigg==", + "path": "microsoft.identitymodel.protocols.openidconnect/8.0.1", + "hashPath": "microsoft.identitymodel.protocols.openidconnect.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kDimB6Dkd3nkW2oZPDkMkVHfQt3IDqO5gL0oa8WVy3OP4uE8Ij+8TXnqg9TOd9ufjsY3IDiGz7pCUbnfL18tjg==", + "path": "microsoft.identitymodel.tokens/8.0.1", + "hashPath": "microsoft.identitymodel.tokens.8.0.1.nupkg.sha512" + }, + "Microsoft.OpenApi/2.7.5": { + "type": "package", + "serviceable": true, + "sha512": "sha512-0FA67RSnRM4tcBKqiqVu/HPdZ9+QOKbmeRjxRUGTCjPU4C0bmUhd97Dso7Yild5P7nOV6GxJ2xrK0Kv/O9xp0w==", + "path": "microsoft.openapi/2.7.5", + "hashPath": "microsoft.openapi.2.7.5.nupkg.sha512" + }, + "Npgsql/10.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7nb5YzXuvWWJxB0J8DiyL3we+X4FOctZrt0fIBnucOIaIevFEEwGQVZKtiu9olXdlNAK1eNgqSral6r/jlhI4w==", + "path": "npgsql/10.0.3", + "hashPath": "npgsql.10.0.3.nupkg.sha512" + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/10.0.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-PsNYgPOSW41Xx19gin7y4EdZAPteWr9Cb01XkdObxOsPzi+mgBupBEN7J7+erXFsROPOILM7MlIoO9QzL8+LGQ==", + "path": "npgsql.entityframeworkcore.postgresql/10.0.2", + "hashPath": "npgsql.entityframeworkcore.postgresql.10.0.2.nupkg.sha512" + }, + "Swashbuckle.AspNetCore/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SDU6akgCV/H4jFMRfyJ0mgO5jWOuuAqekvEThXg8c/LjnfNz5Nkaz+RUpeTVJKWIRX4wDKC/6R3ogJ4AsRE32A==", + "path": "swashbuckle.aspnetcore/10.2.1", + "hashPath": "swashbuckle.aspnetcore.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.Swagger/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ej4inPhiWCq+0utG8yaKhIhE8M3k3R/qRaGhpgDZB+O/s+o62/zRMO1Cn2CtQccsrqPE9PYnzCp6hQGYGpJOyQ==", + "path": "swashbuckle.aspnetcore.swagger/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swagger.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.SwaggerGen/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JYX6i/y0xEtQWH/hZyfcage1/ldwww83ueD/gBc34uSnMwyvRLUsOpYcxlliFFxFbZMrY6t+R9ENqolE7zTEOg==", + "path": "swashbuckle.aspnetcore.swaggergen/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swaggergen.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.SwaggerUI/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vzB8ZAGqXus3fdareJ9GHctaRP9ZL+wW9x8U7s1Y+BWprInFvSg6rpD9VhANNpwXA8fUHqu5Agjl/+hHG1BCQA==", + "path": "swashbuckle.aspnetcore.swaggerui/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swaggerui.10.2.1.nupkg.sha512" + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GJw3bYkWpOgvN3tJo5X4lYUeIFA2HD293FPUhKmp7qxS+g5ywAb34Dnd3cDAFLkcMohy5XTpoaZ4uAHuw0uSPQ==", + "path": "system.identitymodel.tokens.jwt/8.0.1", + "hashPath": "system.identitymodel.tokens.jwt.8.0.1.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.runtimeconfig.json b/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.runtimeconfig.json new file mode 100644 index 0000000..b849de0 --- /dev/null +++ b/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.runtimeconfig.json @@ -0,0 +1,21 @@ +{ + "runtimeOptions": { + "tfm": "net10.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "10.0.0" + }, + { + "name": "Microsoft.AspNetCore.App", + "version": "10.0.0" + } + ], + "configProperties": { + "System.GC.Server": true, + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, + "System.Reflection.NullabilityInfoContext.IsSupported": true, + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false + } + } +} \ No newline at end of file diff --git a/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.staticwebassets.endpoints.json b/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.staticwebassets.endpoints.json new file mode 100644 index 0000000..21da96b --- /dev/null +++ b/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.staticwebassets.endpoints.json @@ -0,0 +1 @@ +{"Version":1,"ManifestType":"Publish","Endpoints":[]} \ No newline at end of file diff --git a/backend-tests/bin/Debug/net10.0/dist/appsettings.json b/backend-tests/bin/Debug/net10.0/dist/appsettings.json new file mode 100644 index 0000000..e7cf4d6 --- /dev/null +++ b/backend-tests/bin/Debug/net10.0/dist/appsettings.json @@ -0,0 +1,25 @@ +{ + "ConnectionStrings": { + "Nexus": "Host=localhost;Port=5432;Database=nexus;Username=nexus;Password=nexus" + }, + "Integrations": { + "OpenClaw": { + "BaseUrl": "http://127.0.0.1:18789", + "Token": "", + "Password": "" + }, + "Ollama": { + "BaseUrl": "http://127.0.0.1:11434" + }, + "Nvidia": { + "ApiKey": "" + } + }, + "Jwt": { + "Issuer": "nexus", + "Audience": "nexus-web", + "AccessTokenExpirationMinutes": 15, + "RefreshTokenExpirationDays": 7 + }, + "AllowedHosts": "*" +} diff --git a/backend-tests/bin/Debug/net10.0/dist/web.config b/backend-tests/bin/Debug/net10.0/dist/web.config new file mode 100644 index 0000000..4ad0a27 --- /dev/null +++ b/backend-tests/bin/Debug/net10.0/dist/web.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..1717871 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..6a9ab10 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..e0456df Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..ec8f0be Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..ec8932a Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..cd2a651 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..38774af Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..6c54c07 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..36cb776 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..072405b Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..26da51a Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..08faebf Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..40a4c73 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..be2d610 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..e629bba Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..4a2e9f3 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..2ad8dd7 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..a162479 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..fe38663 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..ecc813a Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..510b948 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..40e1cab Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..15c2687 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..0a66eff Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..81ac85c Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..afb3a49 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..7acd2e9 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..b5eb966 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..612148c Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..1fa216a Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..42d0cfd Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..ddf9b55 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..1c335ca Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..ec5d123 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..18f7128 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..4919efa Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..0ac9156 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..ca753b1 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..07d694f Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..156d6c1 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/testhost.dll b/backend-tests/bin/Debug/net10.0/testhost.dll new file mode 100755 index 0000000..62467be Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/testhost.dll differ diff --git a/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..8a98e9f Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..cac5dc7 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..405edf4 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..6efe36e Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..2586945 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/xunit.abstractions.dll b/backend-tests/bin/Debug/net10.0/xunit.abstractions.dll new file mode 100755 index 0000000..d1e90bf Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/xunit.abstractions.dll differ diff --git a/backend-tests/bin/Debug/net10.0/xunit.assert.dll b/backend-tests/bin/Debug/net10.0/xunit.assert.dll new file mode 100755 index 0000000..99bc34c Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/xunit.assert.dll differ diff --git a/backend-tests/bin/Debug/net10.0/xunit.core.dll b/backend-tests/bin/Debug/net10.0/xunit.core.dll new file mode 100755 index 0000000..d56aa16 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/xunit.core.dll differ diff --git a/backend-tests/bin/Debug/net10.0/xunit.execution.dotnet.dll b/backend-tests/bin/Debug/net10.0/xunit.execution.dotnet.dll new file mode 100755 index 0000000..7a1cc87 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/xunit.execution.dotnet.dll differ diff --git a/backend-tests/bin/Debug/net10.0/xunit.runner.visualstudio.testadapter.dll b/backend-tests/bin/Debug/net10.0/xunit.runner.visualstudio.testadapter.dll new file mode 100755 index 0000000..c32acf1 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/xunit.runner.visualstudio.testadapter.dll differ diff --git a/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..b9ea235 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..a05e75c Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..8e231aa Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..9d19bae Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..4739c86 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100755 index 0000000..e9fd41b Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll b/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100755 index 0000000..e191cff Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100755 index 0000000..898e00a Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100755 index 0000000..4580347 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100755 index 0000000..e45fac1 Binary files /dev/null and b/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/backend-tests/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs b/backend-tests/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs new file mode 100644 index 0000000..925b135 --- /dev/null +++ b/backend-tests/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Ap.676E4176.Up2Date b/backend-tests/obj/Debug/net10.0/Nexus.Ap.676E4176.Up2Date new file mode 100644 index 0000000..e69de29 diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.AssemblyInfo.cs b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.AssemblyInfo.cs new file mode 100644 index 0000000..5879ce2 --- /dev/null +++ b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("Nexus.Api.Tests")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+14e7bded387e60ab0564cd437155d8878e14c760")] +[assembly: System.Reflection.AssemblyProductAttribute("Nexus.Api.Tests")] +[assembly: System.Reflection.AssemblyTitleAttribute("Nexus.Api.Tests")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.AssemblyInfoInputs.cache b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1024115 --- /dev/null +++ b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a869fda33f005e45aeeda31f16bee8f00070b5fad7da59fad29a15ef54720c96 diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.GeneratedMSBuildEditorConfig.editorconfig b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..b02bd80 --- /dev/null +++ b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,18 @@ +is_global = true +build_property.TargetFramework = net10.0 +build_property.TargetFrameworkIdentifier = .NETCoreApp +build_property.TargetFrameworkVersion = v10.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property.EntryPointFilePath = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = Nexus.Api.Tests +build_property.ProjectDir = /home/node/.openclaw/workspace/nexus/backend-tests/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.EffectiveAnalysisLevelStyle = 10.0 +build_property.EnableCodeStyleSeverity = diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.GlobalUsings.g.cs b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.GlobalUsings.g.cs new file mode 100644 index 0000000..d12bcbc --- /dev/null +++ b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.assets.cache b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.assets.cache new file mode 100644 index 0000000..0c18e1a Binary files /dev/null and b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.assets.cache differ diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.csproj.AssemblyReference.cache b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.csproj.AssemblyReference.cache new file mode 100644 index 0000000..785a84e Binary files /dev/null and b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.csproj.AssemblyReference.cache differ diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.csproj.CoreCompileInputs.cache b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..48dacf0 --- /dev/null +++ b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +c99636d8155f562c79319587820111eaebf10fc29139fce0ff4f8831ff072577 diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.csproj.FileListAbsolute.txt b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..8c05d30 --- /dev/null +++ b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.csproj.FileListAbsolute.txt @@ -0,0 +1,126 @@ +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/.msCoverageSourceRootsMapping_Nexus.Api.Tests +/home/node/.openclaw/workspace/nexus/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.csproj.AssemblyReference.cache +/home/node/.openclaw/workspace/nexus/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.GeneratedMSBuildEditorConfig.editorconfig +/home/node/.openclaw/workspace/nexus/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.AssemblyInfoInputs.cache +/home/node/.openclaw/workspace/nexus/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.AssemblyInfo.cs +/home/node/.openclaw/workspace/nexus/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.csproj.CoreCompileInputs.cache +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/xunit.abstractions.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Nexus.Api.deps.json +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Nexus.Api.runtimeconfig.json +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/dist/web.config +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/appsettings.json +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/dist/appsettings.json +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.deps.json +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.runtimeconfig.json +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/dist/Nexus.Api.staticwebassets.endpoints.json +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Nexus.Api.staticwebassets.endpoints.json +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Nexus.Api +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/xunit.runner.visualstudio.testadapter.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.deps.json +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.runtimeconfig.json +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Nexus.Api.Tests.pdb +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/HealthChecks.NpgSql.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Relational.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Abstractions.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.JsonWebTokens.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Logging.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.IdentityModel.Tokens.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.OpenApi.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CoreUtilities.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.PlatformAbstractions.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CommunicationUtilities.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.CrossPlatEngine.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.TestPlatform.Utilities.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Microsoft.VisualStudio.TestPlatform.Common.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/testhost.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Newtonsoft.Json.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Npgsql.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.Swagger.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/System.IdentityModel.Tokens.Jwt.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/xunit.assert.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/xunit.core.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/xunit.execution.dotnet.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Nexus.Api.dll +/home/node/.openclaw/workspace/nexus/backend-tests/bin/Debug/net10.0/Nexus.Api.pdb +/home/node/.openclaw/workspace/nexus/backend-tests/obj/Debug/net10.0/Nexus.Ap.676E4176.Up2Date +/home/node/.openclaw/workspace/nexus/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.dll +/home/node/.openclaw/workspace/nexus/backend-tests/obj/Debug/net10.0/refint/Nexus.Api.Tests.dll +/home/node/.openclaw/workspace/nexus/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.pdb +/home/node/.openclaw/workspace/nexus/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.genruntimeconfig.cache +/home/node/.openclaw/workspace/nexus/backend-tests/obj/Debug/net10.0/ref/Nexus.Api.Tests.dll diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.dll b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.dll new file mode 100644 index 0000000..3c5f8d6 Binary files /dev/null and b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.dll differ diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.genruntimeconfig.cache b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.genruntimeconfig.cache new file mode 100644 index 0000000..1c124b2 --- /dev/null +++ b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.genruntimeconfig.cache @@ -0,0 +1 @@ +b131a0c42825e277e5217eb02a94de91bb00238a64c4d7b2e92fe613b61c6e8d diff --git a/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.pdb b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.pdb new file mode 100644 index 0000000..8c70229 Binary files /dev/null and b/backend-tests/obj/Debug/net10.0/Nexus.Api.Tests.pdb differ diff --git a/backend-tests/obj/Debug/net10.0/ref/Nexus.Api.Tests.dll b/backend-tests/obj/Debug/net10.0/ref/Nexus.Api.Tests.dll new file mode 100644 index 0000000..b64423e Binary files /dev/null and b/backend-tests/obj/Debug/net10.0/ref/Nexus.Api.Tests.dll differ diff --git a/backend-tests/obj/Debug/net10.0/refint/Nexus.Api.Tests.dll b/backend-tests/obj/Debug/net10.0/refint/Nexus.Api.Tests.dll new file mode 100644 index 0000000..b64423e Binary files /dev/null and b/backend-tests/obj/Debug/net10.0/refint/Nexus.Api.Tests.dll differ diff --git a/backend-tests/obj/Nexus.Api.Tests.csproj.nuget.dgspec.json b/backend-tests/obj/Nexus.Api.Tests.csproj.nuget.dgspec.json new file mode 100644 index 0000000..1fd0dc6 --- /dev/null +++ b/backend-tests/obj/Nexus.Api.Tests.csproj.nuget.dgspec.json @@ -0,0 +1,865 @@ +{ + "format": 1, + "restore": { + "/home/node/.openclaw/workspace/nexus/backend-tests/Nexus.Api.Tests.csproj": {} + }, + "projects": { + "/home/node/.openclaw/workspace/nexus/backend-tests/Nexus.Api.Tests.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/node/.openclaw/workspace/nexus/backend-tests/Nexus.Api.Tests.csproj", + "projectName": "Nexus.Api.Tests", + "projectPath": "/home/node/.openclaw/workspace/nexus/backend-tests/Nexus.Api.Tests.csproj", + "packagesPath": "/home/node/.nuget/packages/", + "outputPath": "/home/node/.openclaw/workspace/nexus/backend-tests/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/node/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net10.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0": { + "framework": "net10.0", + "targetAlias": "net10.0", + "projectReferences": { + "/home/node/.openclaw/workspace/nexus/backend/Nexus.Api.csproj": { + "projectPath": "/home/node/.openclaw/workspace/nexus/backend/Nexus.Api.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.300" + }, + "frameworks": { + "net10.0": { + "framework": "net10.0", + "targetAlias": "net10.0", + "dependencies": { + "Microsoft.NET.Test.Sdk": { + "target": "Package", + "version": "[17.13.0, )" + }, + "xunit": { + "target": "Package", + "version": "[2.9.3, )" + }, + "xunit.runner.visualstudio": { + "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", + "suppressParent": "All", + "target": "Package", + "version": "[3.1.0, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/home/node/.dotnet/sdk/10.0.300/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + }, + "/home/node/.openclaw/workspace/nexus/backend/Nexus.Api.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/node/.openclaw/workspace/nexus/backend/Nexus.Api.csproj", + "projectName": "Nexus.Api", + "projectPath": "/home/node/.openclaw/workspace/nexus/backend/Nexus.Api.csproj", + "packagesPath": "/home/node/.nuget/packages/", + "outputPath": "/home/node/.openclaw/workspace/nexus/backend/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/node/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net10.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0": { + "framework": "net10.0", + "targetAlias": "net10.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.300" + }, + "frameworks": { + "net10.0": { + "framework": "net10.0", + "targetAlias": "net10.0", + "dependencies": { + "AspNetCore.HealthChecks.NpgSql": { + "target": "Package", + "version": "[9.0.0, )" + }, + "Microsoft.AspNetCore.Authentication.JwtBearer": { + "target": "Package", + "version": "[10.0.8, )" + }, + "Microsoft.EntityFrameworkCore.Design": { + "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", + "suppressParent": "All", + "target": "Package", + "version": "[10.0.8, )" + }, + "Npgsql.EntityFrameworkCore.PostgreSQL": { + "target": "Package", + "version": "[10.0.2, )" + }, + "Swashbuckle.AspNetCore": { + "target": "Package", + "version": "[10.2.1, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.AspNetCore.App": { + "privateAssets": "none" + }, + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/home/node/.dotnet/sdk/10.0.300/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.AspNetCore": "(,10.0.32767]", + "Microsoft.AspNetCore.Antiforgery": "(,10.0.32767]", + "Microsoft.AspNetCore.App": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.BearerToken": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.Cookies": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.OAuth": "(,10.0.32767]", + "Microsoft.AspNetCore.Authorization": "(,10.0.32767]", + "Microsoft.AspNetCore.Authorization.Policy": "(,10.0.32767]", + "Microsoft.AspNetCore.Components": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Authorization": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Endpoints": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Forms": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Server": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Web": "(,10.0.32767]", + "Microsoft.AspNetCore.Connections.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.CookiePolicy": "(,10.0.32767]", + "Microsoft.AspNetCore.Cors": "(,10.0.32767]", + "Microsoft.AspNetCore.Cryptography.Internal": "(,10.0.32767]", + "Microsoft.AspNetCore.Cryptography.KeyDerivation": "(,10.0.32767]", + "Microsoft.AspNetCore.DataProtection": "(,10.0.32767]", + "Microsoft.AspNetCore.DataProtection.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.DataProtection.Extensions": "(,10.0.32767]", + "Microsoft.AspNetCore.Diagnostics": "(,10.0.32767]", + "Microsoft.AspNetCore.Diagnostics.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Diagnostics.HealthChecks": "(,10.0.32767]", + "Microsoft.AspNetCore.HostFiltering": "(,10.0.32767]", + "Microsoft.AspNetCore.Hosting": "(,10.0.32767]", + "Microsoft.AspNetCore.Hosting.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Hosting.Server.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Html.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Http": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Connections": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Connections.Common": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Extensions": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Features": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Results": "(,10.0.32767]", + "Microsoft.AspNetCore.HttpLogging": "(,10.0.32767]", + "Microsoft.AspNetCore.HttpOverrides": "(,10.0.32767]", + "Microsoft.AspNetCore.HttpsPolicy": "(,10.0.32767]", + "Microsoft.AspNetCore.Identity": "(,10.0.32767]", + "Microsoft.AspNetCore.Localization": "(,10.0.32767]", + "Microsoft.AspNetCore.Localization.Routing": "(,10.0.32767]", + "Microsoft.AspNetCore.Metadata": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.ApiExplorer": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Cors": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.DataAnnotations": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Formatters.Json": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Formatters.Xml": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Localization": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Razor": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.RazorPages": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.TagHelpers": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.ViewFeatures": "(,10.0.32767]", + "Microsoft.AspNetCore.OutputCaching": "(,10.0.32767]", + "Microsoft.AspNetCore.RateLimiting": "(,10.0.32767]", + "Microsoft.AspNetCore.Razor": "(,10.0.32767]", + "Microsoft.AspNetCore.Razor.Runtime": "(,10.0.32767]", + "Microsoft.AspNetCore.RequestDecompression": "(,10.0.32767]", + "Microsoft.AspNetCore.ResponseCaching": "(,10.0.32767]", + "Microsoft.AspNetCore.ResponseCaching.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.ResponseCompression": "(,10.0.32767]", + "Microsoft.AspNetCore.Rewrite": "(,10.0.32767]", + "Microsoft.AspNetCore.Routing": "(,10.0.32767]", + "Microsoft.AspNetCore.Routing.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.HttpSys": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.IIS": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.IISIntegration": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Transport.Quic": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "(,10.0.32767]", + "Microsoft.AspNetCore.Session": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR.Common": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR.Protocols.Json": "(,10.0.32767]", + "Microsoft.AspNetCore.StaticAssets": "(,10.0.32767]", + "Microsoft.AspNetCore.StaticFiles": "(,10.0.32767]", + "Microsoft.AspNetCore.WebSockets": "(,10.0.32767]", + "Microsoft.AspNetCore.WebUtilities": "(,10.0.32767]", + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.Extensions.Caching.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Caching.Memory": "(,10.0.32767]", + "Microsoft.Extensions.Configuration": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Binder": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.CommandLine": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.FileExtensions": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Ini": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Json": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.KeyPerFile": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.UserSecrets": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Xml": "(,10.0.32767]", + "Microsoft.Extensions.DependencyInjection": "(,10.0.32767]", + "Microsoft.Extensions.DependencyInjection.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics.HealthChecks": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Features": "(,10.0.32767]", + "Microsoft.Extensions.FileProviders.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.FileProviders.Composite": "(,10.0.32767]", + "Microsoft.Extensions.FileProviders.Physical": "(,10.0.32767]", + "Microsoft.Extensions.FileSystemGlobbing": "(,10.0.32767]", + "Microsoft.Extensions.Hosting": "(,10.0.32767]", + "Microsoft.Extensions.Hosting.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Http": "(,10.0.32767]", + "Microsoft.Extensions.Identity.Core": "(,10.0.32767]", + "Microsoft.Extensions.Identity.Stores": "(,10.0.32767]", + "Microsoft.Extensions.Localization": "(,10.0.32767]", + "Microsoft.Extensions.Localization.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Logging": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Configuration": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Console": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Debug": "(,10.0.32767]", + "Microsoft.Extensions.Logging.EventLog": "(,10.0.32767]", + "Microsoft.Extensions.Logging.EventSource": "(,10.0.32767]", + "Microsoft.Extensions.Logging.TraceSource": "(,10.0.32767]", + "Microsoft.Extensions.ObjectPool": "(,10.0.32767]", + "Microsoft.Extensions.Options": "(,10.0.32767]", + "Microsoft.Extensions.Options.ConfigurationExtensions": "(,10.0.32767]", + "Microsoft.Extensions.Options.DataAnnotations": "(,10.0.32767]", + "Microsoft.Extensions.Primitives": "(,10.0.32767]", + "Microsoft.Extensions.Validation": "(,10.0.32767]", + "Microsoft.Extensions.WebEncoders": "(,10.0.32767]", + "Microsoft.JSInterop": "(,10.0.32767]", + "Microsoft.Net.Http.Headers": "(,10.0.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.EventLog": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Cbor": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Cryptography.Xml": "(,10.0.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.RateLimiting": "(,10.0.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + } + } +} \ No newline at end of file diff --git a/backend-tests/obj/Nexus.Api.Tests.csproj.nuget.g.props b/backend-tests/obj/Nexus.Api.Tests.csproj.nuget.g.props new file mode 100644 index 0000000..8539ae6 --- /dev/null +++ b/backend-tests/obj/Nexus.Api.Tests.csproj.nuget.g.props @@ -0,0 +1,27 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /home/node/.nuget/packages/ + /home/node/.nuget/packages/ + PackageReference + 7.0.0 + + + + + + + + + + + + + + /home/node/.nuget/packages/xunit.analyzers/1.18.0 + /home/node/.nuget/packages/microsoft.extensions.apidescription.server/10.0.0 + + \ No newline at end of file diff --git a/backend-tests/obj/Nexus.Api.Tests.csproj.nuget.g.targets b/backend-tests/obj/Nexus.Api.Tests.csproj.nuget.g.targets new file mode 100644 index 0000000..3161028 --- /dev/null +++ b/backend-tests/obj/Nexus.Api.Tests.csproj.nuget.g.targets @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/backend-tests/obj/project.assets.json b/backend-tests/obj/project.assets.json new file mode 100644 index 0000000..9886128 --- /dev/null +++ b/backend-tests/obj/project.assets.json @@ -0,0 +1,2899 @@ +{ + "version": 4, + "targets": { + "net10.0": { + "AspNetCore.HealthChecks.NpgSql/9.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "Npgsql": "8.0.3" + }, + "compile": { + "lib/net8.0/HealthChecks.NpgSql.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/HealthChecks.NpgSql.dll": { + "related": ".xml" + } + } + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.8": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "8.0.1" + }, + "compile": { + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll": { + "related": ".xml" + } + }, + "frameworkReferences": [ + "Microsoft.AspNetCore.App" + ] + }, + "Microsoft.CodeCoverage/17.13.0": { + "type": "package", + "compile": { + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {} + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {} + }, + "build": { + "build/netstandard2.0/Microsoft.CodeCoverage.props": {}, + "build/netstandard2.0/Microsoft.CodeCoverage.targets": {} + } + }, + "Microsoft.EntityFrameworkCore/10.0.4": { + "type": "package", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "10.0.4", + "Microsoft.EntityFrameworkCore.Analyzers": "10.0.4", + "Microsoft.Extensions.Caching.Memory": "10.0.4", + "Microsoft.Extensions.Logging": "10.0.4" + }, + "compile": { + "lib/net10.0/Microsoft.EntityFrameworkCore.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net10.0/Microsoft.EntityFrameworkCore.props": {} + } + }, + "Microsoft.EntityFrameworkCore.Abstractions/10.0.4": { + "type": "package", + "compile": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { + "related": ".xml" + } + } + }, + "Microsoft.EntityFrameworkCore.Analyzers/10.0.4": { + "type": "package" + }, + "Microsoft.EntityFrameworkCore.Relational/10.0.4": { + "type": "package", + "dependencies": { + "Microsoft.EntityFrameworkCore": "10.0.4", + "Microsoft.Extensions.Caching.Memory": "10.0.4", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.4", + "Microsoft.Extensions.Logging": "10.0.4" + }, + "compile": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Relational.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Relational.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Extensions.ApiDescription.Server/10.0.0": { + "type": "package", + "build": { + "build/_._": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/_._": {} + } + }, + "Microsoft.Extensions.Caching.Abstractions/10.0.4": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.4" + }, + "compile": { + "lib/net10.0/Microsoft.Extensions.Caching.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.Extensions.Caching.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net8.0/_._": {} + } + }, + "Microsoft.Extensions.Caching.Memory/10.0.4": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.4", + "Microsoft.Extensions.Logging.Abstractions": "10.0.4", + "Microsoft.Extensions.Options": "10.0.4", + "Microsoft.Extensions.Primitives": "10.0.4" + }, + "compile": { + "lib/net10.0/Microsoft.Extensions.Caching.Memory.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.Extensions.Caching.Memory.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net8.0/_._": {} + } + }, + "Microsoft.Extensions.Configuration.Abstractions/10.0.4": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.4" + }, + "compile": { + "lib/net10.0/Microsoft.Extensions.Configuration.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.Extensions.Configuration.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net8.0/_._": {} + } + }, + "Microsoft.Extensions.DependencyInjection/10.0.4": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.4" + }, + "compile": { + "lib/net10.0/Microsoft.Extensions.DependencyInjection.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.Extensions.DependencyInjection.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net8.0/_._": {} + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/10.0.4": { + "type": "package", + "compile": { + "lib/net10.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net8.0/_._": {} + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + }, + "compile": { + "lib/net8.0/Microsoft.Extensions.Diagnostics.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Extensions.Diagnostics.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks/8.0.11": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.11", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + }, + "compile": { + "lib/net8.0/Microsoft.Extensions.Diagnostics.HealthChecks.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Extensions.Diagnostics.HealthChecks.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions/8.0.11": { + "type": "package", + "compile": { + "lib/net8.0/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Extensions.FileProviders.Abstractions/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + }, + "compile": { + "lib/net8.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.Hosting.Abstractions/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2" + }, + "compile": { + "lib/net8.0/Microsoft.Extensions.Hosting.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Extensions.Hosting.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.Logging/10.0.4": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.4", + "Microsoft.Extensions.Logging.Abstractions": "10.0.4", + "Microsoft.Extensions.Options": "10.0.4" + }, + "compile": { + "lib/net10.0/Microsoft.Extensions.Logging.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.Extensions.Logging.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net8.0/_._": {} + } + }, + "Microsoft.Extensions.Logging.Abstractions/10.0.4": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.4" + }, + "compile": { + "lib/net10.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets": {} + } + }, + "Microsoft.Extensions.Options/10.0.4": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.4", + "Microsoft.Extensions.Primitives": "10.0.4" + }, + "compile": { + "lib/net10.0/Microsoft.Extensions.Options.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.Extensions.Options.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net8.0/Microsoft.Extensions.Options.targets": {} + } + }, + "Microsoft.Extensions.Primitives/10.0.4": { + "type": "package", + "compile": { + "lib/net10.0/Microsoft.Extensions.Primitives.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.Extensions.Primitives.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net8.0/_._": {} + } + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "type": "package", + "compile": { + "lib/net9.0/Microsoft.IdentityModel.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Abstractions.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "compile": { + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.0.1" + }, + "compile": { + "lib/net9.0/Microsoft.IdentityModel.Logging.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Logging.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "compile": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Protocols": "8.0.1", + "System.IdentityModel.Tokens.Jwt": "8.0.1" + }, + "compile": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Logging": "8.0.1" + }, + "compile": { + "lib/net9.0/Microsoft.IdentityModel.Tokens.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Tokens.dll": { + "related": ".xml" + } + } + }, + "Microsoft.NET.Test.Sdk/17.13.0": { + "type": "package", + "dependencies": { + "Microsoft.CodeCoverage": "17.13.0", + "Microsoft.TestPlatform.TestHost": "17.13.0" + }, + "compile": { + "lib/netcoreapp3.1/_._": {} + }, + "runtime": { + "lib/netcoreapp3.1/_._": {} + }, + "build": { + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props": {}, + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/Microsoft.NET.Test.Sdk.props": {} + } + }, + "Microsoft.OpenApi/2.7.5": { + "type": "package", + "compile": { + "lib/net8.0/Microsoft.OpenApi.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.OpenApi.dll": { + "related": ".pdb;.xml" + } + } + }, + "Microsoft.TestPlatform.ObjectModel/17.13.0": { + "type": "package", + "compile": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {} + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {} + }, + "resource": { + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.TestPlatform.TestHost/17.13.0": { + "type": "package", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.13.0", + "Newtonsoft.Json": "13.0.1" + }, + "compile": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}, + "lib/netcoreapp3.1/testhost.dll": { + "related": ".deps.json" + } + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}, + "lib/netcoreapp3.1/testhost.dll": { + "related": ".deps.json" + } + }, + "resource": { + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "zh-Hant" + } + }, + "build": { + "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props": {} + } + }, + "Newtonsoft.Json/13.0.1": { + "type": "package", + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + } + }, + "Npgsql/10.0.3": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "10.0.0" + }, + "compile": { + "lib/net10.0/Npgsql.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Npgsql.dll": { + "related": ".xml" + } + } + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/10.0.2": { + "type": "package", + "dependencies": { + "Microsoft.EntityFrameworkCore": "[10.0.4, 11.0.0)", + "Microsoft.EntityFrameworkCore.Relational": "[10.0.4, 11.0.0)", + "Npgsql": "10.0.3" + }, + "compile": { + "lib/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": { + "related": ".xml" + } + } + }, + "Swashbuckle.AspNetCore/10.2.1": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.ApiDescription.Server": "10.0.0", + "Swashbuckle.AspNetCore.Swagger": "10.2.1", + "Swashbuckle.AspNetCore.SwaggerGen": "10.2.1", + "Swashbuckle.AspNetCore.SwaggerUI": "10.2.1" + }, + "build": { + "build/_._": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/_._": {} + } + }, + "Swashbuckle.AspNetCore.Swagger/10.2.1": { + "type": "package", + "dependencies": { + "Microsoft.OpenApi": "2.7.5" + }, + "compile": { + "lib/net10.0/Swashbuckle.AspNetCore.Swagger.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.Swagger.dll": { + "related": ".pdb;.xml" + } + }, + "frameworkReferences": [ + "Microsoft.AspNetCore.App" + ] + }, + "Swashbuckle.AspNetCore.SwaggerGen/10.2.1": { + "type": "package", + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "10.2.1" + }, + "compile": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll": { + "related": ".pdb;.xml" + } + } + }, + "Swashbuckle.AspNetCore.SwaggerUI/10.2.1": { + "type": "package", + "compile": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll": { + "related": ".pdb;.xml" + } + }, + "frameworkReferences": [ + "Microsoft.AspNetCore.App" + ] + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.0.1", + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "compile": { + "lib/net9.0/System.IdentityModel.Tokens.Jwt.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/System.IdentityModel.Tokens.Jwt.dll": { + "related": ".xml" + } + } + }, + "xunit/2.9.3": { + "type": "package", + "dependencies": { + "xunit.analyzers": "1.18.0", + "xunit.assert": "2.9.3", + "xunit.core": "[2.9.3]" + } + }, + "xunit.abstractions/2.0.3": { + "type": "package", + "compile": { + "lib/netstandard2.0/xunit.abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/xunit.abstractions.dll": { + "related": ".xml" + } + } + }, + "xunit.analyzers/1.18.0": { + "type": "package" + }, + "xunit.assert/2.9.3": { + "type": "package", + "compile": { + "lib/net6.0/xunit.assert.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/xunit.assert.dll": { + "related": ".xml" + } + } + }, + "xunit.core/2.9.3": { + "type": "package", + "dependencies": { + "xunit.extensibility.core": "[2.9.3]", + "xunit.extensibility.execution": "[2.9.3]" + }, + "build": { + "build/xunit.core.props": {}, + "build/xunit.core.targets": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/xunit.core.props": {}, + "buildMultiTargeting/xunit.core.targets": {} + } + }, + "xunit.extensibility.core/2.9.3": { + "type": "package", + "dependencies": { + "xunit.abstractions": "2.0.3" + }, + "compile": { + "lib/netstandard1.1/xunit.core.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard1.1/xunit.core.dll": { + "related": ".xml" + } + } + }, + "xunit.extensibility.execution/2.9.3": { + "type": "package", + "dependencies": { + "xunit.extensibility.core": "[2.9.3]" + }, + "compile": { + "lib/netstandard1.1/xunit.execution.dotnet.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard1.1/xunit.execution.dotnet.dll": { + "related": ".xml" + } + } + }, + "xunit.runner.visualstudio/3.1.0": { + "type": "package", + "compile": { + "lib/net8.0/_._": {} + }, + "runtime": { + "lib/net8.0/_._": {} + }, + "build": { + "build/net8.0/xunit.runner.visualstudio.props": {} + } + }, + "Nexus.Api/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v10.0", + "dependencies": { + "AspNetCore.HealthChecks.NpgSql": "9.0.0", + "Microsoft.AspNetCore.Authentication.JwtBearer": "10.0.8", + "Npgsql.EntityFrameworkCore.PostgreSQL": "10.0.2", + "Swashbuckle.AspNetCore": "10.2.1" + }, + "compile": { + "bin/placeholder/Nexus.Api.dll": {} + }, + "runtime": { + "bin/placeholder/Nexus.Api.dll": {} + }, + "frameworkReferences": [ + "Microsoft.AspNetCore.App" + ] + } + } + }, + "libraries": { + "AspNetCore.HealthChecks.NpgSql/9.0.0": { + "sha512": "npc58/AD5zuVxERdhCl2Kb7WnL37mwX42SJcXIwvmEig0/dugOLg3SIwtfvvh3TnvTwR/sk5LYNkkPaBdks61A==", + "type": "package", + "path": "aspnetcore.healthchecks.npgsql/9.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "aspnetcore.healthchecks.npgsql.9.0.0.nupkg.sha512", + "aspnetcore.healthchecks.npgsql.nuspec", + "icon.png", + "lib/net8.0/HealthChecks.NpgSql.dll", + "lib/net8.0/HealthChecks.NpgSql.xml", + "lib/netstandard2.0/HealthChecks.NpgSql.dll", + "lib/netstandard2.0/HealthChecks.NpgSql.xml" + ] + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.8": { + "sha512": "oGnE+X/SN6jdqao9WOkOIfyZ5+a0AtluJWy1Mxndq+kcWG6sx5k6l6tucu8/wJ7o9fHfLgVCzm/c4v/KVgVk6w==", + "type": "package", + "path": "microsoft.aspnetcore.authentication.jwtbearer/10.0.8", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll", + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.xml", + "microsoft.aspnetcore.authentication.jwtbearer.10.0.8.nupkg.sha512", + "microsoft.aspnetcore.authentication.jwtbearer.nuspec" + ] + }, + "Microsoft.CodeCoverage/17.13.0": { + "sha512": "9LIUy0y+DvUmEPtbRDw6Bay3rzwqFV8P4efTrK4CZhQle3M/QwLPjISghfcolmEGAPWxuJi6m98ZEfk4VR4Lfg==", + "type": "package", + "path": "microsoft.codecoverage/17.13.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.txt", + "build/netstandard2.0/CodeCoverage/CodeCoverage.config", + "build/netstandard2.0/CodeCoverage/CodeCoverage.exe", + "build/netstandard2.0/CodeCoverage/Cov_x86.config", + "build/netstandard2.0/CodeCoverage/amd64/CodeCoverage.exe", + "build/netstandard2.0/CodeCoverage/amd64/Cov_x64.config", + "build/netstandard2.0/CodeCoverage/amd64/covrun64.dll", + "build/netstandard2.0/CodeCoverage/amd64/msdia140.dll", + "build/netstandard2.0/CodeCoverage/arm64/Cov_arm64.config", + "build/netstandard2.0/CodeCoverage/arm64/covrunarm64.dll", + "build/netstandard2.0/CodeCoverage/arm64/msdia140.dll", + "build/netstandard2.0/CodeCoverage/codecoveragemessages.dll", + "build/netstandard2.0/CodeCoverage/coreclr/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "build/netstandard2.0/CodeCoverage/covrun32.dll", + "build/netstandard2.0/CodeCoverage/msdia140.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Core.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.Core.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Interprocess.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.props", + "build/netstandard2.0/Microsoft.CodeCoverage.targets", + "build/netstandard2.0/Microsoft.DiaSymReader.dll", + "build/netstandard2.0/Microsoft.VisualStudio.TraceDataCollector.dll", + "build/netstandard2.0/Mono.Cecil.Pdb.dll", + "build/netstandard2.0/Mono.Cecil.Rocks.dll", + "build/netstandard2.0/Mono.Cecil.dll", + "build/netstandard2.0/ThirdPartyNotices.txt", + "build/netstandard2.0/alpine/x64/Cov_x64.config", + "build/netstandard2.0/alpine/x64/libCoverageInstrumentationMethod.so", + "build/netstandard2.0/alpine/x64/libInstrumentationEngine.so", + "build/netstandard2.0/arm64/MicrosoftInstrumentationEngine_arm64.dll", + "build/netstandard2.0/cs/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/de/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/es/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/fr/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/it/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ja/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ko/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/macos/x64/Cov_x64.config", + "build/netstandard2.0/macos/x64/libCoverageInstrumentationMethod.dylib", + "build/netstandard2.0/macos/x64/libInstrumentationEngine.dylib", + "build/netstandard2.0/pl/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/pt-BR/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ru/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/tr/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ubuntu/x64/Cov_x64.config", + "build/netstandard2.0/ubuntu/x64/libCoverageInstrumentationMethod.so", + "build/netstandard2.0/ubuntu/x64/libInstrumentationEngine.so", + "build/netstandard2.0/x64/MicrosoftInstrumentationEngine_x64.dll", + "build/netstandard2.0/x86/MicrosoftInstrumentationEngine_x86.dll", + "build/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "lib/net462/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "microsoft.codecoverage.17.13.0.nupkg.sha512", + "microsoft.codecoverage.nuspec" + ] + }, + "Microsoft.EntityFrameworkCore/10.0.4": { + "sha512": "kzTsfFK2GCytp6DDTfQOmxPU4gbGdrIlP7PxrxF3ESNLtfXrC8BoUVZENBN2WORlZPAD7CVX6AYIglgkpXQooA==", + "type": "package", + "path": "microsoft.entityframeworkcore/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "buildTransitive/net10.0/Microsoft.EntityFrameworkCore.props", + "lib/net10.0/Microsoft.EntityFrameworkCore.dll", + "lib/net10.0/Microsoft.EntityFrameworkCore.xml", + "microsoft.entityframeworkcore.10.0.4.nupkg.sha512", + "microsoft.entityframeworkcore.nuspec" + ] + }, + "Microsoft.EntityFrameworkCore.Abstractions/10.0.4": { + "sha512": "qDcJqCfN1XYyX0ID/Hd9/kQTRvlia8S+Yuwyl9uFhBIKnOCbl9WMdGQCzbZUKbkpkfvf3P9CDdXsnxHyE3O0Aw==", + "type": "package", + "path": "microsoft.entityframeworkcore.abstractions/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "lib/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll", + "lib/net10.0/Microsoft.EntityFrameworkCore.Abstractions.xml", + "microsoft.entityframeworkcore.abstractions.10.0.4.nupkg.sha512", + "microsoft.entityframeworkcore.abstractions.nuspec" + ] + }, + "Microsoft.EntityFrameworkCore.Analyzers/10.0.4": { + "sha512": "pQeMHCyD3yTtCEGnHV4VsgKUvrESo3MR5mnh8sgQ1hWYmI1YFsUutDowBIxkobeWRtaRmBqQAtF7XQFW6FWuNA==", + "type": "package", + "path": "microsoft.entityframeworkcore.analyzers/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "analyzers/dotnet/cs/Microsoft.EntityFrameworkCore.Analyzers.dll", + "docs/PACKAGE.md", + "microsoft.entityframeworkcore.analyzers.10.0.4.nupkg.sha512", + "microsoft.entityframeworkcore.analyzers.nuspec" + ] + }, + "Microsoft.EntityFrameworkCore.Relational/10.0.4": { + "sha512": "DOTjTHy93W3TwpMLM4SCm0n57Sc0Jj3+m2S6LSTstKyBB34eT1UouaMS19mpWwvtj42+sRiEjA3+rOTNoNzXFQ==", + "type": "package", + "path": "microsoft.entityframeworkcore.relational/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "lib/net10.0/Microsoft.EntityFrameworkCore.Relational.dll", + "lib/net10.0/Microsoft.EntityFrameworkCore.Relational.xml", + "microsoft.entityframeworkcore.relational.10.0.4.nupkg.sha512", + "microsoft.entityframeworkcore.relational.nuspec" + ] + }, + "Microsoft.Extensions.ApiDescription.Server/10.0.0": { + "sha512": "NCWCGiwRwje8773yzPQhvucYnnfeR+ZoB1VRIrIMp4uaeUNw7jvEPHij3HIbwCDuNCrNcphA00KSAR9yD9qmbg==", + "type": "package", + "path": "microsoft.extensions.apidescription.server/10.0.0", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "build/Microsoft.Extensions.ApiDescription.Server.props", + "build/Microsoft.Extensions.ApiDescription.Server.targets", + "buildMultiTargeting/Microsoft.Extensions.ApiDescription.Server.props", + "buildMultiTargeting/Microsoft.Extensions.ApiDescription.Server.targets", + "microsoft.extensions.apidescription.server.10.0.0.nupkg.sha512", + "microsoft.extensions.apidescription.server.nuspec", + "tools/Newtonsoft.Json.dll", + "tools/dotnet-getdocument.deps.json", + "tools/dotnet-getdocument.dll", + "tools/dotnet-getdocument.runtimeconfig.json", + "tools/net10.0/GetDocument.Insider.deps.json", + "tools/net10.0/GetDocument.Insider.dll", + "tools/net10.0/GetDocument.Insider.exe", + "tools/net10.0/GetDocument.Insider.runtimeconfig.json", + "tools/net10.0/Microsoft.AspNetCore.Connections.Abstractions.dll", + "tools/net10.0/Microsoft.AspNetCore.Connections.Abstractions.xml", + "tools/net10.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll", + "tools/net10.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.xml", + "tools/net10.0/Microsoft.AspNetCore.Http.Features.dll", + "tools/net10.0/Microsoft.AspNetCore.Http.Features.xml", + "tools/net10.0/Microsoft.Extensions.Configuration.Abstractions.dll", + "tools/net10.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "tools/net10.0/Microsoft.Extensions.Diagnostics.Abstractions.dll", + "tools/net10.0/Microsoft.Extensions.Features.dll", + "tools/net10.0/Microsoft.Extensions.Features.xml", + "tools/net10.0/Microsoft.Extensions.FileProviders.Abstractions.dll", + "tools/net10.0/Microsoft.Extensions.Hosting.Abstractions.dll", + "tools/net10.0/Microsoft.Extensions.Logging.Abstractions.dll", + "tools/net10.0/Microsoft.Extensions.Options.dll", + "tools/net10.0/Microsoft.Extensions.Primitives.dll", + "tools/net10.0/Microsoft.Net.Http.Headers.dll", + "tools/net10.0/Microsoft.Net.Http.Headers.xml", + "tools/net10.0/Microsoft.OpenApi.dll", + "tools/net462-x86/GetDocument.Insider.exe", + "tools/net462-x86/GetDocument.Insider.exe.config", + "tools/net462-x86/Microsoft.Bcl.AsyncInterfaces.dll", + "tools/net462-x86/Microsoft.OpenApi.dll", + "tools/net462-x86/Microsoft.Win32.Primitives.dll", + "tools/net462-x86/System.AppContext.dll", + "tools/net462-x86/System.Buffers.dll", + "tools/net462-x86/System.Collections.Concurrent.dll", + "tools/net462-x86/System.Collections.NonGeneric.dll", + "tools/net462-x86/System.Collections.Specialized.dll", + "tools/net462-x86/System.Collections.dll", + "tools/net462-x86/System.ComponentModel.EventBasedAsync.dll", + "tools/net462-x86/System.ComponentModel.Primitives.dll", + "tools/net462-x86/System.ComponentModel.TypeConverter.dll", + "tools/net462-x86/System.ComponentModel.dll", + "tools/net462-x86/System.Console.dll", + "tools/net462-x86/System.Data.Common.dll", + "tools/net462-x86/System.Diagnostics.Contracts.dll", + "tools/net462-x86/System.Diagnostics.Debug.dll", + "tools/net462-x86/System.Diagnostics.DiagnosticSource.dll", + "tools/net462-x86/System.Diagnostics.FileVersionInfo.dll", + "tools/net462-x86/System.Diagnostics.Process.dll", + "tools/net462-x86/System.Diagnostics.StackTrace.dll", + "tools/net462-x86/System.Diagnostics.TextWriterTraceListener.dll", + "tools/net462-x86/System.Diagnostics.Tools.dll", + "tools/net462-x86/System.Diagnostics.TraceSource.dll", + "tools/net462-x86/System.Diagnostics.Tracing.dll", + "tools/net462-x86/System.Drawing.Primitives.dll", + "tools/net462-x86/System.Dynamic.Runtime.dll", + "tools/net462-x86/System.Globalization.Calendars.dll", + "tools/net462-x86/System.Globalization.Extensions.dll", + "tools/net462-x86/System.Globalization.dll", + "tools/net462-x86/System.IO.Compression.ZipFile.dll", + "tools/net462-x86/System.IO.Compression.dll", + "tools/net462-x86/System.IO.FileSystem.DriveInfo.dll", + "tools/net462-x86/System.IO.FileSystem.Primitives.dll", + "tools/net462-x86/System.IO.FileSystem.Watcher.dll", + "tools/net462-x86/System.IO.FileSystem.dll", + "tools/net462-x86/System.IO.IsolatedStorage.dll", + "tools/net462-x86/System.IO.MemoryMappedFiles.dll", + "tools/net462-x86/System.IO.Pipes.dll", + "tools/net462-x86/System.IO.UnmanagedMemoryStream.dll", + "tools/net462-x86/System.IO.dll", + "tools/net462-x86/System.Linq.Expressions.dll", + "tools/net462-x86/System.Linq.Parallel.dll", + "tools/net462-x86/System.Linq.Queryable.dll", + "tools/net462-x86/System.Linq.dll", + "tools/net462-x86/System.Memory.dll", + "tools/net462-x86/System.Net.Http.dll", + "tools/net462-x86/System.Net.NameResolution.dll", + "tools/net462-x86/System.Net.NetworkInformation.dll", + "tools/net462-x86/System.Net.Ping.dll", + "tools/net462-x86/System.Net.Primitives.dll", + "tools/net462-x86/System.Net.Requests.dll", + "tools/net462-x86/System.Net.Security.dll", + "tools/net462-x86/System.Net.Sockets.dll", + "tools/net462-x86/System.Net.WebHeaderCollection.dll", + "tools/net462-x86/System.Net.WebSockets.Client.dll", + "tools/net462-x86/System.Net.WebSockets.dll", + "tools/net462-x86/System.Numerics.Vectors.dll", + "tools/net462-x86/System.ObjectModel.dll", + "tools/net462-x86/System.Reflection.Extensions.dll", + "tools/net462-x86/System.Reflection.Primitives.dll", + "tools/net462-x86/System.Reflection.dll", + "tools/net462-x86/System.Resources.Reader.dll", + "tools/net462-x86/System.Resources.ResourceManager.dll", + "tools/net462-x86/System.Resources.Writer.dll", + "tools/net462-x86/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net462-x86/System.Runtime.CompilerServices.VisualC.dll", + "tools/net462-x86/System.Runtime.Extensions.dll", + "tools/net462-x86/System.Runtime.Handles.dll", + "tools/net462-x86/System.Runtime.InteropServices.RuntimeInformation.dll", + "tools/net462-x86/System.Runtime.InteropServices.dll", + "tools/net462-x86/System.Runtime.Numerics.dll", + "tools/net462-x86/System.Runtime.Serialization.Formatters.dll", + "tools/net462-x86/System.Runtime.Serialization.Json.dll", + "tools/net462-x86/System.Runtime.Serialization.Primitives.dll", + "tools/net462-x86/System.Runtime.Serialization.Xml.dll", + "tools/net462-x86/System.Runtime.dll", + "tools/net462-x86/System.Security.Claims.dll", + "tools/net462-x86/System.Security.Cryptography.Algorithms.dll", + "tools/net462-x86/System.Security.Cryptography.Csp.dll", + "tools/net462-x86/System.Security.Cryptography.Encoding.dll", + "tools/net462-x86/System.Security.Cryptography.Primitives.dll", + "tools/net462-x86/System.Security.Cryptography.X509Certificates.dll", + "tools/net462-x86/System.Security.Principal.dll", + "tools/net462-x86/System.Security.SecureString.dll", + "tools/net462-x86/System.Text.Encoding.Extensions.dll", + "tools/net462-x86/System.Text.Encoding.dll", + "tools/net462-x86/System.Text.Encodings.Web.dll", + "tools/net462-x86/System.Text.Json.dll", + "tools/net462-x86/System.Text.RegularExpressions.dll", + "tools/net462-x86/System.Threading.Overlapped.dll", + "tools/net462-x86/System.Threading.Tasks.Extensions.dll", + "tools/net462-x86/System.Threading.Tasks.Parallel.dll", + "tools/net462-x86/System.Threading.Tasks.dll", + "tools/net462-x86/System.Threading.Thread.dll", + "tools/net462-x86/System.Threading.ThreadPool.dll", + "tools/net462-x86/System.Threading.Timer.dll", + "tools/net462-x86/System.Threading.dll", + "tools/net462-x86/System.ValueTuple.dll", + "tools/net462-x86/System.Xml.ReaderWriter.dll", + "tools/net462-x86/System.Xml.XDocument.dll", + "tools/net462-x86/System.Xml.XPath.XDocument.dll", + "tools/net462-x86/System.Xml.XPath.dll", + "tools/net462-x86/System.Xml.XmlDocument.dll", + "tools/net462-x86/System.Xml.XmlSerializer.dll", + "tools/net462-x86/netstandard.dll", + "tools/net462/GetDocument.Insider.exe", + "tools/net462/GetDocument.Insider.exe.config", + "tools/net462/Microsoft.Bcl.AsyncInterfaces.dll", + "tools/net462/Microsoft.OpenApi.dll", + "tools/net462/Microsoft.Win32.Primitives.dll", + "tools/net462/System.AppContext.dll", + "tools/net462/System.Buffers.dll", + "tools/net462/System.Collections.Concurrent.dll", + "tools/net462/System.Collections.NonGeneric.dll", + "tools/net462/System.Collections.Specialized.dll", + "tools/net462/System.Collections.dll", + "tools/net462/System.ComponentModel.EventBasedAsync.dll", + "tools/net462/System.ComponentModel.Primitives.dll", + "tools/net462/System.ComponentModel.TypeConverter.dll", + "tools/net462/System.ComponentModel.dll", + "tools/net462/System.Console.dll", + "tools/net462/System.Data.Common.dll", + "tools/net462/System.Diagnostics.Contracts.dll", + "tools/net462/System.Diagnostics.Debug.dll", + "tools/net462/System.Diagnostics.DiagnosticSource.dll", + "tools/net462/System.Diagnostics.FileVersionInfo.dll", + "tools/net462/System.Diagnostics.Process.dll", + "tools/net462/System.Diagnostics.StackTrace.dll", + "tools/net462/System.Diagnostics.TextWriterTraceListener.dll", + "tools/net462/System.Diagnostics.Tools.dll", + "tools/net462/System.Diagnostics.TraceSource.dll", + "tools/net462/System.Diagnostics.Tracing.dll", + "tools/net462/System.Drawing.Primitives.dll", + "tools/net462/System.Dynamic.Runtime.dll", + "tools/net462/System.Globalization.Calendars.dll", + "tools/net462/System.Globalization.Extensions.dll", + "tools/net462/System.Globalization.dll", + "tools/net462/System.IO.Compression.ZipFile.dll", + "tools/net462/System.IO.Compression.dll", + "tools/net462/System.IO.FileSystem.DriveInfo.dll", + "tools/net462/System.IO.FileSystem.Primitives.dll", + "tools/net462/System.IO.FileSystem.Watcher.dll", + "tools/net462/System.IO.FileSystem.dll", + "tools/net462/System.IO.IsolatedStorage.dll", + "tools/net462/System.IO.MemoryMappedFiles.dll", + "tools/net462/System.IO.Pipes.dll", + "tools/net462/System.IO.UnmanagedMemoryStream.dll", + "tools/net462/System.IO.dll", + "tools/net462/System.Linq.Expressions.dll", + "tools/net462/System.Linq.Parallel.dll", + "tools/net462/System.Linq.Queryable.dll", + "tools/net462/System.Linq.dll", + "tools/net462/System.Memory.dll", + "tools/net462/System.Net.Http.dll", + "tools/net462/System.Net.NameResolution.dll", + "tools/net462/System.Net.NetworkInformation.dll", + "tools/net462/System.Net.Ping.dll", + "tools/net462/System.Net.Primitives.dll", + "tools/net462/System.Net.Requests.dll", + "tools/net462/System.Net.Security.dll", + "tools/net462/System.Net.Sockets.dll", + "tools/net462/System.Net.WebHeaderCollection.dll", + "tools/net462/System.Net.WebSockets.Client.dll", + "tools/net462/System.Net.WebSockets.dll", + "tools/net462/System.Numerics.Vectors.dll", + "tools/net462/System.ObjectModel.dll", + "tools/net462/System.Reflection.Extensions.dll", + "tools/net462/System.Reflection.Primitives.dll", + "tools/net462/System.Reflection.dll", + "tools/net462/System.Resources.Reader.dll", + "tools/net462/System.Resources.ResourceManager.dll", + "tools/net462/System.Resources.Writer.dll", + "tools/net462/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net462/System.Runtime.CompilerServices.VisualC.dll", + "tools/net462/System.Runtime.Extensions.dll", + "tools/net462/System.Runtime.Handles.dll", + "tools/net462/System.Runtime.InteropServices.RuntimeInformation.dll", + "tools/net462/System.Runtime.InteropServices.dll", + "tools/net462/System.Runtime.Numerics.dll", + "tools/net462/System.Runtime.Serialization.Formatters.dll", + "tools/net462/System.Runtime.Serialization.Json.dll", + "tools/net462/System.Runtime.Serialization.Primitives.dll", + "tools/net462/System.Runtime.Serialization.Xml.dll", + "tools/net462/System.Runtime.dll", + "tools/net462/System.Security.Claims.dll", + "tools/net462/System.Security.Cryptography.Algorithms.dll", + "tools/net462/System.Security.Cryptography.Csp.dll", + "tools/net462/System.Security.Cryptography.Encoding.dll", + "tools/net462/System.Security.Cryptography.Primitives.dll", + "tools/net462/System.Security.Cryptography.X509Certificates.dll", + "tools/net462/System.Security.Principal.dll", + "tools/net462/System.Security.SecureString.dll", + "tools/net462/System.Text.Encoding.Extensions.dll", + "tools/net462/System.Text.Encoding.dll", + "tools/net462/System.Text.Encodings.Web.dll", + "tools/net462/System.Text.Json.dll", + "tools/net462/System.Text.RegularExpressions.dll", + "tools/net462/System.Threading.Overlapped.dll", + "tools/net462/System.Threading.Tasks.Extensions.dll", + "tools/net462/System.Threading.Tasks.Parallel.dll", + "tools/net462/System.Threading.Tasks.dll", + "tools/net462/System.Threading.Thread.dll", + "tools/net462/System.Threading.ThreadPool.dll", + "tools/net462/System.Threading.Timer.dll", + "tools/net462/System.Threading.dll", + "tools/net462/System.ValueTuple.dll", + "tools/net462/System.Xml.ReaderWriter.dll", + "tools/net462/System.Xml.XDocument.dll", + "tools/net462/System.Xml.XPath.XDocument.dll", + "tools/net462/System.Xml.XPath.dll", + "tools/net462/System.Xml.XmlDocument.dll", + "tools/net462/System.Xml.XmlSerializer.dll", + "tools/net462/netstandard.dll" + ] + }, + "Microsoft.Extensions.Caching.Abstractions/10.0.4": { + "sha512": "uDRooaV6N3WZ0kdlNPMB68/MdGn/in1Fs7Db7DnIm85RBTPy4P321WO+daAImiYpH5dekjNggDqy1N44WaIlMA==", + "type": "package", + "path": "microsoft.extensions.caching.abstractions/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Caching.Abstractions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net8.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Abstractions.targets", + "lib/net10.0/Microsoft.Extensions.Caching.Abstractions.dll", + "lib/net10.0/Microsoft.Extensions.Caching.Abstractions.xml", + "lib/net462/Microsoft.Extensions.Caching.Abstractions.dll", + "lib/net462/Microsoft.Extensions.Caching.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.xml", + "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll", + "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.xml", + "microsoft.extensions.caching.abstractions.10.0.4.nupkg.sha512", + "microsoft.extensions.caching.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Caching.Memory/10.0.4": { + "sha512": "CLLussNUMdSbyJOu4VBF7sqskHGB/5N1EcFzrqG/HsPATN8fCRUcfp0qns1VwkxKHwxrtYCh5FKe+kM81Q1PHA==", + "type": "package", + "path": "microsoft.extensions.caching.memory/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Caching.Memory.targets", + "buildTransitive/net462/_._", + "buildTransitive/net8.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Memory.targets", + "lib/net10.0/Microsoft.Extensions.Caching.Memory.dll", + "lib/net10.0/Microsoft.Extensions.Caching.Memory.xml", + "lib/net462/Microsoft.Extensions.Caching.Memory.dll", + "lib/net462/Microsoft.Extensions.Caching.Memory.xml", + "lib/net8.0/Microsoft.Extensions.Caching.Memory.dll", + "lib/net8.0/Microsoft.Extensions.Caching.Memory.xml", + "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll", + "lib/net9.0/Microsoft.Extensions.Caching.Memory.xml", + "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.dll", + "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.xml", + "microsoft.extensions.caching.memory.10.0.4.nupkg.sha512", + "microsoft.extensions.caching.memory.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Configuration.Abstractions/10.0.4": { + "sha512": "3x9X9SMAMdAoEwWxHfsT2a9dTBqEtfYfbEOFw+UPtBshEH2gHWJeazxrZ1FK1O18MoCbe1NxINg5qciB01pEcg==", + "type": "package", + "path": "microsoft.extensions.configuration.abstractions/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Configuration.Abstractions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net8.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Configuration.Abstractions.targets", + "lib/net10.0/Microsoft.Extensions.Configuration.Abstractions.dll", + "lib/net10.0/Microsoft.Extensions.Configuration.Abstractions.xml", + "lib/net462/Microsoft.Extensions.Configuration.Abstractions.dll", + "lib/net462/Microsoft.Extensions.Configuration.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.xml", + "lib/net9.0/Microsoft.Extensions.Configuration.Abstractions.dll", + "lib/net9.0/Microsoft.Extensions.Configuration.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml", + "microsoft.extensions.configuration.abstractions.10.0.4.nupkg.sha512", + "microsoft.extensions.configuration.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.DependencyInjection/10.0.4": { + "sha512": "NkvJ8aSr3AG30yabjv7ZWwTG/wq5OElNTlNq39Ok2HSEF3TIwAc1f1xnTJlR/GuoJmEgkfT7WBO9YbSXRk41+g==", + "type": "package", + "path": "microsoft.extensions.dependencyinjection/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.targets", + "buildTransitive/net462/_._", + "buildTransitive/net8.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.targets", + "lib/net10.0/Microsoft.Extensions.DependencyInjection.dll", + "lib/net10.0/Microsoft.Extensions.DependencyInjection.xml", + "lib/net462/Microsoft.Extensions.DependencyInjection.dll", + "lib/net462/Microsoft.Extensions.DependencyInjection.xml", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.xml", + "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll", + "lib/net9.0/Microsoft.Extensions.DependencyInjection.xml", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.dll", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.xml", + "microsoft.extensions.dependencyinjection.10.0.4.nupkg.sha512", + "microsoft.extensions.dependencyinjection.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/10.0.4": { + "sha512": "SIe9zlVQJecnk/DTmevIcl6+aEDYhoVLc2eG2AKwVeNEC8CSyxHAbh4lf0xtHq9JUum0vVTEByGNTK+b6oihTQ==", + "type": "package", + "path": "microsoft.extensions.dependencyinjection.abstractions/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net8.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets", + "lib/net10.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net10.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "microsoft.extensions.dependencyinjection.abstractions.10.0.4.nupkg.sha512", + "microsoft.extensions.dependencyinjection.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Diagnostics.Abstractions/8.0.1": { + "sha512": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==", + "type": "package", + "path": "microsoft.extensions.diagnostics.abstractions/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Diagnostics.Abstractions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Diagnostics.Abstractions.targets", + "lib/net462/Microsoft.Extensions.Diagnostics.Abstractions.dll", + "lib/net462/Microsoft.Extensions.Diagnostics.Abstractions.xml", + "lib/net6.0/Microsoft.Extensions.Diagnostics.Abstractions.dll", + "lib/net6.0/Microsoft.Extensions.Diagnostics.Abstractions.xml", + "lib/net7.0/Microsoft.Extensions.Diagnostics.Abstractions.dll", + "lib/net7.0/Microsoft.Extensions.Diagnostics.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.Diagnostics.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.Diagnostics.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.Diagnostics.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.Diagnostics.Abstractions.xml", + "microsoft.extensions.diagnostics.abstractions.8.0.1.nupkg.sha512", + "microsoft.extensions.diagnostics.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Diagnostics.HealthChecks/8.0.11": { + "sha512": "zLgN22Zp9pk8RHlwssRTexw4+a6wqOnKWN+VejdPn5Yhjql4XiBhkFo35Nu8mmqHIk/UEmmCnMGLWq75aFfkOw==", + "type": "package", + "path": "microsoft.extensions.diagnostics.healthchecks/8.0.11", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "THIRD-PARTY-NOTICES.TXT", + "lib/net462/Microsoft.Extensions.Diagnostics.HealthChecks.dll", + "lib/net462/Microsoft.Extensions.Diagnostics.HealthChecks.xml", + "lib/net8.0/Microsoft.Extensions.Diagnostics.HealthChecks.dll", + "lib/net8.0/Microsoft.Extensions.Diagnostics.HealthChecks.xml", + "lib/netstandard2.0/Microsoft.Extensions.Diagnostics.HealthChecks.dll", + "lib/netstandard2.0/Microsoft.Extensions.Diagnostics.HealthChecks.xml", + "microsoft.extensions.diagnostics.healthchecks.8.0.11.nupkg.sha512", + "microsoft.extensions.diagnostics.healthchecks.nuspec" + ] + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions/8.0.11": { + "sha512": "So3JUdRxozRjvQ3cxU6F3nI/i4emDnjane6yMYcJhvTTTu29ltlIdoXjkFGRceIWz8yKvuEpzXItZ0x5GvN2nQ==", + "type": "package", + "path": "microsoft.extensions.diagnostics.healthchecks.abstractions/8.0.11", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "THIRD-PARTY-NOTICES.TXT", + "lib/net462/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.dll", + "lib/net462/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.xml", + "microsoft.extensions.diagnostics.healthchecks.abstractions.8.0.11.nupkg.sha512", + "microsoft.extensions.diagnostics.healthchecks.abstractions.nuspec" + ] + }, + "Microsoft.Extensions.FileProviders.Abstractions/8.0.0": { + "sha512": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "type": "package", + "path": "microsoft.extensions.fileproviders.abstractions/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.FileProviders.Abstractions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.FileProviders.Abstractions.targets", + "lib/net462/Microsoft.Extensions.FileProviders.Abstractions.dll", + "lib/net462/Microsoft.Extensions.FileProviders.Abstractions.xml", + "lib/net6.0/Microsoft.Extensions.FileProviders.Abstractions.dll", + "lib/net6.0/Microsoft.Extensions.FileProviders.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.FileProviders.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.FileProviders.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.xml", + "microsoft.extensions.fileproviders.abstractions.8.0.0.nupkg.sha512", + "microsoft.extensions.fileproviders.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Hosting.Abstractions/8.0.1": { + "sha512": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==", + "type": "package", + "path": "microsoft.extensions.hosting.abstractions/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Hosting.Abstractions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Hosting.Abstractions.targets", + "lib/net462/Microsoft.Extensions.Hosting.Abstractions.dll", + "lib/net462/Microsoft.Extensions.Hosting.Abstractions.xml", + "lib/net6.0/Microsoft.Extensions.Hosting.Abstractions.dll", + "lib/net6.0/Microsoft.Extensions.Hosting.Abstractions.xml", + "lib/net7.0/Microsoft.Extensions.Hosting.Abstractions.dll", + "lib/net7.0/Microsoft.Extensions.Hosting.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.Hosting.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.Hosting.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.xml", + "lib/netstandard2.1/Microsoft.Extensions.Hosting.Abstractions.dll", + "lib/netstandard2.1/Microsoft.Extensions.Hosting.Abstractions.xml", + "microsoft.extensions.hosting.abstractions.8.0.1.nupkg.sha512", + "microsoft.extensions.hosting.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Logging/10.0.4": { + "sha512": "S8+6fCuMOhJZGk8sGFtOy3VsF9mk9x4UOL59GM91REiA/fmCDjunKKIw4RmStG87qyXPfxelDJf2pXIbTuaBdw==", + "type": "package", + "path": "microsoft.extensions.logging/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Logging.targets", + "buildTransitive/net462/_._", + "buildTransitive/net8.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.targets", + "lib/net10.0/Microsoft.Extensions.Logging.dll", + "lib/net10.0/Microsoft.Extensions.Logging.xml", + "lib/net462/Microsoft.Extensions.Logging.dll", + "lib/net462/Microsoft.Extensions.Logging.xml", + "lib/net8.0/Microsoft.Extensions.Logging.dll", + "lib/net8.0/Microsoft.Extensions.Logging.xml", + "lib/net9.0/Microsoft.Extensions.Logging.dll", + "lib/net9.0/Microsoft.Extensions.Logging.xml", + "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", + "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", + "lib/netstandard2.1/Microsoft.Extensions.Logging.dll", + "lib/netstandard2.1/Microsoft.Extensions.Logging.xml", + "microsoft.extensions.logging.10.0.4.nupkg.sha512", + "microsoft.extensions.logging.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Logging.Abstractions/10.0.4": { + "sha512": "PDMMt7fvBatv6hcxxyJtXIzSwn7Dy00W6I2vDAOTYrQqNM2dF5A2L9n0uMzdPz2IPoNZWkAmYjoOCEdDLq0i4w==", + "type": "package", + "path": "microsoft.extensions.logging.abstractions/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets", + "lib/net10.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net10.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net462/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net462/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", + "microsoft.extensions.logging.abstractions.10.0.4.nupkg.sha512", + "microsoft.extensions.logging.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Options/10.0.4": { + "sha512": "kRxa2Zjzhg/ohh7EklpqQpBIcyQnC3meWxCcpZBn+0QWy/fY1DmDd45JiW8Vyrpj2J1RDtau5yRHiLZS/AoxUw==", + "type": "package", + "path": "microsoft.extensions.options/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Options.SourceGeneration.dll", + "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "buildTransitive/net461/Microsoft.Extensions.Options.targets", + "buildTransitive/net462/Microsoft.Extensions.Options.targets", + "buildTransitive/net8.0/Microsoft.Extensions.Options.targets", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.targets", + "buildTransitive/netstandard2.0/Microsoft.Extensions.Options.targets", + "lib/net10.0/Microsoft.Extensions.Options.dll", + "lib/net10.0/Microsoft.Extensions.Options.xml", + "lib/net462/Microsoft.Extensions.Options.dll", + "lib/net462/Microsoft.Extensions.Options.xml", + "lib/net8.0/Microsoft.Extensions.Options.dll", + "lib/net8.0/Microsoft.Extensions.Options.xml", + "lib/net9.0/Microsoft.Extensions.Options.dll", + "lib/net9.0/Microsoft.Extensions.Options.xml", + "lib/netstandard2.0/Microsoft.Extensions.Options.dll", + "lib/netstandard2.0/Microsoft.Extensions.Options.xml", + "lib/netstandard2.1/Microsoft.Extensions.Options.dll", + "lib/netstandard2.1/Microsoft.Extensions.Options.xml", + "microsoft.extensions.options.10.0.4.nupkg.sha512", + "microsoft.extensions.options.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Primitives/10.0.4": { + "sha512": "lABYqiRH9HgYJsjzO3W7+cucUwWXhEkiyrRylANdIubnzcESlkIsLowXpQ4E+sc7kjMLbk1hk5oxw4qTKowTEg==", + "type": "package", + "path": "microsoft.extensions.primitives/10.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Primitives.targets", + "buildTransitive/net462/_._", + "buildTransitive/net8.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Primitives.targets", + "lib/net10.0/Microsoft.Extensions.Primitives.dll", + "lib/net10.0/Microsoft.Extensions.Primitives.xml", + "lib/net462/Microsoft.Extensions.Primitives.dll", + "lib/net462/Microsoft.Extensions.Primitives.xml", + "lib/net8.0/Microsoft.Extensions.Primitives.dll", + "lib/net8.0/Microsoft.Extensions.Primitives.xml", + "lib/net9.0/Microsoft.Extensions.Primitives.dll", + "lib/net9.0/Microsoft.Extensions.Primitives.xml", + "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", + "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", + "microsoft.extensions.primitives.10.0.4.nupkg.sha512", + "microsoft.extensions.primitives.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "sha512": "OtlIWcyX01olfdevPKZdIPfBEvbcioDyBiE/Z2lHsopsMD7twcKtlN9kMevHmI5IIPhFpfwCIiR6qHQz1WHUIw==", + "type": "package", + "path": "microsoft.identitymodel.abstractions/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.Abstractions.dll", + "lib/net462/Microsoft.IdentityModel.Abstractions.xml", + "lib/net472/Microsoft.IdentityModel.Abstractions.dll", + "lib/net472/Microsoft.IdentityModel.Abstractions.xml", + "lib/net6.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/net6.0/Microsoft.IdentityModel.Abstractions.xml", + "lib/net8.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/net8.0/Microsoft.IdentityModel.Abstractions.xml", + "lib/net9.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/net9.0/Microsoft.IdentityModel.Abstractions.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.xml", + "microsoft.identitymodel.abstractions.8.0.1.nupkg.sha512", + "microsoft.identitymodel.abstractions.nuspec" + ] + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "sha512": "s6++gF9x0rQApQzOBbSyp4jUaAlwm+DroKfL8gdOHxs83k8SJfUXhuc46rDB3rNXBQ1MVRxqKUrqFhO/M0E97g==", + "type": "package", + "path": "microsoft.identitymodel.jsonwebtokens/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net462/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net472/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net472/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net6.0/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net6.0/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net8.0/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.JsonWebTokens.xml", + "microsoft.identitymodel.jsonwebtokens.8.0.1.nupkg.sha512", + "microsoft.identitymodel.jsonwebtokens.nuspec" + ] + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "sha512": "UCPF2exZqBXe7v/6sGNiM6zCQOUXXQ9+v5VTb9gPB8ZSUPnX53BxlN78v2jsbIvK9Dq4GovQxo23x8JgWvm/Qg==", + "type": "package", + "path": "microsoft.identitymodel.logging/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.Logging.dll", + "lib/net462/Microsoft.IdentityModel.Logging.xml", + "lib/net472/Microsoft.IdentityModel.Logging.dll", + "lib/net472/Microsoft.IdentityModel.Logging.xml", + "lib/net6.0/Microsoft.IdentityModel.Logging.dll", + "lib/net6.0/Microsoft.IdentityModel.Logging.xml", + "lib/net8.0/Microsoft.IdentityModel.Logging.dll", + "lib/net8.0/Microsoft.IdentityModel.Logging.xml", + "lib/net9.0/Microsoft.IdentityModel.Logging.dll", + "lib/net9.0/Microsoft.IdentityModel.Logging.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Logging.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Logging.xml", + "microsoft.identitymodel.logging.8.0.1.nupkg.sha512", + "microsoft.identitymodel.logging.nuspec" + ] + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "sha512": "uA2vpKqU3I2mBBEaeJAWPTjT9v1TZrGWKdgK6G5qJd03CLx83kdiqO9cmiK8/n1erkHzFBwU/RphP83aAe3i3g==", + "type": "package", + "path": "microsoft.identitymodel.protocols/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.Protocols.dll", + "lib/net462/Microsoft.IdentityModel.Protocols.xml", + "lib/net472/Microsoft.IdentityModel.Protocols.dll", + "lib/net472/Microsoft.IdentityModel.Protocols.xml", + "lib/net6.0/Microsoft.IdentityModel.Protocols.dll", + "lib/net6.0/Microsoft.IdentityModel.Protocols.xml", + "lib/net8.0/Microsoft.IdentityModel.Protocols.dll", + "lib/net8.0/Microsoft.IdentityModel.Protocols.xml", + "lib/net9.0/Microsoft.IdentityModel.Protocols.dll", + "lib/net9.0/Microsoft.IdentityModel.Protocols.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Protocols.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Protocols.xml", + "microsoft.identitymodel.protocols.8.0.1.nupkg.sha512", + "microsoft.identitymodel.protocols.nuspec" + ] + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "sha512": "AQDbfpL+yzuuGhO/mQhKNsp44pm5Jv8/BI4KiFXR7beVGZoSH35zMV3PrmcfvSTsyI6qrcR898NzUauD6SRigg==", + "type": "package", + "path": "microsoft.identitymodel.protocols.openidconnect/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/net462/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "lib/net472/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/net472/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "lib/net6.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/net6.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "lib/net8.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/net8.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "microsoft.identitymodel.protocols.openidconnect.8.0.1.nupkg.sha512", + "microsoft.identitymodel.protocols.openidconnect.nuspec" + ] + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "sha512": "kDimB6Dkd3nkW2oZPDkMkVHfQt3IDqO5gL0oa8WVy3OP4uE8Ij+8TXnqg9TOd9ufjsY3IDiGz7pCUbnfL18tjg==", + "type": "package", + "path": "microsoft.identitymodel.tokens/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.Tokens.dll", + "lib/net462/Microsoft.IdentityModel.Tokens.xml", + "lib/net472/Microsoft.IdentityModel.Tokens.dll", + "lib/net472/Microsoft.IdentityModel.Tokens.xml", + "lib/net6.0/Microsoft.IdentityModel.Tokens.dll", + "lib/net6.0/Microsoft.IdentityModel.Tokens.xml", + "lib/net8.0/Microsoft.IdentityModel.Tokens.dll", + "lib/net8.0/Microsoft.IdentityModel.Tokens.xml", + "lib/net9.0/Microsoft.IdentityModel.Tokens.dll", + "lib/net9.0/Microsoft.IdentityModel.Tokens.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Tokens.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Tokens.xml", + "microsoft.identitymodel.tokens.8.0.1.nupkg.sha512", + "microsoft.identitymodel.tokens.nuspec" + ] + }, + "Microsoft.NET.Test.Sdk/17.13.0": { + "sha512": "W19wCPizaIC9Zh47w8wWI/yxuqR7/dtABwOrc8r2jX/8mUNxM2vw4fXDh+DJTeogxV+KzKwg5jNNGQVwf3LXyA==", + "type": "package", + "path": "microsoft.net.test.sdk/17.13.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "build/net462/Microsoft.NET.Test.Sdk.props", + "build/net462/Microsoft.NET.Test.Sdk.targets", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.cs", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.fs", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.vb", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets", + "buildMultiTargeting/Microsoft.NET.Test.Sdk.props", + "lib/net462/_._", + "lib/netcoreapp3.1/_._", + "microsoft.net.test.sdk.17.13.0.nupkg.sha512", + "microsoft.net.test.sdk.nuspec" + ] + }, + "Microsoft.OpenApi/2.7.5": { + "sha512": "0FA67RSnRM4tcBKqiqVu/HPdZ9+QOKbmeRjxRUGTCjPU4C0bmUhd97Dso7Yild5P7nOV6GxJ2xrK0Kv/O9xp0w==", + "type": "package", + "path": "microsoft.openapi/2.7.5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net8.0/Microsoft.OpenApi.dll", + "lib/net8.0/Microsoft.OpenApi.pdb", + "lib/net8.0/Microsoft.OpenApi.xml", + "lib/netstandard2.0/Microsoft.OpenApi.dll", + "lib/netstandard2.0/Microsoft.OpenApi.pdb", + "lib/netstandard2.0/Microsoft.OpenApi.xml", + "microsoft.openapi.2.7.5.nupkg.sha512", + "microsoft.openapi.nuspec" + ] + }, + "Microsoft.TestPlatform.ObjectModel/17.13.0": { + "sha512": "bt0E0Dx+iqW97o4A59RCmUmz/5NarJ7LRL+jXbSHod72ibL5XdNm1Ke+UO5tFhBG4VwHLcSjqq9BUSblGNWamw==", + "type": "package", + "path": "microsoft.testplatform.objectmodel/17.13.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "lib/net462/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/net462/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/net462/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/net462/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netstandard2.0/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netstandard2.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netstandard2.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "microsoft.testplatform.objectmodel.17.13.0.nupkg.sha512", + "microsoft.testplatform.objectmodel.nuspec" + ] + }, + "Microsoft.TestPlatform.TestHost/17.13.0": { + "sha512": "9GGw08Dc3AXspjekdyTdZ/wYWFlxbgcF0s7BKxzVX+hzAwpifDOdxM+ceVaaJSQOwqt3jtuNlHn3XTpKUS9x9Q==", + "type": "package", + "path": "microsoft.testplatform.testhost/17.13.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.txt", + "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props", + "build/netcoreapp3.1/x64/testhost.dll", + "build/netcoreapp3.1/x64/testhost.exe", + "build/netcoreapp3.1/x86/testhost.x86.dll", + "build/netcoreapp3.1/x86/testhost.x86.exe", + "lib/net462/_._", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/testhost.deps.json", + "lib/netcoreapp3.1/testhost.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/x64/msdia140.dll", + "lib/netcoreapp3.1/x86/msdia140.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "microsoft.testplatform.testhost.17.13.0.nupkg.sha512", + "microsoft.testplatform.testhost.nuspec" + ] + }, + "Newtonsoft.Json/13.0.1": { + "sha512": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==", + "type": "package", + "path": "newtonsoft.json/13.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.md", + "lib/net20/Newtonsoft.Json.dll", + "lib/net20/Newtonsoft.Json.xml", + "lib/net35/Newtonsoft.Json.dll", + "lib/net35/Newtonsoft.Json.xml", + "lib/net40/Newtonsoft.Json.dll", + "lib/net40/Newtonsoft.Json.xml", + "lib/net45/Newtonsoft.Json.dll", + "lib/net45/Newtonsoft.Json.xml", + "lib/netstandard1.0/Newtonsoft.Json.dll", + "lib/netstandard1.0/Newtonsoft.Json.xml", + "lib/netstandard1.3/Newtonsoft.Json.dll", + "lib/netstandard1.3/Newtonsoft.Json.xml", + "lib/netstandard2.0/Newtonsoft.Json.dll", + "lib/netstandard2.0/Newtonsoft.Json.xml", + "newtonsoft.json.13.0.1.nupkg.sha512", + "newtonsoft.json.nuspec", + "packageIcon.png" + ] + }, + "Npgsql/10.0.3": { + "sha512": "7nb5YzXuvWWJxB0J8DiyL3we+X4FOctZrt0fIBnucOIaIevFEEwGQVZKtiu9olXdlNAK1eNgqSral6r/jlhI4w==", + "type": "package", + "path": "npgsql/10.0.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net10.0/Npgsql.dll", + "lib/net10.0/Npgsql.xml", + "lib/net8.0/Npgsql.dll", + "lib/net8.0/Npgsql.xml", + "lib/net9.0/Npgsql.dll", + "lib/net9.0/Npgsql.xml", + "npgsql.10.0.3.nupkg.sha512", + "npgsql.nuspec", + "postgresql.png" + ] + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/10.0.2": { + "sha512": "PsNYgPOSW41Xx19gin7y4EdZAPteWr9Cb01XkdObxOsPzi+mgBupBEN7J7+erXFsROPOILM7MlIoO9QzL8+LGQ==", + "type": "package", + "path": "npgsql.entityframeworkcore.postgresql/10.0.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll", + "lib/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.xml", + "npgsql.entityframeworkcore.postgresql.10.0.2.nupkg.sha512", + "npgsql.entityframeworkcore.postgresql.nuspec", + "postgresql.png" + ] + }, + "Swashbuckle.AspNetCore/10.2.1": { + "sha512": "SDU6akgCV/H4jFMRfyJ0mgO5jWOuuAqekvEThXg8c/LjnfNz5Nkaz+RUpeTVJKWIRX4wDKC/6R3ogJ4AsRE32A==", + "type": "package", + "path": "swashbuckle.aspnetcore/10.2.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/Swashbuckle.AspNetCore.props", + "buildMultiTargeting/Swashbuckle.AspNetCore.props", + "docs/package-readme.md", + "swashbuckle.aspnetcore.10.2.1.nupkg.sha512", + "swashbuckle.aspnetcore.nuspec" + ] + }, + "Swashbuckle.AspNetCore.Swagger/10.2.1": { + "sha512": "ej4inPhiWCq+0utG8yaKhIhE8M3k3R/qRaGhpgDZB+O/s+o62/zRMO1Cn2CtQccsrqPE9PYnzCp6hQGYGpJOyQ==", + "type": "package", + "path": "swashbuckle.aspnetcore.swagger/10.2.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net10.0/Swashbuckle.AspNetCore.Swagger.dll", + "lib/net10.0/Swashbuckle.AspNetCore.Swagger.pdb", + "lib/net10.0/Swashbuckle.AspNetCore.Swagger.xml", + "lib/net8.0/Swashbuckle.AspNetCore.Swagger.dll", + "lib/net8.0/Swashbuckle.AspNetCore.Swagger.pdb", + "lib/net8.0/Swashbuckle.AspNetCore.Swagger.xml", + "lib/net9.0/Swashbuckle.AspNetCore.Swagger.dll", + "lib/net9.0/Swashbuckle.AspNetCore.Swagger.pdb", + "lib/net9.0/Swashbuckle.AspNetCore.Swagger.xml", + "package-readme.md", + "swashbuckle.aspnetcore.swagger.10.2.1.nupkg.sha512", + "swashbuckle.aspnetcore.swagger.nuspec" + ] + }, + "Swashbuckle.AspNetCore.SwaggerGen/10.2.1": { + "sha512": "JYX6i/y0xEtQWH/hZyfcage1/ldwww83ueD/gBc34uSnMwyvRLUsOpYcxlliFFxFbZMrY6t+R9ENqolE7zTEOg==", + "type": "package", + "path": "swashbuckle.aspnetcore.swaggergen/10.2.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll", + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerGen.pdb", + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerGen.xml", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerGen.dll", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerGen.pdb", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerGen.xml", + "lib/net9.0/Swashbuckle.AspNetCore.SwaggerGen.dll", + "lib/net9.0/Swashbuckle.AspNetCore.SwaggerGen.pdb", + "lib/net9.0/Swashbuckle.AspNetCore.SwaggerGen.xml", + "package-readme.md", + "swashbuckle.aspnetcore.swaggergen.10.2.1.nupkg.sha512", + "swashbuckle.aspnetcore.swaggergen.nuspec" + ] + }, + "Swashbuckle.AspNetCore.SwaggerUI/10.2.1": { + "sha512": "vzB8ZAGqXus3fdareJ9GHctaRP9ZL+wW9x8U7s1Y+BWprInFvSg6rpD9VhANNpwXA8fUHqu5Agjl/+hHG1BCQA==", + "type": "package", + "path": "swashbuckle.aspnetcore.swaggerui/10.2.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll", + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerUI.pdb", + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerUI.xml", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerUI.dll", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerUI.pdb", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerUI.xml", + "lib/net9.0/Swashbuckle.AspNetCore.SwaggerUI.dll", + "lib/net9.0/Swashbuckle.AspNetCore.SwaggerUI.pdb", + "lib/net9.0/Swashbuckle.AspNetCore.SwaggerUI.xml", + "package-readme.md", + "swashbuckle.aspnetcore.swaggerui.10.2.1.nupkg.sha512", + "swashbuckle.aspnetcore.swaggerui.nuspec" + ] + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "sha512": "GJw3bYkWpOgvN3tJo5X4lYUeIFA2HD293FPUhKmp7qxS+g5ywAb34Dnd3cDAFLkcMohy5XTpoaZ4uAHuw0uSPQ==", + "type": "package", + "path": "system.identitymodel.tokens.jwt/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/System.IdentityModel.Tokens.Jwt.dll", + "lib/net462/System.IdentityModel.Tokens.Jwt.xml", + "lib/net472/System.IdentityModel.Tokens.Jwt.dll", + "lib/net472/System.IdentityModel.Tokens.Jwt.xml", + "lib/net6.0/System.IdentityModel.Tokens.Jwt.dll", + "lib/net6.0/System.IdentityModel.Tokens.Jwt.xml", + "lib/net8.0/System.IdentityModel.Tokens.Jwt.dll", + "lib/net8.0/System.IdentityModel.Tokens.Jwt.xml", + "lib/net9.0/System.IdentityModel.Tokens.Jwt.dll", + "lib/net9.0/System.IdentityModel.Tokens.Jwt.xml", + "lib/netstandard2.0/System.IdentityModel.Tokens.Jwt.dll", + "lib/netstandard2.0/System.IdentityModel.Tokens.Jwt.xml", + "system.identitymodel.tokens.jwt.8.0.1.nupkg.sha512", + "system.identitymodel.tokens.jwt.nuspec" + ] + }, + "xunit/2.9.3": { + "sha512": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", + "type": "package", + "path": "xunit/2.9.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "xunit.2.9.3.nupkg.sha512", + "xunit.nuspec" + ] + }, + "xunit.abstractions/2.0.3": { + "sha512": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==", + "type": "package", + "path": "xunit.abstractions/2.0.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net35/xunit.abstractions.dll", + "lib/net35/xunit.abstractions.xml", + "lib/netstandard1.0/xunit.abstractions.dll", + "lib/netstandard1.0/xunit.abstractions.xml", + "lib/netstandard2.0/xunit.abstractions.dll", + "lib/netstandard2.0/xunit.abstractions.xml", + "xunit.abstractions.2.0.3.nupkg.sha512", + "xunit.abstractions.nuspec" + ] + }, + "xunit.analyzers/1.18.0": { + "sha512": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ==", + "type": "package", + "path": "xunit.analyzers/1.18.0", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "analyzers/dotnet/cs/xunit.analyzers.dll", + "analyzers/dotnet/cs/xunit.analyzers.fixes.dll", + "tools/install.ps1", + "tools/uninstall.ps1", + "xunit.analyzers.1.18.0.nupkg.sha512", + "xunit.analyzers.nuspec" + ] + }, + "xunit.assert/2.9.3": { + "sha512": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA==", + "type": "package", + "path": "xunit.assert/2.9.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "lib/net6.0/xunit.assert.dll", + "lib/net6.0/xunit.assert.xml", + "lib/netstandard1.1/xunit.assert.dll", + "lib/netstandard1.1/xunit.assert.xml", + "xunit.assert.2.9.3.nupkg.sha512", + "xunit.assert.nuspec" + ] + }, + "xunit.core/2.9.3": { + "sha512": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", + "type": "package", + "path": "xunit.core/2.9.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "build/xunit.core.props", + "build/xunit.core.targets", + "buildMultiTargeting/xunit.core.props", + "buildMultiTargeting/xunit.core.targets", + "xunit.core.2.9.3.nupkg.sha512", + "xunit.core.nuspec" + ] + }, + "xunit.extensibility.core/2.9.3": { + "sha512": "kf3si0YTn2a8J8eZNb+zFpwfoyvIrQ7ivNk5ZYA5yuYk1bEtMe4DxJ2CF/qsRgmEnDr7MnW1mxylBaHTZ4qErA==", + "type": "package", + "path": "xunit.extensibility.core/2.9.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "lib/net452/xunit.core.dll", + "lib/net452/xunit.core.dll.tdnet", + "lib/net452/xunit.core.xml", + "lib/net452/xunit.runner.tdnet.dll", + "lib/net452/xunit.runner.utility.net452.dll", + "lib/netstandard1.1/xunit.core.dll", + "lib/netstandard1.1/xunit.core.xml", + "xunit.extensibility.core.2.9.3.nupkg.sha512", + "xunit.extensibility.core.nuspec" + ] + }, + "xunit.extensibility.execution/2.9.3": { + "sha512": "yMb6vMESlSrE3Wfj7V6cjQ3S4TXdXpRqYeNEI3zsX31uTsGMJjEw6oD5F5u1cHnMptjhEECnmZSsPxB6ChZHDQ==", + "type": "package", + "path": "xunit.extensibility.execution/2.9.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "lib/net452/xunit.execution.desktop.dll", + "lib/net452/xunit.execution.desktop.xml", + "lib/netstandard1.1/xunit.execution.dotnet.dll", + "lib/netstandard1.1/xunit.execution.dotnet.xml", + "xunit.extensibility.execution.2.9.3.nupkg.sha512", + "xunit.extensibility.execution.nuspec" + ] + }, + "xunit.runner.visualstudio/3.1.0": { + "sha512": "K9O9TOzugqOo4LJ87uuq1VG8RAqGp20Ng85Wx932oT5LNBkIgeeGYubVW5UMnOOTanFNbGavmbuYrJr4INzSwg==", + "type": "package", + "path": "xunit.runner.visualstudio/3.1.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "build/net472/xunit.abstractions.dll", + "build/net472/xunit.runner.visualstudio.props", + "build/net472/xunit.runner.visualstudio.testadapter.dll", + "build/net8.0/xunit.abstractions.dll", + "build/net8.0/xunit.runner.visualstudio.props", + "build/net8.0/xunit.runner.visualstudio.testadapter.dll", + "lib/net472/_._", + "lib/net8.0/_._", + "xunit.runner.visualstudio.3.1.0.nupkg.sha512", + "xunit.runner.visualstudio.nuspec" + ] + }, + "Nexus.Api/1.0.0": { + "type": "project", + "path": "../backend/Nexus.Api.csproj", + "msbuildProject": "../backend/Nexus.Api.csproj" + } + }, + "projectFileDependencyGroups": { + "net10.0": [ + "Microsoft.NET.Test.Sdk >= 17.13.0", + "Nexus.Api >= 1.0.0", + "xunit >= 2.9.3", + "xunit.runner.visualstudio >= 3.1.0" + ] + }, + "packageFolders": { + "/home/node/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/node/.openclaw/workspace/nexus/backend-tests/Nexus.Api.Tests.csproj", + "projectName": "Nexus.Api.Tests", + "projectPath": "/home/node/.openclaw/workspace/nexus/backend-tests/Nexus.Api.Tests.csproj", + "packagesPath": "/home/node/.nuget/packages/", + "outputPath": "/home/node/.openclaw/workspace/nexus/backend-tests/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/node/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net10.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0": { + "framework": "net10.0", + "targetAlias": "net10.0", + "projectReferences": { + "/home/node/.openclaw/workspace/nexus/backend/Nexus.Api.csproj": { + "projectPath": "/home/node/.openclaw/workspace/nexus/backend/Nexus.Api.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.300" + }, + "frameworks": { + "net10.0": { + "framework": "net10.0", + "targetAlias": "net10.0", + "dependencies": { + "Microsoft.NET.Test.Sdk": { + "target": "Package", + "version": "[17.13.0, )" + }, + "xunit": { + "target": "Package", + "version": "[2.9.3, )" + }, + "xunit.runner.visualstudio": { + "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", + "suppressParent": "All", + "target": "Package", + "version": "[3.1.0, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/home/node/.dotnet/sdk/10.0.300/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + } +} \ No newline at end of file diff --git a/backend-tests/obj/project.nuget.cache b/backend-tests/obj/project.nuget.cache new file mode 100644 index 0000000..78e60ac --- /dev/null +++ b/backend-tests/obj/project.nuget.cache @@ -0,0 +1,57 @@ +{ + "version": 2, + "dgSpecHash": "1cy+vQUljqM=", + "success": true, + "projectFilePath": "/home/node/.openclaw/workspace/nexus/backend-tests/Nexus.Api.Tests.csproj", + "expectedPackageFiles": [ + "/home/node/.nuget/packages/aspnetcore.healthchecks.npgsql/9.0.0/aspnetcore.healthchecks.npgsql.9.0.0.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.aspnetcore.authentication.jwtbearer/10.0.8/microsoft.aspnetcore.authentication.jwtbearer.10.0.8.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.codecoverage/17.13.0/microsoft.codecoverage.17.13.0.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.entityframeworkcore/10.0.4/microsoft.entityframeworkcore.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.entityframeworkcore.abstractions/10.0.4/microsoft.entityframeworkcore.abstractions.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.entityframeworkcore.analyzers/10.0.4/microsoft.entityframeworkcore.analyzers.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.entityframeworkcore.relational/10.0.4/microsoft.entityframeworkcore.relational.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.apidescription.server/10.0.0/microsoft.extensions.apidescription.server.10.0.0.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.caching.abstractions/10.0.4/microsoft.extensions.caching.abstractions.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.caching.memory/10.0.4/microsoft.extensions.caching.memory.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.configuration.abstractions/10.0.4/microsoft.extensions.configuration.abstractions.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.dependencyinjection/10.0.4/microsoft.extensions.dependencyinjection.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.dependencyinjection.abstractions/10.0.4/microsoft.extensions.dependencyinjection.abstractions.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.diagnostics.abstractions/8.0.1/microsoft.extensions.diagnostics.abstractions.8.0.1.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.diagnostics.healthchecks/8.0.11/microsoft.extensions.diagnostics.healthchecks.8.0.11.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.diagnostics.healthchecks.abstractions/8.0.11/microsoft.extensions.diagnostics.healthchecks.abstractions.8.0.11.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.fileproviders.abstractions/8.0.0/microsoft.extensions.fileproviders.abstractions.8.0.0.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.hosting.abstractions/8.0.1/microsoft.extensions.hosting.abstractions.8.0.1.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.logging/10.0.4/microsoft.extensions.logging.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.logging.abstractions/10.0.4/microsoft.extensions.logging.abstractions.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.options/10.0.4/microsoft.extensions.options.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.extensions.primitives/10.0.4/microsoft.extensions.primitives.10.0.4.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.identitymodel.abstractions/8.0.1/microsoft.identitymodel.abstractions.8.0.1.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.identitymodel.jsonwebtokens/8.0.1/microsoft.identitymodel.jsonwebtokens.8.0.1.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.identitymodel.logging/8.0.1/microsoft.identitymodel.logging.8.0.1.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.identitymodel.protocols/8.0.1/microsoft.identitymodel.protocols.8.0.1.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.identitymodel.protocols.openidconnect/8.0.1/microsoft.identitymodel.protocols.openidconnect.8.0.1.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.identitymodel.tokens/8.0.1/microsoft.identitymodel.tokens.8.0.1.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.net.test.sdk/17.13.0/microsoft.net.test.sdk.17.13.0.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.openapi/2.7.5/microsoft.openapi.2.7.5.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.testplatform.objectmodel/17.13.0/microsoft.testplatform.objectmodel.17.13.0.nupkg.sha512", + "/home/node/.nuget/packages/microsoft.testplatform.testhost/17.13.0/microsoft.testplatform.testhost.17.13.0.nupkg.sha512", + "/home/node/.nuget/packages/newtonsoft.json/13.0.1/newtonsoft.json.13.0.1.nupkg.sha512", + "/home/node/.nuget/packages/npgsql/10.0.3/npgsql.10.0.3.nupkg.sha512", + "/home/node/.nuget/packages/npgsql.entityframeworkcore.postgresql/10.0.2/npgsql.entityframeworkcore.postgresql.10.0.2.nupkg.sha512", + "/home/node/.nuget/packages/swashbuckle.aspnetcore/10.2.1/swashbuckle.aspnetcore.10.2.1.nupkg.sha512", + "/home/node/.nuget/packages/swashbuckle.aspnetcore.swagger/10.2.1/swashbuckle.aspnetcore.swagger.10.2.1.nupkg.sha512", + "/home/node/.nuget/packages/swashbuckle.aspnetcore.swaggergen/10.2.1/swashbuckle.aspnetcore.swaggergen.10.2.1.nupkg.sha512", + "/home/node/.nuget/packages/swashbuckle.aspnetcore.swaggerui/10.2.1/swashbuckle.aspnetcore.swaggerui.10.2.1.nupkg.sha512", + "/home/node/.nuget/packages/system.identitymodel.tokens.jwt/8.0.1/system.identitymodel.tokens.jwt.8.0.1.nupkg.sha512", + "/home/node/.nuget/packages/xunit/2.9.3/xunit.2.9.3.nupkg.sha512", + "/home/node/.nuget/packages/xunit.abstractions/2.0.3/xunit.abstractions.2.0.3.nupkg.sha512", + "/home/node/.nuget/packages/xunit.analyzers/1.18.0/xunit.analyzers.1.18.0.nupkg.sha512", + "/home/node/.nuget/packages/xunit.assert/2.9.3/xunit.assert.2.9.3.nupkg.sha512", + "/home/node/.nuget/packages/xunit.core/2.9.3/xunit.core.2.9.3.nupkg.sha512", + "/home/node/.nuget/packages/xunit.extensibility.core/2.9.3/xunit.extensibility.core.2.9.3.nupkg.sha512", + "/home/node/.nuget/packages/xunit.extensibility.execution/2.9.3/xunit.extensibility.execution.2.9.3.nupkg.sha512", + "/home/node/.nuget/packages/xunit.runner.visualstudio/3.1.0/xunit.runner.visualstudio.3.1.0.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/backend/Contracts/AuthRequests.cs b/backend/Contracts/AuthRequests.cs new file mode 100644 index 0000000..7d1b8ec --- /dev/null +++ b/backend/Contracts/AuthRequests.cs @@ -0,0 +1,42 @@ +using System.ComponentModel.DataAnnotations; + +namespace Nexus.Api.Contracts; + +public sealed record LoginRequest +{ + [Required, EmailAddress, MaxLength(120)] + public string Email { get; init; } = string.Empty; + + [Required, MinLength(10), MaxLength(200)] + public string Password { get; init; } = string.Empty; +} + +public sealed record AuthResponse +{ + public string AccessToken { get; init; } = string.Empty; + public DateTimeOffset ExpiresAt { get; init; } + public UserInfo User { get; init; } = new(); +} + +public sealed record UserInfo +{ + public Guid Id { get; init; } + public string Email { get; init; } = string.Empty; + public string DisplayName { get; init; } = string.Empty; + public string Role { get; init; } = string.Empty; +} + +public sealed record UpdateProfileRequest +{ + [MaxLength(100)] + public string? DisplayName { get; init; } +} + +public sealed record ChangePasswordRequest +{ + [Required, MinLength(10), MaxLength(200)] + public string CurrentPassword { get; init; } = string.Empty; + + [Required, MinLength(10), MaxLength(200)] + public string NewPassword { get; init; } = string.Empty; +} diff --git a/backend/Contracts/Requests.cs b/backend/Contracts/Requests.cs new file mode 100644 index 0000000..0110406 --- /dev/null +++ b/backend/Contracts/Requests.cs @@ -0,0 +1,9 @@ +namespace Nexus.Api.Contracts; + +public sealed record CreateProjectRequest(string Name, string? Description); +public sealed record CreateTaskRequest(string Title, string? Priority, Guid? ProjectId); +public sealed record UpdateTaskStateRequest(string State); +public sealed record ChatRequest(string Message, string? ConversationId, string? AgentId); + +public sealed record UpdateProjectRequest(string? Name, string? Description, string? Status); +public sealed record UpdateTaskRequest(string? Title, string? Priority, Guid? ProjectId); diff --git a/backend/Contracts/Responses.cs b/backend/Contracts/Responses.cs new file mode 100644 index 0000000..a202d2e --- /dev/null +++ b/backend/Contracts/Responses.cs @@ -0,0 +1,50 @@ +using Nexus.Api.Domain; + +namespace Nexus.Api.Contracts; + +public sealed record AgentListResponse( + string Id, + string Name, + string Role, + string Model, + string Status, + DateTimeOffset? LastSeen, + string? Workspace, + string? Description +); + +public sealed record AgentDetailResponse( + string Id, + string Name, + string Role, + string Model, + string Status, + DateTimeOffset? LastSeen, + string? Workspace, + string? AgentDir, + string? Description, + IReadOnlyList? SubAgents, + string? IdentityName +); + +public sealed record AgentCommandRequest(string Message); + +public sealed record AgentCommandResponse( + string Runtime, + string AgentId, + string ConversationId, + string Content +); + +public sealed record ProjectHealth( + int Online, + int Offline, + int Degraded, + int Unknown +); + +public sealed record IncidentInfo( + Guid? TaskId, + string? Title, + DateTimeOffset? Since +); diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..e34349b --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build +WORKDIR /src +COPY Nexus.Api.csproj . +RUN dotnet restore +COPY . . +RUN dotnet publish -c Release -o /app/publish + +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine +WORKDIR /app +COPY --from=build /app/publish . +USER $APP_UID +EXPOSE 8080 +ENTRYPOINT ["dotnet", "Nexus.Api.dll"] diff --git a/backend/Domain/Entities.cs b/backend/Domain/Entities.cs new file mode 100644 index 0000000..b227f8b --- /dev/null +++ b/backend/Domain/Entities.cs @@ -0,0 +1,93 @@ +namespace Nexus.Api.Domain; + +public enum OperationalStatus +{ + Online, + Degraded, + Offline, + Unknown +} + +/// +/// Strongly-typed task lifecycle states. +/// String values (e.g. "In progress") are preserved for API compatibility +/// via ; the WorkTask entity continues to store +/// state as a string in the database. +/// +public enum TaskState +{ + Backlog, + InProgress, + Blocked, + Done +} + +public static class TaskStateHelper +{ + private static readonly Dictionary StateToString = new() + { + [TaskState.Backlog] = "Backlog", + [TaskState.InProgress] = "In progress", + [TaskState.Blocked] = "Blocked", + [TaskState.Done] = "Done" + }; + + private static readonly Dictionary StringToState = new(StringComparer.OrdinalIgnoreCase) + { + ["Backlog"] = TaskState.Backlog, + ["In progress"] = TaskState.InProgress, + ["Blocked"] = TaskState.Blocked, + ["Done"] = TaskState.Done + }; + + /// Valid task-state string values for API validation. + public static readonly string[] AllStates = ["Backlog", "In progress", "Blocked", "Done"]; + + /// Convert a TaskState enum to its API string representation. + public static string ToStateString(this TaskState state) => StateToString[state]; + + /// Parse a string to TaskState; defaults to Backlog for unrecognized input. + public static TaskState ToTaskState(this string state) => + StringToState.TryGetValue(state, out var result) ? result : TaskState.Backlog; + + /// Returns true if the string is a recognized task state (case-insensitive). + public static bool IsValidState(string? state) => + !string.IsNullOrWhiteSpace(state) && StringToState.ContainsKey(state); + + public static bool IsInProgressOrBlocked(string? state) => + string.Equals(state, "In progress", StringComparison.OrdinalIgnoreCase) + || string.Equals(state, "Blocked", StringComparison.OrdinalIgnoreCase); + + public static bool IsDoneOrBacklog(string? state) => + string.Equals(state, "Done", StringComparison.OrdinalIgnoreCase) + || string.Equals(state, "Backlog", StringComparison.OrdinalIgnoreCase); +} + +public sealed class Project +{ + public Guid Id { get; init; } = Guid.NewGuid(); + public required string Name { get; set; } + public string Description { get; set; } = string.Empty; + public int Progress { get; set; } + public OperationalStatus Status { get; set; } = OperationalStatus.Unknown; + public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class WorkTask +{ + public Guid Id { get; init; } = Guid.NewGuid(); + public required string Title { get; set; } + public string State { get; set; } = "Backlog"; + public string Priority { get; set; } = "Normal"; + public Guid? ProjectId { get; set; } + public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class ActivityEvent +{ + public long Id { get; init; } + public required string Type { get; set; } + public required string Message { get; set; } + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; +} + diff --git a/backend/Domain/Identity.cs b/backend/Domain/Identity.cs new file mode 100644 index 0000000..b551f66 --- /dev/null +++ b/backend/Domain/Identity.cs @@ -0,0 +1,45 @@ +using System.ComponentModel.DataAnnotations; + +namespace Nexus.Api.Domain; + +public class NexusUser +{ + public Guid Id { get; set; } = Guid.NewGuid(); + + [MaxLength(120)] + public string Email { get; set; } = string.Empty; + + [MaxLength(120)] + public string NormalizedEmail { get; set; } = string.Empty; + + [MaxLength(100)] + public string DisplayName { get; set; } = string.Empty; + + public string PasswordHash { get; set; } = string.Empty; + + public string Role { get; set; } = "owner"; + + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; + + public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow; + + public DateTimeOffset? LastLoginAt { get; set; } + + public ICollection RefreshTokens { get; set; } = new List(); +} + +public class RefreshToken +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid UserId { get; set; } + [MaxLength(64)] + public string TokenHash { get; set; } = string.Empty; + public Guid FamilyId { get; set; } = Guid.NewGuid(); + public DateTimeOffset ExpiresAt { get; set; } + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset? RevokedAt { get; set; } + [MaxLength(64)] + public string? ReplacedByTokenHash { get; set; } + public Guid ConcurrencyStamp { get; set; } = Guid.NewGuid(); + public NexusUser User { get; set; } = null!; +} diff --git a/backend/Infrastructure/Migrations/20260609064750_InitialCreate.Designer.cs b/backend/Infrastructure/Migrations/20260609064750_InitialCreate.Designer.cs new file mode 100644 index 0000000..96e7108 --- /dev/null +++ b/backend/Infrastructure/Migrations/20260609064750_InitialCreate.Designer.cs @@ -0,0 +1,220 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Nexus.Api.Infrastructure; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Nexus.Api.Migrations +{ + [DbContext(typeof(NexusDbContext))] + [Migration("20260609064750_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.8") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Nexus.Api.Domain.ActivityEvent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("Type") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Activity"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.NexusUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(120) + .HasColumnType("character varying(120)"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(120) + .HasColumnType("character varying(120)"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("text"); + + b.Property("Role") + .IsRequired() + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(160) + .HasColumnType("character varying(160)"); + + b.Property("Progress") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("Projects"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("FamilyId") + .HasColumnType("uuid"); + + b.Property("ReplacedByTokenHash") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("RevokedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("TokenHash") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("TokenHash") + .IsUnique(); + + b.HasIndex("UserId", "FamilyId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.WorkTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Priority") + .IsRequired() + .HasColumnType("text"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("State") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(240) + .HasColumnType("character varying(240)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("Tasks"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.RefreshToken", b => + { + b.HasOne("Nexus.Api.Domain.NexusUser", "User") + .WithMany("RefreshTokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.NexusUser", b => + { + b.Navigation("RefreshTokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/backend/Infrastructure/Migrations/20260609064750_InitialCreate.cs b/backend/Infrastructure/Migrations/20260609064750_InitialCreate.cs new file mode 100644 index 0000000..b4b5b68 --- /dev/null +++ b/backend/Infrastructure/Migrations/20260609064750_InitialCreate.cs @@ -0,0 +1,143 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Nexus.Api.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Activity", + columns: table => new + { + Id = table.Column(type: "bigint", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Type = table.Column(type: "text", nullable: false), + Message = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: false), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Activity", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Projects", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(160)", maxLength: 160, nullable: false), + Description = table.Column(type: "text", nullable: false), + Progress = table.Column(type: "integer", nullable: false), + Status = table.Column(type: "integer", nullable: false), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Projects", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Tasks", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Title = table.Column(type: "character varying(240)", maxLength: 240, nullable: false), + State = table.Column(type: "text", nullable: false), + Priority = table.Column(type: "text", nullable: false), + ProjectId = table.Column(type: "uuid", nullable: true), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Tasks", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Users", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Email = table.Column(type: "character varying(120)", maxLength: 120, nullable: false), + NormalizedEmail = table.Column(type: "character varying(120)", maxLength: 120, nullable: false), + DisplayName = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + PasswordHash = table.Column(type: "text", nullable: false), + Role = table.Column(type: "text", nullable: false), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false), + LastLoginAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Users", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "RefreshTokens", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + UserId = table.Column(type: "uuid", nullable: false), + TokenHash = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + FamilyId = table.Column(type: "uuid", nullable: false), + ExpiresAt = table.Column(type: "timestamp with time zone", nullable: false), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + RevokedAt = table.Column(type: "timestamp with time zone", nullable: true), + ReplacedByTokenHash = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + ConcurrencyStamp = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_RefreshTokens", x => x.Id); + table.ForeignKey( + name: "FK_RefreshTokens_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_RefreshTokens_TokenHash", + table: "RefreshTokens", + column: "TokenHash", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_RefreshTokens_UserId_FamilyId", + table: "RefreshTokens", + columns: new[] { "UserId", "FamilyId" }); + + migrationBuilder.CreateIndex( + name: "IX_Users_NormalizedEmail", + table: "Users", + column: "NormalizedEmail", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Activity"); + + migrationBuilder.DropTable( + name: "Projects"); + + migrationBuilder.DropTable( + name: "RefreshTokens"); + + migrationBuilder.DropTable( + name: "Tasks"); + + migrationBuilder.DropTable( + name: "Users"); + } + } +} diff --git a/backend/Infrastructure/Migrations/NexusDbContextModelSnapshot.cs b/backend/Infrastructure/Migrations/NexusDbContextModelSnapshot.cs new file mode 100644 index 0000000..ab2c2db --- /dev/null +++ b/backend/Infrastructure/Migrations/NexusDbContextModelSnapshot.cs @@ -0,0 +1,217 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Nexus.Api.Infrastructure; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Nexus.Api.Migrations +{ + [DbContext(typeof(NexusDbContext))] + partial class NexusDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.8") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Nexus.Api.Domain.ActivityEvent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("Type") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Activity"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.NexusUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(120) + .HasColumnType("character varying(120)"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(120) + .HasColumnType("character varying(120)"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("text"); + + b.Property("Role") + .IsRequired() + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(160) + .HasColumnType("character varying(160)"); + + b.Property("Progress") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("Projects"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("uuid"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("FamilyId") + .HasColumnType("uuid"); + + b.Property("ReplacedByTokenHash") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("RevokedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("TokenHash") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("TokenHash") + .IsUnique(); + + b.HasIndex("UserId", "FamilyId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.WorkTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Priority") + .IsRequired() + .HasColumnType("text"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("State") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(240) + .HasColumnType("character varying(240)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("Tasks"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.RefreshToken", b => + { + b.HasOne("Nexus.Api.Domain.NexusUser", "User") + .WithMany("RefreshTokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Nexus.Api.Domain.NexusUser", b => + { + b.Navigation("RefreshTokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/backend/Infrastructure/NexusDbContext.cs b/backend/Infrastructure/NexusDbContext.cs new file mode 100644 index 0000000..6d0a9ef --- /dev/null +++ b/backend/Infrastructure/NexusDbContext.cs @@ -0,0 +1,31 @@ +using Microsoft.EntityFrameworkCore; +using Nexus.Api.Domain; + +namespace Nexus.Api.Infrastructure; + +public sealed class NexusDbContext(DbContextOptions options) : DbContext(options) +{ + public DbSet Projects => Set(); + public DbSet Tasks => Set(); + public DbSet Activity => Set(); + public DbSet Users => Set(); + public DbSet RefreshTokens => Set(); + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity().Property(x => x.Name).HasMaxLength(160); + modelBuilder.Entity().Property(x => x.Title).HasMaxLength(240); + modelBuilder.Entity().Property(x => x.Message).HasMaxLength(1000); + modelBuilder.Entity().HasIndex(u => u.NormalizedEmail).IsUnique(); + modelBuilder.Entity().HasIndex(r => r.TokenHash).IsUnique(); + modelBuilder.Entity().HasIndex(r => new { r.UserId, r.FamilyId }); + modelBuilder.Entity().Property(r => r.ConcurrencyStamp).IsConcurrencyToken(); + modelBuilder.Entity() + .HasOne(r => r.User) + .WithMany(u => u.RefreshTokens) + .HasForeignKey(r => r.UserId) + .OnDelete(DeleteBehavior.Cascade); + + modelBuilder.Entity().HasIndex(x => x.CreatedAt); + } +} diff --git a/backend/Integrations/Contracts.cs b/backend/Integrations/Contracts.cs new file mode 100644 index 0000000..7a85444 --- /dev/null +++ b/backend/Integrations/Contracts.cs @@ -0,0 +1,40 @@ +using Nexus.Api.Domain; + +namespace Nexus.Api.Integrations; + +public sealed record AgentRuntimeStatus( + string Runtime, + OperationalStatus Status, + TimeSpan? Latency, + string? Detail); + +public sealed record ModelProviderStatus( + string Provider, + string Model, + OperationalStatus Status, + bool IsLocal, + string? Detail); + +public sealed record AgentChatResult( + string Runtime, + string AgentId, + string ConversationId, + string Content); + +public interface IAgentRuntime +{ + string Name { get; } + Task GetStatusAsync(CancellationToken cancellationToken); + Task ChatAsync( + string message, + string conversationId, + string agentId, + CancellationToken cancellationToken); +} + +public interface IModelProvider +{ + string Name { get; } + Task> GetModelsAsync(CancellationToken cancellationToken); +} + diff --git a/backend/Integrations/NvidiaProvider.cs b/backend/Integrations/NvidiaProvider.cs new file mode 100644 index 0000000..9f499f9 --- /dev/null +++ b/backend/Integrations/NvidiaProvider.cs @@ -0,0 +1,25 @@ +using Nexus.Api.Domain; + +namespace Nexus.Api.Integrations; + +public sealed class NvidiaProvider(IConfiguration configuration) : IModelProvider +{ + public string Name => "NVIDIA"; + + public Task> GetModelsAsync( + CancellationToken cancellationToken) + { + var configured = !string.IsNullOrWhiteSpace( + configuration["Integrations:Nvidia:ApiKey"]); + IReadOnlyCollection models = + [ + new( + Name, + "moonshotai/kimi-k2.6", + configured ? OperationalStatus.Online : OperationalStatus.Unknown, + false, + configured ? "Credential configured" : "Credential required") + ]; + return Task.FromResult(models); + } +} diff --git a/backend/Integrations/OllamaProvider.cs b/backend/Integrations/OllamaProvider.cs new file mode 100644 index 0000000..380f281 --- /dev/null +++ b/backend/Integrations/OllamaProvider.cs @@ -0,0 +1,37 @@ +using System.Net.Http.Json; +using Nexus.Api.Domain; + +namespace Nexus.Api.Integrations; + +public sealed class OllamaProvider(HttpClient client) : IModelProvider +{ + private sealed record OllamaTag(string Name); + private sealed record OllamaTags(IReadOnlyCollection? Models); + + public string Name => "Ollama"; + + public async Task> GetModelsAsync( + CancellationToken cancellationToken) + { + try + { + var response = await client.GetFromJsonAsync("/api/tags", cancellationToken); + return response?.Models? + .Select(model => new ModelProviderStatus( + Name, + model.Name, + OperationalStatus.Online, + true, + "Local")) + .ToArray() ?? []; + } + catch (Exception exception) + { + return + [ + new(Name, "qwen3:4b", OperationalStatus.Offline, true, exception.Message) + ]; + } + } +} + diff --git a/backend/Integrations/OpenClawRuntime.cs b/backend/Integrations/OpenClawRuntime.cs new file mode 100644 index 0000000..b195651 --- /dev/null +++ b/backend/Integrations/OpenClawRuntime.cs @@ -0,0 +1,75 @@ +using System.Diagnostics; +using System.Net.Http.Headers; +using System.Net.Http.Json; +using System.Text.Json; +using Nexus.Api.Domain; + +namespace Nexus.Api.Integrations; + +public sealed class OpenClawRuntime(HttpClient client, IConfiguration configuration) : IAgentRuntime +{ + public string Name => "OpenClaw"; + + public async Task GetStatusAsync(CancellationToken cancellationToken) + { + var stopwatch = Stopwatch.StartNew(); + try + { + using var request = new HttpRequestMessage(HttpMethod.Get, "/"); + ApplyAuthorization(request); + + using var response = await client.SendAsync(request, cancellationToken); + stopwatch.Stop(); + var status = response.IsSuccessStatusCode + ? OperationalStatus.Online + : OperationalStatus.Degraded; + return new(Name, status, stopwatch.Elapsed, $"HTTP {(int)response.StatusCode}"); + } + catch (Exception exception) + { + stopwatch.Stop(); + return new(Name, OperationalStatus.Offline, stopwatch.Elapsed, exception.Message); + } + } + + public async Task ChatAsync( + string message, + string conversationId, + string agentId, + CancellationToken cancellationToken) + { + using var request = new HttpRequestMessage(HttpMethod.Post, "/v1/chat/completions"); + ApplyAuthorization(request); + request.Content = JsonContent.Create(new + { + model = $"openclaw/{agentId}", + messages = new[] { new { role = "user", content = message } }, + user = conversationId, + stream = false + }); + + using var response = await client.SendAsync(request, cancellationToken); + var body = await response.Content.ReadAsStringAsync(cancellationToken); + if (!response.IsSuccessStatusCode) + throw new HttpRequestException($"OpenClaw chat returned HTTP {(int)response.StatusCode}: {body}"); + + using var document = JsonDocument.Parse(body); + var content = document.RootElement + .GetProperty("choices")[0] + .GetProperty("message") + .GetProperty("content") + .GetString(); + if (string.IsNullOrWhiteSpace(content)) + throw new InvalidOperationException("OpenClaw returned an empty assistant response."); + + return new(Name, agentId, conversationId, content); + } + + private void ApplyAuthorization(HttpRequestMessage request) + { + var credential = configuration["Integrations:OpenClaw:Password"] + ?? configuration["Integrations:OpenClaw:Token"]; + if (!string.IsNullOrWhiteSpace(credential)) + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", credential); + } +} diff --git a/backend/Nexus.Api.csproj b/backend/Nexus.Api.csproj new file mode 100644 index 0000000..bc1a355 --- /dev/null +++ b/backend/Nexus.Api.csproj @@ -0,0 +1,18 @@ + + + net10.0 + enable + enable + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + diff --git a/backend/Program.cs b/backend/Program.cs new file mode 100644 index 0000000..b1c9706 --- /dev/null +++ b/backend/Program.cs @@ -0,0 +1,1229 @@ +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.HttpOverrides; +using Microsoft.AspNetCore.RateLimiting; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.IdentityModel.Tokens; +using Nexus.Api.Contracts; +using Nexus.Api.Domain; +using Nexus.Api.Integrations; +using Nexus.Api.Infrastructure; +using System.Security.Cryptography; +using Nexus.Api.Routing; +using Nexus.Api.Services; +using System.IdentityModel.Tokens.Jwt; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.RateLimiting; +using Microsoft.AspNetCore.Antiforgery; +using System.Diagnostics.CodeAnalysis; +using System.IO; + +var builder = WebApplication.CreateBuilder(args); + +var jwtKey = builder.Configuration["Jwt:Key"]; +var jwtIssuer = builder.Configuration["Jwt:Issuer"] ?? "nexus"; +var jwtAudience = builder.Configuration["Jwt:Audience"] ?? "nexus-web"; +if (string.IsNullOrWhiteSpace(jwtKey) || Encoding.UTF8.GetByteCount(jwtKey) < 32) + throw new InvalidOperationException("Jwt:Key must be configured with at least 32 bytes."); + +builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) + .AddJwtBearer(options => + { + options.MapInboundClaims = false; + options.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuer = true, + ValidateAudience = true, + ValidateLifetime = true, + ValidateIssuerSigningKey = true, + ValidIssuer = jwtIssuer, + ValidAudience = jwtAudience, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey)), + NameClaimType = JwtRegisteredClaimNames.Sub, + RoleClaimType = System.Security.Claims.ClaimTypes.Role, + ClockSkew = TimeSpan.FromSeconds(30) + }; + }); + +builder.Services.AddAuthorization(); +builder.Services.AddAntiforgery(options => +{ + options.HeaderName = "X-CSRF-TOKEN"; + options.Cookie.Name = "nexus-csrf"; + options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; + options.Cookie.HttpOnly = false; +}); +builder.Services.AddRateLimiter(options => +{ + options.RejectionStatusCode = StatusCodes.Status429TooManyRequests; + options.AddPolicy("auth", context => RateLimitPartition.GetFixedWindowLimiter( + context.Connection.RemoteIpAddress?.ToString() ?? "unknown", + _ => new FixedWindowRateLimiterOptions + { + PermitLimit = 5, + Window = TimeSpan.FromMinutes(1), + QueueLimit = 0, + AutoReplenishment = true + })); + + options.AddPolicy("agents", context => RateLimitPartition.GetFixedWindowLimiter( + context.Connection.RemoteIpAddress?.ToString() ?? "unknown", + _ => new FixedWindowRateLimiterOptions + { + PermitLimit = 30, + Window = TimeSpan.FromMinutes(1), + QueueLimit = 0, + AutoReplenishment = true + })); +}); + +builder.Services.Configure(options => +{ + options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; + options.KnownIPNetworks.Clear(); + options.KnownProxies.Clear(); +}); + +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); +builder.Services.ConfigureHttpJsonOptions(options => + options.SerializerOptions.Converters.Add(new JsonStringEnumConverter())); +builder.Services.AddDbContext(options => + options.UseNpgsql(builder.Configuration.GetConnectionString("Nexus")) + .ConfigureWarnings(w => w.Ignore(Microsoft.EntityFrameworkCore.Diagnostics.RelationalEventId.PendingModelChangesWarning))); + +builder.Services.AddHttpClient(client => +{ + client.BaseAddress = new(builder.Configuration["Integrations:OpenClaw:BaseUrl"] + ?? "http://127.0.0.1:18789"); + client.Timeout = TimeSpan.FromSeconds(5); +}); + +builder.Services.AddHttpClient("gateway", client => +{ + client.BaseAddress = new(builder.Configuration["Integrations:OpenClaw:BaseUrl"] + ?? "http://127.0.0.1:18789"); + client.Timeout = TimeSpan.FromSeconds(5); +}); + +builder.Services.AddTransient(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddHealthChecks() + .AddNpgSql(builder.Configuration.GetConnectionString("Nexus")!, name: "postgresql", tags: ["database"]) + .AddCheck("runtime", () => + { + // Runtime check will be added via IAgentRuntime in the endpoint + return HealthCheckResult.Healthy("Runtime configured"); + }, tags: ["runtime"]); + +var app = builder.Build(); + +await using (var scope = app.Services.CreateAsyncScope()) +{ + var db = scope.ServiceProvider.GetRequiredService(); + await db.Database.MigrateAsync(); + + var ownerEmail = builder.Configuration["Owner:Email"]?.Trim().ToLowerInvariant(); + var ownerPassword = builder.Configuration["Owner:Password"]; + var ownerDisplayName = builder.Configuration["Owner:DisplayName"]?.Trim(); + var hasUsers = await db.Users.AnyAsync(); + + if (!hasUsers) + { + if (string.IsNullOrWhiteSpace(ownerEmail)) + throw new InvalidOperationException("Owner:Email is required for initial setup."); + + var initialDisplayName = string.IsNullOrWhiteSpace(ownerDisplayName) + ? BuildOwnerDisplayName(ownerEmail) + : ownerDisplayName; + var initialPassword = string.IsNullOrWhiteSpace(ownerPassword) + ? GenerateTemporaryPassword() + : ownerPassword; + + if (!string.IsNullOrWhiteSpace(ownerPassword) && ownerPassword.Length < 10) + throw new InvalidOperationException("Owner:Password must be at least 10 characters when provided explicitly."); + + db.Users.Add(new NexusUser + { + Email = ownerEmail, + NormalizedEmail = AuthService.NormalizeEmail(ownerEmail), + DisplayName = initialDisplayName, + PasswordHash = PasswordSecurity.Hash(initialPassword), + Role = "owner" + }); + await db.SaveChangesAsync(); + + if (string.IsNullOrWhiteSpace(ownerPassword)) + { + Console.Error.WriteLine($"[nexus] Initial owner credentials generated: displayName={initialDisplayName}, password={initialPassword}"); + } + } + +} + +app.UseForwardedHeaders(); +app.UseRateLimiter(); +app.UseAuthentication(); +app.UseAuthorization(); + +// Security headers (WARN-2) +app.Use(async (context, next) => +{ + var headers = context.Response.Headers; + if (!app.Environment.IsDevelopment()) + { + headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains"; + } + headers["X-Content-Type-Options"] = "nosniff"; + headers["Content-Security-Policy"] = "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'"; + headers["X-Frame-Options"] = "DENY"; + headers["Referrer-Policy"] = "strict-origin-when-cross-origin"; + await next(); +}); + +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.MapGet("/health", async (IAgentRuntime runtime, HealthCheckService healthChecks, CancellationToken ct) => +{ + var report = await healthChecks.CheckHealthAsync(ct); + + // Check runtime separately since it needs IAgentRuntime + string runtimeStatus; + string? runtimeDetail; + try + { + var status = await runtime.GetStatusAsync(ct); + runtimeStatus = status.Status.ToString(); + runtimeDetail = status.Detail; + } + catch (Exception ex) + { + runtimeStatus = "Offline"; + runtimeDetail = ex.Message; + } + + var entries = report.Entries.ToDictionary( + e => e.Key, + e => new + { + status = e.Value.Status.ToString(), + description = e.Value.Description, + data = e.Value.Data + }); + + entries["runtime"] = new + { + status = runtimeStatus, + description = runtimeDetail ?? "Runtime status checked", + data = (IReadOnlyDictionary)new Dictionary() + }; + + var isHealthy = report.Status == HealthStatus.Healthy && runtimeStatus == "Online"; + return isHealthy ? Results.Ok(new { status = "Healthy", checks = entries, timestamp = DateTimeOffset.UtcNow }) + : Results.Ok(new { status = "Degraded", checks = entries, timestamp = DateTimeOffset.UtcNow }); +}); + +var auth = app.MapGroup("/api/v1/auth"); + +auth.MapGet("/csrf", (HttpContext ctx, IAntiforgery antiforgery) => +{ + var tokens = antiforgery.GetAndStoreTokens(ctx); + return Results.Ok(new { token = tokens.RequestToken }); +}); +auth.MapPost("/login", async (LoginRequest request, HttpResponse response, IAuthService authService, CancellationToken ct) => +{ + if (string.IsNullOrWhiteSpace(request.Email) || string.IsNullOrWhiteSpace(request.Password)) + return Results.ValidationProblem(new Dictionary { ["credentials"] = ["Email and password are required."] }); + + var session = await authService.LoginAsync(request, ct); + if (session is null) return Results.Unauthorized(); + + SetRefreshCookie(response, session.RefreshToken, builder.Configuration, app.Environment); + response.Headers.CacheControl = "no-store"; + return Results.Ok(ToAuthResponse(session)); +}).RequireRateLimiting("auth"); + +auth.MapPost("/refresh", async (HttpRequest request, HttpResponse response, IAuthService authService, CancellationToken ct) => +{ + if (!request.Cookies.TryGetValue("nexus_refresh", out var refreshToken)) + return Results.Unauthorized(); + + var session = await authService.RefreshAsync(refreshToken, ct); + if (session is null) + { + ClearRefreshCookie(response, app.Environment); + return Results.Unauthorized(); + } + + SetRefreshCookie(response, session.RefreshToken, builder.Configuration, app.Environment); + response.Headers.CacheControl = "no-store"; + return Results.Ok(ToAuthResponse(session)); +}).RequireRateLimiting("auth"); + +auth.MapPost("/logout", async (HttpRequest request, HttpResponse response, IAuthService authService, CancellationToken ct) => +{ + if (request.Cookies.TryGetValue("nexus_refresh", out var refreshToken)) + await authService.RevokeAsync(refreshToken, ct); + + ClearRefreshCookie(response, app.Environment); + return Results.NoContent(); +}); + +auth.MapGet("/me", async (HttpContext context, IAuthService authService, CancellationToken ct) => +{ + var subject = context.User.FindFirst(JwtRegisteredClaimNames.Sub)?.Value; + if (!Guid.TryParse(subject, out var userId)) return Results.Unauthorized(); + + var user = await authService.GetUserAsync(userId, ct); + return user is null + ? Results.Unauthorized() + : Results.Ok(new UserInfo { Id = user.Id, Email = user.Email, DisplayName = user.DisplayName, Role = user.Role }); +}).RequireAuthorization(); + +auth.MapPatch("/profile", async (HttpContext context, UpdateProfileRequest request, IAuthService authService, CancellationToken ct) => +{ + var subject = context.User.FindFirst(System.IdentityModel.Tokens.Jwt.JwtRegisteredClaimNames.Sub)?.Value; + if (!Guid.TryParse(subject, out var userId)) return Results.Unauthorized(); + + var user = await authService.UpdateProfileAsync(userId, request, ct); + return user is null + ? Results.NotFound() + : Results.Ok(new UserInfo { Id = user.Id, Email = user.Email, DisplayName = user.DisplayName, Role = user.Role }); +}).RequireAuthorization(); + +auth.MapPost("/change-password", async (HttpContext context, ChangePasswordRequest request, IAuthService authService, CancellationToken ct) => +{ + if (string.IsNullOrWhiteSpace(request.CurrentPassword) || string.IsNullOrWhiteSpace(request.NewPassword)) + return Results.ValidationProblem(new Dictionary { ["password"] = ["Current and new passwords are required."] }); + + if (request.NewPassword.Length < 10) + return Results.ValidationProblem(new Dictionary { ["newPassword"] = ["New password must be at least 10 characters."] }); + + var subject = context.User.FindFirst(System.IdentityModel.Tokens.Jwt.JwtRegisteredClaimNames.Sub)?.Value; + if (!Guid.TryParse(subject, out var userId)) return Results.Unauthorized(); + + var success = await authService.ChangePasswordAsync(userId, request, ct); + return success ? Results.Ok(new { message = "Password changed successfully." }) : Results.Problem("Current password is incorrect.", statusCode: 400); +}).RequireAuthorization(); + +var api = app.MapGroup("/api/v1").RequireAuthorization(); + +api.MapGet("/operations/snapshot", async ( + IAgentRuntime runtime, + IAgentService agentService, + NexusDbContext db, + CancellationToken cancellationToken) => +{ + var runtimeTask = runtime.GetStatusAsync(cancellationToken); + var agentsTask = agentService.GetAgentsAsync(cancellationToken); + var projectsTask = db.Projects.AsNoTracking().OrderByDescending(x => x.UpdatedAt).ToListAsync(cancellationToken); + var tasksTask = db.Tasks.AsNoTracking().OrderByDescending(x => x.UpdatedAt).ToListAsync(cancellationToken); + var activityTask = db.Activity.AsNoTracking().OrderByDescending(x => x.CreatedAt).Take(20).ToListAsync(cancellationToken); + await Task.WhenAll(runtimeTask, agentsTask, projectsTask, tasksTask, activityTask); + + var tasks = tasksTask.Result; + var projects = projectsTask.Result; + var agents = agentsTask.Result; + var completedTasks = tasks.Count(x => x.State == TaskStateHelper.ToStateString(TaskState.Done)); + + // Runtime health check + var runtimeStatus = runtimeTask.Result; + var runtimeHealthy = runtimeStatus.Status == OperationalStatus.Online; + + // Last incident: most recent blocked task + var lastIncident = tasks + .Where(x => x.State == TaskStateHelper.ToStateString(TaskState.Blocked)) + .OrderByDescending(x => x.UpdatedAt) + .Select(x => new { TaskId = (Guid?)x.Id, Title = (string?)x.Title, Since = (DateTimeOffset?)x.UpdatedAt }) + .FirstOrDefault(); + + // Project health breakdown + var projectHealth = new + { + Online = projects.Count(x => x.Status == OperationalStatus.Online), + Offline = projects.Count(x => x.Status == OperationalStatus.Offline), + Degraded = projects.Count(x => x.Status == OperationalStatus.Degraded), + Unknown = projects.Count(x => x.Status == OperationalStatus.Unknown) + }; + + return Results.Ok(new + { + generatedAt = DateTimeOffset.UtcNow, + runtime = runtimeTask.Result, + models = Array.Empty(), + runtimeHealthy, + metrics = new + { + activeAgents = agents.Count, + queuedTasks = tasks.Count - completedTasks, + successRate = tasks.Count == 0 ? 100 : Math.Round(completedTasks * 100d / tasks.Count, 1), + incidents = tasks.Count(x => x.State == TaskStateHelper.ToStateString(TaskState.Blocked)) + }, + lastIncident, + projectHealth, + agents = agents.Select(x => new { x.Id, x.Name, x.Role, x.Status, x.Model }), + projects = projects.Select(x => new { x.Id, x.Name, x.Status, x.Progress, x.UpdatedAt }), + tasks = tasks.Select(x => new { x.Id, x.Title, x.State, x.Priority, x.ProjectId, x.UpdatedAt }), + activity = activityTask.Result.Select(x => new { x.Id, x.Type, x.Message, at = x.CreatedAt }) + }); +}); + +api.MapGet("/projects", async (NexusDbContext db, CancellationToken token) => + Results.Ok(await db.Projects.AsNoTracking().OrderByDescending(x => x.UpdatedAt).ToListAsync(token))); + +api.MapPost("/projects", async (CreateProjectRequest request, NexusDbContext db, CancellationToken token) => +{ + if (string.IsNullOrWhiteSpace(request.Name)) + return Results.ValidationProblem(new Dictionary { ["name"] = ["Name is required."] }); + + var project = new Project + { + Name = request.Name.Trim(), + Description = request.Description?.Trim() ?? string.Empty, + Status = OperationalStatus.Online + }; + db.Projects.Add(project); + db.Activity.Add(new ActivityEvent { Type = "project", Message = $"Project {project.Name} created" }); + await db.SaveChangesAsync(token); + return Results.Created($"/api/v1/projects/{project.Id}", project); +}); + +api.MapGet("/projects/{id:guid}", async (Guid id, NexusDbContext db, CancellationToken token) => +{ + var project = await db.Projects.AsNoTracking().FirstOrDefaultAsync(x => x.Id == id, token); + return project is null ? Results.NotFound() : Results.Ok(project); +}); + +api.MapPatch("/projects/{id:guid}", async (Guid id, UpdateProjectRequest request, NexusDbContext db, CancellationToken token) => +{ + var project = await db.Projects.FindAsync([id], token); + if (project is null) return Results.NotFound(); + + if (!string.IsNullOrWhiteSpace(request.Name)) + project.Name = request.Name.Trim(); + if (request.Description is not null) + project.Description = request.Description.Trim(); + if (!string.IsNullOrWhiteSpace(request.Status) && Enum.TryParse(request.Status, true, out var parsedStatus)) + project.Status = parsedStatus; + + project.UpdatedAt = DateTimeOffset.UtcNow; + db.Activity.Add(new ActivityEvent { Type = "project", Message = $"Project {project.Name} updated" }); + await db.SaveChangesAsync(token); + return Results.Ok(project); +}); + +api.MapDelete("/projects/{id:guid}", async (Guid id, NexusDbContext db, CancellationToken token) => +{ + var project = await db.Projects.FindAsync([id], token); + if (project is null) return Results.NotFound(); + + var hasTasks = await db.Tasks.AnyAsync(t => t.ProjectId == id, token); + if (hasTasks) + { + project.Status = Nexus.Api.Domain.OperationalStatus.Offline; + project.UpdatedAt = DateTimeOffset.UtcNow; + db.Activity.Add(new ActivityEvent { Type = "project", Message = $"Project {project.Name} archived" }); + await db.SaveChangesAsync(token); + return Results.Ok(project); + } + + db.Projects.Remove(project); + db.Activity.Add(new ActivityEvent { Type = "project", Message = $"Project {project.Name} deleted" }); + await db.SaveChangesAsync(token); + return Results.NoContent(); +}); + +api.MapGet("/tasks", async (NexusDbContext db, CancellationToken token) => + Results.Ok(await db.Tasks.AsNoTracking().OrderByDescending(x => x.UpdatedAt).ToListAsync(token))); + +api.MapPost("/tasks", async (CreateTaskRequest request, NexusDbContext db, CancellationToken token) => +{ + if (string.IsNullOrWhiteSpace(request.Title)) + return Results.ValidationProblem(new Dictionary { ["title"] = ["Title is required."] }); + + var task = new WorkTask + { + Title = request.Title.Trim(), + Priority = string.IsNullOrWhiteSpace(request.Priority) ? "Normal" : request.Priority.Trim(), + ProjectId = request.ProjectId + }; + db.Tasks.Add(task); + db.Activity.Add(new ActivityEvent { Type = "task", Message = $"Task {task.Title} created" }); + await db.SaveChangesAsync(token); + return Results.Created($"/api/v1/tasks/{task.Id}", task); +}); + +api.MapGet("/tasks/pending-approval", async (NexusDbContext db, CancellationToken token) => +{ + var threshold = DateTimeOffset.UtcNow.AddHours(-1); + var pending = await db.Tasks.AsNoTracking() + .Where(x => x.State == TaskStateHelper.ToStateString(TaskState.InProgress) && x.UpdatedAt <= threshold) + .OrderByDescending(x => x.UpdatedAt) + .ToListAsync(token); + + return Results.Ok(pending.Select(x => new { x.Id, x.Title, x.State, x.Priority, x.ProjectId, x.UpdatedAt })); +}); + +api.MapPost("/tasks/{id:guid}/approve", async (Guid id, NexusDbContext db, CancellationToken token) => +{ + var task = await db.Tasks.FindAsync([id], token); + if (task is null) return Results.NotFound(); + + if (!TaskStateHelper.IsInProgressOrBlocked(task.State)) + return Results.Problem( + title: "Approval denied", + detail: "Only tasks in 'In progress' or 'Blocked' state can be approved.", + statusCode: StatusCodes.Status403Forbidden); + + task.State = TaskStateHelper.ToStateString(TaskState.Done); + task.UpdatedAt = DateTimeOffset.UtcNow; + db.Activity.Add(new ActivityEvent { Type = "task", Message = $"Task {task.Title} approved" }); + await db.SaveChangesAsync(token); + return Results.Ok(task); +}); + +api.MapPost("/tasks/{id:guid}/reject", async (Guid id, NexusDbContext db, CancellationToken token) => +{ + var task = await db.Tasks.FindAsync([id], token); + if (task is null) return Results.NotFound(); + + if (!TaskStateHelper.IsInProgressOrBlocked(task.State)) + return Results.Problem( + title: "Rejection denied", + detail: "Only tasks in 'In progress' or 'Blocked' state can be rejected.", + statusCode: StatusCodes.Status403Forbidden); + + task.State = TaskStateHelper.ToStateString(TaskState.Backlog); + task.UpdatedAt = DateTimeOffset.UtcNow; + db.Activity.Add(new ActivityEvent { Type = "task", Message = $"Task {task.Title} rejected, returned to backlog" }); + await db.SaveChangesAsync(token); + return Results.Ok(task); +}); + +api.MapPatch("/tasks/{id:guid}/state", async (Guid id, UpdateTaskStateRequest request, NexusDbContext db, CancellationToken token) => +{ + var allowedStates = TaskStateHelper.AllStates; + if (!allowedStates.Contains(request.State, StringComparer.OrdinalIgnoreCase)) + return Results.ValidationProblem(new Dictionary { ["state"] = ["Unsupported task state."] }); + + var task = await db.Tasks.FindAsync([id], token); + if (task is null) return Results.NotFound(); + task.State = allowedStates.First(x => x.Equals(request.State, StringComparison.OrdinalIgnoreCase)); + task.UpdatedAt = DateTimeOffset.UtcNow; + db.Activity.Add(new ActivityEvent { Type = "task", Message = $"Task {task.Title} moved to {task.State}" }); + await db.SaveChangesAsync(token); + return Results.Ok(task); +}); + +api.MapDelete("/tasks/{id:guid}", async (Guid id, NexusDbContext db, CancellationToken token) => +{ + var task = await db.Tasks.FindAsync([id], token); + if (task is null) return Results.NotFound(); + + if (!TaskStateHelper.IsDoneOrBacklog(task.State)) + return Results.Problem( + title: "Task deletion denied", + detail: "Only tasks in 'Done' or 'Backlog' state can be deleted.", + statusCode: StatusCodes.Status403Forbidden); + + db.Activity.Add(new ActivityEvent { Type = "task", Message = $"Task {task.Title} deleted" }); + db.Tasks.Remove(task); + await db.SaveChangesAsync(token); + return Results.NoContent(); +}); + +api.MapPatch("/tasks/{id:guid}", async (Guid id, UpdateTaskRequest request, NexusDbContext db, CancellationToken token) => +{ + var task = await db.Tasks.FindAsync([id], token); + if (task is null) return Results.NotFound(); + + if (!string.IsNullOrWhiteSpace(request.Title)) + task.Title = request.Title.Trim(); + if (!string.IsNullOrWhiteSpace(request.Priority)) + task.Priority = request.Priority.Trim(); + if (request.ProjectId.HasValue) + task.ProjectId = request.ProjectId.Value == Guid.Empty ? null : request.ProjectId; + + task.UpdatedAt = DateTimeOffset.UtcNow; + db.Activity.Add(new ActivityEvent { Type = "task", Message = $"Task {task.Title} updated" }); + await db.SaveChangesAsync(token); + return Results.Ok(task); +}); + +api.MapGet("/activity", async (string? type, string? sort, int? page, int? pageSize, NexusDbContext db, CancellationToken token) => +{ + var query = db.Activity.AsNoTracking(); + + if (!string.IsNullOrWhiteSpace(type)) + query = query.Where(x => x.Type == type); + + query = (sort?.ToLowerInvariant()) switch + { + "oldest" => query.OrderBy(x => x.CreatedAt), + _ => query.OrderByDescending(x => x.CreatedAt) + }; + + var take = Math.Clamp(pageSize ?? 20, 1, 200); + var skip = (Math.Max(page ?? 1, 1) - 1) * take; + + var totalCount = await query.CountAsync(token); + var items = await query.Skip(skip).Take(take).ToListAsync(token); + + return Results.Ok(new + { + items = items.Select(x => new { x.Id, x.Type, x.Message, at = x.CreatedAt }), + totalCount, + page = Math.Max(page ?? 1, 1), + pageSize = take, + totalPages = (int)Math.Ceiling((double)totalCount / take) + }); +}); + +api.MapPost("/chat", async (ChatRequest request, IAgentRuntime runtime, ILogger logger, CancellationToken token) => +{ + var message = request.Message?.Trim(); + if (string.IsNullOrWhiteSpace(message) || message.Length > 8000) + return Results.ValidationProblem(new Dictionary { ["message"] = ["Message must contain between 1 and 8000 characters."] }); + + var agentId = string.IsNullOrWhiteSpace(request.AgentId) ? "iris" : request.AgentId.Trim().ToLowerInvariant(); + if (agentId is not ("iris" or "main")) + return Results.ValidationProblem(new Dictionary { ["agentId"] = ["Only iris and main are supported."] }); + + var conversationId = string.IsNullOrWhiteSpace(request.ConversationId) + ? $"nexus-{Guid.NewGuid():N}" + : request.ConversationId.Trim(); + if (conversationId.Length > 160) + return Results.ValidationProblem(new Dictionary { ["conversationId"] = ["Conversation id is too long."] }); + + try + { + return Results.Ok(await runtime.ChatAsync(message, conversationId, agentId, token)); + } + catch (Exception exception) + { + logger.LogWarning(exception, "OpenClaw chat request failed for agent {AgentId}", agentId); + return Results.Problem( + title: "OpenClaw chat unavailable", + detail: "The trusted OpenClaw chat endpoint is not enabled or reachable.", + statusCode: StatusCodes.Status503ServiceUnavailable); + } +}).RequireRateLimiting("agents"); + +// Agent inventory endpoints +api.MapGet("/agents", async (IAgentService agentService, CancellationToken token) => +{ + var agents = await agentService.GetAgentsAsync(token); + return Results.Ok(agents.Select(a => new AgentListResponse( + a.Id, a.Name, a.Role, a.Model, a.Status.ToString(), a.LastSeen, a.Workspace, a.Description + ))); +}); + +api.MapGet("/agents/{id}", async (string id, IAgentService agentService, CancellationToken token) => +{ + var agent = await agentService.GetAgentAsync(id, token); + if (agent is null) return Results.NotFound(); + return Results.Ok(new AgentDetailResponse( + agent.Id, agent.Name, agent.Role, agent.Model, agent.Status.ToString(), + agent.LastSeen, agent.Workspace, agent.AgentDir, agent.Description, + agent.SubAgents, agent.IdentityName + )); +}); + +api.MapGet("/agents/{id}/activity", async (string id, NexusDbContext db, CancellationToken token) => +{ + var query = db.Activity.AsNoTracking() + .Where(x => x.Message.Contains(id, StringComparison.OrdinalIgnoreCase) || x.Type == "agent") + .OrderByDescending(x => x.CreatedAt) + .Take(50); + + var items = await query.ToListAsync(token); + return Results.Ok(items.Select(x => new { x.Id, x.Type, x.Message, at = x.CreatedAt })); +}); + +api.MapPost("/agents/{id}/command", async (string id, AgentCommandRequest request, IAgentRuntime runtime, ILogger logger, NexusDbContext db, CancellationToken token) => +{ + var message = request.Message?.Trim(); + if (string.IsNullOrWhiteSpace(message) || message.Length > 8000) + return Results.ValidationProblem(new Dictionary { ["message"] = ["Message must contain between 1 and 8000 characters."] }); + + var conversationId = $"nexus-command-{id}-{Guid.NewGuid():N}"; + + try + { + var result = await runtime.ChatAsync(message, conversationId, id, token); + + db.Activity.Add(new ActivityEvent { Type = "agent", Message = $"Command sent to agent {id}: {message[..Math.Min(message.Length, 80)]}" }); + await db.SaveChangesAsync(token); + + return Results.Ok(new AgentCommandResponse(result.Runtime, result.AgentId, result.ConversationId, result.Content)); + } + catch (Exception exception) + { + logger.LogWarning(exception, "Agent command failed for {AgentId}", id); + return Results.Problem( + title: "Agent command failed", + detail: $"Could not send command to agent {id}: {exception.Message}", + statusCode: StatusCodes.Status503ServiceUnavailable); + } +}).RequireRateLimiting("agents"); + +api.MapGet("/routing", async (ModelRoutingService routing, CancellationToken token) => + Results.Ok(await routing.GetStatusAsync(token))); + +// ========== Phase 2: Agent Config Editor ========== + +api.MapGet("/agents/{id}/config", async (string id, CancellationToken ct) => +{ + var workspacePath = $"/mnt/workspace-{id}"; + if (!Directory.Exists(workspacePath)) + return Results.Ok(Array.Empty()); + + var allowedFiles = new HashSet(StringComparer.OrdinalIgnoreCase) + { + "IDENTITY.md", "SOUL.md", "AGENTS.md", "TOOLS.md", "HEARTBEAT.md", "USER.md", "MEMORY.md" + }; + + var files = Directory.GetFiles(workspacePath, "*.md") + .Select(f => new FileInfo(f)) + .Where(f => allowedFiles.Contains(f.Name)) + .OrderBy(f => f.Name) + .Select(f => new + { + fileName = f.Name, + size = f.Length, + modifiedAt = f.LastWriteTimeUtc + }) + .ToList(); + + return Results.Ok(files); +}); + +api.MapGet("/agents/{id}/config/{fileName}", async (string id, string fileName, CancellationToken ct) => +{ + if (!IsValidConfigFileName(fileName)) + return Results.BadRequest(new { error = "Invalid filename. Only .md files with alphanumeric characters, dots, hyphens, and underscores are allowed." }); + + var workspacePath = $"/mnt/workspace-{id}"; + if (!TryResolveSafePath(workspacePath, fileName, out var safePath) || !File.Exists(safePath)) + return Results.NotFound(); + + var content = await File.ReadAllTextAsync(safePath, ct); + var fi = new FileInfo(safePath); + return Results.Ok(new { fileName, content, size = fi.Length, modifiedAt = fi.LastWriteTimeUtc }); +}); + +api.MapPut("/agents/{id}/config/{fileName}", async (string id, string fileName, SaveConfigRequest request, CancellationToken ct) => +{ + if (!IsValidConfigFileName(fileName)) + return Results.BadRequest(new { error = "Invalid filename. Only .md files with alphanumeric characters, dots, hyphens, and underscores are allowed." }); + + if (request.Content is null) + return Results.BadRequest(new { error = "Content is required." }); + + if (request.Content.Length > 500 * 1024) + return Results.BadRequest(new { error = "Content exceeds maximum size of 500KB." }); + + var workspacePath = $"/mnt/workspace-{id}"; + if (!TryResolveSafePath(workspacePath, fileName, out var safePath)) + return Results.NotFound(); + + // Atomic write: write to temp file, then rename + var tempPath = safePath + ".tmp"; + try + { + await File.WriteAllTextAsync(tempPath, request.Content, ct); + File.Move(tempPath, safePath, overwrite: true); + } + catch + { + if (File.Exists(tempPath)) File.Delete(tempPath); + throw; + } + + var fi = new FileInfo(safePath); + return Results.Ok(new { fileName, size = fi.Length, modifiedAt = fi.LastWriteTimeUtc }); +}); + +// ========== Phase 2: Memory Browser ========== + +api.MapGet("/memory", async () => +{ + var basePath = "/mnt/workspace-iris/memory"; + if (!Directory.Exists(basePath)) + return Results.Ok(Array.Empty()); + + var files = Directory.GetFiles(basePath, "*.md") + .Select(f => new FileInfo(f)) + .OrderByDescending(f => f.Name) + .Select(f => new { + name = f.Name, + path = f.FullName.Replace(basePath, "").TrimStart('/'), + size = f.Length, + modifiedAt = f.LastWriteTimeUtc + }) + .ToList(); + + var longTermPath = "/mnt/workspace-iris/MEMORY.md"; + if (File.Exists(longTermPath)) + { + var fi = new FileInfo(longTermPath); + files.Insert(0, new { name = "MEMORY.md", path = "MEMORY.md", size = fi.Length, modifiedAt = fi.LastWriteTimeUtc }); + } + + return Results.Ok(files); +}); + +api.MapGet("/memory/search", async (string q) => +{ + if (string.IsNullOrWhiteSpace(q) || q.Length < 2) + return Results.BadRequest("Query must be at least 2 characters."); + + var basePath = "/mnt/workspace-iris/memory"; + var results = new List(); + + const int maxFiles = 50; + const int maxFileSize = 1_000_000; // 1 MB per file + + async Task SearchDir(string dir) + { + if (!Directory.Exists(dir)) return; + var files = Directory.GetFiles(dir, "*.md").Take(maxFiles); + foreach (var file in files) + { + var fi = new FileInfo(file); + if (fi.Length > maxFileSize) continue; + string content; + using (var reader = new StreamReader(file)) + content = await reader.ReadToEndAsync(); + if (content.Contains(q, StringComparison.OrdinalIgnoreCase)) + { + var idx = content.IndexOf(q, StringComparison.OrdinalIgnoreCase); + var start = Math.Max(0, idx - 60); + var excerpt = (start > 0 ? "\u2026" : "") + content.Substring(start, Math.Min(200, content.Length - start)) + "\u2026"; + results.Add(new { name = Path.GetFileName(file), path = file.Replace(basePath, "").TrimStart('/'), excerpt, size = fi.Length }); + } + } + } + + await SearchDir(basePath); + + var longTermPath = "/mnt/workspace-iris/MEMORY.md"; + if (File.Exists(longTermPath)) + { + string content; + using (var reader = new StreamReader(longTermPath)) + content = await reader.ReadToEndAsync(); + if (content.Contains(q, StringComparison.OrdinalIgnoreCase)) + { + var idx = content.IndexOf(q, StringComparison.OrdinalIgnoreCase); + var start = Math.Max(0, idx - 60); + var excerpt = (start > 0 ? "\u2026" : "") + content.Substring(start, Math.Min(200, content.Length - start)) + "\u2026"; + results.Insert(0, new { name = "MEMORY.md", path = "MEMORY.md", excerpt, size = content.Length }); + } + } + + return Results.Ok(results); +}); + +api.MapGet("/memory/{name}", async (string name) => +{ + if (!TryResolveSafePath("/mnt/workspace-iris/memory", name, out var filePath)) + return Results.BadRequest("Invalid filename."); + + var longTermPath = "/mnt/workspace-iris/MEMORY.md"; + if (name.Equals("MEMORY.md", StringComparison.OrdinalIgnoreCase)) + filePath = longTermPath; + + if (!File.Exists(filePath)) + return Results.NotFound(); + + var content = await File.ReadAllTextAsync(filePath); + return Results.Ok(new { name, path = name, content, size = content.Length, modifiedAt = System.IO.File.GetLastWriteTimeUtc(filePath) }); +}); + +// ========== Phase 2: Docs Browser ========== + +api.MapGet("/docs", () => +{ + var workspaceRoot = "/mnt/workspace-iris"; + var results = new List(); + + void ScanDir(string dir, string category) + { + if (!Directory.Exists(dir)) return; + foreach (var file in Directory.GetFiles(dir, "*.*")) + { + var ext = Path.GetExtension(file).ToLowerInvariant(); + if (ext is not (".md" or ".json" or ".txt" or ".yaml" or ".yml" or ".html" or ".css")) + continue; + var fi = new FileInfo(file); + results.Add(new { + name = fi.Name, + path = file.Replace(workspaceRoot, "").TrimStart('/'), + category, + type = ext.Replace(".", ""), + size = fi.Length, + modifiedAt = fi.LastWriteTimeUtc + }); + } + } + + ScanDir("/mnt/workspace-iris/nexus-phases", "phases"); + ScanDir("/mnt/workspace-iris/skills", "skills"); + ScanDir("/mnt/workspace-iris", "workspace"); + ScanDir("/home/node/.openclaw/workspace/nexus", "nexus"); + ScanDir("/home/node/.openclaw/workspace/nexus/phases", "nexus-phases"); + + return Results.Ok(results.OrderByDescending(x => ((System.DateTime)((dynamic)x).modifiedAt)).Take(100)); +}); + +// ========== Phase 2: Team Org Map ========== + +api.MapGet("/team", async (IAgentService agentService, CancellationToken ct) => +{ + var agents = await agentService.GetAgentsAsync(ct); + var team = new List(); + + foreach (var agent in agents) + { + string identity = ""; + string workspace = agent.Workspace ?? ""; + if (!string.IsNullOrWhiteSpace(workspace) && Directory.Exists(workspace)) + { + var identityFile = Path.Combine(workspace, "IDENTITY.md"); + if (File.Exists(identityFile)) + { + var content = await File.ReadAllTextAsync(identityFile, ct); + var lines = content.Split('\n').Where(l => l.StartsWith("- **")).Take(8); + identity = string.Join("\n", lines); + } + } + + team.Add(new + { + agent.Id, agent.Name, agent.Role, agent.Model, agent.Status, agent.LastSeen, agent.Workspace, agent.Description, + identity + }); + } + + return Results.Ok(team); +}); + +// ========== Phase 2: Security Center ========== + +api.MapGet("/security/status", (NexusDbContext db, IConfiguration config) => +{ + var jwtIssuer = config["Jwt:Issuer"] ?? "nexus"; + var jwtAudience = config["Jwt:Audience"] ?? "nexus-web"; + var refreshDays = config.GetValue("Jwt:RefreshTokenExpirationDays", 7); + var accessTokenMinutes = config.GetValue("Jwt:AccessTokenExpirationMinutes", 30); + + return Results.Ok(new + { + authMethod = "JWT + PBKDF2", + tokenConfig = new { refreshTokenDays = refreshDays, accessTokenMinutes }, + rateLimit = "5 login attempts per minute per IP", + passwordPolicy = "Minimum 10 characters", + cookieConfig = new { httpOnly = true, secure = true, sameSite = "Strict" }, + twoFactorEnabled = false, + passkeyEnabled = false, + checkedAt = DateTimeOffset.UtcNow + }); +}); + +// ========== Phase 2: Incident Diary ========== + +api.MapGet("/incidents", async () => +{ + var basePath = "/mnt/workspace-iris/memory/incidents"; + if (!Directory.Exists(basePath)) + return Results.Ok(Array.Empty()); + + var incidents = new List(); + foreach (var file in Directory.GetFiles(basePath, "*.md").OrderByDescending(f => f).Take(50)) + { + var fi = new FileInfo(file); + if (fi.Length > 1_000_000) continue; + var name = Path.GetFileNameWithoutExtension(file); + var content = await File.ReadAllTextAsync(file); + + // Extract title from # heading + var title = name; + var titleMatch = System.Text.RegularExpressions.Regex.Match(content, @"^#\s+(.+)$", System.Text.RegularExpressions.RegexOptions.Multiline); + if (titleMatch.Success) + title = titleMatch.Groups[1].Value.Trim(); + + // Extract date from filename YYYY-MM-DD + var date = (string?)null; + var dateMatch = System.Text.RegularExpressions.Regex.Match(name, @"^(\d{4}-\d{2}-\d{2})"); + if (dateMatch.Success) + date = dateMatch.Groups[1].Value; + + // Extract severity from content + var severity = "unknown"; + var severityMatch = System.Text.RegularExpressions.Regex.Match(content, @"\*\*Severity:\*\*\s*(.+)$", System.Text.RegularExpressions.RegexOptions.Multiline); + if (severityMatch.Success) + severity = severityMatch.Groups[1].Value.Trim(); + + // Extract excerpt (content up to ## Auslöser or ## Chronologie) + var excerptEnd = content.IndexOf("\n## ", StringComparison.Ordinal); + var excerpt = excerptEnd > 0 + ? content[..excerptEnd].Trim() + : content[..Math.Min(300, content.Length)].Trim(); + if (excerpt.Length > 200) + excerpt = excerpt[..200] + "…"; + + incidents.Add(new + { + name = Path.GetFileName(file), + title, + date, + severity, + excerpt, + size = fi.Length + }); + } + + return Results.Ok(incidents); +}); + +api.MapGet("/incidents/{name}", async (string name) => +{ + var basePath = "/mnt/workspace-iris/memory/incidents"; + if (!TryResolveSafePath(basePath, name, out var filePath)) + return Results.BadRequest("Invalid filename."); + + if (!File.Exists(filePath)) + { + // Try with .md extension if not provided + if (!name.EndsWith(".md", StringComparison.OrdinalIgnoreCase)) + filePath = Path.Combine(basePath, name + ".md"); + if (!File.Exists(filePath)) + return Results.NotFound(); + } + + var content = await File.ReadAllTextAsync(filePath); + var fi = new FileInfo(filePath); + var fileName = Path.GetFileName(filePath); + + // Extract title from # heading + var title = fileName; + var titleMatch = System.Text.RegularExpressions.Regex.Match(content, @"^#\s+(.+)$", System.Text.RegularExpressions.RegexOptions.Multiline); + if (titleMatch.Success) + title = titleMatch.Groups[1].Value.Trim(); + + // Extract date from filename + var date = (string?)null; + var dateMatch = System.Text.RegularExpressions.Regex.Match(fileName, @"^(\d{4}-\d{2}-\d{2})"); + if (dateMatch.Success) + date = dateMatch.Groups[1].Value; + + return Results.Ok(new + { + name = fileName, + title, + date, + content, + size = fi.Length + }); +}); + +// ========== Phase 2: Calendar & Scheduler ========== + +api.MapGet("/calendar", async (IConfiguration config, IHttpClientFactory httpClientFactory, ILogger logger, CancellationToken ct) => +{ + // Try to reach the gateway cron endpoint; fallback to dummy data on failure + var gatewayToken = config["Integrations:OpenClaw:Token"] ?? ""; + + try + { + var httpClient = httpClientFactory.CreateClient("gateway"); + if (!string.IsNullOrWhiteSpace(gatewayToken)) + httpClient.DefaultRequestHeaders.Authorization = + new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", gatewayToken); + + var response = await httpClient.GetAsync("/api/cron", ct); + if (response.IsSuccessStatusCode) + { + var data = await response.Content.ReadFromJsonAsync>(ct); + return Results.Ok(data ?? new List()); + } + } + catch (Exception ex) + { + logger.LogDebug(ex, "Gateway cron endpoint not reachable, using fallback data."); + } + + // Fallback dummy data when gateway is not reachable + var fallbackJobs = new List + { + new { id = "health-check", name = "Health Check", schedule = "*/5 * * * *", lastRun = DateTimeOffset.UtcNow.AddMinutes(-3).ToString("O"), nextRun = DateTimeOffset.UtcNow.AddMinutes(2).ToString("O"), status = "completed" }, + new { id = "memory-sync", name = "Memory Sync", schedule = "0 */6 * * *", lastRun = DateTimeOffset.UtcNow.AddHours(-2).ToString("O"), nextRun = DateTimeOffset.UtcNow.AddHours(4).ToString("O"), status = "completed" }, + new { id = "task-cleanup", name = "Task Cleanup", schedule = "0 3 * * *", lastRun = DateTimeOffset.UtcNow.AddDays(-1).ToString("O"), nextRun = DateTimeOffset.UtcNow.AddDays(1).AddHours(3).ToString("O"), status = "completed" }, + new { id = "backup", name = "Database Backup", schedule = "0 4 * * *", lastRun = DateTimeOffset.UtcNow.AddDays(-1).AddHours(-1).ToString("O"), nextRun = DateTimeOffset.UtcNow.AddDays(1).AddHours(4).ToString("O"), status = "completed" }, + new { id = "model-routing-refresh", name = "Model Routing Refresh", schedule = "*/30 * * * *", lastRun = DateTimeOffset.UtcNow.AddMinutes(-12).ToString("O"), nextRun = DateTimeOffset.UtcNow.AddMinutes(18).ToString("O"), status = "running" }, + }; + return Results.Ok(fallbackJobs); +}); + +api.MapGet("/calendar/upcoming", async (IConfiguration config, IHttpClientFactory httpClientFactory, ILogger logger, CancellationToken ct) => +{ + var gatewayToken = config["Integrations:OpenClaw:Token"] ?? ""; + + try + { + var httpClient = httpClientFactory.CreateClient("gateway"); + if (!string.IsNullOrWhiteSpace(gatewayToken)) + httpClient.DefaultRequestHeaders.Authorization = + new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", gatewayToken); + + var response = await httpClient.GetAsync("/api/cron/upcoming", ct); + if (response.IsSuccessStatusCode) + { + var data = await response.Content.ReadFromJsonAsync>(ct); + return Results.Ok(data ?? new List()); + } + } + catch (Exception ex) + { + logger.LogDebug(ex, "Gateway upcoming cron endpoint not reachable, using fallback data."); + } + + // Fallback dummy data + var now = DateTimeOffset.UtcNow; + var fallback = new List + { + new { id = "health-check", name = "Health Check", nextRun = now.AddMinutes(2).ToString("O"), schedule = "*/5 * * * *" }, + new { id = "model-routing-refresh", name = "Model Routing Refresh", nextRun = now.AddMinutes(18).ToString("O"), schedule = "*/30 * * * *" }, + new { id = "memory-sync", name = "Memory Sync", nextRun = now.AddHours(4).ToString("O"), schedule = "0 */6 * * *" }, + new { id = "task-cleanup", name = "Task Cleanup", nextRun = now.AddDays(1).AddHours(3).ToString("O"), schedule = "0 3 * * *" }, + new { id = "backup", name = "Database Backup", nextRun = now.AddDays(1).AddHours(4).ToString("O"), schedule = "0 4 * * *" }, + }; + return Results.Ok(fallback); +}); + +// ========== Phase 2: Docs Catch-All (MUSS AM ENDE SEIN FÜR ROUTE-REIHENFOLGE) ========== + +api.MapGet("/docs/{**path}", async (string path) => +{ + if (string.IsNullOrWhiteSpace(path)) + return Results.BadRequest("Path required."); + + // Try workspace-iris first, then nexus + string? resolvedPath = null; + foreach (var root in new[] { "/mnt/workspace-iris", "/home/node/.openclaw/workspace/nexus" }) + { + if (TryResolveSafePath(root, path, out var candidate) && File.Exists(candidate)) + { + resolvedPath = candidate; + break; + } + } + + if (resolvedPath is null) + return Results.NotFound(); + + var content = await File.ReadAllTextAsync(resolvedPath); + var fi = new FileInfo(resolvedPath); + return Results.Ok(new { name = fi.Name, path = resolvedPath.Replace("/mnt/workspace-iris/", "").Replace("/home/node/.openclaw/workspace/nexus/", ""), content, size = fi.Length, modifiedAt = fi.LastWriteTimeUtc }); +}); + +app.Run(); + +static string GenerateTemporaryPassword() + => Convert.ToBase64String(RandomNumberGenerator.GetBytes(18)) + .TrimEnd('=') + .Replace('+', '-') + .Replace('/', '_'); + +static string BuildOwnerDisplayName(string email) +{ + var localPart = email.Split('@', 2)[0].Trim(); + if (string.IsNullOrWhiteSpace(localPart)) return "Owner"; + + var words = localPart + .Replace('.', ' ') + .Replace('_', ' ') + .Replace('-', ' ') + .Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) + .Select(word => char.ToUpperInvariant(word[0]) + word[1..].ToLowerInvariant()); + + var displayName = string.Join(' ', words); + return string.IsNullOrWhiteSpace(displayName) ? "Owner" : displayName; +} + +static AuthResponse ToAuthResponse(AuthSession session) => new() +{ + AccessToken = session.AccessToken, + ExpiresAt = session.ExpiresAt, + User = session.User +}; + +static void SetRefreshCookie(HttpResponse response, string token, IConfiguration config, IHostEnvironment environment) +{ + var days = config.GetValue("Jwt:RefreshTokenExpirationDays") ?? 7; + response.Cookies.Append("nexus_refresh", token, new CookieOptions + { + HttpOnly = true, + Secure = !environment.IsDevelopment(), + SameSite = SameSiteMode.Strict, + Path = "/api/v1/auth", + MaxAge = TimeSpan.FromDays(days), + IsEssential = true + }); +} + +static void ClearRefreshCookie(HttpResponse response, IHostEnvironment environment) +{ + response.Cookies.Delete("nexus_refresh", new CookieOptions + { + HttpOnly = true, + Secure = !environment.IsDevelopment(), + SameSite = SameSiteMode.Strict, + Path = "/api/v1/auth" + }); +} + +// --- Security helper: safe path validation against traversal --- +static bool TryResolveSafePath(string basePath, string userInput, out string? safePath) +{ + safePath = null; + + // URL-decode to catch encoded attacks like %2F, %2e%2e, %00 + var decoded = Uri.UnescapeDataString(userInput); + + // Reject null bytes + if (decoded.Contains('\0')) return false; + + // Combine with base and resolve to canonical form + var combined = Path.Combine(basePath, decoded); + var full = Path.GetFullPath(combined); + var canonicalBase = Path.GetFullPath(basePath); + + // Must stay within the allowed base directory + if (!full.StartsWith(canonicalBase + Path.DirectorySeparatorChar) && full != canonicalBase) + return false; + + safePath = full; + return true; +} + +// Validates config filename against path-traversal +static bool IsValidConfigFileName(string fileName) +{ + if (string.IsNullOrWhiteSpace(fileName)) return false; + return System.Text.RegularExpressions.Regex.IsMatch(fileName, @"^[a-zA-Z0-9._-]+\.md$"); +} + +// Record types for cron job deserialization +record CronJobEntry(string Id, string Name, string Schedule, string LastRun, string NextRun, string Status); +record UpcomingCronEntry(string Id, string Name, string NextRun, string Schedule); + +// Record type for agent config save request +record SaveConfigRequest(string Content); diff --git a/backend/Routing/ModelRoutingService.cs b/backend/Routing/ModelRoutingService.cs new file mode 100644 index 0000000..bcde4ef --- /dev/null +++ b/backend/Routing/ModelRoutingService.cs @@ -0,0 +1,35 @@ +using Nexus.Api.Domain; +using Nexus.Api.Integrations; + +namespace Nexus.Api.Routing; + +public sealed record RoutingTarget( + int Priority, + string Provider, + string Model, + string Purpose, + OperationalStatus Status, + string Detail); + +public sealed class ModelRoutingService( + IAgentRuntime runtime) +{ + public async Task> GetStatusAsync( + CancellationToken cancellationToken) + { + var runtimeStatus = await runtime.GetStatusAsync(cancellationToken); + + return + [ + new(1, "OpenClaw", "deepseek/deepseek-v4-flash", "Programmer agent", + runtimeStatus.Status, + "Routed through OpenClaw policy"), + new(2, "OpenClaw", "deepseek/deepseek-v4-pro", "Reviewer agent", + runtimeStatus.Status, + "Routed through OpenClaw policy"), + new(3, "OpenClaw", "openai/gpt-5.3-chat-latest", "Iris orchestrator", + runtimeStatus.Status, + "Routed through OpenClaw policy") + ]; + } +} diff --git a/backend/Services/AgentService.cs b/backend/Services/AgentService.cs new file mode 100644 index 0000000..1aedaa0 --- /dev/null +++ b/backend/Services/AgentService.cs @@ -0,0 +1,222 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using Nexus.Api.Domain; +using Nexus.Api.Integrations; + +namespace Nexus.Api.Services; + +public sealed record AgentConfig +{ + [JsonPropertyName("id")] + public string Id { get; init; } = string.Empty; + + [JsonPropertyName("name")] + public string Name { get; init; } = string.Empty; + + [JsonPropertyName("workspace")] + public string? Workspace { get; init; } + + [JsonPropertyName("agentDir")] + public string? AgentDir { get; init; } + + [JsonPropertyName("model")] + public string? Model { get; init; } + + [JsonPropertyName("identity")] + public AgentIdentityConfig? Identity { get; init; } + + [JsonPropertyName("subagents")] + public SubAgentConfig? Subagents { get; init; } +} + +public sealed record SubAgentConfig +{ + [JsonPropertyName("allowAgents")] + public IReadOnlyList? AllowAgents { get; init; } +} + +public sealed record AgentIdentityConfig +{ + [JsonPropertyName("name")] + public string Name { get; init; } = string.Empty; + + [JsonPropertyName("theme")] + public string Theme { get; init; } = string.Empty; +} + +public sealed record AgentInfo( + string Id, + string Name, + string Role, + string Model, + OperationalStatus Status, + DateTimeOffset? LastSeen, + string? Workspace, + string? Description +); + +public sealed record AgentDetail( + string Id, + string Name, + string Role, + string Model, + OperationalStatus Status, + DateTimeOffset? LastSeen, + string? Workspace, + string? AgentDir, + string? Description, + IReadOnlyList? SubAgents, + string? IdentityName +); + +public interface IAgentService +{ + Task> GetAgentsAsync(CancellationToken cancellationToken); + Task GetAgentAsync(string id, CancellationToken cancellationToken); +} + +public sealed class AgentService(IConfiguration configuration, IAgentRuntime runtime) : IAgentService +{ + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNameCaseInsensitive = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public async Task> GetAgentsAsync(CancellationToken cancellationToken) + { + var configs = await LoadAgentConfigsAsync(cancellationToken); + var runtimeStatus = await runtime.GetStatusAsync(cancellationToken); + var overallOperational = runtimeStatus.Status; + + var now = DateTimeOffset.UtcNow; + var agents = new List(configs.Count); + foreach (var config in configs) + { + var model = config.Model ?? "deepseek/deepseek-v4-flash"; + var role = DeriveRole(config.Id); + var description = config.Identity?.Theme ?? string.Empty; + + // main agent doesn't have a separate identity; set a generic description + if (string.IsNullOrEmpty(description)) + { + description = config.Id switch + { + "main" => "Primary conversational agent — routing and general-purpose chat", + _ => description + }; + } + + agents.Add(new AgentInfo( + Id: config.Id, + Name: config.Identity?.Name ?? config.Name ?? config.Id, + Role: role, + Model: model, + Status: overallOperational, + LastSeen: now, + Workspace: config.Workspace, + Description: description + )); + } + + return agents.AsReadOnly(); + } + + public async Task GetAgentAsync(string id, CancellationToken cancellationToken) + { + var configs = await LoadAgentConfigsAsync(cancellationToken); + var config = configs.FirstOrDefault(a => + a.Id.Equals(id, StringComparison.OrdinalIgnoreCase)); + if (config is null) return null; + + var runtimeStatus = await runtime.GetStatusAsync(cancellationToken); + var now = DateTimeOffset.UtcNow; + var role = DeriveRole(config.Id); + var description = config.Identity?.Theme ?? string.Empty; + + if (string.IsNullOrEmpty(description) && config.Id == "main") + description = "Primary conversational agent — routing and general-purpose chat"; + + return new AgentDetail( + Id: config.Id, + Name: config.Identity?.Name ?? config.Name ?? config.Id, + Role: role, + Model: config.Model ?? "deepseek/deepseek-v4-flash", + Status: runtimeStatus.Status, + LastSeen: now, + Workspace: config.Workspace, + AgentDir: config.AgentDir, + Description: description, + SubAgents: config.Subagents?.AllowAgents, + IdentityName: config.Identity?.Name + ); + } + + private static string DeriveRole(string agentId) => agentId.ToLowerInvariant() switch + { + "iris" => "Orchestrator", + "programmer" => "Developer", + "reviewer" => "Reviewer", + "architekt" => "Architect", + "main" => "Assistant", + _ => "Custom" + }; + + private async Task> LoadAgentConfigsAsync(CancellationToken cancellationToken) + { + var path = configuration.GetValue("AgentConfigPath") + ?? "/home/node/.openclaw/openclaw.json"; + + if (!File.Exists(path)) + return Array.Empty(); + + var json = await File.ReadAllTextAsync(path, cancellationToken); + using var document = JsonDocument.Parse(json, new JsonDocumentOptions { AllowTrailingCommas = true }); + var root = document.RootElement; + + if (!root.TryGetProperty("agents", out var agentsElement)) + return Array.Empty(); + + if (!agentsElement.TryGetProperty("list", out var listElement)) + return Array.Empty(); + + var defaults = agentsElement.TryGetProperty("defaults", out var defaultsElement) + ? JsonSerializer.Deserialize(defaultsElement.GetRawText(), JsonOptions) + : null; + + var configs = new List(); + foreach (var agentElement in listElement.EnumerateArray()) + { + var config = JsonSerializer.Deserialize(agentElement.GetRawText(), JsonOptions); + if (config is null || string.IsNullOrWhiteSpace(config.Id)) + continue; + + // Inherit defaults for missing fields + if (string.IsNullOrWhiteSpace(config.Name)) + config = config with { Name = config.Id }; + if (string.IsNullOrWhiteSpace(config.Model) && defaults?.Model?.Primary is not null) + config = config with { Model = defaults.Model.Primary }; + if (string.IsNullOrWhiteSpace(config.Workspace) && defaults?.Workspace is not null) + config = config with { Workspace = defaults.Workspace }; + + configs.Add(config); + } + + return configs.AsReadOnly(); + } + + private sealed record AgentDefaults + { + [JsonPropertyName("workspace")] + public string? Workspace { get; init; } + + [JsonPropertyName("model")] + public AgentDefaultModel? Model { get; init; } + } + + private sealed record AgentDefaultModel + { + [JsonPropertyName("primary")] + public string? Primary { get; init; } + } +} diff --git a/backend/Services/AuthService.cs b/backend/Services/AuthService.cs new file mode 100644 index 0000000..91f07c7 --- /dev/null +++ b/backend/Services/AuthService.cs @@ -0,0 +1,248 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.IdentityModel.Tokens; +using Nexus.Api.Contracts; +using Nexus.Api.Domain; +using Nexus.Api.Infrastructure; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Security.Cryptography; +using System.Text; + +namespace Nexus.Api.Services; + +public interface IAuthService +{ + Task LoginAsync(LoginRequest request, CancellationToken ct = default); + Task RefreshAsync(string refreshToken, CancellationToken ct = default); + Task RevokeAsync(string refreshToken, CancellationToken ct = default); + Task GetUserAsync(Guid userId, CancellationToken ct = default); + Task UpdateProfileAsync(Guid userId, UpdateProfileRequest request, CancellationToken ct = default); + Task ChangePasswordAsync(Guid userId, ChangePasswordRequest request, CancellationToken ct = default); +} + +public sealed record AuthSession( + string AccessToken, + string RefreshToken, + DateTimeOffset ExpiresAt, + UserInfo User); + +public sealed class AuthService : IAuthService +{ + private readonly NexusDbContext _db; + private readonly IConfiguration _config; + private readonly ILogger _logger; + + public AuthService(NexusDbContext db, IConfiguration config, ILogger logger) + { + _db = db; + _config = config; + _logger = logger; + } + + public async Task LoginAsync(LoginRequest request, CancellationToken ct = default) + { + var normalizedEmail = NormalizeEmail(request.Email); + var user = await _db.Users.FirstOrDefaultAsync(u => u.NormalizedEmail == normalizedEmail, ct); + + if (user is null || !PasswordSecurity.Verify(request.Password, user.PasswordHash, out var needsUpgrade)) + { + _logger.LogWarning("Rejected login attempt"); + return null; + } + + if (needsUpgrade) user.PasswordHash = PasswordSecurity.Hash(request.Password); + user.LastLoginAt = DateTimeOffset.UtcNow; + user.UpdatedAt = DateTimeOffset.UtcNow; + + await RemoveExpiredTokensAsync(user.Id, ct); + return await CreateSessionAsync(user, Guid.NewGuid(), null, ct); + } + + public async Task RefreshAsync(string refreshToken, CancellationToken ct = default) + { + if (string.IsNullOrWhiteSpace(refreshToken)) return null; + + var tokenHash = HashToken(refreshToken); + var token = await _db.RefreshTokens + .Include(r => r.User) + .FirstOrDefaultAsync(r => r.TokenHash == tokenHash, ct); + + if (token is null) return null; + + if (token.RevokedAt is not null) + { + await RevokeFamilyAsync(token.FamilyId, ct); + _logger.LogWarning("Refresh token reuse detected for family {FamilyId}", token.FamilyId); + return null; + } + + if (token.ExpiresAt <= DateTimeOffset.UtcNow) return null; + + return await CreateSessionAsync(token.User, token.FamilyId, token, ct); + } + + public async Task RevokeAsync(string refreshToken, CancellationToken ct = default) + { + if (string.IsNullOrWhiteSpace(refreshToken)) return; + + var tokenHash = HashToken(refreshToken); + var token = await _db.RefreshTokens.FirstOrDefaultAsync(r => r.TokenHash == tokenHash, ct); + if (token is null || token.RevokedAt is not null) return; + + token.RevokedAt = DateTimeOffset.UtcNow; + token.ConcurrencyStamp = Guid.NewGuid(); + await _db.SaveChangesAsync(ct); + } + + public Task GetUserAsync(Guid userId, CancellationToken ct = default) + => _db.Users.AsNoTracking().FirstOrDefaultAsync(u => u.Id == userId, ct); + + public async Task UpdateProfileAsync(Guid userId, UpdateProfileRequest request, CancellationToken ct = default) + { + var user = await _db.Users.FirstOrDefaultAsync(u => u.Id == userId, ct); + if (user is null) return null; + + if (!string.IsNullOrWhiteSpace(request.DisplayName)) + { + user.DisplayName = request.DisplayName.Trim(); + } + + user.UpdatedAt = DateTimeOffset.UtcNow; + await _db.SaveChangesAsync(ct); + return user; + } + + public async Task ChangePasswordAsync(Guid userId, ChangePasswordRequest request, CancellationToken ct = default) + { + var user = await _db.Users.FirstOrDefaultAsync(u => u.Id == userId, ct); + if (user is null) return false; + + if (!PasswordSecurity.Verify(request.CurrentPassword, user.PasswordHash, out _)) + return false; + + user.PasswordHash = PasswordSecurity.Hash(request.NewPassword); + user.UpdatedAt = DateTimeOffset.UtcNow; + await _db.SaveChangesAsync(ct); + return true; + } + + private async Task CreateSessionAsync( + NexusUser user, + Guid familyId, + RefreshToken? replacedToken, + CancellationToken ct) + { + var accessExpiresAt = DateTimeOffset.UtcNow.AddMinutes(GetAccessTokenExpirationMinutes()); + var rawRefreshToken = GenerateRefreshToken(); + var refreshTokenHash = HashToken(rawRefreshToken); + + if (replacedToken is not null) + { + replacedToken.RevokedAt = DateTimeOffset.UtcNow; + replacedToken.ReplacedByTokenHash = refreshTokenHash; + replacedToken.ConcurrencyStamp = Guid.NewGuid(); + } + + _db.RefreshTokens.Add(new RefreshToken + { + UserId = user.Id, + TokenHash = refreshTokenHash, + FamilyId = familyId, + ExpiresAt = DateTimeOffset.UtcNow.AddDays(GetRefreshTokenExpirationDays()) + }); + + try + { + await _db.SaveChangesAsync(ct); + } + catch (DbUpdateConcurrencyException) + { + _logger.LogWarning("Concurrent refresh token rotation rejected"); + return null; + } + + return new AuthSession( + GenerateAccessToken(user, accessExpiresAt), + rawRefreshToken, + accessExpiresAt, + ToUserInfo(user)); + } + + private string GenerateAccessToken(NexusUser user, DateTimeOffset expiresAt) + { + var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(GetRequiredConfig("Jwt:Key"))); + var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); + var claims = new[] + { + new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()), + new Claim(JwtRegisteredClaimNames.Email, user.Email), + new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), + new Claim(ClaimTypes.Role, user.Role), + new Claim("display_name", user.DisplayName) + }; + + var token = new JwtSecurityToken( + issuer: GetRequiredConfig("Jwt:Issuer"), + audience: GetRequiredConfig("Jwt:Audience"), + claims: claims, + notBefore: DateTime.UtcNow, + expires: expiresAt.UtcDateTime, + signingCredentials: credentials); + + return new JwtSecurityTokenHandler().WriteToken(token); + } + + private async Task RevokeFamilyAsync(Guid familyId, CancellationToken ct) + { + var activeTokens = await _db.RefreshTokens + .Where(r => r.FamilyId == familyId && r.RevokedAt == null) + .ToListAsync(ct); + + var now = DateTimeOffset.UtcNow; + foreach (var token in activeTokens) + { + token.RevokedAt = now; + token.ConcurrencyStamp = Guid.NewGuid(); + } + + await _db.SaveChangesAsync(ct); + } + + private async Task RemoveExpiredTokensAsync(Guid userId, CancellationToken ct) + { + var cutoff = DateTimeOffset.UtcNow.AddDays(-30); + var oldTokens = await _db.RefreshTokens + .Where(r => r.UserId == userId && (r.ExpiresAt < DateTimeOffset.UtcNow || r.RevokedAt < cutoff)) + .ToListAsync(ct); + + if (oldTokens.Count > 0) _db.RefreshTokens.RemoveRange(oldTokens); + } + + private static string GenerateRefreshToken() + { + var value = Convert.ToBase64String(RandomNumberGenerator.GetBytes(64)); + return value.TrimEnd('=').Replace('+', '-').Replace('/', '_'); + } + + private static string HashToken(string token) + => Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(token))); + + public static string NormalizeEmail(string email) => email.Trim().ToUpperInvariant(); + + private static UserInfo ToUserInfo(NexusUser user) => new() + { + Id = user.Id, + Email = user.Email, + DisplayName = user.DisplayName, + Role = user.Role + }; + + private string GetRequiredConfig(string key) + => _config[key] ?? throw new InvalidOperationException($"Missing required configuration: {key}"); + + private int GetAccessTokenExpirationMinutes() + => _config.GetValue("Jwt:AccessTokenExpirationMinutes") ?? 15; + + private int GetRefreshTokenExpirationDays() + => _config.GetValue("Jwt:RefreshTokenExpirationDays") ?? 7; +} diff --git a/backend/Services/PasswordSecurity.cs b/backend/Services/PasswordSecurity.cs new file mode 100644 index 0000000..d5a678d --- /dev/null +++ b/backend/Services/PasswordSecurity.cs @@ -0,0 +1,67 @@ +using System.Security.Cryptography; +using System.Text; + +namespace Nexus.Api.Services; + +public static class PasswordSecurity +{ + private const int Iterations = 210_000; + private const int SaltSize = 16; + private const int HashSize = 32; + private const string Version = "v1"; + + public static string Hash(string password) + { + ArgumentException.ThrowIfNullOrWhiteSpace(password); + + var salt = RandomNumberGenerator.GetBytes(SaltSize); + var hash = Rfc2898DeriveBytes.Pbkdf2( + password, + salt, + Iterations, + HashAlgorithmName.SHA256, + HashSize); + + return string.Join('.', Version, Iterations, Convert.ToBase64String(salt), Convert.ToBase64String(hash)); + } + + public static bool Verify(string password, string encodedHash, out bool needsUpgrade) + { + needsUpgrade = false; + if (string.IsNullOrEmpty(password) || string.IsNullOrEmpty(encodedHash)) return false; + + var parts = encodedHash.Split('.'); + if (parts.Length == 4 && parts[0] == Version && int.TryParse(parts[1], out var iterations)) + { + try + { + var salt = Convert.FromBase64String(parts[2]); + var expected = Convert.FromBase64String(parts[3]); + var actual = Rfc2898DeriveBytes.Pbkdf2( + password, + salt, + iterations, + HashAlgorithmName.SHA256, + expected.Length); + + needsUpgrade = iterations < Iterations; + return CryptographicOperations.FixedTimeEquals(actual, expected); + } + catch (FormatException) + { + return false; + } + } + + if (encodedHash.Length == 64 && encodedHash.All(Uri.IsHexDigit)) + { + var legacy = Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(password))); + needsUpgrade = true; + return CryptographicOperations.FixedTimeEquals( + Encoding.ASCII.GetBytes(legacy), + Encoding.ASCII.GetBytes(encodedHash.ToUpperInvariant())); + } + + return false; + } +} diff --git a/backend/appsettings.json b/backend/appsettings.json new file mode 100644 index 0000000..e7cf4d6 --- /dev/null +++ b/backend/appsettings.json @@ -0,0 +1,25 @@ +{ + "ConnectionStrings": { + "Nexus": "Host=localhost;Port=5432;Database=nexus;Username=nexus;Password=nexus" + }, + "Integrations": { + "OpenClaw": { + "BaseUrl": "http://127.0.0.1:18789", + "Token": "", + "Password": "" + }, + "Ollama": { + "BaseUrl": "http://127.0.0.1:11434" + }, + "Nvidia": { + "ApiKey": "" + } + }, + "Jwt": { + "Issuer": "nexus", + "Audience": "nexus-web", + "AccessTokenExpirationMinutes": 15, + "RefreshTokenExpirationDays": 7 + }, + "AllowedHosts": "*" +} diff --git a/backend/dist/HealthChecks.NpgSql.dll b/backend/dist/HealthChecks.NpgSql.dll new file mode 100755 index 0000000..3c061a9 Binary files /dev/null and b/backend/dist/HealthChecks.NpgSql.dll differ diff --git a/backend/dist/Microsoft.AspNetCore.Authentication.JwtBearer.dll b/backend/dist/Microsoft.AspNetCore.Authentication.JwtBearer.dll new file mode 100755 index 0000000..d1474c0 Binary files /dev/null and b/backend/dist/Microsoft.AspNetCore.Authentication.JwtBearer.dll differ diff --git a/backend/dist/Microsoft.EntityFrameworkCore.Abstractions.dll b/backend/dist/Microsoft.EntityFrameworkCore.Abstractions.dll new file mode 100755 index 0000000..f457791 Binary files /dev/null and b/backend/dist/Microsoft.EntityFrameworkCore.Abstractions.dll differ diff --git a/backend/dist/Microsoft.EntityFrameworkCore.Relational.dll b/backend/dist/Microsoft.EntityFrameworkCore.Relational.dll new file mode 100755 index 0000000..a82e568 Binary files /dev/null and b/backend/dist/Microsoft.EntityFrameworkCore.Relational.dll differ diff --git a/backend/dist/Microsoft.EntityFrameworkCore.dll b/backend/dist/Microsoft.EntityFrameworkCore.dll new file mode 100755 index 0000000..3ccc5ec Binary files /dev/null and b/backend/dist/Microsoft.EntityFrameworkCore.dll differ diff --git a/backend/dist/Microsoft.IdentityModel.Abstractions.dll b/backend/dist/Microsoft.IdentityModel.Abstractions.dll new file mode 100755 index 0000000..e981f87 Binary files /dev/null and b/backend/dist/Microsoft.IdentityModel.Abstractions.dll differ diff --git a/backend/dist/Microsoft.IdentityModel.JsonWebTokens.dll b/backend/dist/Microsoft.IdentityModel.JsonWebTokens.dll new file mode 100755 index 0000000..25f2a7e Binary files /dev/null and b/backend/dist/Microsoft.IdentityModel.JsonWebTokens.dll differ diff --git a/backend/dist/Microsoft.IdentityModel.Logging.dll b/backend/dist/Microsoft.IdentityModel.Logging.dll new file mode 100755 index 0000000..4ffdb25 Binary files /dev/null and b/backend/dist/Microsoft.IdentityModel.Logging.dll differ diff --git a/backend/dist/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll b/backend/dist/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll new file mode 100755 index 0000000..6c736d2 Binary files /dev/null and b/backend/dist/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll differ diff --git a/backend/dist/Microsoft.IdentityModel.Protocols.dll b/backend/dist/Microsoft.IdentityModel.Protocols.dll new file mode 100755 index 0000000..9f30508 Binary files /dev/null and b/backend/dist/Microsoft.IdentityModel.Protocols.dll differ diff --git a/backend/dist/Microsoft.IdentityModel.Tokens.dll b/backend/dist/Microsoft.IdentityModel.Tokens.dll new file mode 100755 index 0000000..83ec83a Binary files /dev/null and b/backend/dist/Microsoft.IdentityModel.Tokens.dll differ diff --git a/backend/dist/Microsoft.OpenApi.dll b/backend/dist/Microsoft.OpenApi.dll new file mode 100755 index 0000000..fc8cd69 Binary files /dev/null and b/backend/dist/Microsoft.OpenApi.dll differ diff --git a/backend/dist/Nexus.Api b/backend/dist/Nexus.Api new file mode 100755 index 0000000..ccf2465 Binary files /dev/null and b/backend/dist/Nexus.Api differ diff --git a/backend/dist/Nexus.Api.deps.json b/backend/dist/Nexus.Api.deps.json new file mode 100644 index 0000000..369f3d2 --- /dev/null +++ b/backend/dist/Nexus.Api.deps.json @@ -0,0 +1,356 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v10.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v10.0": { + "Nexus.Api/1.0.0": { + "dependencies": { + "AspNetCore.HealthChecks.NpgSql": "9.0.0", + "Microsoft.AspNetCore.Authentication.JwtBearer": "10.0.8", + "Npgsql.EntityFrameworkCore.PostgreSQL": "10.0.2", + "Swashbuckle.AspNetCore": "10.2.1" + }, + "runtime": { + "Nexus.Api.dll": {} + } + }, + "AspNetCore.HealthChecks.NpgSql/9.0.0": { + "dependencies": { + "Npgsql": "10.0.3" + }, + "runtime": { + "lib/net8.0/HealthChecks.NpgSql.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.0.0" + } + } + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.8": { + "dependencies": { + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "8.0.1" + }, + "runtime": { + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.EntityFrameworkCore/10.0.8": { + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "10.0.8" + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.EntityFrameworkCore.Abstractions/10.0.8": { + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.EntityFrameworkCore.Relational/10.0.8": { + "dependencies": { + "Microsoft.EntityFrameworkCore": "10.0.8" + }, + "runtime": { + "lib/net10.0/Microsoft.EntityFrameworkCore.Relational.dll": { + "assemblyVersion": "10.0.8.0", + "fileVersion": "10.0.826.23019" + } + } + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Abstractions.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Logging.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Protocols": "8.0.1", + "System.IdentityModel.Tokens.Jwt": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Logging": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Tokens.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.OpenApi/2.7.5": { + "runtime": { + "lib/net8.0/Microsoft.OpenApi.dll": { + "assemblyVersion": "2.7.5.0", + "fileVersion": "2.7.5.0" + } + } + }, + "Npgsql/10.0.3": { + "runtime": { + "lib/net10.0/Npgsql.dll": { + "assemblyVersion": "10.0.3.0", + "fileVersion": "10.0.3.0" + } + } + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/10.0.2": { + "dependencies": { + "Microsoft.EntityFrameworkCore": "10.0.8", + "Microsoft.EntityFrameworkCore.Relational": "10.0.8", + "Npgsql": "10.0.3" + }, + "runtime": { + "lib/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": { + "assemblyVersion": "10.0.2.0", + "fileVersion": "10.0.2.0" + } + } + }, + "Swashbuckle.AspNetCore/10.2.1": { + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "10.2.1", + "Swashbuckle.AspNetCore.SwaggerGen": "10.2.1", + "Swashbuckle.AspNetCore.SwaggerUI": "10.2.1" + } + }, + "Swashbuckle.AspNetCore.Swagger/10.2.1": { + "dependencies": { + "Microsoft.OpenApi": "2.7.5" + }, + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.Swagger.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "Swashbuckle.AspNetCore.SwaggerGen/10.2.1": { + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "10.2.1" + }, + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "Swashbuckle.AspNetCore.SwaggerUI/10.2.1": { + "runtime": { + "lib/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll": { + "assemblyVersion": "10.2.1.0", + "fileVersion": "10.2.1.2634" + } + } + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.0.1", + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/System.IdentityModel.Tokens.Jwt.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + } + } + }, + "libraries": { + "Nexus.Api/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "AspNetCore.HealthChecks.NpgSql/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-npc58/AD5zuVxERdhCl2Kb7WnL37mwX42SJcXIwvmEig0/dugOLg3SIwtfvvh3TnvTwR/sk5LYNkkPaBdks61A==", + "path": "aspnetcore.healthchecks.npgsql/9.0.0", + "hashPath": "aspnetcore.healthchecks.npgsql.9.0.0.nupkg.sha512" + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-oGnE+X/SN6jdqao9WOkOIfyZ5+a0AtluJWy1Mxndq+kcWG6sx5k6l6tucu8/wJ7o9fHfLgVCzm/c4v/KVgVk6w==", + "path": "microsoft.aspnetcore.authentication.jwtbearer/10.0.8", + "hashPath": "microsoft.aspnetcore.authentication.jwtbearer.10.0.8.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-EJx+fIBMgBlgD+ublKCn+GTOJkw3UqV7xOjYWBRVdUYyIm8UfvAsmSOPFiIInsWTHyMEYUJ9gCJY1jwX+6UB7w==", + "path": "microsoft.entityframeworkcore/10.0.8", + "hashPath": "microsoft.entityframeworkcore.10.0.8.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Abstractions/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-jbKDXWPZQhuPHygMnwzNOqxBADVcpRVytcKYZsA++QqhPkpF93Ta8o5mbJQGrARSjlkr9WtOaADV97EDMOZ7DA==", + "path": "microsoft.entityframeworkcore.abstractions/10.0.8", + "hashPath": "microsoft.entityframeworkcore.abstractions.10.0.8.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Relational/10.0.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UU3diAD2wwZveye2rnrwaF/wvJ9tm5iL2fuY9TTap6/iGQK1OO29M1BzXZRlRPVH/dByt5w/pISBSFtyR7hTqw==", + "path": "microsoft.entityframeworkcore.relational/10.0.8", + "hashPath": "microsoft.entityframeworkcore.relational.10.0.8.nupkg.sha512" + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OtlIWcyX01olfdevPKZdIPfBEvbcioDyBiE/Z2lHsopsMD7twcKtlN9kMevHmI5IIPhFpfwCIiR6qHQz1WHUIw==", + "path": "microsoft.identitymodel.abstractions/8.0.1", + "hashPath": "microsoft.identitymodel.abstractions.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-s6++gF9x0rQApQzOBbSyp4jUaAlwm+DroKfL8gdOHxs83k8SJfUXhuc46rDB3rNXBQ1MVRxqKUrqFhO/M0E97g==", + "path": "microsoft.identitymodel.jsonwebtokens/8.0.1", + "hashPath": "microsoft.identitymodel.jsonwebtokens.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UCPF2exZqBXe7v/6sGNiM6zCQOUXXQ9+v5VTb9gPB8ZSUPnX53BxlN78v2jsbIvK9Dq4GovQxo23x8JgWvm/Qg==", + "path": "microsoft.identitymodel.logging/8.0.1", + "hashPath": "microsoft.identitymodel.logging.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uA2vpKqU3I2mBBEaeJAWPTjT9v1TZrGWKdgK6G5qJd03CLx83kdiqO9cmiK8/n1erkHzFBwU/RphP83aAe3i3g==", + "path": "microsoft.identitymodel.protocols/8.0.1", + "hashPath": "microsoft.identitymodel.protocols.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AQDbfpL+yzuuGhO/mQhKNsp44pm5Jv8/BI4KiFXR7beVGZoSH35zMV3PrmcfvSTsyI6qrcR898NzUauD6SRigg==", + "path": "microsoft.identitymodel.protocols.openidconnect/8.0.1", + "hashPath": "microsoft.identitymodel.protocols.openidconnect.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kDimB6Dkd3nkW2oZPDkMkVHfQt3IDqO5gL0oa8WVy3OP4uE8Ij+8TXnqg9TOd9ufjsY3IDiGz7pCUbnfL18tjg==", + "path": "microsoft.identitymodel.tokens/8.0.1", + "hashPath": "microsoft.identitymodel.tokens.8.0.1.nupkg.sha512" + }, + "Microsoft.OpenApi/2.7.5": { + "type": "package", + "serviceable": true, + "sha512": "sha512-0FA67RSnRM4tcBKqiqVu/HPdZ9+QOKbmeRjxRUGTCjPU4C0bmUhd97Dso7Yild5P7nOV6GxJ2xrK0Kv/O9xp0w==", + "path": "microsoft.openapi/2.7.5", + "hashPath": "microsoft.openapi.2.7.5.nupkg.sha512" + }, + "Npgsql/10.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7nb5YzXuvWWJxB0J8DiyL3we+X4FOctZrt0fIBnucOIaIevFEEwGQVZKtiu9olXdlNAK1eNgqSral6r/jlhI4w==", + "path": "npgsql/10.0.3", + "hashPath": "npgsql.10.0.3.nupkg.sha512" + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/10.0.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-PsNYgPOSW41Xx19gin7y4EdZAPteWr9Cb01XkdObxOsPzi+mgBupBEN7J7+erXFsROPOILM7MlIoO9QzL8+LGQ==", + "path": "npgsql.entityframeworkcore.postgresql/10.0.2", + "hashPath": "npgsql.entityframeworkcore.postgresql.10.0.2.nupkg.sha512" + }, + "Swashbuckle.AspNetCore/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SDU6akgCV/H4jFMRfyJ0mgO5jWOuuAqekvEThXg8c/LjnfNz5Nkaz+RUpeTVJKWIRX4wDKC/6R3ogJ4AsRE32A==", + "path": "swashbuckle.aspnetcore/10.2.1", + "hashPath": "swashbuckle.aspnetcore.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.Swagger/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ej4inPhiWCq+0utG8yaKhIhE8M3k3R/qRaGhpgDZB+O/s+o62/zRMO1Cn2CtQccsrqPE9PYnzCp6hQGYGpJOyQ==", + "path": "swashbuckle.aspnetcore.swagger/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swagger.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.SwaggerGen/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JYX6i/y0xEtQWH/hZyfcage1/ldwww83ueD/gBc34uSnMwyvRLUsOpYcxlliFFxFbZMrY6t+R9ENqolE7zTEOg==", + "path": "swashbuckle.aspnetcore.swaggergen/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swaggergen.10.2.1.nupkg.sha512" + }, + "Swashbuckle.AspNetCore.SwaggerUI/10.2.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vzB8ZAGqXus3fdareJ9GHctaRP9ZL+wW9x8U7s1Y+BWprInFvSg6rpD9VhANNpwXA8fUHqu5Agjl/+hHG1BCQA==", + "path": "swashbuckle.aspnetcore.swaggerui/10.2.1", + "hashPath": "swashbuckle.aspnetcore.swaggerui.10.2.1.nupkg.sha512" + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GJw3bYkWpOgvN3tJo5X4lYUeIFA2HD293FPUhKmp7qxS+g5ywAb34Dnd3cDAFLkcMohy5XTpoaZ4uAHuw0uSPQ==", + "path": "system.identitymodel.tokens.jwt/8.0.1", + "hashPath": "system.identitymodel.tokens.jwt.8.0.1.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/backend/dist/Nexus.Api.dll b/backend/dist/Nexus.Api.dll new file mode 100644 index 0000000..62d0663 Binary files /dev/null and b/backend/dist/Nexus.Api.dll differ diff --git a/backend/dist/Nexus.Api.pdb b/backend/dist/Nexus.Api.pdb new file mode 100644 index 0000000..7e68243 Binary files /dev/null and b/backend/dist/Nexus.Api.pdb differ diff --git a/backend/dist/Nexus.Api.runtimeconfig.json b/backend/dist/Nexus.Api.runtimeconfig.json new file mode 100644 index 0000000..b849de0 --- /dev/null +++ b/backend/dist/Nexus.Api.runtimeconfig.json @@ -0,0 +1,21 @@ +{ + "runtimeOptions": { + "tfm": "net10.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "10.0.0" + }, + { + "name": "Microsoft.AspNetCore.App", + "version": "10.0.0" + } + ], + "configProperties": { + "System.GC.Server": true, + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, + "System.Reflection.NullabilityInfoContext.IsSupported": true, + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false + } + } +} \ No newline at end of file diff --git a/backend/dist/Nexus.Api.staticwebassets.endpoints.json b/backend/dist/Nexus.Api.staticwebassets.endpoints.json new file mode 100644 index 0000000..21da96b --- /dev/null +++ b/backend/dist/Nexus.Api.staticwebassets.endpoints.json @@ -0,0 +1 @@ +{"Version":1,"ManifestType":"Publish","Endpoints":[]} \ No newline at end of file diff --git a/backend/dist/Npgsql.EntityFrameworkCore.PostgreSQL.dll b/backend/dist/Npgsql.EntityFrameworkCore.PostgreSQL.dll new file mode 100755 index 0000000..14a1321 Binary files /dev/null and b/backend/dist/Npgsql.EntityFrameworkCore.PostgreSQL.dll differ diff --git a/backend/dist/Npgsql.dll b/backend/dist/Npgsql.dll new file mode 100755 index 0000000..184db8d Binary files /dev/null and b/backend/dist/Npgsql.dll differ diff --git a/backend/dist/Swashbuckle.AspNetCore.Swagger.dll b/backend/dist/Swashbuckle.AspNetCore.Swagger.dll new file mode 100755 index 0000000..c6da386 Binary files /dev/null and b/backend/dist/Swashbuckle.AspNetCore.Swagger.dll differ diff --git a/backend/dist/Swashbuckle.AspNetCore.SwaggerGen.dll b/backend/dist/Swashbuckle.AspNetCore.SwaggerGen.dll new file mode 100755 index 0000000..03b2b60 Binary files /dev/null and b/backend/dist/Swashbuckle.AspNetCore.SwaggerGen.dll differ diff --git a/backend/dist/Swashbuckle.AspNetCore.SwaggerUI.dll b/backend/dist/Swashbuckle.AspNetCore.SwaggerUI.dll new file mode 100755 index 0000000..ac14edd Binary files /dev/null and b/backend/dist/Swashbuckle.AspNetCore.SwaggerUI.dll differ diff --git a/backend/dist/System.IdentityModel.Tokens.Jwt.dll b/backend/dist/System.IdentityModel.Tokens.Jwt.dll new file mode 100755 index 0000000..c42b8d7 Binary files /dev/null and b/backend/dist/System.IdentityModel.Tokens.Jwt.dll differ diff --git a/backend/dist/appsettings.json b/backend/dist/appsettings.json new file mode 100644 index 0000000..e7cf4d6 --- /dev/null +++ b/backend/dist/appsettings.json @@ -0,0 +1,25 @@ +{ + "ConnectionStrings": { + "Nexus": "Host=localhost;Port=5432;Database=nexus;Username=nexus;Password=nexus" + }, + "Integrations": { + "OpenClaw": { + "BaseUrl": "http://127.0.0.1:18789", + "Token": "", + "Password": "" + }, + "Ollama": { + "BaseUrl": "http://127.0.0.1:11434" + }, + "Nvidia": { + "ApiKey": "" + } + }, + "Jwt": { + "Issuer": "nexus", + "Audience": "nexus-web", + "AccessTokenExpirationMinutes": 15, + "RefreshTokenExpirationDays": 7 + }, + "AllowedHosts": "*" +} diff --git a/backend/dist/web.config b/backend/dist/web.config new file mode 100644 index 0000000..4ad0a27 --- /dev/null +++ b/backend/dist/web.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..6ff9c46 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,64 @@ +name: nexus + +services: + postgres: + image: postgres:17-alpine + restart: unless-stopped + environment: + POSTGRES_DB: ${POSTGRES_DB:-nexus} + POSTGRES_USER: ${POSTGRES_USER:-nexus} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env} + volumes: + - nexus-postgres:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-nexus} -d ${POSTGRES_DB:-nexus}"] + interval: 10s + timeout: 5s + retries: 5 + networks: [nexus] + + api: + build: + context: ./backend + restart: unless-stopped + environment: + ASPNETCORE_ENVIRONMENT: Production + ASPNETCORE_URLS: http://+:8080 + ConnectionStrings__Nexus: Host=postgres;Port=5432;Database=${POSTGRES_DB:-nexus};Username=${POSTGRES_USER:-nexus};Password=${POSTGRES_PASSWORD} + Jwt__Key: ${JWT_KEY:?Set JWT_KEY in .env} + Jwt__Issuer: ${JWT_ISSUER:-nexus} + Jwt__Audience: ${JWT_AUDIENCE:-nexus-web} + Owner__Email: ${OWNER_EMAIL:?Set OWNER_EMAIL in .env} + Owner__Password: ${OWNER_PASSWORD:-} + Owner__DisplayName: ${OWNER_DISPLAY_NAME:-Owner} + Integrations__OpenClaw__BaseUrl: ${OPENCLAW_BASE_URL:-http://host.docker.internal:18789} + Integrations__OpenClaw__Token: ${OPENCLAW_GATEWAY_TOKEN:-} + Integrations__OpenClaw__Password: ${OPENCLAW_GATEWAY_PASSWORD:-} + extra_hosts: + - host.docker.internal:host-gateway + depends_on: + postgres: + condition: service_healthy + volumes: + - /opt/openclaw/data/openclaw/workspace-iris:/mnt/workspace-iris + - /opt/openclaw/data/openclaw/workspace-programmer:/mnt/workspace-programmer + - /opt/openclaw/data/openclaw/workspace-reviewer:/mnt/workspace-reviewer + - /opt/openclaw/data/openclaw/workspace-architekt:/mnt/workspace-architekt + - /opt/openclaw/data/openclaw/workspace-researcher:/mnt/workspace-researcher + - /opt/openclaw/data/openclaw/workspace-executor:/mnt/workspace-executor + networks: [nexus] + + web: + build: + context: ./frontend + restart: unless-stopped + ports: + - "127.0.0.1:18880:80" + depends_on: [api] + networks: [nexus] + +networks: + nexus: + +volumes: + nexus-postgres: diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..87f7e0b --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,13 @@ +FROM node:24-alpine AS build +WORKDIR /app +RUN corepack enable +COPY package.json pnpm-lock.yaml* ./ +RUN pnpm install --frozen-lockfile=false +COPY . . +RUN pnpm build + +FROM nginx:1.27-alpine +COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=build /app/dist /usr/share/nginx/html +EXPOSE 80 + diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..ed77c2e --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,14 @@ + + + + + + + Nexus | Noveria Operations + + +
+ + + + diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..269ad83 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,29 @@ +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + add_header Content-Security-Policy "default-src 'self'; connect-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'; base-uri 'self'; form-action 'self'" always; + add_header Referrer-Policy "no-referrer" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-Frame-Options "DENY" always; + add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; + + location /api/ { + proxy_pass http://api:8080; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /health { + proxy_pass http://api:8080/health; + } + + location / { + try_files $uri $uri/ /index.html; + } +} + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..955fcba --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,30 @@ +{ + "name": "nexus-web", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite --host 0.0.0.0", + "build": "vue-tsc --noEmit && vite build", + "typecheck": "vue-tsc --noEmit", + "test": "vitest run" + }, + "dependencies": { + "@tailwindcss/vite": "^4.1.8", + "@lucide/vue": "1.17.0", + "pinia": "^3.0.3", + "tailwindcss": "^4.1.8", + "vue": "^3.5.16", + "vue-router": "^4.5.1" + }, + "devDependencies": { + "@types/node": "^22.15.29", + "@vitejs/plugin-vue": "^5.2.4", + "typescript": "~5.7.3", + "vite": "^6.3.5", + "vitest": "^3.1.3", + "vue-tsc": "^2.2.10" + }, + "packageManager": "pnpm@10.12.1" +} + diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml new file mode 100644 index 0000000..82a266a --- /dev/null +++ b/frontend/pnpm-lock.yaml @@ -0,0 +1,1442 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@lucide/vue': + specifier: 1.17.0 + version: 1.17.0(vue@3.5.35(typescript@5.7.3)) + '@tailwindcss/vite': + specifier: ^4.1.8 + version: 4.3.0(vite@6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0)) + pinia: + specifier: ^3.0.3 + version: 3.0.4(typescript@5.7.3)(vue@3.5.35(typescript@5.7.3)) + tailwindcss: + specifier: ^4.1.8 + version: 4.3.0 + vue: + specifier: ^3.5.16 + version: 3.5.35(typescript@5.7.3) + vue-router: + specifier: ^4.5.1 + version: 4.6.4(vue@3.5.35(typescript@5.7.3)) + devDependencies: + '@types/node': + specifier: ^22.15.29 + version: 22.19.20 + '@vitejs/plugin-vue': + specifier: ^5.2.4 + version: 5.2.4(vite@6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0))(vue@3.5.35(typescript@5.7.3)) + typescript: + specifier: ~5.7.3 + version: 5.7.3 + vite: + specifier: ^6.3.5 + version: 6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0) + vue-tsc: + specifier: ^2.2.10 + version: 2.2.12(typescript@5.7.3) + +packages: + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@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==} + + '@lucide/vue@1.17.0': + resolution: {integrity: sha512-6Q1ZHgr5FbmJzKWe5BxlNdjLj2lbmuH1zwDtVzUJofX0w9UREwKgq4F4jwKqFYyyIS4Rj3FiJvDi2k6djukmmw==} + peerDependencies: + vue: '>=3.0.1' + + '@rollup/rollup-android-arm-eabi@4.61.1': + resolution: {integrity: sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.61.1': + resolution: {integrity: sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.61.1': + resolution: {integrity: sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.61.1': + resolution: {integrity: sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.61.1': + resolution: {integrity: sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.61.1': + resolution: {integrity: sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.61.1': + resolution: {integrity: sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.61.1': + resolution: {integrity: sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.61.1': + resolution: {integrity: sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.61.1': + resolution: {integrity: sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.61.1': + resolution: {integrity: sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.61.1': + resolution: {integrity: sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.61.1': + resolution: {integrity: sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.61.1': + resolution: {integrity: sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.61.1': + resolution: {integrity: sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.61.1': + resolution: {integrity: sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.61.1': + resolution: {integrity: sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.61.1': + resolution: {integrity: sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.61.1': + resolution: {integrity: sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.61.1': + resolution: {integrity: sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.61.1': + resolution: {integrity: sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.61.1': + resolution: {integrity: sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.61.1': + resolution: {integrity: sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.61.1': + resolution: {integrity: sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.61.1': + resolution: {integrity: sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==} + cpu: [x64] + os: [win32] + + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/node@22.19.20': + resolution: {integrity: sha512-6tELRwSDYWW9EdZhbeZmYGZ1/7Djkt+Ah3/ScEYT9cDord7UJzasR/4D3VONg9tQI5CDp+/CZC1AXj2pCFOvpw==} + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.15': + resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==} + + '@volar/source-map@2.4.15': + resolution: {integrity: sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==} + + '@volar/typescript@2.4.15': + resolution: {integrity: sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==} + + '@vue/compiler-core@3.5.35': + resolution: {integrity: sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==} + + '@vue/compiler-dom@3.5.35': + resolution: {integrity: sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==} + + '@vue/compiler-sfc@3.5.35': + resolution: {integrity: sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==} + + '@vue/compiler-ssr@3.5.35': + resolution: {integrity: sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-api@7.7.9': + resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + + '@vue/devtools-kit@7.7.9': + resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + + '@vue/devtools-shared@7.7.9': + resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + + '@vue/language-core@2.2.12': + resolution: {integrity: sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.35': + resolution: {integrity: sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==} + + '@vue/runtime-core@3.5.35': + resolution: {integrity: sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==} + + '@vue/runtime-dom@3.5.35': + resolution: {integrity: sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==} + + '@vue/server-renderer@3.5.35': + resolution: {integrity: sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==} + peerDependencies: + vue: 3.5.35 + + '@vue/shared@3.5.35': + resolution: {integrity: sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==} + + alien-signals@1.0.13: + resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + enhanced-resolve@5.23.0: + resolution: {integrity: sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==} + engines: {node: '>=10.13.0'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pinia@3.0.4: + resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==} + peerDependencies: + typescript: '>=4.5.0' + vue: ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.61.1: + resolution: {integrity: sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + vite@6.4.3: + resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + + vue-tsc@2.2.12: + resolution: {integrity: sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.35: + resolution: {integrity: sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + +snapshots: + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@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 + + '@lucide/vue@1.17.0(vue@3.5.35(typescript@5.7.3))': + dependencies: + vue: 3.5.35(typescript@5.7.3) + + '@rollup/rollup-android-arm-eabi@4.61.1': + optional: true + + '@rollup/rollup-android-arm64@4.61.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.61.1': + optional: true + + '@rollup/rollup-darwin-x64@4.61.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.61.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.61.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.61.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.61.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.61.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.61.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.61.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.61.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.61.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.61.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.61.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.61.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.61.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.61.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.61.1': + optional: true + + '@tailwindcss/node@4.3.0': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.23.0 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 + + '@tailwindcss/oxide-android-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/vite@4.3.0(vite@6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0))': + dependencies: + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0) + + '@types/estree@1.0.9': {} + + '@types/node@22.19.20': + dependencies: + undici-types: 6.21.0 + + '@vitejs/plugin-vue@5.2.4(vite@6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0))(vue@3.5.35(typescript@5.7.3))': + dependencies: + vite: 6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0) + vue: 3.5.35(typescript@5.7.3) + + '@volar/language-core@2.4.15': + dependencies: + '@volar/source-map': 2.4.15 + + '@volar/source-map@2.4.15': {} + + '@volar/typescript@2.4.15': + dependencies: + '@volar/language-core': 2.4.15 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.35': + dependencies: + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.35 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.35': + dependencies: + '@vue/compiler-core': 3.5.35 + '@vue/shared': 3.5.35 + + '@vue/compiler-sfc@3.5.35': + dependencies: + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.35 + '@vue/compiler-dom': 3.5.35 + '@vue/compiler-ssr': 3.5.35 + '@vue/shared': 3.5.35 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.15 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.35': + dependencies: + '@vue/compiler-dom': 3.5.35 + '@vue/shared': 3.5.35 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-api@7.7.9': + dependencies: + '@vue/devtools-kit': 7.7.9 + + '@vue/devtools-kit@7.7.9': + dependencies: + '@vue/devtools-shared': 7.7.9 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.9': + dependencies: + rfdc: 1.4.1 + + '@vue/language-core@2.2.12(typescript@5.7.3)': + dependencies: + '@volar/language-core': 2.4.15 + '@vue/compiler-dom': 3.5.35 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.35 + alien-signals: 1.0.13 + minimatch: 9.0.9 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.7.3 + + '@vue/reactivity@3.5.35': + dependencies: + '@vue/shared': 3.5.35 + + '@vue/runtime-core@3.5.35': + dependencies: + '@vue/reactivity': 3.5.35 + '@vue/shared': 3.5.35 + + '@vue/runtime-dom@3.5.35': + dependencies: + '@vue/reactivity': 3.5.35 + '@vue/runtime-core': 3.5.35 + '@vue/shared': 3.5.35 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.35(vue@3.5.35(typescript@5.7.3))': + dependencies: + '@vue/compiler-ssr': 3.5.35 + '@vue/shared': 3.5.35 + vue: 3.5.35(typescript@5.7.3) + + '@vue/shared@3.5.35': {} + + alien-signals@1.0.13: {} + + balanced-match@1.0.2: {} + + birpc@2.9.0: {} + + brace-expansion@2.1.1: + dependencies: + balanced-match: 1.0.2 + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + csstype@3.2.3: {} + + de-indent@1.0.2: {} + + detect-libc@2.1.2: {} + + enhanced-resolve@5.23.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@7.0.1: {} + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + estree-walker@2.0.2: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fsevents@2.3.3: + optional: true + + graceful-fs@4.2.11: {} + + he@1.2.0: {} + + hookable@5.5.3: {} + + is-what@5.5.0: {} + + jiti@2.7.0: {} + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.1 + + mitt@3.0.1: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.12: {} + + path-browserify@1.0.1: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + pinia@3.0.4(typescript@5.7.3)(vue@3.5.35(typescript@5.7.3)): + dependencies: + '@vue/devtools-api': 7.7.9 + vue: 3.5.35(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + rfdc@1.4.1: {} + + rollup@4.61.1: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.61.1 + '@rollup/rollup-android-arm64': 4.61.1 + '@rollup/rollup-darwin-arm64': 4.61.1 + '@rollup/rollup-darwin-x64': 4.61.1 + '@rollup/rollup-freebsd-arm64': 4.61.1 + '@rollup/rollup-freebsd-x64': 4.61.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.61.1 + '@rollup/rollup-linux-arm-musleabihf': 4.61.1 + '@rollup/rollup-linux-arm64-gnu': 4.61.1 + '@rollup/rollup-linux-arm64-musl': 4.61.1 + '@rollup/rollup-linux-loong64-gnu': 4.61.1 + '@rollup/rollup-linux-loong64-musl': 4.61.1 + '@rollup/rollup-linux-ppc64-gnu': 4.61.1 + '@rollup/rollup-linux-ppc64-musl': 4.61.1 + '@rollup/rollup-linux-riscv64-gnu': 4.61.1 + '@rollup/rollup-linux-riscv64-musl': 4.61.1 + '@rollup/rollup-linux-s390x-gnu': 4.61.1 + '@rollup/rollup-linux-x64-gnu': 4.61.1 + '@rollup/rollup-linux-x64-musl': 4.61.1 + '@rollup/rollup-openbsd-x64': 4.61.1 + '@rollup/rollup-openharmony-arm64': 4.61.1 + '@rollup/rollup-win32-arm64-msvc': 4.61.1 + '@rollup/rollup-win32-ia32-msvc': 4.61.1 + '@rollup/rollup-win32-x64-gnu': 4.61.1 + '@rollup/rollup-win32-x64-msvc': 4.61.1 + fsevents: 2.3.3 + + source-map-js@1.2.1: {} + + speakingurl@14.0.1: {} + + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + + tailwindcss@4.3.0: {} + + tapable@2.3.3: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + typescript@5.7.3: {} + + undici-types@6.21.0: {} + + vite@6.4.3(@types/node@22.19.20)(jiti@2.7.0)(lightningcss@1.32.0): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.15 + rollup: 4.61.1 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 22.19.20 + fsevents: 2.3.3 + jiti: 2.7.0 + lightningcss: 1.32.0 + + vscode-uri@3.1.0: {} + + vue-router@4.6.4(vue@3.5.35(typescript@5.7.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.35(typescript@5.7.3) + + vue-tsc@2.2.12(typescript@5.7.3): + dependencies: + '@volar/typescript': 2.4.15 + '@vue/language-core': 2.2.12(typescript@5.7.3) + typescript: 5.7.3 + + vue@3.5.35(typescript@5.7.3): + dependencies: + '@vue/compiler-dom': 3.5.35 + '@vue/compiler-sfc': 3.5.35 + '@vue/runtime-dom': 3.5.35 + '@vue/server-renderer': 3.5.35(vue@3.5.35(typescript@5.7.3)) + '@vue/shared': 3.5.35 + optionalDependencies: + typescript: 5.7.3 diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..88fb49c --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/frontend/src/components/ModuleView.vue b/frontend/src/components/ModuleView.vue new file mode 100644 index 0000000..74bbf01 --- /dev/null +++ b/frontend/src/components/ModuleView.vue @@ -0,0 +1,630 @@ + + + + + diff --git a/frontend/src/components/config/ConfigEditor.vue b/frontend/src/components/config/ConfigEditor.vue new file mode 100644 index 0000000..88c5a72 --- /dev/null +++ b/frontend/src/components/config/ConfigEditor.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/frontend/src/components/config/ConfigTabs.vue b/frontend/src/components/config/ConfigTabs.vue new file mode 100644 index 0000000..f6d6e2f --- /dev/null +++ b/frontend/src/components/config/ConfigTabs.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/frontend/src/components/dashboard/ActiveInitiatives.vue b/frontend/src/components/dashboard/ActiveInitiatives.vue new file mode 100644 index 0000000..4bb29af --- /dev/null +++ b/frontend/src/components/dashboard/ActiveInitiatives.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/frontend/src/components/dashboard/AgendaPanel.vue b/frontend/src/components/dashboard/AgendaPanel.vue new file mode 100644 index 0000000..a7cb1a9 --- /dev/null +++ b/frontend/src/components/dashboard/AgendaPanel.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/frontend/src/components/dashboard/IrisPanel.vue b/frontend/src/components/dashboard/IrisPanel.vue new file mode 100644 index 0000000..ad97bc8 --- /dev/null +++ b/frontend/src/components/dashboard/IrisPanel.vue @@ -0,0 +1,315 @@ + + + + + diff --git a/frontend/src/components/dashboard/OperationsFeed.vue b/frontend/src/components/dashboard/OperationsFeed.vue new file mode 100644 index 0000000..1dc018c --- /dev/null +++ b/frontend/src/components/dashboard/OperationsFeed.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/frontend/src/components/dashboard/RecentlyFinished.vue b/frontend/src/components/dashboard/RecentlyFinished.vue new file mode 100644 index 0000000..8a185f7 --- /dev/null +++ b/frontend/src/components/dashboard/RecentlyFinished.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/frontend/src/components/layout/AppHeader.vue b/frontend/src/components/layout/AppHeader.vue new file mode 100644 index 0000000..0573206 --- /dev/null +++ b/frontend/src/components/layout/AppHeader.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/frontend/src/components/layout/AppSidebar.vue b/frontend/src/components/layout/AppSidebar.vue new file mode 100644 index 0000000..ce437a9 --- /dev/null +++ b/frontend/src/components/layout/AppSidebar.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/frontend/src/components/team/AgentCard.vue b/frontend/src/components/team/AgentCard.vue new file mode 100644 index 0000000..96b4b27 --- /dev/null +++ b/frontend/src/components/team/AgentCard.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/frontend/src/components/team/AgentStatusBadge.vue b/frontend/src/components/team/AgentStatusBadge.vue new file mode 100644 index 0000000..a824824 --- /dev/null +++ b/frontend/src/components/team/AgentStatusBadge.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/frontend/src/composables/useTime.ts b/frontend/src/composables/useTime.ts new file mode 100644 index 0000000..5454e18 --- /dev/null +++ b/frontend/src/composables/useTime.ts @@ -0,0 +1,12 @@ +import { computed } from 'vue' + +export function useTime() { + const greeting = computed(() => { + const h = new Date().getHours() + if (h < 11) return 'Guten Morgen' + if (h < 18) return 'Guten Tag' + return 'Guten Abend' + }) + + return { greeting } +} diff --git a/frontend/src/main.ts b/frontend/src/main.ts new file mode 100644 index 0000000..ec7c8b0 --- /dev/null +++ b/frontend/src/main.ts @@ -0,0 +1,28 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import App from './App.vue' +import router from './router' +import { useAuthStore } from './stores/auth' +import './style.css' + +const pinia = createPinia() + +router.beforeEach(async to => { + const auth = useAuthStore(pinia) + await auth.initialize() + + if (to.meta.public) { + return to.name === 'Login' && auth.isAuthenticated ? '/dashboard' : true + } + + if (!auth.isAuthenticated) { + return { name: 'Login', query: { redirect: to.fullPath } } + } + + return true +}) + +createApp(App) + .use(pinia) + .use(router) + .mount('#app') diff --git a/frontend/src/router.ts b/frontend/src/router.ts new file mode 100644 index 0000000..6047b48 --- /dev/null +++ b/frontend/src/router.ts @@ -0,0 +1,40 @@ +import { createRouter, createWebHistory } from 'vue-router' +import LoginView from './views/LoginView.vue' +import ProjectDetailView from './views/ProjectDetailView.vue' +import SettingsView from './views/SettingsView.vue' +import MemoryView from './views/MemoryView.vue' +import DocsView from './views/DocsView.vue' +import TeamView from './views/TeamView.vue' +import AgentDetailView from './views/AgentDetailView.vue' +import AgentsIndexView from './views/AgentsIndexView.vue' +import SecurityView from './views/SecurityView.vue' +import IncidentsView from './views/IncidentsView.vue' +import CalendarView from './views/CalendarView.vue' +import DashboardView from './views/DashboardView.vue' + +const routes = [ + { path: '/login', name: 'Login', component: LoginView, meta: { public: true } }, + { path: '/', redirect: '/dashboard' }, + { path: '/dashboard', name: 'Dashboard', component: DashboardView }, + { path: '/memory', name: 'Memory', component: MemoryView }, + { path: '/docs', name: 'Docs', component: DocsView }, + { path: '/team', name: 'Team', component: TeamView }, + { path: '/agents/:id', name: 'AgentDetail', component: AgentDetailView }, + { path: '/security', name: 'Security', component: SecurityView }, + { path: '/incidents', name: 'Incidents', component: IncidentsView }, + { path: '/calendar', name: 'Calendar', component: CalendarView }, + { path: '/projects', name: 'Projects', component: { template: '' } }, + { path: '/projects/:id', name: 'ProjectDetail', component: ProjectDetailView }, + { path: '/tasks', name: 'Task Board', component: { template: '' } }, + { path: '/agents', name: 'Agents', component: AgentsIndexView }, + { path: '/models', name: 'Models', component: { template: '' } }, + { path: '/activity', name: 'Activity', component: { template: '' } }, + { path: '/chat', name: 'Mobile Chat', component: { template: '' } }, + { path: '/settings', name: 'Settings', component: SettingsView }, + { path: '/:pathMatch(.*)*', redirect: '/dashboard' }, +] + +export default createRouter({ + history: createWebHistory(), + routes, +}) diff --git a/frontend/src/services/api.ts b/frontend/src/services/api.ts new file mode 100644 index 0000000..e52581c --- /dev/null +++ b/frontend/src/services/api.ts @@ -0,0 +1,24 @@ +import { useAuthStore } from '../stores/auth' + +export async function apiFetch(input: RequestInfo | URL, init: RequestInit = {}) { + const auth = useAuthStore() + if (!auth.initialized) await auth.initialize() + + const send = () => { + const headers = new Headers(init.headers) + if (auth.accessToken) headers.set('Authorization', `Bearer ${auth.accessToken}`) + return fetch(input, { ...init, headers, credentials: 'include' }) + } + + let response = await send() + if (response.status !== 401) return response + + const refreshed = await auth.refresh() + if (!refreshed) { + if (window.location.pathname !== '/login') window.location.assign('/login') + return response + } + + response = await send() + return response +} diff --git a/frontend/src/stores/auth.ts b/frontend/src/stores/auth.ts new file mode 100644 index 0000000..07ec9b6 --- /dev/null +++ b/frontend/src/stores/auth.ts @@ -0,0 +1,103 @@ +import { defineStore } from 'pinia' + +export interface AuthUser { + id: string + email: string + displayName: string + role: string +} + +interface AuthPayload { + accessToken: string + expiresAt: string + user: AuthUser +} + +let refreshInFlight: Promise | null = null + +export const useAuthStore = defineStore('auth', { + state: () => ({ + accessToken: null as string | null, + expiresAt: null as string | null, + user: null as AuthUser | null, + initialized: false, + loading: false, + }), + getters: { + isAuthenticated: state => Boolean(state.accessToken && state.user), + }, + actions: { + applySession(payload: AuthPayload) { + this.accessToken = payload.accessToken + this.expiresAt = payload.expiresAt + this.user = payload.user + }, + clearSession() { + this.accessToken = null + this.expiresAt = null + this.user = null + }, + async initialize() { + if (this.initialized) return this.isAuthenticated + this.initialized = true + return this.refresh() + }, + async login(email: string, password: string) { + this.loading = true + try { + const response = await fetch('/api/v1/auth/login', { + method: 'POST', + credentials: 'include', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ email, password }), + }) + + if (!response.ok) { + if (response.status === 429) throw new Error('Too many attempts. Please wait one minute.') + throw new Error('Invalid email or password.') + } + + this.applySession(await response.json() as AuthPayload) + } finally { + this.loading = false + } + }, + async refresh(): Promise { + if (refreshInFlight) return refreshInFlight + + refreshInFlight = (async () => { + try { + const response = await fetch('/api/v1/auth/refresh', { + method: 'POST', + credentials: 'include', + }) + if (!response.ok) { + this.clearSession() + return false + } + + this.applySession(await response.json() as AuthPayload) + return true + } catch { + this.clearSession() + return false + } finally { + refreshInFlight = null + } + })() + + return refreshInFlight + }, + async logout() { + try { + await fetch('/api/v1/auth/logout', { + method: 'POST', + credentials: 'include', + headers: this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : undefined, + }) + } finally { + this.clearSession() + } + }, + }, +}) diff --git a/frontend/src/stores/operations.ts b/frontend/src/stores/operations.ts new file mode 100644 index 0000000..54f7cbc --- /dev/null +++ b/frontend/src/stores/operations.ts @@ -0,0 +1,198 @@ +import { defineStore } from 'pinia' +import type { AgentInfo, OperationsSnapshot, RoutingTarget } from '../types' +import { apiFetch } from '../services/api' + +const fallback: OperationsSnapshot = { + generatedAt: new Date().toISOString(), + runtime: { runtime: 'OpenClaw', status: 'Online', detail: 'Gateway responding' }, + models: [ + { provider: 'OpenClaw', model: 'deepseek/deepseek-v4-flash', status: 'Online', isLocal: false, detail: 'Programmer agent' }, + { provider: 'OpenClaw', model: 'deepseek/deepseek-v4-pro', status: 'Online', isLocal: false, detail: 'Reviewer agent' }, + { provider: 'OpenClaw', model: 'openai/gpt-5.3-chat-latest', status: 'Online', isLocal: false, detail: 'Iris orchestrator' }, + ], + metrics: { activeAgents: 3, queuedTasks: 7, successRate: 98.4, incidents: 0 }, + projects: [ + { id: 'nexus', name: 'Nexus', status: 'Active', progress: 18 }, + { id: 'openclaw', name: 'OpenClaw Runtime', status: 'Online', progress: 100 }, + { id: 'infra', name: 'Noveria Infrastructure', status: 'Stable', progress: 74 }, + ], + tasks: [ + { id: 'preview-foundation', title: 'Nexus foundation', state: 'In progress', priority: 'Critical', updatedAt: new Date().toISOString() }, + { id: 'preview-runtime', title: 'Connect OpenClaw adapter', state: 'In progress', priority: 'High', updatedAt: new Date().toISOString() }, + { id: 'preview-routing', title: 'Configure model routing', state: 'In progress', priority: 'High', updatedAt: new Date().toISOString() }, + { id: 'preview-auth', title: 'Owner authentication', state: 'Done', priority: 'Critical', updatedAt: new Date().toISOString() }, + ], + activity: [ + { type: 'runtime', message: 'OpenClaw runtime health checked', at: new Date().toISOString() }, + { type: 'deploy', message: 'Nexus foundation initialized', at: new Date(Date.now() - 720000).toISOString() }, + { type: 'deploy', message: 'Model routing configured for DeepSeek agents', at: new Date(Date.now() - 1140000).toISOString() }, + ], +} + +const fallbackRouting: RoutingTarget[] = [ + { priority: 1, provider: 'OpenClaw', model: 'deepseek/deepseek-v4-flash', purpose: 'Programmer agent', status: 'Online', detail: 'Routed through OpenClaw' }, + { priority: 2, provider: 'OpenClaw', model: 'deepseek/deepseek-v4-pro', purpose: 'Reviewer agent', status: 'Online', detail: 'Routed through OpenClaw' }, + { priority: 3, provider: 'OpenClaw', model: 'openai/gpt-5.3-chat-latest', purpose: 'Iris orchestrator', status: 'Online', detail: 'Routed through OpenClaw' }, +] + +export const useOperationsStore = defineStore('operations', { + state: () => ({ + snapshot: fallback, + routing: fallbackRouting, + loading: false, + connected: false, + }), + actions: { + async createProject(name: string) { + const response = await apiFetch('/api/v1/projects', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ name }), + }) + if (!response.ok) throw new Error('Project could not be created') + const project = await response.json() + this.snapshot.projects.unshift({ + id: project.id, + name: project.name, + status: project.status, + progress: project.progress, + }) + }, + async createTask(title: string, priority: string) { + const response = await apiFetch('/api/v1/tasks', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ title, priority }), + }) + if (!response.ok) throw new Error('Task could not be created') + const task = await response.json() + this.snapshot.tasks.unshift(task) + this.snapshot.metrics.queuedTasks += 1 + }, + async updateTaskState(id: string, state: string) { + const response = await apiFetch(`/api/v1/tasks/${id}/state`, { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ state }), + }) + if (!response.ok) throw new Error('Task state could not be updated') + const updatedTask = await response.json() + const index = this.snapshot.tasks.findIndex(task => task.id === id) + if (index !== -1) this.snapshot.tasks[index] = updatedTask + this.snapshot.metrics.queuedTasks = this.snapshot.tasks.filter(task => task.state !== 'Done').length + this.snapshot.metrics.incidents = this.snapshot.tasks.filter(task => task.state === 'Blocked').length + const completed = this.snapshot.tasks.filter(task => task.state === 'Done').length + this.snapshot.metrics.successRate = this.snapshot.tasks.length + ? Math.round((completed * 1000) / this.snapshot.tasks.length) / 10 + : 100 + }, + async updateTask(id: string, data: { title?: string; priority?: string; projectId?: string | null }) { + const response = await apiFetch(`/api/v1/tasks/${id}`, { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data), + }) + if (!response.ok) throw new Error('Task could not be updated') + const updatedTask = await response.json() + const index = this.snapshot.tasks.findIndex(task => task.id === id) + if (index !== -1) this.snapshot.tasks[index] = updatedTask + }, + async updateProject(id: string, data: { name?: string; description?: string; status?: string }) { + const response = await apiFetch(`/api/v1/projects/${id}`, { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data), + }) + if (!response.ok) throw new Error('Project could not be updated') + const updatedProject = await response.json() + const index = this.snapshot.projects.findIndex(p => p.id === id) + if (index !== -1) this.snapshot.projects[index] = { + id: updatedProject.id, + name: updatedProject.name, + status: updatedProject.status, + progress: updatedProject.progress, + } + }, + async deleteTask(id: string) { + const response = await apiFetch(`/api/v1/tasks/${id}`, { + method: 'DELETE', + }) + if (response.status === 403) { + const err = await response.json().catch(() => ({ detail: 'Task cannot be deleted in its current state.' })) + throw new Error(err.detail || 'Task cannot be deleted in its current state.') + } + if (!response.ok) throw new Error('Task could not be deleted') + this.snapshot.tasks = this.snapshot.tasks.filter(t => t.id !== id) + this.snapshot.metrics.queuedTasks = this.snapshot.tasks.filter(t => t.state !== 'Done').length + const completed = this.snapshot.tasks.filter(t => t.state === 'Done').length + this.snapshot.metrics.successRate = this.snapshot.tasks.length + ? Math.round((completed * 1000) / this.snapshot.tasks.length) / 10 + : 100 + }, + async deleteProject(id: string) { + const response = await apiFetch(`/api/v1/projects/${id}`, { + method: 'DELETE', + }) + if (!response.ok) throw new Error('Project could not be deleted') + this.snapshot.projects = this.snapshot.projects.filter(p => p.id !== id) + }, + async refresh() { + this.loading = true + try { + const [snapshotResponse, routingResponse] = await Promise.all([ + apiFetch('/api/v1/operations/snapshot'), + apiFetch('/api/v1/routing'), + ]) + if (!snapshotResponse.ok || !routingResponse.ok) throw new Error('Nexus API unavailable') + this.snapshot = await snapshotResponse.json() + this.routing = await routingResponse.json() + this.connected = true + } catch { + this.connected = false + } finally { + this.loading = false + } + }, + async fetchAgents(): Promise { + try { + const response = await apiFetch('/api/v1/agents') + if (!response.ok) throw new Error('Failed to fetch agents') + return await response.json() + } catch { + return [] + } + }, + async approveTask(id: string) { + const response = await apiFetch(`/api/v1/tasks/${id}/approve`, { + method: 'POST', + }) + if (!response.ok) throw new Error('Task could not be approved') + const index = this.snapshot.tasks.findIndex(task => task.id === id) + if (index !== -1) { + this.snapshot.tasks.splice(index, 1) + } + this.snapshot.metrics.queuedTasks = this.snapshot.tasks.filter(task => task.state !== 'Done').length + this.snapshot.metrics.incidents = this.snapshot.tasks.filter(task => task.state === 'Blocked').length + const completed = this.snapshot.tasks.filter(task => task.state === 'Done').length + this.snapshot.metrics.successRate = this.snapshot.tasks.length + ? Math.round((completed * 1000) / this.snapshot.tasks.length) / 10 + : 100 + }, + async rejectTask(id: string) { + const response = await apiFetch(`/api/v1/tasks/${id}/reject`, { + method: 'POST', + }) + if (!response.ok) throw new Error('Task could not be rejected') + const index = this.snapshot.tasks.findIndex(task => task.id === id) + if (index !== -1) { + this.snapshot.tasks[index] = { ...this.snapshot.tasks[index], state: 'Backlog' } + } + this.snapshot.metrics.queuedTasks = this.snapshot.tasks.filter(task => task.state !== 'Done').length + this.snapshot.metrics.incidents = this.snapshot.tasks.filter(task => task.state === 'Blocked').length + const completed = this.snapshot.tasks.filter(task => task.state === 'Done').length + this.snapshot.metrics.successRate = this.snapshot.tasks.length + ? Math.round((completed * 1000) / this.snapshot.tasks.length) / 10 + : 100 + }, + }, +}) diff --git a/frontend/src/style.css b/frontend/src/style.css new file mode 100644 index 0000000..6dfcb4b --- /dev/null +++ b/frontend/src/style.css @@ -0,0 +1,219 @@ +@import "tailwindcss"; + +:root { + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + color: #e8eaf0; + background: #080a0f; + font-synthesis: none; + --panel: #10131a; + --panel-soft: #0d1016; + --line: #202530; + --muted: #7e8799; + --accent: #8b7cf6; + --accent-soft: rgba(139, 124, 246, .12); + --green: #51d49a; +} + +* { box-sizing: border-box; } +body { margin: 0; min-width: 320px; min-height: 100vh; background: radial-gradient(circle at 70% -20%, #17152b 0, transparent 34%), #080a0f; } +button { color: inherit; font: inherit; } +.shell { min-height: 100vh; display: grid; grid-template-columns: 224px 1fr; } +.sidebar { position: sticky; top: 0; height: 100vh; display: flex; flex-direction: column; padding: 22px 14px 14px; border-right: 1px solid #1a1e27; background: rgba(9, 11, 16, .94); backdrop-filter: blur(18px); } +.brand { display: flex; align-items: center; gap: 11px; padding: 0 8px 25px; } +.brand-mark { width: 35px; height: 35px; display: grid; place-items: center; border: 1px solid #443d7c; border-radius: 10px; background: linear-gradient(145deg, #241f44, #12121f); color: #b8adff; box-shadow: 0 0 24px rgba(139,124,246,.13); } +.brand strong { display: block; font-size: 13px; letter-spacing: .14em; } +.brand span, .owner span { display: block; color: var(--muted); font-size: 10px; margin-top: 2px; } +.nav { display: flex; flex-direction: column; gap: 3px; } +.nav button, .sidebar-bottom > button { width: 100%; display: flex; align-items: center; gap: 10px; border: 0; padding: 9px 10px; border-radius: 7px; background: transparent; color: #8991a1; font-size: 12px; text-align: left; cursor: pointer; } +.nav button:hover, .nav button.active { color: #ececf5; background: var(--accent-soft); } +.nav button.active { box-shadow: inset 2px 0 var(--accent); } +.nav button i { margin-left: auto; padding: 1px 6px; border: 1px solid #343947; border-radius: 8px; font-size: 9px; font-style: normal; } +.sidebar-bottom { margin-top: auto; border-top: 1px solid #1b1f28; padding-top: 10px; } +.owner { display: grid; grid-template-columns: 31px 1fr auto; gap: 9px; align-items: center; margin-top: 10px; padding: 10px 8px; } +.owner strong { font-size: 11px; } +.avatar { width: 31px; height: 31px; display: grid; place-items: center; border-radius: 50%; background: #28243f; color: #bcb3ff; font-size: 10px; } +main { min-width: 0; } +.topbar { height: 62px; display: flex; align-items: center; justify-content: space-between; padding: 0 30px; border-bottom: 1px solid #191d25; background: rgba(8,10,15,.68); backdrop-filter: blur(16px); } +.search { width: min(390px, 42vw); display: flex; align-items: center; gap: 9px; padding: 8px 10px; border: 1px solid #202530; border-radius: 7px; color: #6f7889; font-size: 11px; } +.search kbd { margin-left: auto; padding: 2px 5px; border: 1px solid #2c313d; border-radius: 4px; color: #606979; font-size: 9px; } +.top-actions { display: flex; align-items: center; gap: 10px; } +.connection { display: flex; gap: 6px; align-items: center; font-size: 10px; color: #8c95a5; } +.connection.live { color: var(--green); } +.connection.preview { color: #e6b75d; } +.ask, .refresh { display: flex; align-items: center; gap: 7px; padding: 8px 11px; border: 1px solid #37315e; border-radius: 7px; background: #18152a; color: #c4bbff; font-size: 10px; cursor: pointer; } +.content { max-width: 1320px; margin: auto; padding: 36px 34px 60px; } +.page-heading { display: flex; justify-content: space-between; align-items: end; margin-bottom: 28px; } +.eyebrow, .kicker { color: #7065c8; font-size: 9px; font-weight: 700; letter-spacing: .18em; } +h1 { margin: 7px 0 5px; font-size: 27px; letter-spacing: -.04em; } +.page-heading p, .placeholder p { margin: 0; color: var(--muted); font-size: 11px; } +.refresh { border-color: var(--line); background: var(--panel); color: #a5adba; } +.metrics { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 10px; } +.metrics article, .panel { border: 1px solid var(--line); background: linear-gradient(145deg, rgba(18,21,29,.96), rgba(12,15,21,.96)); border-radius: 9px; } +.metrics article { padding: 16px 17px; } +.metrics span { color: #717a8a; font-size: 8px; font-weight: 700; letter-spacing: .14em; } +.metrics strong { display: block; margin: 7px 0 5px; font-size: 24px; letter-spacing: -.04em; } +.metrics small { color: #687181; font-size: 9px; } +.metrics small.up { color: #55c995; } +.dashboard-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; } +.panel { padding: 18px; min-height: 180px; } +.span-2 { grid-column: span 2; } +.panel-head { display: flex; align-items: center; justify-content: space-between; padding-bottom: 15px; border-bottom: 1px solid #1d222c; } +.panel-head h2 { margin: 4px 0 0; font-size: 13px; } +.panel-head button { border: 0; background: transparent; color: #8e96a5; font-size: 9px; } +.badge { padding: 4px 8px; border-radius: 10px; font-size: 8px; } +.badge.positive { color: var(--green); background: rgba(81,212,154,.1); } +.badge.warning { color: #e7b660; background: rgba(231,182,96,.1); } +.runtime-row { display: flex; align-items: center; gap: 12px; padding-top: 22px; } +.runtime-icon { width: 45px; height: 45px; display: grid; place-items: center; border-radius: 9px; color: #ad9fff; background: var(--accent-soft); } +.runtime-main strong, .model strong, .project strong, .event strong { display: block; font-size: 11px; } +.runtime-main span, .model small, .event small { display: block; margin-top: 4px; color: var(--muted); font-size: 9px; } +.pulse-bars { height: 42px; display: flex; align-items: center; gap: 3px; margin-left: auto; } +.pulse-bars i { width: 3px; min-height: 5px; border-radius: 3px; background: linear-gradient(#927fff, #443b7c); } +.model { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 9px; padding: 12px 2px; border-bottom: 1px solid #1b2029; } +.model > span:last-child { color: #687181; font-size: 8px; } +.status-dot { width: 6px; height: 6px; border-radius: 50%; background: #657083; } +.status-dot.online { background: var(--green); box-shadow: 0 0 7px rgba(81,212,154,.4); } +.status-dot.offline { background: #e16e75; } +.project { display: grid; grid-template-columns: 34px 1fr auto; align-items: center; gap: 11px; padding: 12px 0; border-bottom: 1px solid #1b2029; } +.project-letter { width: 31px; height: 31px; display: grid; place-items: center; border: 1px solid #353047; border-radius: 7px; color: #a99cf5; font-size: 10px; } +.project-info > div:first-child { display: flex; justify-content: space-between; } +.project-info span { color: var(--muted); font-size: 8px; } +.project b { color: #838c9c; font-size: 9px; } +.progress { height: 3px; margin-top: 8px; overflow: hidden; border-radius: 4px; background: #242936; } +.progress i { display: block; height: 100%; border-radius: inherit; background: linear-gradient(90deg, #685ac8, #a091ff); } +.event { display: grid; grid-template-columns: auto 1fr; gap: 10px; padding: 12px 0; border-bottom: 1px solid #1b2029; } +.event > span { width: 6px; height: 6px; margin-top: 4px; border-radius: 50%; background: #657083; } +.event > span.runtime { background: var(--green); } +.event > span.deploy { background: #8b7cf6; } +.event > span.security { background: #e5ad52; } +.placeholder { min-height: 420px; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; } +.placeholder svg { margin-bottom: 18px; color: #8074d8; } +.placeholder h2 { margin: 8px 0; } +.mobile-menu { display: none; border: 0; background: transparent; color: #aaa4e7; } +.spin { animation: spin 1s linear infinite; } +@keyframes spin { to { transform: rotate(360deg); } } + +@media (max-width: 900px) { + .shell { grid-template-columns: 1fr; } + .sidebar { position: fixed; z-index: 20; left: -240px; width: 224px; transition: left .2s ease; } + .sidebar.open { left: 0; box-shadow: 20px 0 60px #000; } + .mobile-menu { display: block; } + .topbar { padding: 0 18px; } + .metrics { grid-template-columns: repeat(2, 1fr); } + .dashboard-grid { grid-template-columns: 1fr; } + .span-2 { grid-column: span 1; } +} + +@media (max-width: 560px) { + .content { padding: 26px 16px 40px; } + .search { display: none; } + .topbar { justify-content: space-between; } + .metrics { grid-template-columns: 1fr 1fr; } + .page-heading { align-items: start; } + .page-heading p { max-width: 220px; line-height: 1.5; } + .runtime-row { flex-wrap: wrap; } + .pulse-bars { width: 100%; margin-left: 57px; } +} + + +.module-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; } +.module-card { min-height: 190px; padding: 18px; border: 1px solid var(--line); border-radius: 9px; background: linear-gradient(145deg, rgba(18,21,29,.96), rgba(12,15,21,.96)); } +.module-card h3, .model-detail h3, .timeline h3, .chat-shell h3 { margin: 8px 0 4px; font-size: 13px; } +.module-card p, .model-detail p, .timeline p, .chat-shell p { margin: 0; color: var(--muted); font-size: 10px; line-height: 1.5; } +.module-card-head, .project-card footer { display: flex; align-items: center; justify-content: space-between; } +.project-card .progress { margin: 34px 0 12px; } +.project-card footer { color: var(--muted); font-size: 9px; } +.kanban { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; align-items: start; } +.kanban-column { min-height: 380px; padding: 12px; border: 1px solid var(--line); border-radius: 9px; background: rgba(14,17,23,.8); } +.kanban-column > header { display: flex; justify-content: space-between; padding: 5px 3px 14px; color: #aeb4c0; font-size: 10px; } +.kanban-column > header b { padding: 1px 6px; border-radius: 8px; background: #242936; } +.task-card { margin-bottom: 9px; padding: 14px; border: 1px solid #252a35; border-radius: 8px; background: #12151c; } +.task-card h3 { margin: 10px 0 22px; font-size: 11px; } +.task-card select { width: 100%; margin-bottom: 12px; padding: 7px 8px; border: 1px solid #292f3b; border-radius: 7px; outline: none; color: #c8ccd5; background: #0c0f14; font: inherit; font-size: 9px; cursor: pointer; } +.task-card footer { display: flex; gap: 5px; align-items: center; color: var(--muted); font-size: 8px; } +.priority { font-size: 8px; text-transform: uppercase; color: #9b91e6; }.priority.critical { color: #ec7b82; }.priority.high { color: #e5b05e; } +.empty-state { padding: 35px 0; text-align: center; color: #596171; font-size: 9px; } +.agent-card { display: grid; grid-template-columns: auto 1fr auto; gap: 13px; align-items: start; } +.agent-avatar { width: 38px; height: 38px; display: grid; place-items: center; border-radius: 9px; color: #66d5a4; background: rgba(81,212,154,.1); } +.agent-avatar.violet { color: #a99cff; background: var(--accent-soft); } +.module-list { padding: 4px 18px; } +.model-detail { display: grid; grid-template-columns: 45px 1fr auto; align-items: center; gap: 14px; padding: 19px 0; border-bottom: 1px solid #1d222c; } +.route-rank { color: #6f63c9; font-size: 12px; font-weight: 700; } +.timeline { padding: 6px 20px; } +.timeline article { display: grid; grid-template-columns: 34px 1fr; gap: 12px; padding: 18px 0; border-bottom: 1px solid #1d222c; } +.timeline-icon { width: 30px; height: 30px; display: grid; place-items: center; border-radius: 50%; color: #70d8aa; background: rgba(81,212,154,.1); }.timeline-icon.security { color: #e5b05e; background: rgba(229,176,94,.1); } +.chat-shell { max-width: 760px; margin: auto; padding: 0; overflow: hidden; } +.chat-shell > header { display: grid; grid-template-columns: auto 1fr auto; gap: 12px; align-items: center; padding: 16px; border-bottom: 1px solid var(--line); } +.messages { min-height: 360px; padding: 22px; } +.message { max-width: 75%; margin-bottom: 12px; padding: 12px 14px; border-radius: 10px; background: #171b23; }.message.owner { margin-left: auto; background: #211d39; }.message strong { font-size: 9px; color: #9d91eb; } +.chat-shell form { display: grid; grid-template-columns: 1fr auto; gap: 8px; padding: 14px; border-top: 1px solid var(--line); } +.chat-shell input { min-width: 0; padding: 11px 13px; border: 1px solid #292f3b; border-radius: 8px; outline: none; color: #e7e9ef; background: #0c0f14; font: inherit; font-size: 10px; } +.chat-shell form button { width: 38px; border: 1px solid #443d7c; border-radius: 8px; color: #beb4ff; background: #211d39; } +@media (max-width: 900px) { .module-grid, .kanban { grid-template-columns: 1fr; } } +.quick-create { display: grid; grid-template-columns: minmax(180px, 360px) auto; gap: 8px; margin-bottom: 12px; } +.quick-create input { padding: 10px 12px; border: 1px solid #292f3b; border-radius: 8px; outline: none; color: #e7e9ef; background: #0c0f14; font: inherit; font-size: 10px; } +.quick-create button { padding: 0 14px; border: 1px solid #443d7c; border-radius: 8px; color: #c1b8ff; background: #211d39; font-size: 9px; cursor: pointer; } +.message.error { color: #e9a1a5; background: rgba(193,70,79,.12); border: 1px solid rgba(225,110,117,.2); } +.message.pending { opacity: .68; } +.chat-shell input:disabled, .chat-shell button:disabled { cursor: wait; opacity: .55; } +.settings-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; } +.settings-grid .module-card { min-height: 165px; } +.settings-grid .badge { display: inline-block; margin-top: 28px; } +.sidebar-bottom > button.active { color: #ececf5; background: var(--accent-soft); } +@media (max-width: 700px) { .settings-grid { grid-template-columns: 1fr; } } + +.owner { width: 100%; border: 0; color: inherit; background: transparent; text-align: left; cursor: pointer; } +.owner:hover { background: var(--accent-soft); border-radius: 8px; } + +.login-page { min-height: 100vh; display: grid; place-items: center; padding: 24px; } +.login-card { width: min(420px, 100%); padding: 32px; border: 1px solid var(--line); border-radius: 14px; background: linear-gradient(145deg, rgba(18,21,29,.98), rgba(10,12,18,.98)); box-shadow: 0 28px 90px rgba(0,0,0,.4); } +.login-brand { display: flex; align-items: center; gap: 12px; padding-bottom: 28px; border-bottom: 1px solid #1d222c; } +.login-brand strong { display: block; font-size: 13px; letter-spacing: .14em; } +.login-brand span { display: block; margin-top: 3px; color: var(--muted); font-size: 10px; } +.login-heading { padding: 28px 0 20px; } +.login-heading h1 { margin-top: 9px; font-size: 25px; } +.login-heading p { margin: 0; color: var(--muted); font-size: 11px; line-height: 1.6; } +.login-card form { display: grid; gap: 14px; } +.login-card label span { display: block; margin-bottom: 7px; color: #aab1bf; font-size: 10px; } +.login-card input { width: 100%; padding: 12px 13px; border: 1px solid #2a303b; border-radius: 8px; outline: none; color: #eef0f5; background: #0a0d12; font: inherit; font-size: 12px; } +.login-card input:focus { border-color: #6559b8; box-shadow: 0 0 0 3px rgba(139,124,246,.1); } +.login-card form button { display: flex; align-items: center; justify-content: center; gap: 8px; margin-top: 5px; padding: 12px; border: 1px solid #554a9b; border-radius: 8px; color: #e6e2ff; background: linear-gradient(135deg, #332b68, #211d43); cursor: pointer; } +.login-card form button:disabled { cursor: wait; opacity: .6; } +.login-error { margin: 0; padding: 10px 12px; border: 1px solid rgba(225,110,117,.25); border-radius: 8px; color: #efa2a7; background: rgba(193,70,79,.1); font-size: 10px; } +.login-card footer { margin-top: 24px; color: #626b7b; font-size: 8px; line-height: 1.5; text-align: center; } + +/* Project health row */ +.project-health-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 10px; } +.health-card { padding: 12px 16px; border: 1px solid var(--line); border-radius: 9px; background: linear-gradient(145deg, rgba(18,21,29,.96), rgba(12,15,21,.96)); text-align: center; } +.health-label { display: block; color: #717a8a; font-size: 8px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; } +.health-card strong { display: block; margin-top: 6px; font-size: 22px; letter-spacing: -.04em; } +.health-online { color: var(--green); } +.health-degraded { color: #e7b660; } +.health-offline { color: #e16e75; } +.health-unknown { color: #7e8799; } + +/* Runtime health indicators */ +.runtime-health-row { display: flex; align-items: center; gap: 6px; margin-top: 8px; } +.runtime-health-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; } +.runtime-health-dot.healthy { background: var(--green); box-shadow: 0 0 7px rgba(81,212,154,.4); } +.runtime-health-dot.unhealthy { background: #e7b660; box-shadow: 0 0 7px rgba(231,182,96,.3); } +.runtime-health-text { font-size: 9px; color: var(--muted); } +.runtime-incident { margin-top: 6px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } +.incident-badge { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border: 1px solid rgba(229,176,94,.3); border-radius: 6px; background: rgba(229,176,94,.08); color: #e5b05e; font-size: 9px; } + +/* Snapshot agents in dashboard */ +.snapshot-agents { margin-top: 14px; padding-top: 14px; border-top: 1px solid #1d222c; } +.snapshot-agents-head { display: flex; align-items: center; gap: 6px; font-size: 9px; color: #7065c8; font-weight: 700; letter-spacing: .1em; margin-bottom: 8px; text-transform: uppercase; } +.snapshot-agents-list { display: flex; flex-direction: column; gap: 6px; } +.snapshot-agent-item { display: flex; align-items: center; gap: 7px; padding: 4px 0; } +.snapshot-agent-item .name { font-size: 10px; color: #e8eaf0; } +.snapshot-agent-item .role-tag { margin-left: auto; font-size: 8px; padding: 1px 6px; border: 1px solid #343947; border-radius: 6px; color: #8991a1; } +.status-dot--sm { width: 5px; height: 5px; border-radius: 50%; flex-shrink: 0; } +.status-dot--sm.online { background: var(--green); } +.status-dot--sm.degraded { background: #e7b660; } +.status-dot--sm.offline { background: #e16e75; } + +/* Badge negative for offline */ +.badge.negative { color: #e16e75; background: rgba(225,110,117,.1); } + +@media (max-width: 900px) { .project-health-row { grid-template-columns: repeat(2, 1fr); } } diff --git a/frontend/src/types/agent.ts b/frontend/src/types/agent.ts new file mode 100644 index 0000000..4cf0dd8 --- /dev/null +++ b/frontend/src/types/agent.ts @@ -0,0 +1,29 @@ +export interface AgentInfo { + id: string + name: string + role: string + model: string + status: string + lastSeen?: string + workspace?: string + description?: string +} + +export interface AgentDetail extends AgentInfo { + agentDir?: string + subAgents?: string[] + identityName?: string +} + +export interface TeamMember { + id: string + name: string + role: string + model: string + status: string + lastSeen?: string + workspace?: string + description?: string + identity?: string + subAgents?: string[] +} diff --git a/frontend/src/types/config.ts b/frontend/src/types/config.ts new file mode 100644 index 0000000..d0855bc --- /dev/null +++ b/frontend/src/types/config.ts @@ -0,0 +1,19 @@ +export interface SecurityStatus { + authMethod: string + tokenConfig: { issuer: string; audience: string; refreshTokenDays: number; accessTokenMinutes: number } + rateLimit: string + passwordPolicy: string + cookieConfig: { httpOnly: boolean; secure: boolean; sameSite: string } + twoFactorEnabled: boolean + passkeyEnabled: boolean +} + +export interface ConfigFileInfo { + fileName: string + size: number + modifiedAt: string +} + +export interface ConfigFileDetail extends ConfigFileInfo { + content: string +} diff --git a/frontend/src/types/dashboard.ts b/frontend/src/types/dashboard.ts new file mode 100644 index 0000000..06843cd --- /dev/null +++ b/frontend/src/types/dashboard.ts @@ -0,0 +1,67 @@ +import type { AgentInfo } from './agent' + +export interface RuntimeStatus { + runtime: string + status: 'Online' | 'Degraded' | 'Offline' | 'Unknown' + latency?: string + detail?: string +} + +export interface ModelStatus { + provider: string + model: string + status: 'Online' | 'Degraded' | 'Offline' | 'Unknown' + isLocal: boolean + detail?: string +} + +export interface ProjectHealth { + online: number + offline: number + degraded: number + unknown: number +} + +export interface IncidentInfo { + taskId?: string + title?: string + since?: string +} + +export interface RoutingTarget { + priority: number + provider: string + model: string + purpose: string + status: 'Online' | 'Degraded' | 'Offline' | 'Unknown' + detail: string +} + +export type TaskState = 'Backlog' | 'In progress' | 'Blocked' | 'Done' +export const TASK_STATES: TaskState[] = ['Backlog', 'In progress', 'Blocked', 'Done'] + +export interface OperationsSnapshot { + generatedAt: string + runtime: RuntimeStatus + models: ModelStatus[] + metrics: { + activeAgents: number + queuedTasks: number + successRate: number + incidents: number + runtimeHealthy?: boolean + lastIncident?: IncidentInfo + } + projectHealth?: ProjectHealth + agents?: AgentInfo[] + projects: Array<{ id: string; name: string; status: string; progress: number; updatedAt?: string }> + tasks: Array<{ + id: string + title: string + state: TaskState + priority: string + projectId?: string | null + updatedAt: string + }> + activity: Array<{ id?: number; type: string; message: string; at: string }> +} diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts new file mode 100644 index 0000000..a8befee --- /dev/null +++ b/frontend/src/types/index.ts @@ -0,0 +1,4 @@ +export * from './agent' +export * from './config' +export * from './dashboard' +export * from './project' diff --git a/frontend/src/types/project.ts b/frontend/src/types/project.ts new file mode 100644 index 0000000..8f9cd41 --- /dev/null +++ b/frontend/src/types/project.ts @@ -0,0 +1,30 @@ +export interface MemoryFile { + name: string + path: string + size: number + modifiedAt: string +} + +export interface MemoryDetail extends MemoryFile { + content: string +} + +export interface MemorySearchResult { + name: string + path: string + excerpt: string + size: number +} + +export interface DocFile { + name: string + path: string + category: string + type: string + size: number + modifiedAt: string +} + +export interface DocDetail extends DocFile { + content: string +} diff --git a/frontend/src/utils/markdown.ts b/frontend/src/utils/markdown.ts new file mode 100644 index 0000000..48cc2ef --- /dev/null +++ b/frontend/src/utils/markdown.ts @@ -0,0 +1,108 @@ +/** + * Simple markdown-to-HTML renderer for Nexus. + * Handles common constructs without external dependencies. + */ +export function renderMarkdown(text: string): string { + let html = text + + // Escape HTML entities first + html = html + .replace(/&/g, '&') + .replace(//g, '>') + + // Code blocks (fenced) - process before other inline rules + html = html.replace(/```(\w*)\n([\s\S]*?)```/g, (_match, lang: string, code: string) => { + const langAttr = lang ? ` class="language-${lang}"` : '' + return `
${code.trim()}
` + }) + + // Inline code + html = html.replace(/`([^`]+)`/g, '$1') + + // Horizontal rules + html = html.replace(/^---$/gm, '
') + + // Headers + html = html.replace(/^###### (.+)$/gm, '
$1
') + html = html.replace(/^##### (.+)$/gm, '
$1
') + html = html.replace(/^#### (.+)$/gm, '

$1

') + html = html.replace(/^### (.+)$/gm, '

$1

') + html = html.replace(/^## (.+)$/gm, '

$1

') + html = html.replace(/^# (.+)$/gm, '

$1

') + + // Bold + html = html.replace(/\*\*(.+?)\*\*/g, '$1') + + // Italic + html = html.replace(/\*(.+?)\*/g, '$1') + + // Links [text](url) — block dangerous URL schemes + html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_match: string, text: string, url: string) => { + const lower = url.trim().toLowerCase() + if (lower.startsWith('javascript:') || lower.startsWith('data:') || lower.startsWith('vbscript:')) { + return `[blocked] ${text}` + } + return `${text}` + }) + + // Unordered lists + html = html.replace(/^- (.+)$/gm, '
  • $1
  • ') + html = html.replace(/((?:
  • .*<\/li>\n?)+)/g, '
      $1
    ') + + // Paragraphs: wrap remaining lines that aren't already wrapped + const lines = html.split('\n') + const result: string[] = [] + let inBlock = false + let blockTag = '' + + for (let i = 0; i < lines.length; i++) { + const line = lines[i] + const trimmed = line.trim() + + if (!trimmed) { + if (inBlock) { + result.push(``) + inBlock = false + } + continue + } + + // Already wrapped in a block-level tag + if (/^<(h[1-6]|ul|ol|pre|hr|li|p)/.test(trimmed) || /^<\/(ul|ol|pre)>/.test(trimmed) || /^<(ul|ol|pre)>/.test(trimmed)) { + if (inBlock) { + result.push(``) + inBlock = false + } + result.push(line) + continue + } + + // Closing tag + if (/^<\//.test(trimmed)) { + if (inBlock) { + result.push(``) + inBlock = false + } + result.push(line) + continue + } + + if (!inBlock) { + inBlock = true + blockTag = 'p' + result.push(`<${blockTag}>${trimmed}`) + } else { + // Within paragraph + result.pop() // Remove previous closing tag + const prevContent = result[result.length - 1]?.replace(/^

    /, '').replace(/<\/p>$/, '') ?? '' + result[result.length - 1] = `

    ${prevContent} ${trimmed}

    ` + } + } + + if (inBlock) { + result.push(``) + } + + return result.join('\n') +} diff --git a/frontend/src/views/AgentDetailView.vue b/frontend/src/views/AgentDetailView.vue new file mode 100644 index 0000000..e47d994 --- /dev/null +++ b/frontend/src/views/AgentDetailView.vue @@ -0,0 +1,424 @@ + + + + + diff --git a/frontend/src/views/AgentsIndexView.vue b/frontend/src/views/AgentsIndexView.vue new file mode 100644 index 0000000..34e7a1d --- /dev/null +++ b/frontend/src/views/AgentsIndexView.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/frontend/src/views/CalendarView.vue b/frontend/src/views/CalendarView.vue new file mode 100644 index 0000000..8af148a --- /dev/null +++ b/frontend/src/views/CalendarView.vue @@ -0,0 +1,397 @@ + + + + + diff --git a/frontend/src/views/DashboardView.vue b/frontend/src/views/DashboardView.vue new file mode 100644 index 0000000..9e99413 --- /dev/null +++ b/frontend/src/views/DashboardView.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/frontend/src/views/DocsView.vue b/frontend/src/views/DocsView.vue new file mode 100644 index 0000000..7373e7a --- /dev/null +++ b/frontend/src/views/DocsView.vue @@ -0,0 +1,485 @@ + + + + + diff --git a/frontend/src/views/IncidentsView.vue b/frontend/src/views/IncidentsView.vue new file mode 100644 index 0000000..3da851e --- /dev/null +++ b/frontend/src/views/IncidentsView.vue @@ -0,0 +1,456 @@ + + + + + diff --git a/frontend/src/views/LoginView.vue b/frontend/src/views/LoginView.vue new file mode 100644 index 0000000..65fd945 --- /dev/null +++ b/frontend/src/views/LoginView.vue @@ -0,0 +1,61 @@ + + + diff --git a/frontend/src/views/MemoryView.vue b/frontend/src/views/MemoryView.vue new file mode 100644 index 0000000..2c20ed1 --- /dev/null +++ b/frontend/src/views/MemoryView.vue @@ -0,0 +1,463 @@ + + + + + diff --git a/frontend/src/views/ProjectDetailView.vue b/frontend/src/views/ProjectDetailView.vue new file mode 100644 index 0000000..33418dc --- /dev/null +++ b/frontend/src/views/ProjectDetailView.vue @@ -0,0 +1,481 @@ + + + + + diff --git a/frontend/src/views/SecurityView.vue b/frontend/src/views/SecurityView.vue new file mode 100644 index 0000000..5b5472c --- /dev/null +++ b/frontend/src/views/SecurityView.vue @@ -0,0 +1,332 @@ + + + + + diff --git a/frontend/src/views/SettingsView.vue b/frontend/src/views/SettingsView.vue new file mode 100644 index 0000000..89ee660 --- /dev/null +++ b/frontend/src/views/SettingsView.vue @@ -0,0 +1,276 @@ + + + + + diff --git a/frontend/src/views/TeamView.vue b/frontend/src/views/TeamView.vue new file mode 100644 index 0000000..bd4c14a --- /dev/null +++ b/frontend/src/views/TeamView.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/frontend/tests/operations.test.ts b/frontend/tests/operations.test.ts new file mode 100644 index 0000000..608431e --- /dev/null +++ b/frontend/tests/operations.test.ts @@ -0,0 +1,18 @@ +import { describe, it, expect } from 'vitest' +import { setActivePinia, createPinia } from 'pinia' +import { useOperationsStore } from '../src/stores/operations' + +describe('operations store', () => { + it('initializes with fallback data', () => { + setActivePinia(createPinia()) + const store = useOperationsStore() + expect(store.snapshot.metrics.activeAgents).toBeGreaterThan(0) + expect(store.snapshot.runtime.runtime).toBe('OpenClaw') + }) + + it('has routing targets', () => { + setActivePinia(createPinia()) + const store = useOperationsStore() + expect(store.routing.length).toBeGreaterThan(0) + }) +}) diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json new file mode 100644 index 0000000..3365c92 --- /dev/null +++ b/frontend/tsconfig.app.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "noEmit": true, + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["vite/client"] + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] +} + diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..e891e30 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,8 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} + diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 0000000..20415e3 --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "noEmit": true, + "module": "ESNext", + "moduleResolution": "Bundler", + }, + "include": ["vite.config.ts"] +} + diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000..75ca18b --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,18 @@ +/// +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import tailwindcss from '@tailwindcss/vite' + +export default defineConfig({ + test: { + environment: 'node', + }, + plugins: [vue(), tailwindcss()], + server: { + proxy: { + '/api': 'http://localhost:8080', + '/health': 'http://localhost:8080', + }, + }, +}) + diff --git a/ops/deploy.sh b/ops/deploy.sh new file mode 100755 index 0000000..544cd5f --- /dev/null +++ b/ops/deploy.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Nexus Deployment Script +# Auf dem VPS-HOST ausführen, nicht im Container! +set -e + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +NEXUS_DIR="$(dirname "$SCRIPT_DIR")" + +echo "=== Nexus Deployment ===" +echo "Verzeichnis: $NEXUS_DIR" + +cd "$NEXUS_DIR" + +echo "" +echo "[1/3] Prüfe Konfiguration..." +docker compose config --quiet && echo " ✅ Konfiguration gültig" + +echo "" +echo "[2/3] Starte Stack..." +docker compose up -d + +echo "" +echo "[3/3] Warte auf Services..." +sleep 5 +docker compose ps + +echo "" +echo "=== Fertig ===" +echo "Nexus Web: http://nexus.noveria.net:18880" +echo "Login: vmbao62@hotmail.de" +echo "Passwort: wird beim ersten Start im Container-Log ausgegeben" +echo "" +echo "Logs: docker compose logs api | grep 'Initial owner'" +echo "Status: docker compose ps" +# Patch für compose.yaml +sed -i 's/${OWNER_PASSWORD:?Set OWNER_PASSWORD in .env}/${OWNER_PASSWORD:-}/' "$NEXUS_DIR/compose.yaml" diff --git a/ops/install-ollama-host.sh b/ops/install-ollama-host.sh new file mode 100755 index 0000000..e92f9a6 --- /dev/null +++ b/ops/install-ollama-host.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +set -euo pipefail + +MODEL="${OLLAMA_MODEL:-qwen3:4b}" +BIND_ADDRESS="${OLLAMA_BIND_ADDRESS:-172.18.0.1:11434}" +BACKUP_DIR="/root/security-backups/ollama-$(date -u +%Y%m%dT%H%M%SZ)" + +if [[ "${EUID}" -ne 0 ]]; then + echo "Run this script as root on the Ubuntu host." >&2 + exit 1 +fi + +mkdir -p "${BACKUP_DIR}" +if systemctl cat ollama.service >/dev/null 2>&1; then + systemctl cat ollama.service > "${BACKUP_DIR}/ollama.service.before.txt" +fi +if [[ -d /etc/systemd/system/ollama.service.d ]]; then + cp -a /etc/systemd/system/ollama.service.d "${BACKUP_DIR}/" +fi + +if ! command -v ollama >/dev/null 2>&1; then + curl -fsSL https://ollama.com/install.sh -o /tmp/ollama-install.sh + sh /tmp/ollama-install.sh +fi + +install -d -m 755 /etc/systemd/system/ollama.service.d +cat > /etc/systemd/system/ollama.service.d/10-openclaw.conf </dev/null; then + break + fi + if [[ "${attempt}" -eq 30 ]]; then + systemctl status ollama --no-pager + exit 1 + fi + sleep 2 +done + +OLLAMA_HOST="http://${BIND_ADDRESS}" ollama pull "${MODEL}" +OLLAMA_HOST="http://${BIND_ADDRESS}" ollama show "${MODEL}" >/dev/null +curl -fsS "http://${BIND_ADDRESS}/api/tags" +echo +echo "Ollama ${MODEL} is ready on ${BIND_ADDRESS}. Backup: ${BACKUP_DIR}" diff --git a/ops/nginx-nexus.conf b/ops/nginx-nexus.conf new file mode 100644 index 0000000..ef9fa8b --- /dev/null +++ b/ops/nginx-nexus.conf @@ -0,0 +1,49 @@ +# /etc/nginx/sites-available/nexus.noveria.net +# Symlink: ln -s /etc/nginx/sites-available/nexus.noveria.net /etc/nginx/sites-enabled/ + +server { + listen 80; + server_name nexus.noveria.net; + + # Let's Encrypt challenge + location /.well-known/acme-challenge/ { + root /var/www/html; + } + + location / { + return 301 https://$host$request_uri; + } +} + +server { + listen 443 ssl http2; + server_name nexus.noveria.net; + + # SSL wird per certbot automatisch befüllt + ssl_certificate /etc/letsencrypt/live/nexus.noveria.net/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/nexus.noveria.net/privkey.pem; + + # Security-Header + add_header Strict-Transport-Security "max-age=63072000" always; + add_header X-Content-Type-Options nosniff; + add_header X-Frame-Options DENY; + + client_max_body_size 16m; + + location / { + proxy_pass http://127.0.0.1:18880; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # API-Direktzugriff falls nötig + location /api/ { + proxy_pass http://127.0.0.1:18880; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} diff --git a/ops/setup-https.sh b/ops/setup-https.sh new file mode 100755 index 0000000..20c57fd --- /dev/null +++ b/ops/setup-https.sh @@ -0,0 +1,107 @@ +#!/bin/bash +# HTTPS-Setup für nexus.noveria.net +# Auf dem VPS-HOST ausführen! + +set -e + +echo "=== HTTPS Setup für nexus.noveria.net ===" + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +# 1. Zuerst nur HTTP-Config ausrollen (keine SSL-Referenz!) +echo "[1/5] Installiere HTTP-only Nginx-Config..." +sudo tee /etc/nginx/sites-available/nexus.noveria.net > /dev/null << 'NGINXEOF' +server { + listen 80; + server_name nexus.noveria.net; + + location /.well-known/acme-challenge/ { + root /var/www/html; + } + + location / { + proxy_pass http://127.0.0.1:18880; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +NGINXEOF + +sudo ln -sf /etc/nginx/sites-available/nexus.noveria.net /etc/nginx/sites-enabled/ +sudo nginx -t && sudo systemctl reload nginx +echo " ✅ HTTP-Config aktiv" + +# 2. Firewall +echo "[2/5] Firewall..." +if command -v ufw &>/dev/null; then + sudo ufw allow 80/tcp 2>/dev/null || true + sudo ufw allow 443/tcp 2>/dev/null || true + echo " ✅ ufw: 80+443 offen" +else + echo " ⏭ ufw nicht installiert" +fi + +# 3. HTTP-Test +echo "[3/5] Teste HTTP..." +sleep 1 +STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://nexus.noveria.net) +echo " HTTP-Status: $STATUS" + +# 4. Zertifikat holen +echo "[4/5] Fordere Let's-Encrypt-Zertifikat an..." +sudo certbot certonly --webroot -w /var/www/html -d nexus.noveria.net --non-interactive --agree-tos --email vmbao62@hotmail.de 2>&1 || { + echo " ⚠️ certbot fehlgeschlagen – manuell nachholen:" + echo " sudo certbot --nginx -d nexus.noveria.net" + exit 1 +} +echo " ✅ Zertifikat erhalten" + +# 5. HTTPS-Config ausrollen +echo "[5/5] Aktiviere HTTPS-Config..." +sudo tee /etc/nginx/sites-available/nexus.noveria.net > /dev/null << 'NGINXSSL' +server { + listen 80; + server_name nexus.noveria.net; + location /.well-known/acme-challenge/ { + root /var/www/html; + } + location / { + return 301 https://$host$request_uri; + } +} + +server { + listen 443 ssl http2; + server_name nexus.noveria.net; + + ssl_certificate /etc/letsencrypt/live/nexus.noveria.net/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/nexus.noveria.net/privkey.pem; + + add_header Strict-Transport-Security "max-age=63072000" always; + add_header X-Content-Type-Options nosniff; + add_header X-Frame-Options DENY; + + client_max_body_size 16m; + + location / { + proxy_pass http://127.0.0.1:18880; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +NGINXSSL + +sudo nginx -t && sudo systemctl reload nginx +echo " ✅ HTTPS aktiv" + +# Test +echo "" +sleep 2 +curl -s -o /dev/null -w "HTTPS-Status: %{http_code}\n" https://nexus.noveria.net +echo "" +echo "=== Fertig ===" +echo "Nexus: https://nexus.noveria.net" diff --git a/phases/changelog.md b/phases/changelog.md new file mode 100644 index 0000000..6b237da --- /dev/null +++ b/phases/changelog.md @@ -0,0 +1,31 @@ +# Changelog + +> Letzte Aktualisierung: 2026-06-09 + +- 2026-06-09: Phase 2 Backend + Frontend implementiert: Memory-Browser (Liste, Detail, Volltextsuche), Docs-Browser (Kategorien, Filter), Team-Org-Map (Karten + Kommunikationsmatrix), Security-Center (Auth, Tokens, Rate-Limit, Cookies). Backend-Build 0 Errors, Frontend-Build (vue-tsc + vite) 0 Errors. +- 2026-06-09: Researcher-Agent zum Team hinzugefügt (DeepSeek V4 Pro, Nur-Lese-Rechte, YouTube-Vision-Skill). Kommunikationsmatrix erweitert (Researcher↔Iris only). +- 2026-06-09: Phase 1 komplettiert: Live-Agentinventar, Dashboard-Metriken, Approval-Workflow, Healthchecks (PostgreSQL + Runtime), Tests (Backend 3/3 + Frontend 2/2). +- 2026-06-09: Nexus produktiv auf VPS deployed: Docker-Stack laeuft, Nginx mit Let's Encrypt SSL fuer nexus.noveria.net konfiguriert. +- 2026-06-09: Nexus-Owner-Passwort lokal in `.env` gesetzt; Backend synchronisiert das konfigurierte Passwort nun auch fuer bestehende Owner-Konten. + +- 2026-06-08: `nexus.md` in schlanke Indexdatei und Phase-Dateien aufgeteilt. +- 2026-06-08: Review-Workflows werden auf kurze, tokenarme Ausgabe ausgerichtet. +- 2026-06-08: Programmer hat Phase-1-Reste implementiert: + - ProjectDetailView (CRUD, Archiv, Tasks) + - SettingsView (Profil-Edit, Passwort-Änderung) + - Task-Edit (Inline-Titel, Priorität, Projekt-Zuweisung) + - Activity-Feed (Filter, Sort, Paginierung) + - Router auf echte Komponenten umgestellt + - Backend: Ollama/NVIDIA entfernt, nur OpenClaw aktiv + - Compose bereinigt +- 2026-06-08: Iris zum Chief of Staff mit Approval-Matrix aufgewertet +- 2026-06-08: Programmer hat volle Dateirechte (workspaceOnly: false, ask: off) +- 2026-06-08: Phase-1-Reste abgeschlossen: + - shadcn-vue bewusst aus dem Zielstack entfernt (reines CSS) und im Roadmap markiert + - `.env.template` erstellt (PostgreSQL, JWT, Owner, OpenClaw) + - `DELETE /api/v1/tasks/{id}` implementiert (nur Done/Backlog erlaubt, 403 bei anderen States) + - Task-Delete-Button mit Trash2-Icon und Confirmation-Dialog in ModuleView.vue (Teleport-Modal) + - `deleteTask`-Action im Operations-Store (mit Metrik-Neuberechnung) + - Phase-1-MVP-Status aktualisiert (Tasklöschung, Produktionswerte, Deployment-Entry) + - Deployment-Dokumentation überarbeitet (Build-Anleitung, Deployment-Plan, Offene-Arbeit-Liste) + - Changelog aktualisiert diff --git a/phases/deployment.md b/phases/deployment.md new file mode 100644 index 0000000..0edcabb --- /dev/null +++ b/phases/deployment.md @@ -0,0 +1,71 @@ +# Deployment + +> Letzte Aktualisierung: 2026-06-09 +> Status: ✅ Deployment abgeschlossen +> Live-URL: https://nexus.noveria.net + +## Ziel + +Nach Phase 1 soll das Mission-Control-Board deployt und die Infrastruktur so gesetzt sein, dass Bao direkt draufkommen kann. + +## Secrets und Konfiguration + +- [x] `.env.template` mit allen erforderlichen Variablen erstellt +- [x] Produktions-`.env` mit starken, getrennten Secrets angelegt +- [x] Migration des Produktionsstacks getestet + +## Build-Anleitung (lokal oder in CI) + +Die folgenden Befehle sind auf dem Build-System auszuführen. Vor dem Build müssen die Secrets in `.env` gesetzt sein. + +```bash +# 1. Backend veröffentlichen +cd backend +dotnet publish -c Release -o dist + +# 2. Frontend bauen (pnpm preferred) +cd ../frontend +pnpm install +pnpm build +# └─ Output: frontend/dist/ (statisch auslieferbar) + +# 3. Docker-Stack starten (wenn compose verwendet wird) +cd .. +docker compose up -d --build +``` + +Die Container holen sich ihre Umgebungsvariablen aus der `.env` im Projektstamm. +Stelle sicher, dass `.env` existiert und alle `***`-Platzhalter ersetzt sind. + +## Deployment-Plan + +1. `.env`-Datei auf dem VPS anlegen (alle Secrets generieren/setzen) +2. Backup vor produktiven Infrastrukturarbeiten +3. Docker-Stack auf dem VPS deployen +4. Datenbankmigration läuft automatisch beim Start (via `MigrateAsync`) +5. Nginx Proxy Manager und `nexus.noveria.net` verbinden +6. HTTPS, Header, Cookies und externe Erreichbarkeit validieren + +## Abgeschlossene Deployment-Arbeit + +- [x] Produktions-`.env` mit starken, getrennten Secrets angelegt (2026-06-08) +- [x] Datenbankmigration und kompletter Stack per Docker-Compose deployt +- [x] Nexus auf dem VPS deployt (Docker Compose) +- [x] Nginx mit Let's Encrypt SSL fuer `nexus.noveria.net` konfiguriert +- [x] HTTPS, Security-Header (HSTS, X-Content-Type-Options, X-Frame-Options), Cookies validiert +- [x] Externe Erreichbarkeit bestaetigt (2026-06-09) + +## Verifizierung (2026-06-09) + +- https://nexus.noveria.net → 200 OK, SPA geladen +- /health → Healthy +- /dashboard, /login → SPA-Routing korrekt +- /api/v1/operations/snapshot → 401 Unauthorized (Auth-Schutz aktiv) +- Let's Encrypt TLS-Zertifikat aktiv +- Nginx-Proxy → 127.0.0.1:18880 + +## Offene Arbeit + +- [ ] Backup-Strategie fuer Produktionsdaten definieren +- [ ] Docker-Logs und Container-Health-Monitoring einrichten +- [ ] `.gitignore` final pruefen diff --git a/phases/phase-1-mvp.md b/phases/phase-1-mvp.md new file mode 100644 index 0000000..feaf2e1 --- /dev/null +++ b/phases/phase-1-mvp.md @@ -0,0 +1,128 @@ +# Phase 1 MVP + +> Letzte Aktualisierung: 2026-06-09 +> Fokus: Mission-Control-Board bereitstellen und Infrastruktur anschliessen + +## Status + +- Gesamtfortschritt: ca. 95 % +- Produktiv live: ja (https://nexus.noveria.net) +- Letzter Build: Backend + Frontend erfolgreich + +## Prioritaet + +1. ~~Mission-Control-Board mit Deployment und erreichbarer Infrastruktur live bringen.~~ ✅ Erledigt. +2. ~~Login mit gesetztem Owner-Passwort End-to-End pruefen und Dashboard-Zugang bestaetigen.~~ ✅ Erledigt. +3. Restliche Produktfunktionen sauber ausbauen. +4. Tests und Healthchecks implementieren. + +## Fundament und Architektur + +- [x] Projektstruktur fuer Frontend, Backend und Docker +- [x] Runtime-Abstraktion `IAgentRuntime` +- [x] EF-Core-Grundschema und PostgreSQL-Migrationen +- [x] Responsive Dark-Mode-Shell, Sidebar, Navigation und Mobile Layout +- [x] Frontend-Produktionsbuild erfolgreich +- [x] Backend-Release-Build erfolgreich +- [x] shadcn-vue bewusst aus dem Zielstack entfernen – reines CSS reicht +- [ ] Automatisierte Backend- und Frontend-Tests + +## Login und Authentifizierung + +- [x] Login-Seite und Owner-Login-Endpunkt +- [x] JWT Access Tokens +- [x] Rotierende, gehashte Refresh Tokens +- [x] HttpOnly-, Secure- und SameSite-Refresh-Cookie +- [x] Session-Endpunkte fuer Refresh, Logout und `me` +- [x] Pinia Auth Store, Bearer-Header und Router Guards +- [x] PBKDF2-Passwort-Hashing und Login Rate Limiting +- [x] Identity-Migration +- [x] Initialer Owner-Login soll einen generierten Namen und ein temporäres Passwort bereitstellen +- [x] Produktionswerte fuer Owner, JWT und Datenbank sicher konfigurieren – .env.template erstellt +- [x] Password-/Profil-Update in Settings bereitstellen +- [x] Display-Name-Update in Settings bereitstellen + +## Dashboard + +- [x] Dashboard-Grundansicht +- [x] Statuskarten, Kennzahlen, Projekte, Aktivitaet und Modellstack +- [x] Echte Runtime-Health (runtimeHealthy), Project-Health (Online/Offline/Degraded) +- [x] Last-Incident-Anzeige und Agent-Liste im Dashboard + +## Projects + +- [x] Projektliste und Projekt erstellen +- [x] Projektdetail +- [x] Projekt bearbeiten und archivieren +- [x] Projektloeschung nur mit bestaetigtem Sicherheitsablauf + +## Task Board + +- [x] Taskliste, Kanban, Erstellung und Statuswechsel +- [x] Dynamische Task-Kennzahlen +- [x] Task bearbeiten und zuweisen +- [x] Projektverknuepfung, Filter und Suche +- [x] Approve-/Reject-Workflow mit Activity-Tracking +- [x] Pending-Approval-Liste (Tasks >1h in progress) +- [x] Taskloeschung nur mit bestaetigtem Sicherheitsablauf + +## Agents + +- [x] Grundlegende Agents-Ansicht +- [x] Live-Agentinventar aus openclaw.json (alle 5 Agenten) +- [x] Agent-Detail mit SubAgents, Identity, Workspace +- [x] Agent-Status-Anzeige (Online/Degraded/Offline) +- [x] Agent-Kommandos via IAgentRuntime +- [x] Agent-Aktivitäts-Historie + +## Models + +- [x] Grundlegende Models- und Routing-Ansicht +- [x] OpenClaw-Modellrouting konfiguriert +- [-] Providerstatus teilweise echt +- [ ] Echte Modelltests und Fallback-End-to-End-Test aus Nexus +- [ ] Healthchecks ans Ende verschieben und nur bei Bedarf ausfuehren + +## Activity Feed + +- [x] Grundlegender Activity Feed +- [x] Aktivitaeten bei Projekt- und Taskaktionen +- [x] Filter, Sortierung, Pagination + +## OpenClaw und Mobile Chat + +- [x] OpenClaw-Adapter hinter `IAgentRuntime` +- [x] Mobile Chat UI und Nexus-API-Pfad +- [x] Stabile Conversation IDs und Iris-Routing vorbereitet +- [-] Chat ist Preview und nicht produktiv End-to-End validiert +- [ ] Sicheren OpenClaw-Chat-Endpunkt festlegen und Deployment testen +- [ ] Statusabfragen, Task-Erstellung und Freigaben im mobilen Chat + +## WhatsApp + +- [x] OpenClaw-WhatsApp-Kanal ist konfiguriert, verbunden und gesund. +- [ ] Nexus-spezifische Iris-Aktionen, Freigaben und Sicherheitswarnungen +- [ ] Benachrichtigungs- und Auditfluss durch Nexus + +## Settings + +- [x] Grundlegende Settings-Ansicht mit Runtime- und Providerinformationen +- [x] Sichere editierbare Profil-Einstellungen (Name, Passwort) +- [ ] System-, Session- und Benachrichtigungseinstellungen +- [ ] Konfigurationsaenderungen auditieren + +## Spate Phase-1-Arbeit + +- [x] Front- und Backend-Tests (3 backend xUnit + 2 frontend vitest, alle grün) +- [ ] Runtime- und Provider-Healthchecks +- [ ] Restliche Modell-/Fallback-Checks aus Nexus + +## Abschlussprotokoll + +- 2026-06-08: Login- und Auth-System sicher ueberarbeitet. Backend-Release-Build und Frontend-Produktionsbuild erfolgreich. +- 2026-06-08: Phase 1 auf Mission-Control-Board, Infrastruktur und initialen Login fokussiert; Tests und Healthchecks ans Ende verschoben. +- 2026-06-08: `nexus.md` in schlanke Phase-Dateien aufgeteilt. +- 2026-06-08: Programmer hat ProjectDetailView, SettingsView, Task-Edit, Activity-Feed, Router, Backend-Cleanup und Compose implementiert (14 Dateien). +- 2026-06-08: Iris zum Chief of Staff mit Approval-Matrix aufgewertet. +- 2026-06-08: Task-Deletion (Backend + Frontend mit Confirmation-Dialog), .env.template, Deployment-Doku und Changelog erstellt. +- 2026-06-09: Festes Owner-Passwort in `.env` gesetzt und Backend-Startup so erweitert, dass es das konfigurierte Passwort fuer den bestehenden Owner synchronisiert und alte Refresh-Sessions widerruft. diff --git a/phases/phase-2.md b/phases/phase-2.md new file mode 100644 index 0000000..0eaa989 --- /dev/null +++ b/phases/phase-2.md @@ -0,0 +1,132 @@ +# Phase 2 – Intelligence & Governance + +> Letzte Aktualisierung: 2026-06-09 +> Inspiration: "OpenClaw is 100x better with Mission Control" (Alex Finn) + +## Status + +- Gesamtfortschritt: ~60 % +- Backend: ✅ (Build 0 Errors) +- Frontend: ✅ (Build 0 Errors, Tests 2/2) +- Deployment: 🚧 Bereit + +## Vision + +Phase 2 erweitert Nexus von einem Operations-Dashboard zu einer vollständigen +Mission-Control-Plattform. Der Fokus liegt auf Transparenz, Auditierbarkeit +und proaktiver Steuerung – genau die Punkte, die im YouTube-Video als +Game-Changer beschrieben werden. + +## 1. Calendar & Scheduler (🆕 inspiriert vom Video) + +**Problem:** "My agent is not proactive enough." – Ohne sichtbaren Kalender +weiß der Nutzer nicht, was der Agent geplant hat. + +**Lösung:** +- [ ] GET /api/v1/calendar – Cron-Jobs und geplante Tasks des OpenClaw-Gateways abrufen +- [ ] GET /api/v1/calendar/upcoming – Nächste 5 geplante Ausführungen +- [ ] Kalender-UI-Komponente (Monats-/Wochenansicht) im Frontend +- [ ] Anzeige: Job-Name, Schedule, letzte Ausführung, nächste Ausführung, Status +- [ ] Heartbeat-getriebene Aktualisierung (Polling via Dashboard) + +**Backend:** +- OpenClaw-Gateway-API für Cron-Jobs anzapfen (falls verfügbar) +- Fallback: Jobs aus der Gateway-Konfiguration parsen + +## 2. Memory Browser (🆕 inspiriert vom Video) + +**Problem:** Agent-Memories sind nur als rohe Markdown-Dateien sichtbar. +Kein einfacher Zugriff, keine Suche, keine Übersicht. + +**Lösung:** +- [x] GET /api/v1/memory – Liste aller Memory-Dateien +- [x] GET /api/v1/memory/{name} – Einzel-Memory mit Content +- [x] GET /api/v1/memory/search?q= – Volltextsuche mit Excerpts +- [x] Memory-Browser-UI: Suchleiste, Dateiliste, Markdown-Rendering + +**Backend:** +- Memory-Pfad: /home/node/.openclaw/workspace-iris/memory/ +- Dateien einlesen, parsen, cachen (nicht live parsen bei jedem Request) + +## 3. Docs Browser (🆕 inspiriert vom Video) + +**Problem:** Agent-generierte Dokumente (PRDs, Specs, Reports) sind +verstreut und nicht durchsuchbar. + +**Lösung:** +- [x] GET /api/v1/docs – Liste aller Dokumente mit Kategorien +- [x] GET /api/v1/docs/{**path} – Einzelnes Dokument +- [x] Docs-Browser-UI: Kategorien, Suche, Markdown-Vorschau + +**Backend:** +- Dokumente aus Workspace lesen (.md, .json, .txt) +- .learnings/ Ordner einbeziehen +- Projekt-Dokumente aus nexus/ einbeziehen + +## 4. Team Org Map (🆕 inspiriert vom Video) + +**Problem:** Agenten und ihre Rollen sind nicht übersichtlich dargestellt. +Keine kanonische Übersicht wer was macht. + +**Lösung:** +- [x] GET /api/v1/team – Team-Übersicht mit IDENTITY.md-Daten +- [x] Team-UI: Karten-Grid, Rollen, Status, Kommunikationsmatrix + +**Backend:** +- Agent-Konfiguration aus openclaw.json parsen +- IDENTITY.md + SOUL.md pro Agent einlesen für Mission/Rolle +- Kommunikationsmatrix aus allowAgents ableiten + +## 5. Security Center + +**Problem:** Kein zentraler Ort für Sicherheitsstatus und -Audit. + +**Lösung:** +- [x] GET /api/v1/security/status – Security-Übersicht +- [x] Security-Center-UI: Status-Karten (Auth, Tokens, Rate-Limit, Cookies) + +**Backend:** +- Login-Versuche tracken (erfolgreich/fehlgeschlagen) +- Session-Info aus Refresh-Token-Tabelle +- Rate-Limit-Status (falls abrufbar) + +## 6. TOTP 2FA & Passkeys + +- [ ] TOTP-Setup und -Verifikation +- [ ] WebAuthn/Passkey-Registrierung +- [ ] 2FA-UI in Settings +- [ ] Recovery-Codes + +## 7. Incident Diary (🆕) + +**Problem:** Incidents, Debugging-Sessions und Systemausfälle sind nirgends +festgehalten. Kein historisches Wissen über gelöste Probleme. + +**Lösung:** +- [ ] GET /api/v1/incidents – Liste aller Incident Reports aus `memory/incidents/` +- [ ] GET /api/v1/incidents/{name} – Einzelner Incident mit Markdown-Content +- [ ] Incident-Liste-UI: Tabelle mit Datum, Titel, Schweregrad +- [ ] Incident-Detail-UI: Markdown-Rendering, Chronologie, betroffene Systeme + +**Backend:** +- Incident-Pfad: `/home/node/.openclaw/workspace-iris/memory/incidents/` +- Dateinamen-Pattern: `YYYY-MM-DD-.md` +- Metadaten aus Frontmatter/Dokumentstruktur extrahieren + +## Abhängigkeiten + +- Calendar & Scheduler: Benötigt OpenClaw-Gateway-Cron-API (prüfen) +- Memory & Docs Browser: Read-only auf Workspace-Dateien +- Team Org Map: Baut auf Agent-Inventar aus Phase 1 auf +- Security Center: Baut auf Auth-System aus Phase 1 auf + +## Nächste Schritte + +1. ✅ Phase 1 abgeschlossen (Agent-Inventar, Dashboard-Metriken, Approval-Workflow) +2. ✅ Memory Browser +3. ✅ Docs Browser +4. ✅ Team Org Map +5. ✅ Security Center +6. 🚧 Calendar & Scheduler +7. 🚧 Incident Diary (🆕) +8. TOTP 2FA & Passkeys diff --git a/phases/phase-3.md b/phases/phase-3.md new file mode 100644 index 0000000..3769d87 --- /dev/null +++ b/phases/phase-3.md @@ -0,0 +1,12 @@ +# Phase 3 + +> Letzte Aktualisierung: 2026-06-08 + +- [ ] Office View +- [ ] Kalender +- [ ] Agent Collaboration Visualisierung +- [ ] Advanced Reporting + +## Fokus + +Phase 3 bleibt bewusst knapp und wird erst beim Start der Arbeit ausgebaut. diff --git a/phases/runtime-routing.md b/phases/runtime-routing.md new file mode 100644 index 0000000..9015546 --- /dev/null +++ b/phases/runtime-routing.md @@ -0,0 +1,23 @@ +# Runtime und Routing + +> Letzte Aktualisierung: 2026-06-08 + +## Aktive Modelle + +| Priorität | Modell | Zweck | Provider | +|-----------|--------|-------|----------| +| 1 | deepseek/deepseek-v4-flash | Programmer Agent | DeepSeek (über OpenClaw) | +| 2 | deepseek/deepseek-v4-pro | Reviewer Agent, Iris Fallback | DeepSeek (über OpenClaw) | +| 3 | openai/gpt-5.3-chat-latest | Iris Hauptmodell | OpenAI (über OpenClaw) | + +## Deaktiviert + +- **Ollama** (qwen3:4b): deaktiviert, funktioniert aktuell nicht. Wird später wieder aufgegriffen. +- **NVIDIA** (moonshotai/kimi-k2.6): vollständig entfernt. +- **Kimi 2.6**: vollständig entfernt. + +## Integration + +- Einzige aktive Integration: `OpenClawRuntime` über `IAgentRuntime` +- Keine direkten Provider-Registrierungen mehr im Backend (OllamaProvider, NvidiaProvider entfernt) +- Model-Routing läuft zentral über OpenClaw Gateway