Расширения
Расширения — это механизм добавления новых возможностей в Creatium Max с помощью кода. Каждое расширение работает в изолированной песочнице.
Создание расширения
Самый простой способ создать расширение - это загрузить шаблон попросить ИИ-агента (Claude Code, Codex, Cursor и тд.) сделать нужный вам функционал. В архиве шаблона есть все нужные инструкции и вся документация, которая может потребоваться агенту.
Но можно использовать и обычный ChatGPT, которому достаточно основу функции прислать, чтобы он сделал всю работу.
export default async function (req: Request): Promise<Response> {
// Напиши функцию отправки письма на почту
}Структура файлов
my-extension/
CLAUDE.md и AGENTS.md - документация для ИИ агентов
deno.json - информация о расширении
migrate.ts - скрипт обновления расширения (если нужно)
api/
public/
…публично доступные ендпоинты
admin/
…ендпоинты, доступные только админам
actions/
…действия, доступные в редакторе сценариев
cron/
…скрипты, запускаемые по расписанию
static/
public/
…статические файлы, доступные публично
admin/
index.html - главная страницы расширения в админке
…статические файлы, доступные только админам
storage/
public/
…загруженные файлы, доступные публично
admin/
…загруженные файлы, доступные только админам
data.db - файл базы данных sqlite
…хранилище файлов (uploads, временные файлы и тд)Идентификатор расширения
Можно использовать символы латинского алфавита, цифры и “-”.
Идентификаторы должны быть уникальными: в рамках одного проекта нельзя установить два расширения с одинаковым идентификатором.
Поэтому в качестве стандарта предлагается использовать формат “разработчик-название”. Например “viktor-cart”, где “viktor” это имя разработчика, студии или компании, а cart это название расширения.
/deno.json
Обязательный файл, в котором указывается идентификатор, версия и имя расширения. Идентификатор всегда соответствует названию папки расширения.
{
"name": "my-extension",
"version": "0.0.1",
"title": "Мое расширение"
}/api - HTTP ендпоинты
В папках /api/public и /api/admin лежат публично доступные ендпоинты. public досупны для любых запросов, admin только тем, кто авторизован в /cr-admin.
Каждый ендпоинт - это функция, которая на вход получает Request, а возвращает Response.
export default async function (req: Request): Promise<Response> {
return Response.json({ message: "Hello, world!" });
}Название файла напрямую отражается в URL. Файл /api/public/hello.ts доступен по адресу https://example.com/cr-ext/my-extension/api/public/hello.
/actions - действия для сценариев
В папке /actions находятся функции, которые автоматически подключаются в редактор сценариев, и которые могут быть вызваны из любого сценария. Формат такой же, как в /api, но работа только с JSON в обе стороны.
Чтобы в редакторе сценариев отображались именованные поля с описаниями, можно использовать JSON Schema в экспорте config.input.
export const config = {
title: "Отправить письмо",
input: {
description: "Отправляет письмо на указанный адрес",
type: "object",
properties: {
text: {
description: "Полный текст письма",
type: "string"
},
subject: {
description: "Тема письма",
type: "string"
},
email: {
description: "Кому отправить?",
type: "string"
}
},
required: [ "text", "subject", "email" ]
}
}Если схема указана, она в том числе будет использоваться и для валидации входящих значений.
/cron - задачи по расписанию
В папке /cron находятся функции, которые переодически выполняются по указанному расписанию.
Запуск каждую минуту:
export const config = {
schedule: "* * * * *"
}Каждый день в 8 утра:
export const config = {
schedule: "0 8 * * *"
}И так далее. Это стандартный формат crontab.
/static - статические файлы
В папках /static/public и /static/admin лежат статические файлы, которые доступны всем и только админам, соответственно.
Если есть файл /static/admin/index.html, то он используется в качестве главной страницы расширения в админке.
/storage - постоянное хранилище файлов и баз данных
В этой папке скрипты расширения могут сохранять файлы любого формата. Это единственная папка, доступная для редактирования.
В ней же можно хранить базы данных SQLite (файлы .db или .sqlite), например /storage/data.db, и работать с ними, используя node:sqlite в Deno.
На сервере папка находится по тому же адресу, что и на сайте:
/cr-ext/my-extension/storage/*
Админ интерфейс
Главная страницы расширения в админке - это /static/admin/index.html, которая показывается при открытии расширения.
Все, что внутри /static/admin и /api/admin доступно только после авторизации в админке проекта /cr-admin, то есть дополнительно слои безопасности добавлять не нужно.
Сессии и пользователи
Ендпоинты в /api получают на вход 2 HTTP-заголовка: X-Cre-Session-Id и X-Cre-Member-Id, которые невозможно подменить. В этих заголовках передаются идентификаторы сессии и пользователя из таблиц “Сессии” и “Пользователи” в базе данных проекта.
Используя эти заголовки можно делать функционал, привязанный к посетителям и пользователям.
Запросы к localhost
Чтобы делать запросы к своим ендпоинтам, или ендпоинтам других расширений, расширение может использовать localhost.
Например, запрос к http://localhost/cr-ext/my-extension/api/public/example будет работать независимо от того, на каком домене находится проект.
Ограничения
Чтобы одно расширение не могло нагрузить сервер и замедлить весь проект, на среду выполнения расширений установлены аппаратные ограничения: 0.5 CPU, 512MB RAM.
Эти ограничения обеспечивают стабильность: даже если расширение содержит бесконечный цикл или утечку памяти, проект продолжит работу.
Таймауты
По умолчанию все скрипты (api, actions) имеют таймаут в 30 секунд, а задачи по расписанию (cron) - 5 минут. Эти значения можно изменить в config.timeout.
export const config = {
timeout: 120 // 2 минуты
}Остались вопросы? — Напишите нам в чат поддержки будучи авторизованным в своем аккаунте cremax.ru или через чат поддержки в Телеграме: @CreatiumMaxSupportBot