Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
56a5643
docs(deploy): document setup and production updates
minkinad Oct 6, 2026
da69a79
docs(dev): explain local workflow and verification
minkinad Oct 6, 2026
477a5ff
docs(architecture): diagram component and plugin flows
minkinad Oct 6, 2026
171c69c
docs(plugins): add first extension walkthrough
minkinad Oct 6, 2026
3637950
docs(assistant): explain model context request flow
minkinad Oct 6, 2026
f04bc2c
docs(api): point HTTP readers to SDK workflows
minkinad Oct 6, 2026
3e06555
docs(readme): refresh product overview and add wordmark
minkinad Oct 6, 2026
52f88ec
docs(site): expose new guides in navigation
minkinad Oct 6, 2026
8c3f8ae
chore(github): add contribution templates
minkinad Oct 6, 2026
9471bc5
Merge feat-docks-min into main
minkinad Oct 6, 2026
fca91dc
fix(gitignore): include vitepress
minkinad Oct 6, 2026
e44d402
fix(api): unify machine-readable error details
minkinad Oct 7, 2026
b14b23a
feat(contracts): define shared realtime event protocol
minkinad Oct 7, 2026
9b4276c
feat(core): publish scoped record events after commit
minkinad Oct 7, 2026
b97d8e3
feat(core): add expiring field edit leases
minkinad Oct 7, 2026
89e3820
feat(core): serve authorized realtime streams and lock routes
minkinad Oct 7, 2026
7666c41
feat(sdk): expose typed realtime subscriptions and locks
minkinad Oct 7, 2026
50f5039
test(core): cover realtime updates and lock boundaries
minkinad Oct 7, 2026
e47ad02
feat(ui): stream presence through session-aware proxy
minkinad Oct 7, 2026
49d452d
feat(ui): refresh collection tables on live changes
minkinad Oct 7, 2026
3b60e86
feat(ui): show record edits, field holders and connection state
minkinad Oct 7, 2026
542cb86
fix(ui): bundle Geist font for reproducible builds
minkinad Oct 7, 2026
aa581ed
docs(api): describe realtime routes and error contract
minkinad Oct 7, 2026
28f606e
docs(realtime): explain Collaborative Live and its limits
minkinad Oct 7, 2026
3d2695a
merge: integrate upstream Core/UI split with Collaborative Live
minkinad Oct 7, 2026
da522f6
merge: integrate upstream policy and profile changes
minkinad Oct 7, 2026
dc266e0
fix(core): drain realtime streams and refresh presence snapshots
minkinad Oct 7, 2026
a49885e
fix(ui): keep in-progress edits during live record refresh
minkinad Oct 7, 2026
d24c4a6
docs(realtime): describe safe refresh and lease cleanup
minkinad Oct 7, 2026
118699f
test(core): allow graceful SSE shutdown time in CI
minkinad Oct 7, 2026
0d73210
fix(realtime): synchronize late subscribers and reconnect handlers
Yniphe Oct 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Сообщить об ошибке
description: Воспроизводимая ошибка в Asmblyr Collaborative
title: "[Bug] "
body:
- type: markdown
attributes:
value: Для уязвимостей используйте порядок из SECURITY.md. Не публикуйте токены, персональные данные и дампы.
- type: input
id: version
attributes:
label: Версия или commit
description: Укажите commit установки или ветку, на которой воспроизводится ошибка.
validations:
required: true
- type: textarea
id: steps
attributes:
label: Шаги воспроизведения
description: Укажите настройку, входные данные на вымышленных примерах и шаги.
validations:
required: true
- type: textarea
id: result
attributes:
label: Фактический и ожидаемый результат
validations:
required: true
- type: textarea
id: diagnostics
attributes:
label: Диагностика
description: Сообщения об ошибках и журналы без секретов и данных пользователей.
validations:
required: false
11 changes: 11 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## Изменение

<!-- Кратко: проблема, итоговое поведение и связанные issue. -->

## Проверка

<!-- Укажите выполненные команды и результаты; отдельно — то, что не проверялось. -->

## Данные, доступ и документация

<!-- Отметьте влияние на миграции, данные пользователей, права/секреты и публичные контракты. Ссылки на обновлённые руководства. Для UI используйте только вымышленные данные. -->
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ dist/
.next-visual/
.turbo/
*.tsbuildinfo
.vitepress/
apps/ui/src/generated/plugin-ui.ts
apps/ui/src/generated/plugin-ui.css

Expand Down
2 changes: 2 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
## Подготовка

Следуйте [руководству первого запуска](docs/guide/getting-started.md).
Для карты компонентов и команд используйте [локальную разработку](docs/development/local-development.md),
для нового плагина — [первое расширение](docs/development/first-extension.md).
Публичные пакеты SDK и Kit пока используются как workspace-пакеты репозитория.
Описание компонентов — в [архитектуре](docs/development/architecture.md).

Expand Down
165 changes: 92 additions & 73 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,63 +1,78 @@
# Asmblyr Collaborative

**Открытая платформа для работы с данными и совместного редактирования.**
Создавайте коллекции и связи в PostgreSQL, управляйте записями через админку,
настраивайте доступ команды и подключайте свои приложения через HTTP API.

Проект развивается в статусе **ранней беты**. Интерфейс и документация — на русском.
Первая модель размещения: отдельная установка для каждой команды.

[Документация](docs/index.md) · [Возможности](docs/guide/features.md) ·
[HTTP API](docs/reference/http.md) · [Участие в проекте](CONTRIBUTING.md)

## Возможности

- **Модель данных:** коллекции, типы полей, связи M:1 / 1:M / M:N,
формы, подписи записей и поиск.
- **Работа с записями:** таблицы, вложенные фильтры, сохранённые виды,
редактор в боковой панели, пакетные действия и история изменений.
- **Совместная работа:** комментарии к записям, участники страниц и карточек,
проверка конфликтов при сохранении изменённых полей.
- **Доступ команды:** политики и права на действия, поля и строки,
отдельные права на настройки и ограниченное делегирование политик.
- **Авторизация:** приглашения по ссылке без обязательной почтовой доставки,
пароль, passkey, SSO/OIDC и управление сессиями.
- **Файлы:** библиотека и поля файлов с S3-совместимым хранилищем,
включая Yandex Object Storage.
- **Интеграции:** сервисные аккаунты, ключи, GitLab CI federation
и OAuth/OIDC provider для подключаемых приложений.
- **Расширения:** Kit для серверных обработчиков, собственных коллекций,
миграций, настроек, страниц и редакторов полей.
- **SDK:** генерация типов через `asm connect`, вход через админку,
fluent-запросы и типизированные методы плагинов без специального компилятора.
- **Опциональный ассистент:** потоковый чат, инструменты с правами пользователя
и OpenAI-совместимый провайдер. [Личные подключения Google Drive и Sheets](docs/features/google-workspace.md):
чтение по запросу и изменения после подтверждения пользователя.

Границы каждой функции описаны в [карте возможностей](docs/guide/features.md).
Workspaces группируют коллекции; они не разделяют данные разных компаний.
Блокировки полей, доставка правок в реальном времени, публичный MCP endpoint
и установка расширений из интерфейса пока не поддерживаются.

## Начать работу
**Данные команды, права доступа и расширения — на PostgreSQL.**

Asmblyr Collaborative — открытая платформа для команд, которым нужны настраиваемые
коллекции, редактор записей и HTTP API. Разработчики могут добавить серверные
обработчики и страницы через `@asmblyr-collaborative/kit`; интеграции работают
через API, TypeScript SDK и CLI.

**Статус: ранняя бета.** Одна установка предназначена для одной команды.
Интерфейс и основная документация сейчас на русском. SDK, CLI, Kit и контракты
доступны в npm как `0.1.0-beta.1` под тегом `beta`; выпуск не объявлен стабильным.

[Сайт и демо](https://asmblyr.io/) · [Рабочая консоль](https://console.asmblyr.io/) ·
[Быстрый старт](#быстрый-старт) · [Документация](docs/index.md) ·
[Участие](CONTRIBUTING.md)

## Что уже работает

| Область | Возможности |
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------- |
| Данные | Коллекции, типизированные поля, связи M:1 / 1:M / M:N, формы, таблицы, поиск, вложенные фильтры и сохранённые виды |
| Совместная работа | Комментарии, живое присутствие, обновление записей, блокировки полей и проверка конфликтов при сохранении |
| Доступ | Политики для действий, полей и строк; отдельные права на настройки; приглашения, пароль, passkey и SSO |
| Файлы и интеграции | S3-совместимое хранилище, сервисные аккаунты, GitLab CI federation, OAuth/OIDC provider и личные подключения Google Drive/Sheets |
| Разработка | H3-обработчики, страницы, редакторы полей, коллекции и миграции через Kit; типизированный SDK и CLI `asm connect` |
| Ассистент | Опциональный потоковый чат, инструменты с правами пользователя и действия расширений через внутренний MCP |

Подробности и границы — в [карте возможностей](docs/guide/features.md).
Workspaces группируют коллекции, но не изолируют компании; публичного MCP endpoint
и установки расширений из интерфейса пока нет.

## Collaborative Live

Откройте одну запись в двух браузерах: участники видят друг друга, активное
редактирование поля и сохранённые изменения почти сразу. Таблица обновляется
через SSE; занятые поля показывают имя редактора. Если два человека изменили
одно поле, сохранение черновика возвращает конфликт и предлагает выбрать
значение. [Контракт и ограничения](docs/features/realtime.md).

## Ассистент и расширения

При настройке OpenAI-совместимого провайдера ассистент работает с разрешёнными
данными и явно опубликованными действиями расширений. `defineModelContext`
публикует H3-обработчик для ассистента и внутреннего MCP; обычный HTTP-обработчик
не становится инструментом автоматически. Доступ к данным дополнительно зависит
от прав вызывающего и настройки публикации коллекции в MCP. Личные подключения
Google Drive и Sheets поддерживают чтение по запросу и изменение после
подтверждения пользователя.

[Как работает ассистент](docs/development/assistant-architecture.md) ·
[Первое расширение](docs/development/first-extension.md) ·
[Контракт Kit](docs/reference/kit-guide.md)

## Быстрый старт

Нужны **Node.js 22+, pnpm 11.13.1 и Docker Compose**. Из корня репозитория:

```sh
pnpm install --frozen-lockfile
pnpm db:up
cp -n apps/core/.env.example apps/core/.env
```

Создайте `apps/core/.env` из [шаблона](apps/core/.env.example) и задайте случайный
`ASMBLYR_SETUP_TOKEN` длиной не менее 32 символов. Затем:
В `apps/core/.env` задайте случайный `ASMBLYR_SETUP_TOKEN` длиной не менее 32
символов. Затем:

```sh
pnpm db:migrate
pnpm dev
```

Откройте [localhost:3000/setup](http://localhost:3000/setup), чтобы создать первого
администратора. Подробнее — [первый запуск](docs/guide/getting-started.md).
администратора. Копируйте шаблон `.env` только если файла ещё нет. Подробнее —
[первый запуск](docs/guide/getting-started.md).
Для Docker и Kubernetes предусмотрены отдельные образы Core и UI, собранные из
одного коммита, Docker Compose и Helm-чарт. PostgreSQL и S3 подключаются отдельно:
[установка и настройка](deploy/README.md). CI публикует согласованную пару
Expand All @@ -67,36 +82,40 @@ SDK, CLI, Kit и общие контракты доступны в npm как `0
`beta`: [установка и подключение](docs/reference/packages.md). Docker-сборка
не зависит от предварительной публикации этих пакетов.

## Устройство проекта

| Каталог | Назначение |
| ---------------------------------- | -------------------------------------------------- |
| `apps/core` | HTTP API, авторизация и PostgreSQL; Fastify и Knex |
| `apps/ui` | Админка; Next.js, React и shadcn |
| `packages/contracts` | Общие публичные типы |
| `packages/sdk` | TypeScript HTTP-клиент |
| `packages/cli` | Подключение SDK и генерация типов |
| `packages/kit` | API и сборщик расширений |
| `packages/plugin-comments` | Встроенный модуль комментариев к записям |
| `packages/plugin-google-workspace` | Опциональные инструменты Google Drive и Sheets |
| `examples` | Опциональные примеры расширений и интеграций |
| `deploy` | Универсальные шаблоны Docker-установки |
| `docs` | Пользовательские руководства и контракты |
| `.agents` | Подробные инструкции для работы агентов с кодом |

## Развитие и участие

Текущий фокус — устойчивость беты, совместимость SDK/Kit, документация и удобство
основных сценариев работы с данными. Новые возможности обсуждаются в
[Issues](https://github.com/Asmblyr/Collaborative/issues); сроки и состав следующих
релизов пока не закреплены.

Нашли ошибку или хотите предложить изменение? Начните с
[руководства для участников](CONTRIBUTING.md). Оно описывает запуск проверок,
правила изменений и подготовку pull request.
О вопросах безопасности читайте в [SECURITY.md](SECURITY.md).
## Развёртывание

Основной способ установки использует отдельные образы Core и UI. Совместимый
монолитный образ доступен для существующих установок. [Docker и обновления](docs/guide/deployment.md)
описывают сборку из исходников, Compose и эксплуатационные границы.
[Опубликованные пакеты](docs/reference/packages.md) и
[CLI](docs/reference/cli-guide.md) предназначены для внешних клиентов.

## Как устроен проект

```mermaid
flowchart LR
Browser[Браузер] -->|страницы| UI[Next.js UI]
Browser -->|/api| API[Fastify Core API]
SDK[TypeScript SDK и CLI] --> API
API --> DB[(PostgreSQL)]
API --> S3[(S3-совместимое хранилище)]
Kit[Расширения через Kit] --> API
```

Core отвечает за HTTP, авторизацию и данные; UI предоставляет админку.
Браузерная сессия обрабатывается Core. Серверный код расширений исполняется внутри Core как доверенный
код. [Архитектура](docs/development/architecture.md) и
[структура репозитория](docs/development/local-development.md) раскрывают границы
компонентов и хранения.

## Документация и участие

- [Руководства и справочники](docs/index.md) · [HTTP API](docs/reference/http.md) · [TypeScript SDK](docs/reference/sdk-guide.md)
- [Локальная разработка](docs/development/local-development.md) · [Участие в проекте](CONTRIBUTING.md)
- [Безопасность и сообщение об уязвимости](SECURITY.md)

## Лицензия

[MIT](LICENSE). Сторонние зависимости сохраняют свои лицензии.
Дополнительное локальное S3-хранилище использует MinIO под AGPL.
[MIT](LICENSE). Сторонние зависимости сохраняют свои лицензии. Дополнительное
локальное S3-хранилище использует MinIO под AGPL. Встроенный шрифт Geist
распространяется по [SIL OFL 1.1](apps/ui/src/app/fonts/OFL.txt).
20 changes: 20 additions & 0 deletions apps/core/migrations/20261006030000_realtime_field_locks.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
exports.up = async (knex) => {
await knex.schema.withSchema("public").createTable("asmblyr_field_locks", (table) => {
table.uuid("collection_id").notNullable().references("id").inTable("public.asmblyr_collections").onDelete("CASCADE");
table.text("record_id").notNullable();
table.text("field").notNullable();
table.uuid("session_id").notNullable().references("id").inTable("public.asmblyr_auth_sessions").onDelete("CASCADE");
table.uuid("client_id").notNullable();
table.uuid("user_id").notNullable().references("id").inTable("public.asmblyr_users").onDelete("CASCADE");
table.timestamp("created_at", { useTz: true }).notNullable().defaultTo(knex.fn.now());
table.timestamp("expires_at", { useTz: true }).notNullable();
table.primary(["collection_id", "record_id", "field"]);
table.index("expires_at");
table.index(["session_id", "client_id"]);
});
};

// Locks are transient editor leases. Rolling back discards only active leases.
exports.down = async (knex) => {
await knex.schema.withSchema("public").dropTable("asmblyr_field_locks");
};
Loading