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
This commit is contained in:
Bao
2026-06-09 16:31:42 +02:00
commit eeb6174de0
248 changed files with 19706 additions and 0 deletions
+61
View File
@@ -0,0 +1,61 @@
<script setup lang="ts">
import { ref } from 'vue'
import { Command, LockKeyhole } from '@lucide/vue'
import { useRoute, useRouter } from 'vue-router'
import { useAuthStore } from '../stores/auth'
const auth = useAuthStore()
const route = useRoute()
const router = useRouter()
const email = ref('')
const password = ref('')
const error = ref('')
async function submit() {
error.value = ''
try {
await auth.login(email.value.trim(), password.value)
const target = typeof route.query.redirect === 'string' && route.query.redirect.startsWith('/')
? route.query.redirect
: '/dashboard'
await router.replace(target)
} catch (reason) {
error.value = reason instanceof Error ? reason.message : 'Login failed.'
}
}
</script>
<template>
<main class="login-page">
<section class="login-card">
<div class="login-brand">
<div class="brand-mark"><Command :size="20" /></div>
<div><strong>NEXUS</strong><span>Noveria Operations</span></div>
</div>
<div class="login-heading">
<span class="eyebrow">OWNER ACCESS</span>
<h1>Sign in to mission control</h1>
<p>Use your private owner credentials to continue.</p>
</div>
<form @submit.prevent="submit">
<label>
<span>Email</span>
<input v-model="email" type="email" autocomplete="username" required maxlength="120" />
</label>
<label>
<span>Password</span>
<input v-model="password" type="password" autocomplete="current-password" required minlength="10" maxlength="200" />
</label>
<p v-if="error" class="login-error" role="alert">{{ error }}</p>
<button type="submit" :disabled="auth.loading">
<LockKeyhole :size="15" />
{{ auth.loading ? 'Signing in...' : 'Sign in' }}
</button>
</form>
<footer>Protected owner session · Refresh token stored in a secure HTTP-only cookie</footer>
</section>
</main>
</template>