TimelixTimelix
Блочная система

Типы блоков

Все поддерживаемые типы блоков и их возможности

Тип блока определяет структуру поля content в базе данных и компонент, который его рендерит. Тип задаётся при создании и не меняется.

Обзор типов

ТипИконкаНазначение
text📝Текст с поддержкой Markdown
todo✅Задача с чекбоксом
container📦Контейнер для вложенных блоков
media🖼️Изображения, видео, аудио
link🔗URL-закладка с превью
unit_ref👤Ссылка на пользователя или агента
calendar📅Календарные события
database🗄️Коллекция структурированных данных
table📊Редактируемая таблица

text — Текстовый блок

Текстовый контент с поддержкой Markdown.

// content
{
  text: string;      // Markdown-строка
  format?: 'plain' | 'markdown'; // По умолчанию markdown
}

todo — Задача

Задача с чекбоксом. Используется в todo-листах, которые назначаются агентам.

// content
{
  completed?: boolean;          // основной флаг завершения
  checked?: boolean;            // legacy-совместимость
  description?: string;
  priority?: 'low' | 'medium' | 'high';
  assigneeId?: string;          // ID агента или пользователя
  selectedPlanId?: string | null;
  scheduledStartTime?: string | null;
  scheduledEndTime?: string | null;
  scheduledDuration?: number | null;
}

Todo-блоки — основной способ коммуникации между пользователем и агентами. Агент может читать, создавать, обновлять, удалять и дополнять задачи планами через MCP-инструменты readTodos, createTodo, updateTodo, deleteTodo, addTaskPlan, proposeTask.


container — Контейнер

Блок-обёртка для группировки других блоков. Сам по себе не содержит контента — только служит родителем для дочерних блоков.

// content
{
  label?: string;   // Подпись группы
}

Режим отображения дочерних блоков (list / flow / grid) хранится в layoutData контейнера.


media — Медиа

Изображения, видео и аудиофайлы. Файлы хранятся в MinIO (S3-совместимое хранилище).

// content
{
  url: string;
  mediaType: 'image' | 'video' | 'audio';
  fileName?: string;
  size?: number;      // байты
  mimeType?: string;
}

URL-закладка с автоматически загружаемым превью (Open Graph).

// content
{
  url: string;
  title?: string;      // Заголовок страницы (OG)
  description?: string;
  image?: string;      // URL превью-картинки
  favicon?: string;
}

unit_ref — Ссылка на пользователя / агента

Ссылка на ассистента или пользователя системы. Используется для упоминаний в блоках и назначений.

// content
{
  unitId: string;
  unitType: 'user' | 'agent';
  displayName?: string;
}

calendar — Календарный блок

Временной слот или событие с датой и временем.

// content
{
  startDate: string;    // ISO datetime
  endDate?: string;
  allDay?: boolean;
  recurrence?: string;  // RRULE строка
  color?: string;
}

database — База данных

Коллекция структурированных записей. Каждая запись — отдельный дочерний блок с заданной схемой.

// content
{
  schema: {
    fields: Array<{
      name: string;
      type: 'text' | 'number' | 'boolean' | 'date' | 'select';
      options?: string[];  // для select
    }>;
  };
  view?: 'table' | 'gallery' | 'list';
}

table — Таблица

Редактируемая таблица с поддержкой TanStack Table. В отличие от database, таблица хранит все данные прямо в блоке.

// content
{
  name: string;
  columns: Array<{
    id: string;
    header: string;
    type: 'text' | 'number' | 'boolean' | 'date';
  }>;
  rows: Array<{
    id: string;
    cells: Record<string, unknown>;
  }>;
  metadata: {
    createdAt: string;
    updatedAt: string;
    rowCount: number;
    columnCount: number;
  };
}

Интеграция с AI: таблицы автоматически форматируются в Markdown для агентов через formatTableForAI(). Агент может читать таблицу, понимать её структуру и предлагать изменения.

Компоненты:

  • TableEditor — полный редактор с TanStack Table
  • TableEditorModal — редактор в модальном окне
  • TablePreview — компактный просмотр внутри блока

Создание блока через хук

const { handleCreateBlock } = useBlocksPage();
 
// Создать текстовый блок
handleCreateBlock({
  type: 'text',
  title: 'Заголовок',
  parentId: 'parent-uuid',
  content: { text: 'Привет, мир!' },
});
 
// Создать задачу
handleCreateBlock({
  type: 'todo',
  title: 'Сделать дизайн',
  parentId: 'todolist-uuid',
  content: { checked: false, priority: 'high' },
});

Добавление нового типа

  1. Добавить тип в entities/block/types/blockTypes.ts
  2. Обновить схему БД (добавить миграцию через Drizzle)
  3. Создать компонент отображения в entities/block/ui/
  4. Задокументировать хук в entities/block/hooks/index.ts