feat(chatcoop): транскрипция — снять лимит memo 4000, скилл blago transcription memo #23

Merged
ant merged 8 commits from feat/chatcoop-transcription-memo into dev 2026-05-22 06:59:30 +00:00
Owner

Summary

  • Снять лимит 4000 символов на поле memo транскрипции звонка: на бэкенде убран @MaxLength(4000) с UpdateCallTranscriptionMemoInputDTO.memo, на фронте — maxlength/counter с q-input в TranscriptionMemoEditor.
  • Сузить права на мутацию chatcoopUpdateTranscriptionMemo до chairman | member (роль user снята). Read-методы транскрипций — без изменений.
  • В blago-cli — новая команда blago transcription memo <pathOrId> [--file <path>] [--text <inline>], которая публикует memo на сервер через ту же мутацию. <pathOrId> — это либо путь к meetings/<stem>.md (UUID транскрипции резолвится из .blago/index.json по записи entity_type=call_transcription), либо UUID напрямую. По умолчанию текст берётся из sibling-файла meetings/<stem>.memo.md (тоже pull-only, в blago push не уходит).
  • Скилл ai/commands/manage-transcription-memo.md (распространяется через blago init --claude) описывает workflow «прочитать meeting → собрать .memo.md → согласовать с пользователем → опубликовать через blago transcription memo».

Затронутые файлы

  • components/controller/src/extensions/chatcoop/application/dto/transcription.dto.ts
  • components/controller/src/extensions/chatcoop/application/resolvers/transcription.resolver.ts
  • components/desktop/extensions/chatcoop/features/Transcription/EditMemo/ui/TranscriptionMemoEditor.vue
  • components/blago-cli/src/cmd/run-cli.ts
  • components/blago-cli/src/sync/update-transcription-memo.ts (новый)
  • components/blago-cli/ai/commands/manage-transcription-memo.md (новый)

Не нужно

  • GraphQL schema/SDK regen — @MaxLength и @AuthRoles runtime-декораторы, в schema.gql не влияют. Mutations.ChatCoop.UpdateTranscriptionMemo в SDK уже есть.

Test plan

  • blago transcription memo --help показывает корректную справку
  • blago transcription memo <meetings/...md> без флагов берёт sibling .memo.md и публикует memo (sanity-check после login)
  • blago transcription memo <UUID> --text "тест" обновляет memo по UUID напрямую
  • Desktop: на странице транскрипции у chairman/member textarea принимает текст >4000 символов и сохраняет
  • Desktop: обычный user видит memo readonly с подсказкой о правах
  • Бэкенд возвращает 403/forbidden на chatcoopUpdateTranscriptionMemo для роли user
## Summary - Снять лимит **4000 символов** на поле `memo` транскрипции звонка: на бэкенде убран `@MaxLength(4000)` с `UpdateCallTranscriptionMemoInputDTO.memo`, на фронте — `maxlength`/`counter` с `q-input` в `TranscriptionMemoEditor`. - Сузить права на мутацию `chatcoopUpdateTranscriptionMemo` до `chairman | member` (роль `user` снята). Read-методы транскрипций — без изменений. - В `blago-cli` — новая команда `blago transcription memo <pathOrId> [--file <path>] [--text <inline>]`, которая публикует memo на сервер через ту же мутацию. `<pathOrId>` — это либо путь к `meetings/<stem>.md` (UUID транскрипции резолвится из `.blago/index.json` по записи `entity_type=call_transcription`), либо UUID напрямую. По умолчанию текст берётся из sibling-файла `meetings/<stem>.memo.md` (тоже pull-only, в `blago push` не уходит). - Скилл `ai/commands/manage-transcription-memo.md` (распространяется через `blago init --claude`) описывает workflow «прочитать meeting → собрать `.memo.md` → согласовать с пользователем → опубликовать через `blago transcription memo`». ## Затронутые файлы - `components/controller/src/extensions/chatcoop/application/dto/transcription.dto.ts` - `components/controller/src/extensions/chatcoop/application/resolvers/transcription.resolver.ts` - `components/desktop/extensions/chatcoop/features/Transcription/EditMemo/ui/TranscriptionMemoEditor.vue` - `components/blago-cli/src/cmd/run-cli.ts` - `components/blago-cli/src/sync/update-transcription-memo.ts` (новый) - `components/blago-cli/ai/commands/manage-transcription-memo.md` (новый) ## Не нужно - GraphQL schema/SDK regen — `@MaxLength` и `@AuthRoles` runtime-декораторы, в `schema.gql` не влияют. `Mutations.ChatCoop.UpdateTranscriptionMemo` в SDK уже есть. ## Test plan - [ ] `blago transcription memo --help` показывает корректную справку - [ ] `blago transcription memo <meetings/...md>` без флагов берёт sibling `.memo.md` и публикует memo (sanity-check после login) - [ ] `blago transcription memo <UUID> --text "тест"` обновляет memo по UUID напрямую - [ ] Desktop: на странице транскрипции у chairman/member textarea принимает текст >4000 символов и сохраняет - [ ] Desktop: обычный user видит memo readonly с подсказкой о правах - [ ] Бэкенд возвращает 403/forbidden на `chatcoopUpdateTranscriptionMemo` для роли user
claude added 2 commits 2026-05-22 05:41:02 +00:00
- backend: убран @MaxLength(4000) с UpdateCallTranscriptionMemoInputDTO.memo и описание лимита из @Field
- backend: chatcoopUpdateTranscriptionMemo больше не доступен роли user, только chairman/member (read-методы — без изменений)
- desktop: TranscriptionMemoEditor больше не задаёт maxlength и counter в q-input
- `blago transcription memo <pathOrId> [--file <path>] [--text <inline>]` — публикация краткого содержания транскрипции через chatcoopUpdateTranscriptionMemo
- pathOrId: путь к meetings/<stem>.md (id из .blago/index.json, entity_type=call_transcription) или UUID
- default-источник memo — sibling-файл meetings/<stem>.memo.md рядом с meeting (pull-only, в push не уходит)
- скилл ai/commands/manage-transcription-memo.md описывает workflow «прочитать meeting → собрать .memo.md → согласовать → опубликовать»
claude added 1 commit 2026-05-22 05:44:50 +00:00
- новый entity_type call_transcription_memo в index-store (тип файла .memo.md, parsing/sync через стандартный syncEntityFile)
- pull-communication: для каждой COMPLETED-транскрипции с непустым tr.memo пишет sibling-файл meetings/<stem>.memo.md (hash = "<uuid>:memo"); при наличии локального draft, не индексированного в .blago/index.json, серверный memo не записывается — выводится warning
- update-transcription-memo: после успешной мутации сохраняет sibling и заносит запись в индекс (etag локального файла), чтобы следующий pull шёл штатно через syncEntityFile вместо warning'а
- скилл manage-transcription-memo: добавлены замечания про pull-синк, git-style маркеры конфликта и поведение неиндексированных черновиков
claude added 1 commit 2026-05-22 05:52:56 +00:00
- pull-communication: для каждой COMPLETED-транскрипции вызывает syncTranscriptionMemoFile, который ВСЕГДА обеспечивает файл meetings/<stem>.memo.md (пустой, если на сервере memo пуст). Файл сразу индексируется (entity_type=call_transcription_memo) — редактирование→blago transcription memo идёт без шагов «создать файл».
- Конфликты при отсутствии prev-индекса разруливаются явно: server пуст → принять локальный draft как baseline; оба непустые и разные → git-style merge-markers; совпало → проиндексировать как есть.
- update-transcription-memo: текст ошибки про отсутствующий sibling указывает на blago pull (создаст sibling сам).
- скилл manage-transcription-memo: процедура переписана под «sibling уже есть, просто открой и редактируй».
claude added 1 commit 2026-05-22 06:01:02 +00:00
Курсор transcriptionLastEndedExclusiveByProject фильтровал ВСЕ артефакты транскрипции — поэтому
для уже скачанных meeting.md sibling-файлы .memo.md не появлялись. Разделил циклы:

  1. meeting.md — только endedAt > lowerBoundExclusive (тяжёлый GetTranscription с сегментами).
  2. .memo.md  — для всех COMPLETED транскрипций каждый pull (поле memo приходит уже в лёгком
     GetTranscriptions, повторных запросов не делаем).

Проверено: blago pull → 4/4 sibling .memo.md появились пустыми в проекте 33-platforma-otchetov-dlya-fnsfss; затем blago transcription memo опубликовал 476 символов в крайней транскрипции 7116fb31-3b8c-4a63-9c0c-11da26aba075, повторный pull сохранил содержимое без конфликта.
claude added 1 commit 2026-05-22 06:06:00 +00:00
- TranscriptionMemoEditor: q-input type=textarea заменён на WrappedEditor (Milkdown через src/shared/ui/WrappedEditor) — теперь memo отображается с markdown-рендерингом (заголовки/списки/жирный/ссылки), а не как plain текст. Кнопка «Сохранить» вынесена в отдельную панель под редактором (фокус-кольцо и поле растут естественно). Минимальная высота 180px, без скролла — растёт по содержимому.
- TranscriptionDetailPage: max-width 720 → 1040px, padding 16/20 → 16/32 — страница перестала быть сильно зауженной, гармонично для desktop.
- скилл manage-transcription-memo: добавлен раздел «Формат содержимого .memo.md» — первая строка строго одно предложение ≤150 символов без markdown (о чём был звонок), затем пустая строка и сжатая суть; этикет/повторы/разогрев убираются.
claude added 1 commit 2026-05-22 06:25:27 +00:00
Список транскрипций был зажат max-width: 720px в центре страницы и собран из самописных rows. Заменил на тот же паттерн, что использует CalendarPage / CalendarEventsTable — q-page(padding) + q-table с колонками: Звонок (название + превью memo), Начало, Длительность, Участники, Статус. Клик по строке открывает детальную страницу транскрипции.
claude added 1 commit 2026-05-22 06:33:42 +00:00
- WrappedEditor (q-field+Editor) на странице транскрипции выглядел сломанным: floating-label «Заметка о звонке» падал поверх первой строки memo, кнопка «Сохранить» торчала сбоку без выравнивания, рамки редактора не было.
- Перешёл на голый Editor (Milkdown через src/shared/ui/Editor) в собственной карточке: border-radius:10px, рамка по тону --tr-border, padded=true. Кнопка «Сохранить» — в нижней панели карточки (border-top, flex-end). Hint «доступно председателю и членам совета» — отдельной строкой под карточкой.
- TranscriptionDetailPage: добавлен h2 «Заметка о звонке» как у секции «Текст», memo больше не висит без подписи.
ant approved these changes 2026-05-22 06:59:19 +00:00
ant merged commit a436527248 into dev 2026-05-22 06:59:30 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#23