feat(ai-chat): expose full Docmost toolset to the in-app agent
Grow the agent tool registry in forUser() from 10 to 41 tools, wiring all remaining @docmost/mcp client capabilities: reads (workspace/spaces/pages/ sidebar/outline/json/node/table/comments/shares/history/diff/export) and reversible writes (editPageText, patch/insert/delete node, updatePageJson, table ops, copy/import content, share/unshare, restorePageVersion, updateComment, transformPage). Deliberately NOT exposed: deleteComment (irreversible hard delete) and the filePath-based image tools (uploadImage/insertImage/replaceImage — useless and unsafe for a server-side agent). transformPage omits the deleteComments option from its schema and never passes it, so the comment-deletion path is unreachable from the agent. - Extend DocmostClientLike with the new method signatures. - Update SAFETY_FRAMEWORK to describe the broader toolset while keeping the no-permanent-deletion guarantee and anti-prompt-injection rules; flag that comment-text edits are not version-tracked and sharing is public. - Add guardrail tests: no deleteComment tool; transformPage schema rejects deleteComments. - docs(ai-agent-chat-plan): record the toolset expansion and a backlog item to support image insertion by URL via the existing SSRF guard. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -671,3 +671,48 @@ API AI SDK v6 + мост стрима (H3/M4/M5), снять аудит как
|
||||
Все блокеры имеют конкретный механизм; непроверенные швы подтверждены. План **готов к старту
|
||||
этапа A**. Самый рискованный кусок — C2 (provenance-collab) — реализовать первым сквозным
|
||||
вертикальным срезом «правка агентом → бейдж в истории», чтобы снять интеграционный риск рано.
|
||||
|
||||
---
|
||||
|
||||
## 16. Бэклог: расширение тулсета агента (2026-06-17)
|
||||
|
||||
> Решения сессии по составу инструментов агента в `ai-chat/tools/ai-chat-tools.service.ts`.
|
||||
|
||||
**Сделано.** Раньше агенту были доступны только 10 тулов (поиск, чтение страницы, грубый
|
||||
CRUD страниц + create/resolve комментариев). Прокидываем в адаптер **все** оставшиеся
|
||||
возможности клиента `@docmost/mcp` (`packages/mcp/src/client.ts`), КРОМЕ удаления
|
||||
комментариев. Добавлены:
|
||||
|
||||
- **чтение:** `getWorkspace`, `listSpaces`, `listPages`, `listSidebarPages`, `getOutline`,
|
||||
`getPageJson`, `getNode`, `getTable`, `listComments`, `getComment`, `checkNewComments`,
|
||||
`listShares`, `listPageHistory`, `getPageHistory`, `diffPageVersions`, `exportPageMarkdown`;
|
||||
- **обратимая запись:** `editPageText`, `patchNode`, `insertNode`, `deleteNode`,
|
||||
`updatePageJson`, `tableInsertRow`, `tableDeleteRow`, `tableUpdateCell`, `copyPageContent`,
|
||||
`importPageMarkdown`, `sharePage`, `unsharePage`, `restorePageVersion`, `updateComment`,
|
||||
`transformPage`.
|
||||
|
||||
**Сознательно НЕ прокидываем:**
|
||||
|
||||
- `deleteComment` — hard delete комментария, необратимо (запрошено явно: «кроме удаления
|
||||
комментариев»). По той же причине у `transformPage` НЕ экспонируем опцию `deleteComments`
|
||||
(захардкожен `false`).
|
||||
- `uploadImage` / `insertImage` / `replaceImage` — принимают **локальный путь на ФС сервера**
|
||||
(`filePath`, НЕ URL). Для серверного агента это бесполезно (он не может положить файл на
|
||||
хост) и потенциально опасно — по сути примитив чтения локальных файлов хоста.
|
||||
|
||||
**ХОТИМ СДЕЛАТЬ (TODO): вставка картинок по URL.** Научить агента вставлять изображение
|
||||
**по URL**: агент передаёт ссылку → сервер скачивает картинку через уже имеющийся
|
||||
`external-mcp/ssrf-guard.ts` (защита от SSRF / приватных адресов) → грузит во вложения
|
||||
(`POST /files/upload`) и вставляет image-узел. Это безопасная и реально работающая замена
|
||||
filePath-тулам. Требует доработки клиента (новый метод `insertImageFromUrl`, либо опция `url`
|
||||
у существующих image-методов) или обёртки в адаптере с загрузкой во временный буфер.
|
||||
|
||||
**Замечания (учесть при ревью/эксплуатации):**
|
||||
|
||||
- `updateComment` редактирует контент комментария БЕЗ истории версий — **необратимо**;
|
||||
отступление от инварианта D2/D3 «агенту доступно только обратимое». Включено по явному
|
||||
запросу (исключили лишь удаление). Серверная проверка прав остаётся: правится только свой
|
||||
комментарий (`creatorId === authUser.id`).
|
||||
- `sharePage` делает страницу **публично доступной**; возвращаемый `publicUrl` строится от
|
||||
`apiUrl` адаптера (loopback `127.0.0.1`), поэтому для внешней ссылки нужен публичный хост
|
||||
(`MCP_DOCMOST_API_URL`).
|
||||
|
||||
Reference in New Issue
Block a user