Инициализировать репозиторий «Дейл»

Первый коммит: модульный монолит ядра (.NET 10) и gRPC-сервисы
ai/ml/telegram, фронтенд Vue 3/Vite/Tailwind, документация (ТЗ,
инструкция пользователя, техдокументация, код-стайл), бэклог,
скрипты развёртывания и архив прототипа LeadRadar.
This commit is contained in:
Rustam Khalimov
2026-09-11 02:50:17 +03:00
commit 9e07568ddd
1402 changed files with 177470 additions and 0 deletions
@@ -0,0 +1,58 @@
namespace Deal.Modules.Discovery.Application.Models;
/// <summary>
/// Создание задачи поиска — вход POST /api/discovery/tasks (DiscoveryTaskDraft: поля с дефолтами сервиса).
/// </summary>
/// <remarks>
/// 1:1 с TaskCreate discovery_routes.py L50–60 и нормализацией create_task discovery.py L234–282: name — строка
/// (обязательная, Trim); description/keywords/minSubscribers/lang/autoJoin имеют дефолты в сервисе;
/// threshold/sampleSize/planJoins — null → дефолты (threshold/sampleSize — из настроек discEvalThreshold/
/// discEvalSample, planJoins — 1). plan_joins дополнительно проходит план-бюджет (DiscoveryPlanGuard).
/// </remarks>
public sealed record DiscoveryTaskDraft
{
/// <summary>
/// Название задачи (после Trim непустое — иначе 400 «Укажите название задачи»).
/// </summary>
public string Name { get; init; } = string.Empty;
/// <summary>
/// Описание ниши/цели (может быть пустым).
/// </summary>
public string Description { get; init; } = string.Empty;
/// <summary>
/// Ключевые слова поиска; null → пустой список (start до добавления ключей — 400).
/// </summary>
public IReadOnlyList<string>? Keywords { get; init; }
/// <summary>
/// Минимальное число участников; null → 0.
/// </summary>
public int? MinSubscribers { get; init; }
/// <summary>
/// Язык источников: ru|any; null/иное → ru.
/// </summary>
public string? Lang { get; init; }
/// <summary>
/// Порог подходящих сообщений, % (кламп 1..100); null → настройка discEvalThreshold.
/// </summary>
public int? Threshold { get; init; }
/// <summary>
/// Размер выборки сообщений при оценке (кламп ≥1); null → настройка discEvalSample.
/// </summary>
public int? SampleSize { get; init; }
/// <summary>
/// План авто-вступлений (1..discJoinLimit + бюджет); null → 1.
/// </summary>
public int? PlanJoins { get; init; }
/// <summary>
/// Авто-вступления воркером; null → false.
/// </summary>
public bool? AutoJoin { get; init; }
}