feat: add launcher frontend MVP

This commit is contained in:
DCCONSTRUCTIONS
2026-05-01 18:39:59 +03:00
parent 63d21a7a57
commit e8c6e76885
46 changed files with 9497 additions and 0 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 MiB

+1
View File
@@ -0,0 +1 @@
<svg id="nodedc-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220.82 54.55"><defs><style>.cls-1{fill:#e2e1e1;}.cls-2{fill:#dbdbdb;stroke:#dbdbdb;stroke-miterlimit:10;stroke-width:0.75px;}</style></defs><path class="cls-1" d="M52.8,23.61,46.92,33.76,41.05,23.61H52.8m18-10.39H23.06L46.92,54.55Z"/><polygon class="cls-1" points="31.28 33.13 18.11 10.34 75.73 10.34 62.59 33.13 74.28 33.13 93.22 0 0 0 19.61 33.13 31.28 33.13"/><path class="cls-2" d="M116.35,18.49V1h1.27l10.34,15V1h1.33V18.49H128l-10.34-15v15Z"/><path class="cls-2" d="M140.43,18.64c-4.79,0-8.16-3.72-8.16-8.89S135.64.86,140.43.86s8.17,3.72,8.17,8.89S145.25,18.64,140.43,18.64Zm0-1.25c4,0,6.79-3.17,6.79-7.64s-2.77-7.64-6.79-7.64-6.77,3.17-6.77,7.64S136.44,17.39,140.43,17.39Z"/><path class="cls-2" d="M151.6,18.49V1h5.1c5.54,0,8.79,3.42,8.79,8.74s-3.25,8.74-8.79,8.74ZM153,17.24h3.75c4.77,0,7.42-2.92,7.42-7.49s-2.65-7.49-7.42-7.49H153Z"/><path class="cls-2" d="M168.49,1h10.77V2.26h-9.42V8.93h7.89v1.25h-7.89v7.06h9.74v1.25H168.49Z"/><path class="cls-2" d="M188.88,18.49V1H194c5.54,0,8.79,3.42,8.79,8.74s-3.25,8.74-8.79,8.74Zm1.35-1.25H194c4.77,0,7.41-2.92,7.41-7.49S198.75,2.26,194,2.26h-3.75Z"/><path class="cls-2" d="M205.15,9.75c0-5.24,3.19-8.89,8.11-8.89a6.8,6.8,0,0,1,7.1,5.52h-1.43a5.54,5.54,0,0,0-5.74-4.27c-4.05,0-6.64,3.17-6.64,7.64s2.54,7.64,6.59,7.64a5.46,5.46,0,0,0,5.74-4.29h1.43c-.75,3.52-3.4,5.54-7.15,5.54C208.27,18.64,205.15,15.05,205.15,9.75Z"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

+4
View File
@@ -0,0 +1,4 @@
<svg id="nodedc-mark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 93.22 54.55">
<path fill="#e2e1e1" d="M52.8 23.61 46.92 33.76 41.05 23.61H52.8m18-10.39H23.06l23.86 41.33Z"/>
<polygon fill="#e2e1e1" points="31.28 33.13 18.11 10.34 75.73 10.34 62.59 33.13 74.28 33.13 93.22 0 0 0 19.61 33.13 31.28 33.13"/>
</svg>

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 MiB

+567
View File
@@ -0,0 +1,567 @@
{
"clients": [
{
"id": "client_romashka",
"type": "company",
"name": "ООО Ромашка",
"legalName": "ООО Ромашка",
"status": "active",
"demoEndsAt": null,
"contactName": "Иван Петров",
"contactEmail": "ivan@romashka.ru",
"notes": "Основной demo-клиент для проверки Task Manager, NodeDC и deny-исключений.",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "client_roga_kopyta",
"type": "company",
"name": "ООО Рога и Копыта",
"legalName": "ООО Рога и Копыта",
"status": "demo",
"demoEndsAt": "2026-06-01T00:00:00Z",
"contactName": "Мария Иванова",
"contactEmail": "maria@example.ru",
"notes": "Клиент на демо-доступе, подключены только базовые сервисы.",
"createdAt": "2026-04-10T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "client_private_architect",
"type": "person",
"name": "Илья Архитектор",
"legalName": null,
"status": "suspended",
"demoEndsAt": "2026-04-20T00:00:00Z",
"contactName": "Илья Архитектор",
"contactEmail": "ilya@example.ru",
"notes": "Пример приостановленного частного клиента.",
"createdAt": "2026-03-14T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
}
],
"users": [
{
"id": "user_root",
"authentikUserId": "ak-root",
"name": "Root Admin",
"email": "root@nodedc.local",
"globalStatus": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "user_ivan",
"authentikUserId": "ak-ivan",
"name": "Иван Петров",
"email": "ivan@romashka.ru",
"globalStatus": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "user_vera",
"authentikUserId": "ak-vera",
"name": "Вера Соколова",
"email": "vera@romashka.ru",
"globalStatus": "active",
"createdAt": "2026-04-02T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "user_vasya",
"authentikUserId": "ak-vasya",
"name": "Василий Орлов",
"email": "vasya@romashka.ru",
"globalStatus": "active",
"createdAt": "2026-04-05T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "user_lena",
"authentikUserId": "ak-lena",
"name": "Лена Волкова",
"email": "lena@romashka.ru",
"globalStatus": "active",
"createdAt": "2026-04-08T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "user_maria",
"authentikUserId": "ak-maria",
"name": "Мария Иванова",
"email": "maria@example.ru",
"globalStatus": "active",
"createdAt": "2026-04-10T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "user_blocked",
"authentikUserId": "ak-blocked",
"name": "Олег Заблокирован",
"email": "oleg@romashka.ru",
"globalStatus": "blocked",
"createdAt": "2026-04-12T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
}
],
"memberships": [
{
"id": "mem_ivan_romashka",
"clientId": "client_romashka",
"userId": "user_ivan",
"role": "client_owner",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "mem_vera_romashka",
"clientId": "client_romashka",
"userId": "user_vera",
"role": "client_admin",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "mem_vasya_romashka",
"clientId": "client_romashka",
"userId": "user_vasya",
"role": "member",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "mem_lena_romashka",
"clientId": "client_romashka",
"userId": "user_lena",
"role": "member",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "mem_blocked_romashka",
"clientId": "client_romashka",
"userId": "user_blocked",
"role": "member",
"status": "disabled",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "mem_maria_roga",
"clientId": "client_roga_kopyta",
"userId": "user_maria",
"role": "client_owner",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "mem_ivan_roga",
"clientId": "client_roga_kopyta",
"userId": "user_ivan",
"role": "client_admin",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
}
],
"groups": [
{
"id": "group_romashka_leads",
"clientId": "client_romashka",
"name": "Руководство",
"description": "Собственники и руководители клиента.",
"memberIds": [
"user_ivan",
"user_vera"
],
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "group_romashka_accounting",
"clientId": "client_romashka",
"name": "Бухгалтерия",
"description": "1C и финансовые сценарии.",
"memberIds": [
"user_lena"
],
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "group_romashka_ops",
"clientId": "client_romashka",
"name": "Операторы",
"description": "Ежедневная работа в задачах и тендерах.",
"memberIds": [
"user_vasya",
"user_lena"
],
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "group_roga_demo",
"clientId": "client_roga_kopyta",
"name": "Демо-команда",
"description": "Пилотный контур клиента.",
"memberIds": [
"user_maria",
"user_ivan"
],
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
}
],
"services": [
{
"id": "service_nodedc",
"slug": "nodedc",
"title": "NodeDC",
"subtitle": "Агентная платформа",
"description": "Сборка, запуск и мониторинг агентных workflow.",
"fullDescription": "NodeDC используется для настройки агентных процессов, визуальной оркестрации, интеграций и runtime-мониторинга.",
"url": "https://dev.handhdc.ru",
"launchUrl": "https://dev.handhdc.ru/sso/launch",
"accentColor": "#B5FF5A",
"fallbackGradient": "linear-gradient(128deg, rgba(181, 255, 90, 0.84), rgba(37, 58, 36, 0.86) 42%, #0A0D10 82%)",
"status": "active",
"order": 10,
"authentikApplicationSlug": "nodedc",
"authentikGroupName": "service-nodedc",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T15:29:56.933Z",
"coverImageUrl": "/storage/uploads/1777649382309-49d8c393-2026-05-01-17.31.21.jpg",
"coverMediaKind": "image",
"coverMediaSource": "file",
"coverMediaFileName": "1777649382309-49d8c393-2026-05-01-17.31.21.jpg",
"ambientVideoUrl": "/storage/uploads/1777649395844-a878de95-090aff247929335.69e6521716ea9.gif",
"ambientMediaKind": "gif",
"ambientMediaSource": "file",
"ambientMediaFileName": "1777649395844-a878de95-090aff247929335.69e6521716ea9.gif"
},
{
"id": "service_task_manager",
"slug": "task-manager",
"title": "Task Manager",
"subtitle": "Операционный слой",
"description": "Задачи, контуры предприятия, процессы и AI-функции поверх задачника.",
"fullDescription": "Task Manager основан на архитектуре Plane и расширен AI-функциями NODE.DC.",
"url": "https://tasks.handhdc.ru",
"launchUrl": "https://tasks.handhdc.ru/sso/launch",
"accentColor": "#D7C8FF",
"fallbackGradient": "linear-gradient(132deg, rgba(215, 200, 255, 0.82), rgba(51, 41, 79, 0.9) 46%, #0B0D10 84%)",
"status": "active",
"order": 20,
"authentikApplicationSlug": "task-manager",
"authentikGroupName": "service-task-manager",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "service_1c",
"slug": "1c-assistant",
"title": "1C Assistant",
"subtitle": "Бухгалтерский ассистент",
"description": "Вопросы к 1С, точные выборки и доказательная навигация по данным.",
"fullDescription": "Ассистент для бухгалтерских запросов, анализа операций, остатков и документов.",
"url": "https://1c.handhdc.ru",
"launchUrl": "https://1c.handhdc.ru/sso/launch",
"accentColor": "#8FD7FF",
"fallbackGradient": "linear-gradient(126deg, rgba(143, 215, 255, 0.8), rgba(32, 61, 80, 0.9) 44%, #080B0F 84%)",
"status": "maintenance",
"order": 30,
"authentikApplicationSlug": "1c-assistant",
"authentikGroupName": "service-1c-assistant",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "service_tender",
"slug": "tender-agent",
"title": "Tender Agent",
"subtitle": "Госзакупки и тендеры",
"description": "Поиск, анализ и подготовка тендерных решений.",
"fullDescription": "Сервис собирает тендерные данные, строит выжимку рисков и помогает подготовить пакет участия.",
"url": "https://tender.handhdc.ru",
"launchUrl": "https://tender.handhdc.ru/sso/launch",
"accentColor": "#FFD166",
"fallbackGradient": "linear-gradient(135deg, rgba(255, 209, 102, 0.84), rgba(74, 53, 19, 0.92) 42%, #0B0D10 86%)",
"status": "active",
"order": 40,
"authentikApplicationSlug": "tender-agent",
"authentikGroupName": "service-tender-agent",
"createdAt": "2026-04-03T10:00:00Z",
"updatedAt": "2026-05-01T15:37:01.591Z",
"coverImageUrl": "/storage/uploads/1777649809136-7935fb4d-2026-05-01-18.36.20.jpg",
"coverMediaKind": "image",
"coverMediaSource": "file",
"coverMediaFileName": "1777649809136-7935fb4d-2026-05-01-18.36.20.jpg"
},
{
"id": "service_digital_twin",
"slug": "digital-twin",
"title": "Digital Twin",
"subtitle": "3D и пространственные данные",
"description": "Просмотр цифровых двойников, карт и объектных сцен.",
"fullDescription": "Витрина геометрии, объектов, слоёв и статусов инфраструктуры.",
"url": "https://twin.handhdc.ru",
"launchUrl": "https://twin.handhdc.ru/sso/launch",
"accentColor": "#76E4F7",
"fallbackGradient": "linear-gradient(140deg, rgba(118, 228, 247, 0.82), rgba(23, 69, 87, 0.92) 47%, #080B0F 86%)",
"status": "active",
"order": 50,
"authentikApplicationSlug": "digital-twin",
"authentikGroupName": "service-digital-twin",
"createdAt": "2026-04-05T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "service_dm",
"slug": "digital-modules",
"title": "Digital Modules",
"subtitle": "Будущие модули",
"description": "Скрытый каталог модулей для root-admin preview.",
"fullDescription": "Площадка для будущих цифровых модулей NODE.DC.",
"url": "https://dm.handhdc.ru",
"launchUrl": "https://dm.handhdc.ru/sso/launch",
"accentColor": "#FF9AC2",
"fallbackGradient": "linear-gradient(135deg, rgba(255, 154, 194, 0.78), rgba(76, 41, 64, 0.9) 44%, #090B0F 86%)",
"status": "hidden",
"order": 60,
"authentikApplicationSlug": "digital-modules",
"authentikGroupName": "service-digital-modules",
"createdAt": "2026-04-10T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "service_internal",
"slug": "internal-tools",
"title": "Internal Tools",
"subtitle": "Внутренний контур",
"description": "Отключённый сервис для проверки диагностики root-admin.",
"fullDescription": "Не показывается обычным пользователям, виден root-admin в каталоге.",
"url": "https://internal.handhdc.ru",
"launchUrl": null,
"accentColor": "#F97373",
"fallbackGradient": "linear-gradient(135deg, rgba(249, 115, 115, 0.78), rgba(73, 32, 32, 0.92) 43%, #090B0F 86%)",
"status": "disabled",
"order": 70,
"authentikApplicationSlug": "internal-tools",
"authentikGroupName": "service-internal-tools",
"createdAt": "2026-04-12T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
}
],
"grants": [
{
"id": "grant_romashka_task",
"serviceId": "service_task_manager",
"targetType": "client",
"targetId": "client_romashka",
"appRole": "member",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "grant_romashka_nodedc_leads",
"serviceId": "service_nodedc",
"targetType": "group",
"targetId": "group_romashka_leads",
"appRole": "admin",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "grant_romashka_1c_accounting",
"serviceId": "service_1c",
"targetType": "group",
"targetId": "group_romashka_accounting",
"appRole": "member",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "grant_romashka_tender_ops",
"serviceId": "service_tender",
"targetType": "group",
"targetId": "group_romashka_ops",
"appRole": "viewer",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "grant_romashka_twin_vasya",
"serviceId": "service_digital_twin",
"targetType": "user",
"targetId": "user_vasya",
"appRole": "viewer",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "grant_roga_task",
"serviceId": "service_task_manager",
"targetType": "client",
"targetId": "client_roga_kopyta",
"appRole": "member",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "grant_roga_nodedc",
"serviceId": "service_nodedc",
"targetType": "client",
"targetId": "client_roga_kopyta",
"appRole": "viewer",
"status": "active",
"createdAt": "2026-04-01T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
}
],
"exceptions": [
{
"id": "exception_lena_task_deny",
"serviceId": "service_task_manager",
"userId": "user_lena",
"type": "deny",
"reason": "Индивидуально отключён Task Manager на период ревизии доступа.",
"createdAt": "2026-04-28T10:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
}
],
"invites": [
{
"id": "invite_romashka_analyst",
"clientId": "client_romashka",
"email": "analyst@romashka.ru",
"role": "member",
"invitedByUserId": "user_ivan",
"token": "romashka-analyst-demo",
"expiresAt": "2026-05-15T12:00:00Z",
"status": "sent",
"createdAt": "2026-04-30T12:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "invite_roga_admin",
"clientId": "client_roga_kopyta",
"email": "ops@example.ru",
"role": "client_admin",
"invitedByUserId": "user_maria",
"token": "roga-admin-demo",
"expiresAt": "2026-05-18T12:00:00Z",
"status": "created",
"createdAt": "2026-04-30T14:00:00Z",
"updatedAt": "2026-05-01T09:00:00Z"
}
],
"syncStatuses": [
{
"id": "sync_romashka_auth",
"objectId": "client_romashka",
"objectName": "ООО Ромашка",
"objectType": "client",
"target": "authentik",
"state": "synced",
"lastSyncAt": "2026-05-01T08:00:00Z",
"error": null,
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "sync_task_auth",
"objectId": "service_task_manager",
"objectName": "Task Manager",
"objectType": "service",
"target": "authentik",
"state": "synced",
"lastSyncAt": "2026-05-01T08:00:00Z",
"error": null,
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "sync_lena_task",
"objectId": "exception_lena_task_deny",
"objectName": "Deny: Лена / Task Manager",
"objectType": "grant",
"target": "task_manager",
"state": "pending",
"lastSyncAt": null,
"error": null,
"updatedAt": "2026-05-01T09:00:00Z"
},
{
"id": "sync_roga_nodedc",
"objectId": "client_roga_kopyta",
"objectName": "ООО Рога и Копыта",
"objectType": "client",
"target": "nodedc",
"state": "error",
"lastSyncAt": "2026-05-01T08:00:00Z",
"error": "OIDC binding ещё не создан для demo-клиента.",
"updatedAt": "2026-05-01T09:00:00Z"
}
],
"auditEvents": [
{
"id": "audit_1",
"at": "2026-05-01T08:40:00Z",
"actorUserId": "user_root",
"actorName": "Root Admin",
"action": "Создан сервис",
"objectType": "service",
"objectName": "Digital Modules",
"clientId": "client_romashka",
"result": "success",
"details": null
},
{
"id": "audit_2",
"at": "2026-05-01T08:20:00Z",
"actorUserId": "user_ivan",
"actorName": "Иван Петров",
"action": "Создан invite",
"objectType": "invite",
"objectName": "analyst@romashka.ru",
"clientId": "client_romashka",
"result": "success",
"details": "Срок действия до 15.05.2026"
},
{
"id": "audit_3",
"at": "2026-04-30T17:10:00Z",
"actorUserId": "user_root",
"actorName": "Root Admin",
"action": "Создано deny-исключение",
"objectType": "access",
"objectName": "Лена / Task Manager",
"clientId": "client_romashka",
"result": "warning",
"details": "Индивидуальное правило перекрыло client grant."
},
{
"id": "audit_4",
"at": "2026-04-30T16:00:00Z",
"actorUserId": "user_root",
"actorName": "Root Admin",
"action": "Ошибка синхронизации",
"objectType": "sync",
"objectName": "ООО Рога и Копыта / NodeDC",
"clientId": "client_romashka",
"result": "error",
"details": "Нет application binding."
}
]
}
+1
View File
@@ -0,0 +1 @@
Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB