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

+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