POST /api/projects/:id/doc-content/:nodeId/inline-edit — Точечная правка блока (SSE)
Сгенерировано из матриц + кода. Правки вносить в источники (
docs/matrices/,server/routes/), не здесь.
| Поле | Значение |
|---|---|
| HTTP | POST /api/projects/:id/doc-content/:nodeId/inline-edit |
| Auth | optionalAuth, requireProjectAccess — гость + авторизованный, доступ к проекту (read/write) |
| Scope токена | read_write |
| PG-функции | api.upsert_block_doc_content |
| Таблицы | block_doc_content, block_doc_content_history |
| SRM | SRM-199 |
| RP (права) | RP-112 |
| Файл роута | server/routes/projects.js |
| Статус | done |
Аргументы запроса (best-effort из хендлера; путь-параметры опущены):
| Аргумент | Где | Обяз. | Заметка |
|---|---|---|---|
contentItemId | body | подтвердить | |
fullContent | body | подтвердить | |
instruction | body | подтвердить | |
selectedText | body | подтвердить |
Коды ответов/ошибок (из хендлера): 400, 403 (+ 200) — уточнить причины вручную
Для человека
Как открыть: откройте проект → вкладка «Doc» (▧) → в тексте блока выделите фрагмент мышью → во всплывающей подсказке впишите, что с ним сделать («сократи», «добавь пример», «формальнее»), и подтвердите.
Точечная правка: вы указываете на конкретный кусок текста и говорите, как его изменить, — переписывается весь блок целиком, но прицельно вокруг вашего выделения и инструкции. В контекст идут весь текст блока, выделенный фрагмент, ваша инструкция и тексты блоков-предшественников, так что правка остаётся согласованной с остальным документом.
Результат течёт потоком и заменяет текст блока целиком. Прежняя версия уходит в историю с пометкой «правка по выделению», поэтому изменение легко отменить (Ctrl+Z или «Отменить»). Инструкция — до 1000 символов, выделение — до 5000. Доступно владельцу проекта (и гостю — в своём проекте). Точные правила — RP-112.
Для агента
Запись — токен со scope read_write (см. Конвенции); под ролью владельца, write-доступ к проекту обязателен. Ответ — поток text/event-stream (SSE).
Тело запроса (JSON):
| Поле | Тип | Обяз. | Назначение |
|---|---|---|---|
selectedText | string | да | Выделенный фрагмент, ≤ 5000 символов |
instruction | string | да | Что сделать с фрагментом, ≤ 1000 символов |
fullContent | string | да | Текущий полный текст блока, ≤ 50 000 символов |
contentItemId | number | нет | Если правится не сам блок, а его артефакт — id этого артефакта |
Любое из обязательных полей пропущено → 400 (поток не открывается). Невалидный contentItemId → событие error в потоке.
Пример запроса (-N — потоковый ответ):
curl -N -X POST "https://specbuilder.vnimanie.ai/api/projects/a1b2c3d4-.../doc-content/node-7/inline-edit" \ -H "Authorization: Bearer tak_..." \ -H "Content-Type: application/json" \ -d '{"selectedText":"Данные берём из CRM.","instruction":"Уточни, какие именно поля","fullContent":"## Сбор данных\n\nДанные берём из CRM.\n..."}'Пример потока (события — из server/services/docGenerator.js):
event: generatingdata: {"nodeId":"node-7","label":"Сбор данных","phase":"inline-edit"}
event: chunkdata: {"nodeId":"node-7","text":"## Сбор данных\n\nИз CRM берём поля..."}
event: saveddata: {"nodeId":"node-7","version":5,"tokenEstimate":560}
event: donedata: {"nodeId":"node-7","phase":"inline-edit"}Возвращается весь обновлённый блок (не дифф) — собираете его из chunk-событий. saved означает, что результат записан, а прежняя версия ушла в историю с типом правки llm_inline — отсюда работает откат. done закрывает поток. Обрыв соединения прерывает генерацию (AbortController). Поток — SSE, не JSON и не Markdown.