# Свої розділи й платформа — WIKI Helomi

> Власні розділи без розробника, файл розділу від ШІ, розширення кодом, консоль платформи.


---

# Власні розділи

Власний розділ — розділ, якого нема серед стандартних, але потрібен саме вашій компанії: ремонти, проєкти, заявки, гарантійні випадки. Його пише ваш ШІ одним файлом (дані, свій вигляд і логіка) або ви збираєте в конструкторі без коду: назва, іконка, етапи, поля, що є в картці; правила передачі створюють з запису угоду, клієнта, задачу чи запис іншого розділу. У меню зліва розділ ставиться перемикачем на його плитці.

## Можливості
- Галерея «Власні розділи»: плитки розділів і прозорий квадрат «+ Додати розділ» — туди перетягують файл розділу від ШІ.
- «У меню зліва» на плитці (і відділ меню), порядок — перетягуванням плиток. Окремого пункту «Розділи» в меню нема.
- Файл розділу від ШІ: дані, своя сторінка й агент одним файлом; ШІ-співробітник з правом творця встановлює сам (стаття [Розділ від ШІ](section-package.md)).
- Назва розділу й запису, іконка з фірмового набору, опис «Для чого розділ (бачать люди й ШІ)».
- Етапи з кольорами й позначкою «завершальний»; дошка за етапом або за полем-списком.
- «Що є в картці»: відповідальний, клієнт, угода, бренд, нотатки, файли.
- Поля тим самим конструктором «Типи даних», що в угод і клієнтів: обов'язковість, «при створенні», «у списку» діють і у формі, і в API.
- Список, дошка, картка-шторка з нотатками, файлами й журналом.
- Правила передачі: новий запис або етап → угода, клієнт, задача, запис іншого розділу.
- Окремий доступ до кожного розділу; імпорт і експорт XLSX; архів.

## 1. Налаштування: галерея і новий розділ
«Налаштування → Типи даних → Власні розділи» — галерея: кожен розділ плиткою (іконка, назва, що всередині — «код · сторінка, агент, дані» або «конструктор · N записів», хто створив), останній — прозорий квадрат «+ Додати розділ».

**Файл від ШІ (з кодом і своїм виглядом):**
1. «Інструкція для ШІ» — збережіть файл і дайте його своєму ШІ (Claude, ChatGPT, Gemini) разом з описом розділу; або «+ Розділ» → «Скопіювати завдання для ШІ».
2. ШІ віддасть файл розділу (`.sgsection.json` або `.html`). Перетягніть його в квадрат «+ Додати розділ» (або «+ Розділ» → «Вибрати файл»).
3. Відкриється перевірка: «Що буде зроблено», «Зауваги», «Помилки». Якщо такий розділ уже є — «Оновити «…»» або «Окремий розділ поруч».
4. «Показати в меню зліва» (і відділ меню) → «Встановити» / «Оновити».

**ШІ-співробітник зробить сам:** напишіть Ломі чи іншому ШІ «Зроби розділ Ремонти…» — з правом творця він встановить розділ сам, у галереї з'явиться плитка, а в меню зліва її ставите ви.

**Конструктор без коду:**
1. «+ Розділ» → «Зібрати вручну».
2. Заповніть «Назва розділу» (наприклад, «Ремонти»), «Назва запису» («Ремонт»), «Іконка», «Опис».
3. «Етапи (дошка)»: назви, кольори, порядок «Вище» / «Нижче», позначка «завершальний»; «без етапів», якщо етапи не потрібні.
4. «Дошка за»: «за етапом», за полем-списком або «без дошки».
5. «Що є в картці»: «Відповідальний», «Клієнт», «Угода», «Бренд», «Нотатки», «Файли».
6. «Розділ увімкнено» → «Створити». З'явиться плитка в галереї.

**Меню зліва:** на плитці — «У меню зліва» і відділ меню («основний список» або відділ, як він називається в меню). Пункт бачать усі, кому розділ доступний; сховати лише для себе — «Моє меню». Порядок пунктів — перетягуванням плиток.

**«⋮» на плитці:** «Відкрити», «Налаштувати розділ» / «Налаштувати дані», «Поля», «Таблиця даних» (записи розділу з кодом стандартним списком), «Код і версії», «Файл розділу» (вивантажити, дати ШІ доробити й завантажити назад — «Оновити»), «Видалити».

## 2. Поля розділу
1. На плитці «⋮ → Поля» або з розділу «⋮ → Налаштувати поля» — відкриються «Типи даних» цього розділу.
2. Додайте поля будь-якого типу; позначте «обов'язкове», «при створенні», «у списку».
3. Вбудовані поля (назва, етап, клієнт…) видно з замком: їх не вимкнути, лише налаштувати показ і обов'язковість.

## 3. Передача в інші розділи
1. На плитці «⋮ → Налаштувати розділ» — блок «Передача в інші розділи» → «+ Правило».
2. Коли: новий запис або запис перейшов на етап (наприклад, «Готово»).
3. «створити в»: угода, клієнт, задача або інший власний розділ.
4. «+ що передати»: поле цілі і що в нього підставити — текст або значення з запису (`{title}`, `{custom.ключ}`).
5. Для угоди, клієнта й задачі можна позначити зв'язок — створене прив'язується до запису.

Приклад: запис перейшов на «Готово» → задача «Видати клієнту». Створення проходить ті самі перевірки, що й вручну: обов'язкові поля цілі мають бути заповнені правилом.

Тригерів і автоматичних задач за налаштуваннями тригерів для записів власних розділів поки нема — лише правила передачі (`features.csv`: «Тригери й задачі для записів власних розділів» — далі).

## 4. Доступ до розділу
- Кожен власний розділ має свій ключ доступу `x:<коротке ім'я>`; сторінка з кодом без своїх даних — `xe:<коротке ім'я>`. Галочка — у «Налаштування → Розділи меню» (або в картці людини в «Користувачі»). Пункт у меню зліва бачать лише ті, кому розділ доступний.
- Людям новий розділ типово відкритий, ШІ-співробітникам — лише якщо адміністратор відкрив його в доступах ШІ.

## 5. Працювати із записами
Записи власного розділу ведуть так само, як угоди: список і дошка етапів, картка-шторка з полями, нотатками, файлами й журналом. Які поля є і що під ними підказано — налаштовує власник розділу в його «Типах даних».

1. Пункт розділу в меню зліва (якщо його туди поставили) або «Власні розділи» → плитка → назва.
2. Вкладки «Список» і «Дошка» (якщо є етапи або поле-список); фільтр за етапом («усі» або етап), галочка «Архів», «Пошук».
3. «+ <Назва запису>» (наприклад, «+ Ремонт»; у порожньому розділі — «Додати перший») → форма з полями «при створенні» → «Створити».
4. Клік по запису відкриває картку-шторку: поля (змінюються на місці), етап, відповідальний, клієнт («Телефон або назва»), «Нотатки», «Файли» («Прикріпити файл»), «Журнал».
5. На дошці перетягніть картку в іншу колонку — етап зміниться, спрацюють правила передачі.

## 6. Архів і видалення
- «в архів» / «з архіву» у картці запису.
- Видалити запис назавжди може лише адміністратор; інші переносять в архів.
- Розділ без записів можна видалити; розділ із записами — лише вимкнути.

## 7. Імпорт і експорт
«⋮» розділу: «Експорт XLSX» (за поточними фільтрами) і «Імпорт XLSX» (колонки — за назвами полів, обов'язкова колонка «Назва»; спершу перевірка без запису). Також у «⋮»: «Налаштувати поля», «Налаштувати розділ».

## Можливі помилки
| Що ви бачите | Чому | Що зробити |
| --- | --- | --- |
| «Назвіть розділ» | Порожня назва розділу | Впишіть назву |
| «У кожного етапу має бути назва» | Порожній етап | Назвіть або видаліть етап |
| «Дошка будується лише за полем-списком цього розділу» | Для дошки вибрано поле іншого типу | Виберіть поле-список або «за етапом» |
| «Заповніть обов'язкові поля: …» | Поле обов'язкове в «Типах даних» | Заповніть поле |
| «Обов'язкові поля не можна очистити: …» | Спроба стерти обов'язкове значення | Впишіть нове значення |
| «У розділі … записів — вимкніть його замість видалення» | Розділ з записами | Вимкніть «Розділ увімкнено» |
| «Видаляє адміністратор; інші — переносять в архів» | Немає права видаляти | Перенесіть запис в архів |
| «Нотатки в цьому розділі вимкнено» / «Файли в цьому розділі вимкнено» | Вимкнено в «Що є в картці» | Увімкніть у налаштуваннях розділу |
| «Потрібна колонка «Назва»» | У файлі імпорту нема колонки назви | Додайте колонку «Назва» |
| «Розділ «…» уже є…» | Файл розділу вже встановлено | У перевірці виберіть «Оновити» або «Окремий розділ поруч» |
| «Файл розділу з помилками: …» | ШІ написав файл з помилками | Покажіть ШІ список «Помилки» з перевірки — він виправить |
| «У меню зліва ставиться розділ зі сторінкою…» | У розділу лише агент | Додайте сторінку або лишіть розділ поза меню |
| Перемикач «У меню зліва» неактивний | Розділ вимкнено або нема сторінки | Увімкніть розділ |

## Для ШІ-співробітників
Власний розділ видно в каталозі за коротким ім'ям: `describe_section("<slug>")` повертає поля, етапи й обов'язкові. Потрібен доступ до розділу `x:<slug>` (і «Власні розділи»).

| Інструмент | Що робить |
| --- | --- |
| `records_meta` | Опис розділу: етапи, поля, обов'язкові, відповідальні |
| `records_list` | Записи з `q`, `stage`, `responsible_id`, `client_id`, `archived` |
| `records_get` | Картка запису: поля, нотатки, журнал |
| `records_create` | Новий запис (обов'язкові поля — з «Типів даних»); передавайте `idempotency_key` |
| `records_update` | Змінити запис: етап, поля, відповідальний |

ШІ з правом творця встановлює цілий розділ файлом (дані, сторінка, агент): `sections_package_guide` → `sections_package_check` → `sections_package_install`, свій розділ вивантажує `sections_package_export` і оновлює з `update`; перелік — `sections_gallery`. Інструкція — стаття [Розділ від ШІ](section-package.md). У меню зліва розділ ставить людина.

ШІ з правом творця «Свої розділи» може також створювати власні розділи й поля по одному інструментами `sections_list`, `sections_create`, `sections_update`, `sections_rule_targets`, `sections_delete` (порожній свій розділ; **спочатку запитати**), `fields_list`, `fields_create`, `fields_update`, `fields_builtin_update`, `fields_delete` (**спочатку запитати**) — і змінювати лише створене собою.

Чого не робити:
- Не вигадувати `slug` і назви етапів — брати з `records_meta`.
- Не змінювати розділи, створені людьми або іншими ШІ.
- Не видаляти записи: інструмента видалення нема, у людини це робить лише адміністратор.

## Додаткова інформація
- Пов'язані статті: [Розділ від ШІ: файл розділу](section-package.md), [Розширення (код)](extensions.md), [Імпорт і експорт](import-export.md), [Угоди](deals.md), [Завдання](tasks.md).


---

# Розділ від ШІ: файл розділу

Файл розділу — один файл, яким ШІ (ваш ШІ-співробітник або будь-який чат: Claude, ChatGPT, Gemini) описує цілий новий розділ Helomi: записи з полями й етапами, власний вигляд сторінки і логіку, що працює сама. Людина перетягує файл у прозорий квадрат «+ Додати розділ» у «Власних розділах» (або ШІ-співробітник встановлює його сам), перевіряє, що буде створено, і вмикає розділ у лівому меню. Ця стаття — повна інструкція для ШІ: дайте її своєму ШІ разом з описом розділу, який потрібен.

## Можливості
- Один файл — увесь розділ: дані (поля, етапи, що є в картці, передача в інші розділи), сторінка (HTML + CSS + JS) і агент (JS за розкладом).
- Файл `.json` (пакет) або один `.html` (сторінка, а опис і дані — у блоці `<script id="sg-section">`).
- Перевірка до встановлення: що буде створено, помилки, зауваги стилю. Нічого не пишеться, доки людина не натисне «Встановити».
- Повтор того самого файлу не створює дубль: пропонується «Оновити» наявний розділ.
- Оновлення не видаляє даних: поля додаються й змінюються, записи лишаються; код — нова версія з поверненням попередньої.
- Розділ можна вивантажити тим самим файлом («⋯ → Файл розділу»), дати ШІ доробити й завантажити назад.
- ШІ-співробітник з правом творця встановлює файл сам; у меню зліва розділ ставить людина.

## 1. Налаштування: отримати розділ від ШІ
1. «Налаштування → Типи даних → Власні розділи». Тут галерея ваших розділів і прозорий квадрат «+ Додати розділ».
2. Натисніть «Інструкція для ШІ» — завантажиться ця стаття файлом `.md`. Або «+ Додати розділ» → «Скопіювати завдання для ШІ» — у буфер ляже готове завдання.
3. Дайте інструкцію своєму ШІ й опишіть розділ: що зберігати (поля), які етапи, що показувати, що робити самому (нагадування, підрахунки). Наприклад: «Зроби розділ "Ремонти": пристрій, тип ремонту, вартість, етапи Прийнято → Діагностика → Готово, сторінка з показниками і таблицею, щодня нагадувати про ремонти, що застрягли».
4. ШІ віддає файл `<ім'я>.sgsection.json` (або `.html`). Збережіть його.
5. Перетягніть файл у квадрат «+ Додати розділ» (або натисніть на квадрат → «Вибрати файл»). Відкриється перевірка: що буде створено, зауваги, помилки.
6. «Показати в меню зліва» (і відділ меню) → «Встановити». Розділ з'явиться плиткою в галереї й у лівому меню.

ШІ-співробітник з правом творця «Свої розділи» (дані) і «Свої розширення (код)» (сторінка, агент) робить кроки 3–6 сам інструментами (див. «Для ШІ-співробітників»); людина лише вмикає «У меню зліва».

## 2. Як влаштований розділ: дані, вигляд, логіка
| шар | у файлі | що дає | коли потрібен |
| --- | --- | --- | --- |
| Дані | `data` | записи з полями, етапами, відповідальним, клієнтом, нотатками, файлами; список, дошка, картка, імпорт/експорт, доступ, `records_*` для ШІ | розділ щось зберігає (ремонти, заявки, автопарк, проєкти) |
| Вигляд | `page` | своя сторінка в ізольованому вікні: показники, таблиці, форми, калькулятор, дашборд з кількох розділів | потрібен вигляд, якого нема у стандартному списку |
| Логіка | `agent` | `function run(input)` вручну, зі сторінки або за розкладом (не частіше ніж раз на 5 хв) | щось має відбуватися саме: нагадування, підрахунки, перенесення між розділами |

Можна будь-яку комбінацію. Лише `data` — розділ конструктора (той самий, що створюють вручну). `data` + `page` — свій вигляд над своїми записами (найчастіше). Лише `page` — сторінка-звіт, що читає інші розділи. `agent` без сторінки в меню не ставиться.

Як розділ працює з рештою Helomi: усе — тими самими маршрутами й перевірками, що й у людини. Обов'язкові поля, доступи, журнал змін, тригери спрацьовують самі. Записати можна лише те, що дозволено: свої записи — завжди, інші розділи — лише інструментами з `permissions`. Код Helomi, налаштування компанії, права людей розділ не змінює.

## 3. Формат файлу squaregram-section/1

```json
{
  "format": "squaregram-section/1",
  "slug": "remonty",
  "title": "Ремонти",
  "icon": "flask",
  "description": "Ремонти техніки клієнтів: прийом → діагностика → готово",
  "menu": true,
  "menu_group": "",
  "note": "перша версія",
  "data": { "record_title": "Ремонт", "stages": [], "card": {}, "fields": [], "kanban_field": null, "rules": [] },
  "page": { "html": "<div class=\"sg-sheet\">…</div><style>…</style><script>…</script>" },
  "agent": { "js": "function run(input) { … }", "schedule_minutes": 1440 },
  "permissions": ["tasks_create"]
}
```

### 3.1. Верхній рівень
| поле | обов'язкове | що це |
| --- | --- | --- |
| `format` | так | завжди `squaregram-section/1` |
| `title` | так | назва розділу в меню й галереї: «Ремонти» (множина) |
| `slug` | ні | коротке ім'я в адресі: латиниця, цифри, `_`, до 14 символів (`remonty`). Без нього — з назви |
| `icon` | ні | іконка з набору: folder, clipboard, briefcase, calendar, tasks, documents, products, warehouse, deliveries, clients, structure, star, flag, bulb, gift, card, receipt, map, phone, mail, camera, scale, flask, spark, book. Інша — буде folder |
| `description` | ні | для чого розділ — бачать люди й ШІ |
| `menu` | ні | пропозиція поставити в ліве меню (типово `true`); вирішує людина при встановленні |
| `menu_group` | ні | відділ лівого меню, як він називається в меню («Відділ продажу»); порожньо — верхній список |
| `note` | ні | що змінено в цій версії (журнал версій) |
| `data` | ні* | дані розділу (3.2) |
| `page` | ні* | сторінка (3.3) |
| `agent` | ні* | агент (3.4) |
| `permissions` | ні | інструменти ЗАПИСУ в інші розділи, дозволені сторінці (3.5) |

\* Хоча б одне з `data`, `page`, `agent`.

### 3.2. `data` — записи, поля, етапи
| поле | що це |
| --- | --- |
| `record_title` | назва одного запису: «Ремонт» (у кнопці «+ Ремонт») |
| `stages` | етапи по порядку: `[{"key": "new", "title": "Прийнято", "color": "blue"}, …, {"key": "done", "title": "Готово", "color": "green", "done": true}]`. Кольори: blue, violet, green, yellow, red, gray. `done: true` — завершальний. Без поля — «Нове → В роботі → Готово»; `false` або `[]` — без етапів |
| `card` | що є в картці запису: `{"responsible": true, "client": false, "deal": false, "brand": false, "notes": true, "files": true}` |
| `fields` | поля (нижче), до 60 |
| `kanban_field` | дошка за полем-списком (ключ поля `select`); без нього — за етапом |
| `rules` | передача в інші розділи (нижче) |

Поле: `{"key": "device", "title": "Пристрій", "kind": "text", "required": true, "in_list": true, "on_create": true, "options": [], "block": "Додаткові поля"}`.
- `key` — латиниця, цифри, `_`, з літери, до 40; за ним сторінка й агент читають значення: `record.custom.device`.
- `kind` — text, number, checkbox, date, time, select, multiselect, url, textarea. Для `select` потрібні `options`.
- `required` — без значення запис не збережеться ні людиною, ні сторінкою, ні ШІ. `in_list` — колонка списку. `on_create` — поле у формі створення (обов'язкові — завжди).

Вбудовані поля запису є завжди: `title` (назва), `stage_key` (етап), `responsible_id`, `client_id`, `deal_id`, `brand_id` (якщо увімкнено в `card`). Окремо їх в `fields` не описують.

Правило передачі: `{"title": "Видати клієнту", "when": "stage", "stage": "done", "target": "task", "values": {"title": "Видати клієнту: {title}"}, "link": false}`.
- `when` — `create` (новий запис) або `stage` (запис перейшов на етап `stage`).
- `target` — `deal` (угода), `client` (клієнт), `task` (задача) або `x_<slug>` іншого власного розділу.
- `values` — поле цілі → шаблон з полів запису: `{id}`, `{title}`, `{stage}`, `{stage_key}`, `{responsible_id}`, `{client_id}`, `{custom.<ключ>}`. Поля цілі: угода — title, client_id, funnel_id, stage_id, source_id, responsible_id, comment, deadline_at, important, `custom.<ключ>`; клієнт — company, person, phones, emails, source_id, main_responsible_id, comment, tags; задача — title, description, due_at, assignee_id, deal_id, client_id, priority, important.
- `link: true` — прив'язати створену угоду чи клієнта до запису (якщо в `card` увімкнено `deal` / `client`).

### 3.3. `page` — сторінка
`{"html": "…"}` — розмітка, `<style>` і `<script>` разом, до 400 000 символів. Сторінка живе в ізольованому вікні (iframe без доступу до токена, cookies, мережі й інших сайтів). Оболонку (шрифт Onest, токени й класи NeoHelomi, міст `sg`) дає Helomi — `<html>`, `<head>`, шрифти й бібліотеки не підключайте. Зовнішні `<script src>`, `fetch`, `XMLHttpRequest`, `WebSocket` заблоковані: дані — лише через `sg`.

### 3.4. `agent` — логіка
`{"js": "function run(input) { … }", "schedule_minutes": 60}` — до 120 000 символів, обов'язково `function run(input)`. `schedule_minutes` — запуск за розкладом (не частіше ніж раз на 5 хвилин); без нього — вручну («Запустити агента») і зі сторінки (`sg.runAgent`). Див. розділ 7.

### 3.5. `permissions`
Список інструментів ЗАПИСУ, які дозволено сторінці: `["tasks_create", "deals_add_note"]`. Читати сторінка може й без них. Свої записи (`sg.records.create/update`) — без дозволу. Назви інструментів — з `sections_package_guide.tools` або `describe_section`. Основні: `deals_create`, `deals_update`, `deals_change_stage`, `deals_add_note`, `deals_add_task`, `clients_create`, `clients_update`, `clients_add_note`, `tasks_create`, `tasks_update`, `records_create`, `records_update` (записи інших власних розділів).

### 3.6. Один `.html` замість `.json`
Можна віддати один файл `<ім'я>.html`: сторінка — як є, а опис і дані — у блоці `<script type="application/json" id="sg-section">{"title": "…", "icon": "…", "data": {…}, "permissions": […]}</script>`, агент — у `<script type="text/x-sg-agent" id="sg-agent">function run(input) { … }</script>`. Обидва блоки при встановленні вирізаються зі сторінки. Повний документ (`<!doctype html><html><head>…<body>…`) теж приймається: беруться стилі з `<head>` і вміст `<body>`; `<title>` стає назвою, якщо її нема в описі. Обгортка ```` ```json … ``` ```` з чату теж приймається.

## 4. Стиль NeoHelomi — обов'язково
Сторінка має виглядати як рідний розділ Helomi. Порушення стилю перевірка показує зауваженням — виправляйте наступною версією.

**Головне:** світле полотно дає програма; ваш вміст — шарами прозорого білого скла; тіней і рамок нема; великі радіуси; **чорне на екрані одне** (головна дія); червоне — лише увага (крапка, помилка); статуси — пастельні пігулки; іконки контурні; без смайликів; шрифт Onest (уже підключено).

Заборонено: свої кольори (`#hex`, `rgb()`, `hsl()`), свої тіні й рамки, градієнти, темні панелі, смайлики, `alert/confirm/prompt`, другий чорний елемент, зовнішні шрифти й бібліотеки. Колір, відступ, радіус — лише `var(--sg-…)`.

### 4.1. Шари
| шар | клас | для чого |
| --- | --- | --- |
| лист | `.sg-sheet` | одна робоча область сторінки (відступ 20–24, на телефоні 14) |
| група | `.sg-group` | блок усередині листа: таблиця, форма, колонка дошки, панель фільтрів |
| картка | `.sg-card` | окремий запис, показник; поле вводу вже має цей вигляд |
| рядок | `.sg-row` | пласкі рядки списку всередині групи (фон з'являється при наведенні) |
| суцільне | `.sg-pop` | випадне меню, вікно поверх сторінки |

Не більше трьох рівнів скла: лист → група → картка. Четвертий — рядок `.sg-row`.

### 4.2. Компоненти
- **Шапка:** `<h1 class="sg-title">Назва</h1>` + `<span class="sg-muted">підзаголовок</span>`; праворуч одна головна дія `<button class="sg-btn sg-btn--black">`.
- **Кнопки:** головна `.sg-btn.sg-btn--black` (одна); другорядні `.sg-btn.sg-btn--white` або `.sg-btn.sg-btn--line`; дрібні — `+ .sg-btn--sm`. Кругла кнопка-іконка — `.sg-circ` (44 px) / `.sg-circ.sg-circ--sm` (34 px), всередині `sg.icon("…")`.
- **Вкладки:** `.sg-tabs` → `.sg-tab` (активна `.is-active` — чорна пігулка); дрібний перемикач — `.sg-seg` з кнопками (`.is-active`).
- **Форми:** `.sg-field` → `<label>` + `input.sg-input` / `select.sg-select` / `textarea.sg-input.sg-textarea`; прапорець `input.sg-check`. Висота полів 40 px, пігулки.
- **Таблиці:** `.sg-table-wrap` → `table.sg-table` (щільні рядки, липка шапка); числа й суми — клас `.sg-num` (праворуч, табличні цифри).
- **Статуси:** `.sg-pill` + `--blue | --violet | --green | --yellow | --red | --gray`, дрібні `.sg-pill--sm`. Колір етапу запису — `record.stage.color` → `sg-pill--<color>`.
- **Текст:** `.sg-title` (30/500), `.sg-h2` (20/500), `.sg-h3`; підпис групи `.sg-cap` (великі літери); другорядне `.sg-muted`, `.sg-faint`.
- **Показники:** `.sg-kpi` з `<small>` (підпис) і `<b>` (число); один на екрані може бути `.sg-kpi--black`.
- **Дошка:** `.sg-kanban` → `.sg-kanban-col` (група-колонка) → `.sg-cap` з назвою етапу → `.sg-card` записів.
- **Порожньо й завантаження:** `.sg-empty` з одним реченням, що робити; скелет — `.sg-skeleton`. Помилка — `.sg-error`.
- **Іконки:** лише `sg.icon("назва", розмір)` — SVG-рядок у `innerHTML`. Назви: як у полі `icon` (3.1) і ще plus, minus, close, search, filter, edit, trash, check, chevron-down, chevron-right, refresh, download, export, import, copy, eye, calendar, clock, bell, link, pin, settings, deals, clients, chats, phone, mail, finance, coins, dashboard, agent, alert, more.

### 4.3. Токени (CSS-змінні)
Кольори тексту: `--sg-ink` (основний), `--sg-ink-2`, `--sg-muted` (підписи), `--sg-faint`. Чорне: `--sg-black`, текст на ньому `--sg-on-black`. Увага: `--sg-attention`. Скло: `--sg-sheet`, `--sg-group`, `--sg-card`, `--sg-solid`, розмиття `--sg-blur`, кромка `--sg-glass-edge`. Лінії: `--sg-line` (розділювач), `--sg-outline` (контур кнопки), `--sg-outline-field`, `--sg-outline-focus`. Пастелі статусів: `--sg-pastel-blue|violet|green|yellow|red|gray` і текст `--sg-pastel-<колір>-ink`. Радіуси: `--sg-r-sheet` 34, `--sg-r-group` 26, `--sg-r-card` 20, `--sg-r-row` 16, `--sg-r-pill`. Відступи: `--sg-space-1…8`. Розміри: `--sg-ctl-h` (40), `--sg-circ` (44), `--sg-fs-title`, `--sg-fs-h2`, `--sg-fs-body`, `--sg-fs-sm`, `--sg-fs-xs`, `--sg-fs-cap`. Шрифт: `--sg-font`.

### 4.4. Свій CSS і телефон
- Свій CSS — у `<style>` сторінки, класи з власним префіксом (`.rp-…`), значення лише `var(--sg-…)`. Розкладку (grid, flex) пишіть на своїх класах.
- Телефон від 390 px: сітки `grid-template-columns: repeat(auto-fill, minmax(240px, 1fr))`; на `@media (max-width: 768px)` рядки таблиць стають картками, кнопки й поля — на всю ширину, зони торкання ≥ 44 px, без горизонтальної прокрутки сторінки.
- Висоту вікна Helomi підлаштовує сам за вмістом — не задавайте `height: 100vh` і не робіть внутрішньої прокрутки сторінки.
- Елемент з атрибутом `hidden`, якому ви задали свій `display` (grid, flex), браузер усе одно покаже — допишіть `.ваш-клас[hidden] { display: none; }`.

## 5. Міст sg на сторінці
Усе асинхронне (`await`). Помилка → `throw Error` з реченням українською, показуйте її людині (`sg.toast(e.message)` або `.sg-error`).

| виклик | що робить |
| --- | --- |
| `sg.user` | `{id, name, admin}` — хто відкрив сторінку (є після події `sg:ready` на `document`) |
| `sg.section` | `{slug, title, data_slug}` — цей розділ; `data_slug` — його дані (є одразу) |
| `await sg.records.meta()` | опис даних розділу: етапи, поля (`key`, `title`, `kind`, `options`, `required`), відповідальні |
| `await sg.records.list({q, stage, responsible_id, client_id, archived, sort, dir, page, per_page, f_<ключ>})` | записи: `{items, total, page, pages}`; запис — `{id, title, stage: {key, title, color, done}, stage_key, responsible: {id, name}, client, custom: {ключ: значення}, archived, created_at, updated_at}` |
| `await sg.records.get(id)` | картка запису: поля, нотатки, файли, журнал |
| `await sg.records.kanban({q})` | дошка: колонки етапів (або поля-списку) з записами |
| `await sg.records.create({title, stage_key, responsible_id, client_id, custom: {…}})` | новий запис (обов'язкові поля діють) |
| `await sg.records.update(id, {stage_key, custom: {…}})` | змінити запис (журнал змін, правила передачі) |
| `await sg.read("/api/crm/deals", {q: "Петро", per_page: 20})` | **читання будь-якого розділу CRM** у межах прав людини (розділ 6) |
| `await sg.call("tasks_create", {values: {title: "…"}})` | інструмент (ті самі, що в ШІ): читання — завжди, запис — лише з `permissions` |
| `await sg.data.get(col, key)` / `set(col, key, value)` / `list(col)` / `del(col, key)` | сховище розділу (налаштування, кеш): JSON до 64 КБ на запис |
| `await sg.runAgent(input)` | запустити агента → `{ok, result, error, logs}` |
| `sg.navigate("/crm/deals/123")` | перейти в розділ Helomi |
| `sg.toast("Збережено")` | коротке повідомлення |
| `await sg.confirm("Видалити?")` | підтвердження в стилі програми → `true/false` |
| `sg.icon("plus", 18)` | SVG-рядок фірмової іконки |

## 6. Що можна читати: адреси даних CRM
`sg.read(шлях, параметри)` читає лише `/api/crm/…`, `/api/help/…` і `/api/ai/catalog`; користувачі, ключі інтеграцій і секрети закриті. Права — того, хто відкрив сторінку: чого людина не бачить, сторінка теж не прочитає.

| шлях | що повертає | параметри |
| --- | --- | --- |
| `/api/crm/deals` | угоди: `id, title, stage, funnel, client {company, person}, total_amount, paid_amount, credit_amount, responsible, custom, ordered_at, updated_at` | q, funnel_id, stage_id, source_id, responsible_id, client_id, archived, overdue, date_from, date_to, page, per_page, sort, order |
| `/api/crm/deals/{id}` | картка угоди з позиціями, оплатами, доставкою | — |
| `/api/crm/clients` | клієнти: `id, company, person, phones, emails, source, responsible, custom` | q, source_id, responsible_id, tags, archived, page, per_page |
| `/api/crm/tasks` | задачі: `id, title, status, due_at, assignee, deal, client, done` | q, status, responsible_id, mine, overdue, due_from, due_to, deal_id, client_id |
| `/api/crm/products` | товари: `id, sku, title, price, cost, stock, reserved, free` | q, category_id, in_stock, page, per_page |
| `/api/crm/x/<slug>` | записи будь-якого власного розділу | як у `sg.records.list` |
| `/api/help/<key>` | стаття WIKI | — |

Відповіді списків: `{items, total, page, pages}`. Не більше 200 на сторінку — для великих даних гортайте `page`.

## 7. Агент: логіка за розкладом
```js
function run(input) {                 // input: {trigger: "schedule"} або те, що передала сторінка через sg.runAgent
  var stuck = sg.records.list({ stage: "diag", per_page: 50 });
  stuck.items.forEach(function (r) {
    sg.call("tasks_create", { values: { title: "Ремонт застряг: " + r.title } });
  });
  sg.log("застрягли", stuck.items.length);
  return { stuck: stuck.items.length };
}
```
- У агента виклики **синхронні** (без `await`): `sg.records.list/get/meta/create/update`, `sg.call`, `sg.data.get/set/list/delete`, `sg.log`; `sg.section` — як на сторінці.
- У списках агента значення — короткі: `stage` — назва етапу, `stage_key` — ключ, `client` і `responsible` — імена, `custom` — словник полів.
- Мережі, файлів, таймерів нема; 30 секунд і 300 викликів на прогін; без `while(true)`.
- Агент працює від імені свого ШІ-співробітника «<назва> · агент». Дані свого розділу він бачить одразу; інші розділи (задачі, угоди) людина відкриває йому в «Налаштування → Команда → ШІ-співробітники → <агент> → Доступи». Видалення, гроші, масові дії й відправки чекають підтвердження людини.
- Агент не створює розділів, агентів і розширень — лише працює з даними.

## 8. Повний приклад: розділ «Ремонти»
Файл `remonty.sgsection.json` — дані, сторінка з показниками, формою й таблицею, агент щодня:

```json
{
  "format": "squaregram-section/1",
  "slug": "remonty",
  "title": "Ремонти",
  "icon": "flask",
  "description": "Ремонти техніки клієнтів: прийом → діагностика → готово",
  "menu": true,
  "data": {
    "record_title": "Ремонт",
    "stages": [
      {"key": "new", "title": "Прийнято", "color": "blue"},
      {"key": "diag", "title": "Діагностика", "color": "yellow"},
      {"key": "done", "title": "Готово", "color": "green", "done": true}
    ],
    "card": {"responsible": true, "client": true, "deal": false, "brand": false, "notes": true, "files": true},
    "fields": [
      {"key": "device", "title": "Пристрій", "kind": "text", "required": true},
      {"key": "kind", "title": "Тип ремонту", "kind": "select", "options": ["Гарантія", "Платний"]},
      {"key": "price", "title": "Вартість", "kind": "number"}
    ],
    "rules": [
      {"title": "Видати клієнту", "when": "stage", "stage": "done", "target": "task",
       "values": {"title": "Видати клієнту: {title}"}, "link": false}
    ]
  },
  "page": {"html": "<div class=\"sg-sheet rp\"><header class=\"rp-head\"><div><h1 class=\"sg-title\">Ремонти</h1><span class=\"sg-muted\">техніка клієнтів у роботі</span></div><button class=\"sg-btn sg-btn--black\" id=\"add\">+ Ремонт</button></header><div class=\"rp-kpis\" id=\"kpis\"></div><form class=\"sg-group rp-form\" id=\"form\" hidden><div class=\"sg-field\"><label>Назва *</label><input class=\"sg-input\" name=\"title\" required placeholder=\"Ноутбук Петра\"></div><div class=\"sg-field\"><label>Пристрій *</label><input class=\"sg-input\" name=\"device\" required></div><div class=\"sg-field\"><label>Тип ремонту</label><select class=\"sg-select\" name=\"kind\"><option>Гарантія</option><option>Платний</option></select></div><div class=\"sg-field\"><label>Вартість, грн</label><input class=\"sg-input\" name=\"price\" type=\"number\" min=\"0\"></div><div class=\"rp-foot\"><button class=\"sg-btn sg-btn--white\" type=\"button\" id=\"cancel\">Скасувати</button><button class=\"sg-btn sg-btn--line\" type=\"submit\">Створити</button></div></form><div class=\"sg-group\"><div class=\"sg-table-wrap\"><table class=\"sg-table rp-table\"><thead><tr><th>Ремонт</th><th>Пристрій</th><th>Етап</th><th class=\"sg-num\">Вартість</th></tr></thead><tbody id=\"rows\"><tr><td colspan=\"4\"><div class=\"sg-skeleton\" style=\"height: 40px\"></div></td></tr></tbody></table></div></div></div><style>.rp { padding: 24px; display: grid; gap: 14px; } .rp-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; } .rp-kpis { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; } .rp-form { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; padding: 16px; } .rp-form[hidden] { display: none; } .rp-foot { display: flex; gap: 8px; align-items: end; } @media (max-width: 768px) { .rp { padding: 14px; } .rp-head .sg-btn, .rp-foot .sg-btn { flex: 1 1 auto; } .rp-table thead { display: none; } .rp-table tr { display: grid; grid-template-columns: 1fr auto; gap: 4px; padding: 10px 0; } .rp-table td { border: 0; padding: 0 10px; } }</style><script>function esc(v) { return String(v == null ? '' : v).replace(/[&<>\"']/g, function (c) { return {'&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;'}[c]; }); } async function load() { try { var r = await sg.records.list({ per_page: 100 }); var work = r.items.filter(function (x) { return !(x.stage && x.stage.done); }); var sum = work.reduce(function (s, x) { return s + (Number(x.custom.price) || 0); }, 0); document.getElementById('kpis').innerHTML = '<div class=\"sg-kpi\"><small>У роботі</small><b>' + work.length + '</b></div><div class=\"sg-kpi\"><small>Готово</small><b>' + (r.items.length - work.length) + '</b></div><div class=\"sg-kpi\"><small>Сума в роботі, грн</small><b>' + sum.toLocaleString('uk-UA') + '</b></div>'; document.getElementById('rows').innerHTML = r.items.length ? r.items.map(function (x) { return '<tr><td>' + esc(x.title) + '</td><td>' + esc(x.custom.device) + '</td><td>' + (x.stage ? '<span class=\"sg-pill sg-pill--sm sg-pill--' + esc(x.stage.color) + '\">' + esc(x.stage.title) + '</span>' : '') + '</td><td class=\"sg-num\">' + esc(x.custom.price) + '</td></tr>'; }).join('') : '<tr><td colspan=\"4\"><div class=\"sg-empty\">Ремонтів поки немає — натисніть «+ Ремонт»</div></td></tr>'; } catch (e) { sg.toast(e.message); } } var form = document.getElementById('form'); document.getElementById('add').onclick = function () { form.hidden = false; form.title.focus(); }; document.getElementById('cancel').onclick = function () { form.hidden = true; }; form.onsubmit = async function (ev) { ev.preventDefault(); try { await sg.records.create({ title: form.title.value, custom: { device: form.device.value, kind: form.kind.value, price: form.price.value ? Number(form.price.value) : null } }); form.reset(); form.hidden = true; sg.toast('Ремонт додано'); load(); } catch (e) { sg.toast(e.message); } }; load();</script>"},
  "agent": {"js": "function run(input) { var stuck = sg.records.list({ stage: 'diag', per_page: 50 }); stuck.items.forEach(function (r) { sg.call('tasks_create', { values: { title: 'Ремонт застряг: ' + r.title } }); }); sg.log('застрягли', stuck.items.length); return { stuck: stuck.items.length }; }", "schedule_minutes": 1440},
  "permissions": []
}
```

Агенту прикладу потрібен доступ до «Завдань»: після встановлення людина відкриває його в «Доступах» агента «Ремонти · агент».

## 9. Те саме одним файлом .html
```html
<div class="sg-sheet rp">
  <header class="rp-head">
    <div><h1 class="sg-title">Ремонти</h1><span class="sg-muted">техніка клієнтів у роботі</span></div>
    <button class="sg-btn sg-btn--black" id="add">+ Ремонт</button>
  </header>
  <div class="sg-group"><div class="sg-table-wrap"><table class="sg-table"><tbody id="rows"></tbody></table></div></div>
</div>
<style>.rp { padding: 24px; display: grid; gap: 14px; } .rp-head { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; }</style>
<script>
  sg.records.list({ per_page: 100 }).then(function (r) {
    document.getElementById("rows").innerHTML = r.items.map(function (x) { return "<tr><td>" + x.title + "</td></tr>"; }).join("");
  });
</script>
<script type="application/json" id="sg-section">
{"format": "squaregram-section/1", "slug": "remonty", "title": "Ремонти", "icon": "flask",
 "data": {"record_title": "Ремонт", "fields": [{"key": "device", "title": "Пристрій", "kind": "text", "required": true}]}}
</script>
<script type="text/x-sg-agent" id="sg-agent">
function run(input) { return { total: sg.records.list({}).total }; }
</script>
```
(У справжньому файлі екрануйте значення від людей, як `esc()` у розділі 8.)

## 10. Оновити розділ
1. «Власні розділи» → плитка → «⋯» → «Файл розділу» — завантажиться поточний файл.
2. Дайте його ШІ: «Додай поле "Майстер" і колонку на сторінці».
3. Перетягніть новий файл у квадрат «+ Додати розділ». Перевірка побачить, що такий розділ уже є, і запропонує «Оновити «Ремонти»» (або «Окремий розділ»).
4. Що станеться: нові поля додаються, наявні змінюють назву й прапорці (тип поля зі значеннями не змінюється); поля, яких нема у файлі, лишаються — видаляє людина в «Типах даних»; записи не чіпаються; сторінка й агент — нова версія, попередню повертає «Налаштування → Типи даних → Розширення → Версії».

## 11. Меню зліва і доступ
- Кожна плитка в галереї має перемикач «У меню зліва» і вибір відділу. Ставить і знімає лише людина з доступом до «Налаштувань CRM»; порядок пунктів — перетягуванням плиток. Кожен ще може сховати пункт лише для себе в «Моє меню».
- Пункт бачать ті, кому розділ доступний: розділ з даними — галочка «x:<slug>», сторінка без даних — «xe:<slug>» (людям типово відкрито, ШІ — лише відкритий явно).
- Окремого пункту «Розділи» в меню нема: розділ, якого нема в меню, відкривається з галереї, за адресою або кнопкою на панелі швидкого доступу.

## 12. Чеклист ШІ перед тим, як віддати файл
- [ ] `format` — `squaregram-section/1`, є `title`, `slug` латиницею до 14 символів, `icon` з набору.
- [ ] Ключі полів латиницею; у `select` є `options`; обов'язкові — лише справді обов'язкові.
- [ ] Сторінка: один `.sg-sheet`, групи `.sg-group`, одна чорна кнопка, лише `var(--sg-…)` і класи `sg-*`, без смайликів і своїх кольорів.
- [ ] Значення від людей екрануються перед `innerHTML`.
- [ ] Порожньо, завантаження (`.sg-skeleton`) і помилка (`sg.toast(e.message)`) продумані.
- [ ] Сховані `hidden` елементи зі своїм `display` мають правило `[hidden] { display: none; }`.
- [ ] Телефон 390 px: без горизонтальної прокрутки, кнопки на всю ширину, таблиця → картки.
- [ ] Дані — лише через `sg.records` / `sg.read` / `sg.call`; запис в інші розділи — інструменти в `permissions`.
- [ ] Агент: `function run(input)`, без нескінченних циклів, до 300 викликів, розклад ≥ 5 хв.
- [ ] Ви (ШІ-співробітник) спершу викликали `sections_package_check` і виправили помилки.

## Можливі помилки
| Що ви бачите | Чому | Що зробити |
| --- | --- | --- |
| «Файл не є JSON: …» | Пошкоджений JSON (кома, лапки) | Попросіть ШІ віддати файл заново або вставити як `.html` |
| «Не впізнаю файл: потрібен .json або .html» | Інший формат | Попросіть у ШІ файл розділу за цією інструкцією |
| «Назвіть розділ: поле title» | Нема назви | Додайте `title` |
| «Файл нічого не створює…» | Нема ні `data`, ні `page`, ні `agent` | Додайте хоча б одне |
| «Поле «…» (список): потрібні варіанти options» | `select` без варіантів | Додайте `options` |
| «Поле «…»: тип має бути одним із …» | Невідомий `kind` | Візьміть тип з розділу 3.2 |
| «Агент має оголосити function run(input) { … }» | Нема функції `run` | Оголосіть її |
| «Розклад агента — не частіше ніж раз на 5 хвилин» | Замалий `schedule_minutes` | 5 або більше |
| «Невідомий інструмент у permissions: …» | Такого інструмента нема | Назва з `sections_package_guide.tools` |
| «Розділ «…» уже є (e:…) — передайте update…» | Такий розділ уже встановлено | «Оновити» або «Окремий розділ» |
| «У меню зліва ставиться розділ зі сторінкою…» | Лише агент | Додайте сторінку або лишіть поза меню |
| «Дані розділу ШІ створює з правом творця «Свої розділи»» / «Сторінку й агента … «Свої розширення (код)»» | У ШІ нема права | Адміністратор видає право в «Доступах» ШІ |
| «Цей розділ створив не цей ШІ…» | ШІ оновлює чужий розділ | ШІ змінює лише свої розділи |
| «Власні розділи налаштовує людина з доступом до «Налаштувань CRM»» | Немає доступу | Попросіть адміністратора |
| На сторінці «Немає доступу до розділу …» | Галочку розділу закрито | Адміністратор відкриває доступ |
| Зауваги «Стиль: …» | Свої кольори, смайлики, alert, тіні | Не блокують; виправте наступною версією |

## Для ШІ-співробітників
Права: дані (`data`) — право творця «Свої розділи»; сторінка й агент — «Свої розширення (код)». Змінювати можна лише свої розділи. У меню зліва ставить людина.

| Інструмент | Що робить |
| --- | --- |
| `sections_package_guide` | СПОЧАТКУ ПРОЧИТАЙТЕ: ця стаття і живі довідники — іконки, типи полів, кольори етапів, інструменти для `permissions` |
| `sections_gallery` | Розділи організації плитками: `id` (`e:<n>` — з кодом, `t:<n>` — конструктор), `mine`, дані, меню |
| `sections_package_check` | Перевірити файл без запису: `values: {package: {…}}` або `{content: "<текст .json/.html>"}`, `update?` → `ok`, `actions`, `errors`, `warnings`, `conflict` |
| `sections_package_install` | Встановити: `values: {package, file_name?, update?, as_new?}` → `{id, url, created, warnings}` |
| `sections_package_export` | Мій розділ файлом (`tile_id`) — доробити й встановити з `update` |

Порядок: `sections_package_guide` → (`sections_gallery`, чи нема вже такого) → `sections_package_check` → виправити `errors` і по змозі `warnings` → `sections_package_install` → сказати людині: «Розділ «…» встановлено, увімкніть його в лівому меню: Налаштування → Типи даних → Власні розділи → «У меню зліва»». Після встановлення з даними — `records_meta`, `records_list`, `records_create`, `records_update` зі `slug` розділу. Конфлікт (`conflict`) — свій розділ оновлюйте `update: "<id>"`, чужий не чіпайте: запропонуйте людині `as_new`.

Чого не робити:
- Не вигадувати іконки, типи полів, назви інструментів — брати з `sections_package_guide`.
- Не ставити `update` на чужий розділ і не видаляти поля через файл (поля, яких нема у файлі, лишаються).
- Не писати своїх кольорів, смайликів, мережевих запитів; не просити людину вимкнути перевірки.

## Додаткова інформація
- Пов'язані статті: [Власні розділи](custom-sections.md), [Розширення (код)](extensions.md), [ШІ-творець](ai-creator.md), [Моє меню](my-menu.md).


---

# Розширення: свій розділ і свій агент кодом

Розширення — це ваш код усередині Helomi: **сторінка** (HTML + CSS + JavaScript) з'являється плиткою в «Власних розділах» (а перемикачем — пунктом лівого меню) і відкривається всередині програми, а **агент** (JavaScript, `function run(input)`) працює на сервері вручну, зі сторінки або за розкладом. Ядро Helomi ви не змінюєте: сторінка живе в ізольованому iframe, агент — в ізольованому рушії, і з даними обидва працюють лише через міст `sg`, тими самими маршрутами й правами, що й люди, тож сторінку не можна відрізнити від рідного розділу — **лише стиль NeoHelomi**.

## Можливості
- Найпростіше — файлом розділу: дані + сторінка + агент одним файлом, який ШІ пише за статтею [Розділ від ШІ](section-package.md), а людина перетягує в «+ Додати розділ» у «Власних розділах». Розширення — та сама сторінка й агент, що там встановлюються.
- Сторінка (адреса `/crm/x/ext/<slug>`) в ізольованому iframe, з мостом `sg.*`; плитка — у галереї «Власні розділи», у меню зліва — перемикачем «У меню зліва» на плитці.
- Якщо в розділу є свої дані (файл розділу з `data`), `sg.records.list/get/create/update` працює з ними без окремого дозволу.
- Читання будь-якого розділу CRM у межах прав людини, яка відкрила сторінку; запис — лише інструментами з дозволів розширення.
- Власне сховище розширення (JSON).
- Агент на сервері: вручну, зі сторінки або за розкладом (не частіше ніж раз на 5 хвилин), без мережі й файлів.
- Кожна зміна — нова версія з описом; повернення будь-якої версії.
- Розширення пише людина в налаштуваннях або ШІ з правом творця.

## 1. Налаштування
- **Людина** — «Налаштування → Типи даних → Розширення» (потрібен доступ до «Налаштувань CRM»): список розширень з автором («написав ШІ» для створених ШІ), «Нове розширення», редактор «Код сторінки» і «Код агента», «Плитка на сторінці /crm/x» (назва, іконка, опис), «Агент за розкладом, хвилин», «Що змінено», «Версії», «Запуски агента», «Інструкція для авторів (і для ШІ)» — ця стаття.
- **ШІ-співробітник** пише розширення лише з правом творця «Свої розширення (код)» у «Доступах» його пульта (видає адміністратор) і змінює лише свої розширення.
- Агент розширення працює від імені свого ШІ-співробітника («<назва> · агент»): його розділи, ліміти й «спочатку запитати» налаштовуються в пульті ШІ-співробітників.

## 2. Створити розширення
1. `extensions_guide` — ця інструкція і перелік інструментів.
2. `extensions_create` з `title`, `icon` (folder, clipboard, briefcase, calendar, tasks, documents, products, warehouse,
   deliveries, clients, structure, star, flag, bulb, gift, card, receipt, map, phone, mail, camera, scale, flask, spark, book), `page_html` і/або `agent_js`, `permissions` (інструменти ЗАПИСУ, які
   сторінці дозволено: напр. `["deals_create", "tasks_create"]`; читати сторінка може й так), `schedule_minutes`
   (агент за розкладом, не частіше ніж раз на 5 хв), `note` — що зроблено.
3. Відкрийте результат: `/crm/x/ext/<slug>`. Виправлення — `extensions_update` (кожна зміна — нова версія,
   `extensions_rollback` повертає попередню). Агента перевіряйте `extensions_run` — у відповіді результат, `logs` і помилка.

Людина робить те саме в «Налаштування → Типи даних → Розширення» → «Нове розширення» → «Створити»; відкрити сторінку — «Відкрити», плитка в «Власних розділах» або пункт меню зліва.

## 3. Стиль NeoHelomi — обов'язково

У сторінку вже підключено шрифт Onest, токени `--sg-*` і базові класи `sg-*`. **Не пишіть своїх кольорів, тіней, радіусів і рамок** — лише `var(--sg-…)` і класи нижче. Без смайликів (іконки — `sg.icon()`), без градієнтів, без темних панелей, без браузерних `alert/confirm` (є `sg.confirm`, `sg.toast`).

- **Шари.** Тло дає програма. Ваш вміст — у листі `.sg-sheet` (padding 20–24) → групи `.sg-group` (padding 14–16) →
  картки `.sg-card` / рядки `.sg-row`. Не більше трьох рівнів.
- **Шапка сторінки.** `<h1 class="sg-title">Назва</h1>` + `<span class="sg-muted">` підзаголовок; справа — одна головна
  дія `<button class="sg-btn sg-btn--black">`. **Чорне на екрані одне** (головна дія або активна вкладка).
- **Кнопки:** головна `.sg-btn.sg-btn--black`; другорядні `.sg-btn.sg-btn--white` або `.sg-btn.sg-btn--line`; дрібні —
  `.sg-btn--sm`. Кругла іконка-кнопка — `.sg-circ` (44 px) / `.sg-circ.sg-circ--sm` (34 px), всередині `sg.icon(...)`.
- **Вкладки й перемикачі:** `.sg-tabs` з `.sg-tab` (активна — `.is-active`, чорна пігулка); дрібний перемикач —
  `.sg-seg` з кнопками (`.is-active` біла).
- **Форми:** `.sg-field` → `<label>` + `.sg-input` / `select.sg-select` / `textarea.sg-input.sg-textarea`; прапорець —
  `input.sg-check`. Поля 40 px заввишки, пігулки.
- **Таблиці:** `.sg-table-wrap` → `table.sg-table` (щільні рядки, липка шапка). Числа — клас `.sg-num`.
- **Статуси:** `.sg-pill` + колір `--blue | --violet | --green | --yellow | --red | --gray`, дрібні — `.sg-pill--sm`.
- **Текст:** заголовки `.sg-title` / `.sg-h2` / `.sg-h3`; підпис групи `.sg-cap` (великі літери); другорядне `.sg-muted`,
  `.sg-faint`. Показники — `.sg-kpi` з `<small>` (підпис) і `<b>` (число).
- **Порожньо / завантаження:** `.sg-empty` з одним реченням, що робити; скелет — `.sg-skeleton`.
- **Телефон:** сторінка має працювати від 390 px: сітки — `grid-template-columns: repeat(auto-fill, minmax(240px, 1fr))`,
  на `@media (max-width: 768px)` рядки таблиць → картки, кнопки й поля на всю ширину, зони торкання ≥ 44 px.

Свій CSS — у `<style>` вашої сторінки, з префіксом класів (`.my-…`) і лише значеннями `var(--sg-…)`.

## 4. Міст `sg` (сторінка)

Усе асинхронне (`await`). Помилка → `throw Error` з реченням українською.

| виклик | що робить |
| --- | --- |
| `sg.user` | `{id, name, admin}` — хто відкрив сторінку |
| `sg.section` | `{slug, title, data_slug}` — цей розділ і його дані |
| `await sg.records.list({q, stage, per_page})` / `get(id)` / `meta()` / `kanban()` / `create({title, custom})` / `update(id, {stage_key, custom})` | записи даних свого розділу (файл розділу з `data`); запис — без окремого дозволу |
| `await sg.read("/api/crm/deals", {q: "Петро", per_page: 20})` | **читання будь-якого розділу CRM** у межах прав цієї людини: угоди, клієнти, задачі, склад, фінанси, документи, доставки, власні розділи (`/api/crm/x/<slug>`) |
| `await sg.call("deals_create", {values: {...}})` | інструмент (ті самі, що в ШІ): читання — завжди, запис — лише з `permissions` розширення |
| `await sg.data.get(col, key)` / `set(col, key, value)` / `list(col)` / `del(col, key)` | власне сховище розширення (JSON, до 64 КБ на запис) |
| `await sg.runAgent(input)` | запустити агента цього розширення → `{ok, result, error, logs}` |
| `sg.navigate("/crm/deals/123")` | перейти в розділ Helomi |
| `sg.toast("Збережено")` | коротке повідомлення внизу |
| `await sg.confirm("Видалити?")` | підтвердження в стилі програми → `true/false` |
| `sg.icon("plus", 18)` | SVG-рядок фірмової іконки (вставляйте в `innerHTML`) |

Інструменти й їхні аргументи — `extensions_guide.tools` або `describe_section`. Основні: `deals_list/get/create/update/ change_stage/close/add_item/add_note/add_task`, `clients_list/get/create/update/add_note`, `tasks_list/get/create/update`, `products_list/get`, `records_meta/list/get/create/update` (власні розділи). Обов'язкові поля, воронки, доступи й журнал діють так само, як для людини.

## 5. Агент (`agent_js`)

```js
function run(input) {               // input: {trigger: "schedule"} або те, що передала сторінка
  var deals = sg.call("deals_list", { overdue: true, per_page: 50 });
  deals.items.forEach(function (d) {
    sg.call("deals_add_task", { deal_id: d.id, values: { title: "Нагадати клієнту" } });
  });
  sg.data.set("stats", "last", { count: deals.items.length });
  sg.log("оброблено", deals.items.length);
  return { processed: deals.items.length };
}
```

У агента виклики **синхронні** (без `await`): `sg.call`, `sg.data.get/set/list/delete`, `sg.log`. Мережі, файлів, таймерів нема; 30 секунд і 300 викликів на прогін. Агент працює від імені свого ШІ-співробітника («<назва> · агент»): його розділи, ліміти й «спочатку запитати» (видалення, гроші, масові, відправки) — у пульті ШІ-співробітників. Розширень, агентів і розділів агент не створює.

## 6. Приклад сторінки

```html
<div class="sg-sheet my-page">
  <header class="my-head">
    <div><h1 class="sg-title">Прострочені угоди</h1><span class="sg-muted">де минув термін етапу</span></div>
    <button class="sg-btn sg-btn--black" id="run">Нагадати всім</button>
  </header>
  <div class="sg-group"><div class="sg-table-wrap"><table class="sg-table"><thead><tr><th>Угода</th><th>Клієнт</th><th class="sg-num">Сума</th></tr></thead>
    <tbody id="rows"><tr><td colspan="3" class="sg-empty">Завантаження…</td></tr></tbody></table></div></div>
</div>
<style>
  .my-page { padding: 24px; display: grid; gap: 14px; }
  .my-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
  @media (max-width: 768px) { .my-page { padding: 16px; } .my-head .sg-btn { width: 100%; } }
</style>
<script>
  async function load() {
    const res = await sg.read("/api/crm/deals", { overdue: true, per_page: 50 });
    document.getElementById("rows").innerHTML = res.items.length ? res.items.map((d) =>
      `<tr><td><a href="#" data-id="${d.id}">${d.title || "#" + d.id}</a></td><td>${d.client?.company || ""}</td>` +
      `<td class="sg-num">${d.total_amount ?? ""}</td></tr>`).join("") : `<tr><td colspan="3" class="sg-empty">Прострочених нема</td></tr>`;
  }
  document.addEventListener("click", (e) => { const a = e.target.closest("[data-id]"); if (a) { e.preventDefault(); sg.navigate("/crm/deals/" + a.dataset.id); } });
  document.getElementById("run").onclick = async () => { const r = await sg.runAgent({}); sg.toast(r.ok ? "Готово" : r.error); load(); };
  load();
</script>
```

## 7. Версії, відкат, запуск агента
- Кожне збереження — нова версія з приміткою «Що змінено»; «Версії» в налаштуваннях або `extensions_versions` показують історію, «повернути» — `extensions_rollback`.
- «Запустити агента» на сторінці розширення («Дії з розширенням») або в налаштуваннях; результат, журнал `sg.log` і помилка — у «Запуски агента» або у відповіді `extensions_run`.
- «Код і версії» в «⋮» сторінки веде до налаштувань розширення.

## Можливі помилки
| Що ви бачите | Чому | Що зробити |
| --- | --- | --- |
| «Розширенню потрібен код сторінки або агента» | Порожнє розширення | Додайте `page_html` або `agent_js` |
| «Код агента має оголосити function run(input) { … }» | Нема функції `run` | Оголосіть `function run(input)` |
| «Код сторінки довший за … символів» / «Код агента довший за … символів» | Ліміт 400 000 / 120 000 символів | Скоротіть код |
| «Розклад — не частіше ніж раз на 5 хвилин» | Замалий інтервал | Вкажіть 5 хвилин або більше |
| «Невідомий інструмент у дозволах: …» | Такого інструмента нема | Візьміть назву з `extensions_guide.tools` |
| «Іконку обирають з набору: …» | Іконка не з переліку | Виберіть іконку з переліку в розділі 2 |
| «Міст читає лише розділи CRM (/api/crm/…), довідку й каталог» | `sg.read` на інший шлях | Читайте лише `/api/crm/…` |
| «Запис сховища більший за 64000 символів» / «У сховищі розширення вже 20000 записів» | Ліміти сховища | Розбийте дані або приберіть старі записи |
| «Розширення пише ШІ з правом творця «Свої розширення» …» | ШІ без права творця | Попросіть адміністратора видати право |
| «Розширення налаштовує людина з доступом до «Налаштувань CRM»» | Людина без доступу | Попросіть адміністратора |

## Для ШІ-співробітників
Інструменти творця (потрібне право «Свої розширення (код)»):

| Інструмент | Що робить |
| --- | --- |
| `extensions_guide` | СПОЧАТКУ ПРОЧИТАЙТЕ: ця інструкція і перелік інструментів для `permissions` |
| `extensions_list` | Розширення організації (`made_by` — автор; змінювати можна лише свої) |
| `extensions_get` | Моє розширення з кодом сторінки й агента |
| `extensions_create` | Нове розширення: `title`, `icon`, `page_html`, `agent_js`, `schedule_minutes`, `permissions`, `note` |
| `extensions_update` | Змінити моє розширення (нова версія; `note` — що змінилося) |
| `extensions_versions` | Версії мого розширення |
| `extensions_rollback` | Повернути версію |
| `extensions_run` | Запустити агента: результат, `logs`, помилка |
| `extensions_delete` | Видалити моє розширення. **Спочатку запитати** (вид `delete`) |

Сторінки розширень відкривають люди; ШІ працює з даними через інструменти.

Чого не можна: ходити в інтернет зі сторінки (заборонено політикою безпеки), читати токени й паролі, змінювати ядро Helomi, налаштування організації, чужі розширення й агентів людей. Порушення стилю (свої кольори, смайлики, друге чорне) вважається помилкою — виправляйте наступною версією.

## Додаткова інформація
- Пов'язані статті: [Розділ від ШІ: файл розділу](section-package.md), [Власні розділи](custom-sections.md), ШІ-творець (`ai-creator.md`), ШІ-співробітники (`ai-employees.md`).


---

# Консоль платформи

Helomi — платформа: кожна компанія має свій акаунт з окремою базою, своїми людьми, ключами інтеграцій і ШІ-співробітниками. Консоль платформи — окремий інтерфейс адміністратора платформи для керування всіма компаніями: підписки й оплати, тарифи, підтримка, оголошення, журнал. Дані компаній у консолі приватні: зайти всередину можна лише тоді, коли сама компанія відкрила доступ підтримки.

## Можливості
- Список компаній зі станом, підпискою, «Оплачено до», кількістю людей, розміром бази й останнім входом.
- Підписка 3 000 грн на місяць, пробний період, рахунки, позначка «оплачено» вручну, автопризупинення.
- Тарифи з лімітами людей, ШІ-співробітників, власних розділів і місця.
- Звернення компаній і відповіді на них.
- «Увійти як власник» і вивантаження — лише з доступом підтримки, відкритим компанією на час.
- Видалення з утриманням 30 днів, оголошення для всіх компаній, журнал усіх дій консолі.
- Окремий логін і пароль адміністратора платформи.

## 1. Налаштування
- Консоль відкриває адміністратор платформи: «Налаштування → Компанія → Консоль платформи» або після входу окремою поштою адміністратора (вона одразу веде в консоль). Ліворуч — меню консолі: «Огляд», «Компанії», «Оплати», «Тарифи», «Підтримка», «Оголошення», «Журнал», «Ломі», «Сервер», «Налаштування»; унизу — «До своєї компанії» і «Вийти».
- Консоль → «Налаштування»: ціна підписки, пробний період, пільгові дні, відкрита чи закрита реєстрація компаній, реквізити для рахунків, email підтримки.
- Там само — «Вхід адміністраторів платформи»: пошта (не з жодної компанії) і пароль (щонайменше 10 символів, літери й цифри) → «Створити окремий вхід». Робочому акаунту компанії можна «Забрати права» — тоді ваша компанія справді така сама, як усі (останнього адміністратора забрати не можна).

Консоль і пункт «Тариф і оплата» з'являються, коли сервер працює в режимі кількох організацій; «Підтримка» тоді пише команді Helomi.

## 2. Огляд і компанії
«Огляд»: «Компаній» (і нових за 30 днів), «Дохід на місяць», «Сплачено за 30 днів», «Прострочено», «Пробний період», «Нові звернення»; нижче — прострочені рахунки й нові звернення.

«Компанії»: пошук «Назва, адреса чи email власника», таблиця «Компанія», «Стан», «Підписка», «Оплачено до», «Людей», «База», «Останній вхід». «+ Компанія» → «Назва *» і «Коротке ім'я (slug) *» (латиниця, цифри й дефіс; змінити потім не можна) → «Створити». Нові компанії створюються лише в суворому режимі сервера.

Клік по компанії — картка: «Власник і контакти», «Реквізити», «Підписка», «Рахунки», «Використання за 30 днів» (графіки), «Доступ підтримки», «Звернення».

## 3. Підписка, рахунки, оплати
- У картці компанії — «Підписка» → «Зберегти підписку». Наявні компанії стоять «без оплати», нові отримують пробний період.
- Рахунки виставляються самі; невчасно сплачена компанія призупиняється автоматично (перевірка щогодини).
- «Оплати»: фільтри «усі», «виставлені», «прострочені», «оплачені», «скасовані». Платіжної системи поки нема: «оплачено» в рядку рахунку ставиться вручну й продовжує підписку; рахунок можна скасувати.

## 4. Тарифи й ліміти
«Тарифи» — ліміти людей, ШІ-співробітників, власних розділів і місця для кожного тарифу, з кількістю компаній на ньому. Коли компанія впирається в ліміт, вона бачить «Тариф «…» дозволяє до N … Щоб додати більше, зверніться до адміністратора платформи». Розмір бази лише показується, але не блокує роботу.

## 5. Підтримка і доступ підтримки
- «Підтримка» в консолі: звернення всіх компаній. Фільтри одним рядком: пошук (тема, текст листування, автор, компанія, №),
  стан з лічильниками («Усі», «Нові», «Є відповідь», «Закриті»), тема («Помилка в системі», «Як налаштувати», «Пропозиція»,
  «Оплата й тариф», «Інше»), результат від людини («Вирішено», «Не вирішено», «Ще не оцінено») і компанія. У рядку — кольорова
  точка теми, компанія, автор, стан і результат; праворуч — листування, «Відповісти», «Закрити звернення».
- Після кожної відповіді людина в компанії бачить «Питання вирішено?»: «Так, вирішено» — звернення закривається з позначкою
  «вирішено»; «Ні, не вирішено» + пояснення — звернення знову нове, позначка «не вирішено», пояснення — в листуванні. Нова
  відповідь підтримки скидає оцінку, людина оцінює знову.
- Доступ до даних компанії відкриває **сама компанія**: «Налаштування → Система → Підтримка → Доступ підтримки» — «на годину», «на добу» або «на тиждень» → «Відкрити доступ»; закрити раніше — «Закрити доступ». Поки доступ закрито, адміністратор платформи бачить лише назву, тариф і використання, а не угоди, клієнтів і файли.
- З відкритим доступом у картці компанії працюють «Увійти як власник» (вхід записується в журнал і видно компанії) і «Вивантажити» (архів бази й файлів).

## 6. Призупинити, видалити, вивантажити
Унизу картки компанії: «Призупинити» / «Увімкнути» і «Видалити». Видалена компанія одразу втрачає вхід, її дані зберігаються 30 днів (можна відновити), потім база й файли переносяться в архів на сервері. Однаково для всіх компаній, у тому числі компанії №1.

## 7. Оголошення і журнал
- «Оголошення» — текст, тип («звичайне» або «важливе») → «Опублікувати». У всіх компаніях воно показується пігулкою внизу екрана (над доком телефона).
- «Журнал» — усі дії консолі, оплати, доступи підтримки, реєстрації.
- «Сервер» — стан машини платформи (що зробити, ресурси, сервіси, база, бекапи, безпека). Це справа платформи, а не компанії,
  тому в режимі кількох організацій «Сервер» є лише в консолі, а з «Налаштування → Система» компаній прибраний; без режиму
  платформи (одна компанія, консолі нема) він лишається в «Налаштування → Система». Стан сервера бачить лише адміністратор
  платформи — і окремим входом адміністратора, і робочим акаунтом своєї компанії, поки цей акаунт є в списку «Консоль →
  Налаштування → Вхід адміністраторів платформи».

## 8. Що бачить компанія
- «Налаштування → Компанія → Тариф і оплата» — «Підписка», «Ціна» на місяць, «До сплати», «Як оплатити», таблиця рахунків («Рахунок», «Період», «Сума», «Стан», «Сплатити до»).
- «Налаштування → Система → Підтримка» — одна сторінка (раніше були дві: «Служба підтримки» і «Підтримка Helomi»):
  «+ Нове звернення» з темою (помилка в системі, як налаштувати, пропозиція, оплата й тариф, інше), список з тими самими
  фільтрами, листування, «Питання вирішено?», «Дописати», «Відкрити знову». Пише кожен працівник компанії й бачить свої
  звернення; адміністратор компанії бачить усі звернення компанії і керує «Доступом підтримки» (смуга вгорі сторінки).
  Стара адреса `/crm/settings/help-desk` відкриває ту саму сторінку.
- «Налаштування → Мій акаунт → Мої організації» — компанії, у яких людина працює з тією самою поштою, і перехід між ними.

## 9. Захист
- Кожен запит — лише в межах своєї компанії: чужі дані відповідають «не знайдено» (суворий режим).
- Вхід захищено від підбору пароля: 10 невдалих спроб за 15 хвилин — пауза.
- Реєстрація компаній: пастка для ботів, не більше 5 реєстрацій на годину з однієї адреси, вимоги до пароля; відкривається в консолі → «Налаштування».

## 10. Ломі для всіх компаній і на головній
Консоль → «Ломі» — ключі, якими Ломі працює в усіх компаніях, і її поведінка на головній сторінці.

- **Голос — Google (Gemini TTS).** «Ключ Google AI», перемикач «Озвучувати Ломі цим ключем у всіх компаніях», «Голос», «Модель озвучення», «Швидкість мовлення», «Рушій голосу Google» («Gemini, потім Chirp 3 HD» — типово: коли ліміт Gemini вичерпано на всіх ключах і моделях — Google Cloud Text-to-Speech, голоси Chirp 3 HD, 1 млн знаків на місяць безкоштовно, потрібен увімкнений Cloud Text-to-Speech API в проєкті ключа; «Chirp 3 HD, потім Gemini»; «лише Gemini»; «лише Chirp 3 HD»), галочка «Вичерпано ліміт моделі Gemini — брати іншу модель Gemini» (у кожної моделі свій ліміт), «Запасний голос, коли Google не озвучив» («Поліна» — безкоштовний голос Microsoft, типово; «вимкнено» — тоді без Google лише текст; під полем — скільки разів Поліна озвучила сьогодні), «Як говорити». Ключ зберігається зашифрованим і назад не показується — лише «задано ••••» і чотири останні символи.
- **Мозок — Anthropic (Claude).** «Ключ Anthropic» і перемикач «Думати Ломі цим ключем у всіх компаніях — платить платформа». Компанія зі своїм ключем бере свій.
- **Ломі на головній — для гостей.** Перемикач «Ломі говорить з гостями головної», стан («відповідає моделлю» або «без ключа — відповіді з WIKI», «голос Gemini» або «голос браузера»), лічильник «сьогодні запитань», «Модель для гостей» (claude-opus-5-5 — найрозумніша, claude-haiku-5-5 — найдешевша й найшвидша), «Запитань на добу (усі гості)», «Запитань з однієї адреси на годину», «Довжина відповіді гостю» (знаків, 150–1000, типово 500), «Запасні ключі Google» — скільки завгодно ключів Google у черзі: Ломі працює з основним, а коли той вичерпав добовий ліміт Google, одразу бере наступний (до вичерпаного повертається після півночі за тихоокеанським часом); біля кожного видно, скільки озвучень сьогодні й чи він на паузі, «Привітання» і «Екскурсія» — одна репліка на рядок у порядку Можливості, ШІ-співробітники, Інтеграції, WIKI, Телефон, Ціна, Почати; «Планети першого екрана» — що Ломі каже, коли гість торкається планети-розділу у вихорі, рядок на планету: Угоди, Склад, Фінанси, Документи, Доставки, Переписки, ШІ-співробітники, WIKI. Окрема група «Звуки розділів головної»: перемикач тихого фону, «Гучність фону» (0–1, типово 0,15), «Під голосом Ломі — частка гучності» (типово 0,5: чутно, але тихо) і для кожного розділу головної свій звук — Космос, Місто й сміх, Ліс, Тихий дощ у лісі, Парк із фонтаном, Море або Тиша; тематичні елементи розділу змінюються разом зі звуком. Записи — у суспільному надбанні. Для гостей ключ Anthropic береться з цієї сторінки завжди, незалежно від перемикача «для всіх компаній»; якщо його нема — ключ із .env сервера.

Гостям Ломі відповідає лише про Helomi і CRM, не бачить даних жодної компанії й нічого не змінює. Озвучити можна лише репліки, які видав сервер (вони підписані), тож ключ Google не використати для чужого тексту.

## Можливі помилки
| Що ви бачите | Чому | Що зробити |
| --- | --- | --- |
| «Увійти як власник» і «Вивантажити» неактивні | Компанія не відкрила доступ підтримки | Попросіть компанію відкрити доступ у «Налаштування → Підтримка» |
| Працівник не бачить «Доступ підтримки» | Доступом керує лише адміністратор компанії | Попросіть адміністратора |
| «Тема звернення: bug, howto, …» | Через API передано невідому тему | Візьміть одну з: `bug`, `howto`, `idea`, `billing`, `other` |
| «Платформа ще в м'якому режимі…» | Сервер не в суворому режимі | Увімкнути суворий режим на сервері, потім «+ Компанія» |
| «Тариф «…» дозволяє до N …» (у компанії) | Ліміт тарифу | Змініть тариф компанії в консолі |
| Немає пункту «Консоль платформи» | Ви не адміністратор платформи або сервер в одній організації | Увійдіть окремим входом адміністратора |
| «Стан сервера бачить лише адміністратор платформи» | Акаунт, яким ви ввійшли, не адміністратор платформи | Увійдіть окремим входом адміністратора (створюється в «Консоль → Налаштування → Вхід адміністраторів платформи») |

## Для ШІ-співробітників
Консолі для ШІ нема і не буде: ШІ-співробітник працює лише всередині своєї компанії. Тарифний ліміт ШІ-співробітників діє і на агентів, яких створює ШІ-творець. Звернення в підтримку пишуть люди: токен ШІ на `/api/platform/my/support*` отримує 403. Якщо людина просить ШІ «напиши в підтримку», ШІ підказує їй сторінку «Налаштування → Підтримка» і тему (помилка, як налаштувати, пропозиція, оплата, інше).

## Додаткова інформація
- Пов'язані статті: [Люди, ролі, доступи](settings-access.md), [Налаштування: огляд](settings.md), [ШІ-співробітники](ai-employees.md).
