Журнал изменений
Что нового.
Каждое усовершенствование платформы, как только она появится.
· kamo-internal
История производственного класса + вкладки голосовой почты с инструментом медиаплеера
Закладка истории (SoftphoneHistoryTab.tsx): Бесконечная прокрутка через IntersectionObserver внутри контейнера прокрутки панели - Фильтровые чипы: Все / Входящие / Исходящие / Пропущенные / Записанные - Запись иконки в строке действий, когда сторона изображения имеет запись строки - меню переполнения строки (Добавить в контакты) - Нажмите, чтобы позвонить обратно через существующий dialpad Закладка голосовой почты (SoftphoneVoicemailTab.tsx): Бесконечная прокрутка, фильтрующие чипы (All / Unread / Has audio) Per-row Play / Call Back / Больше действий - Автомаркировка в игре Двухвариантный диалог удаления: Archive (soft-hide, все пользователи) vs. Permanently delete (справа от VOIP VOICEMAIL PERMANENT DELETE; возвращается в состояние инвалидности для пользователей без него) - Кнопка "отметить все" с нулевой ценой Инструмент Mediaplayer popup **************************** - Аудио: синтезированный скруббер в стиле формы волны, click-to-seek, Replay10/Forward10, частота воспроизведения (0,5x-2x), цикл, громкость + немое, устройство вывода, выполненное из параметров AV Видео: содержит видопорт, PiP, полноэкранный, тот же скруббер + элементы управления - Многодорожечный селектор для записи вызовов (мастер + каждый канал) - Скачать - Два режима источника: запись voipApi (звонок/VM) или актив визуализации по imgId Зарегистрировано в tools/registry/registrations.ts Hook + сантехника: - UseSoftphone раскрывает историю + голосовые сообщения (loadMore, hasMore, isLoading) и действия архивирования / постоянного удаления - voipApi получает lookupRecording, getRecordingMetadata, archiveVoicemail, paginated getVoicemails - /api/voip proxy передает аудио/видео/октет-поток тела с **************** неповрежденным (без буферизации), поэтому медиа-элементы скраб - Новые **************** пересылки на новую конечную точку потоковой передачи DocsService с Range - VOIP VOICEMAIL PERMANENT DELETE добавлен в интерфейсный реестр RoleRightType, поэтому проверьте правильные ворота
· InitializerService
Миграционный бегун для колонок Recording provider-lookup + колонки архивов VM
Добавляет RECORDINGS.provider instance id (UUID) и provider external id (VARCHAR(64)) плюс составной индекс idx recordings provider lookup, используемый основной конечной точкой поиска вкладки «История софтфона». Также добавляется PHONE VOICEMAIL.is archived + date archived для нового потока мягкого архива. Уничтожает любые ранее существовавшие строки RECORDING / RECORDING EXTS в одном и том же проходе — естественно, идемпотентный (предикат соответствует только строкам, чей провайдер external id по-прежнему NULL, что не произойдет, когда ConversionService будет на новом пути кода). Заказ 35 — после **************** (30) так что таблицы записи существуют до приземления АЛТЕР.
· ConversionService
Persist providerInstanceId + providerExternalId на записи при глотании
Потоки X-Phone-Server-Id и X-Asterisk-Unique-Id (уже в UnprocessedRecording) на новых полях RecordingMetadata, поэтому строки вызова / голосовой почты в системе визуализации несут ключ соединения обратно в строку поставщика источника. Для голосовых сообщений помощник отправляет исходное имя файла (например, msg0000); мы удаляем префикс msg и ведущие нули, чтобы сохраненный ключ соответствовал тому, что REST API голосовой почты FreePBX возвращает в качестве идентификатора сообщения.
· DocsService
Добавить ******************* с поддержкой HTTP Range
Общие конечные точки потоковой передачи для аудио/видеоизображения, используемые внутренним инструментом MediaPlayer. Повторное использование авторизации ImageService (так же, как /download / ...), но потоков с Accept-Ranges + Content-Range, чтобы медиа-элементы могли очищаться без загрузки полного файла.
· VOIPService
Запись воспроизведения, архив голосовой почты, выделенная голосовая почта, обогащение истории
- Новая запись Контроллер с объемным поиском, потоковое аудио для треков master + per-channel и метаданные для окна инструмента медиаплеера CallController.getCallHistory / getVoicemails обогащает каждую строку с помощью записи изображений Id через новый RecordingLookupService - однократная поездка туда и обратно, без N + 1 - PhoneProvider.getVoicemails теперь принимает (memberId, страница, размер); FreePBX пагинирует клиентскую сторону от одного вывода, RingCentral использует нативную подкачку, KamoPBX продолжает бросать NotSupported - Конечная точка архива голосовой почты (скрыто через PhoneVoicemail.isArchived) и постоянное удаление, защищенное VOIP VOICEMAIL PERMANENT DELETE - GodActive bypass требует как GD-подхода, так и активного переключения - PhoneProvider получает GetInstanceId(), поэтому контроллеры могут решить ключ подключения для записи поиска без второго заводского вызова
· kamo-shared-library
Ключи поиска провайдера на Записи, архив голосовой почты, потоковая передача диапазона MinIO
- Запись: добавить провайдераInstanceId + провайдерExternalId для присоединения провайдера call-history / voicemail строки обратно к средствам визуализации - PhoneVoicemail: add isArchived + dateArchived for soft-hide from softphone listings - RoleRightType: добавить VOIP VOICEMAIL PERMANENT DELETE (разрушительные ворота удаляются; архив остается доступным для всех) - MinIOStorageService: добавьте openRange() + RangeStream, чтобы конечные точки аудио/видео могли выполнять HTTP Range - RecordingImagingService: поток провайдера id + внешний id через RecordingMetadata в строку Recording на ingest
· kamo-internal
Добавить вкладку «История» — выделенный график аудита с поиском и фильтрами
- LeadHistoryPanel: липкая панель инструментов фильтра с дебюнсированным поиском, фильтры ****************, таблица MUI с пагинацией, цветные чипы событий, разрешение имени участника для полей назначения / счета - leadApi: getLeadHistory() и getLeadHistoryFilters() с полной поддержкой запроса-парама - LeadHistoryEntry, LeadHistoryActor, LeadHistoryFieldMeta, LeadHistoryPageResponse, LeadHistoryFiltersResponse types - Next.js прокси-маршруты для **************** и /фильтры LeadViewClient подключается для рендеринга LeadHistoryPanel, когда активна вкладка History
· SecurityService
Добавить GET /{id}/history и /{id}/history/filters конечные точки
Назначенная, фильтруемая, доступная для поиска конечная точка с лид-историей с загрузкой пакетного актера (без N + 1). Конечная точка фильтра возвращает различные используемые поля, все поля реестра, различные субъекты и все типы событий. Все мутирующие конечные точки теперь передают вызывающего участника в качестве актера в LeadHistoryService для атрибуции.
· kamo-shared-library
Добавить журнал аудита истории лидов - сущность, реестр, сервис, DTO, крючки LeadService
- LeadHistory entity (UUID PK, простые длинные FK - никаких ограничений FK для удаления / преобразования свинца) - LeadHistoryEventType enum с читабельными этикетками - LeadHistoryFieldRegistry: единственный источник истины для ~55 отслеживаемых свинцовых полей; добавление поля - одна строка - Запись LeadFieldDescriptor (ключ, этикетка, категория, экстрактор) - LeadHistoryService: snapshot/diff pipeline, ************* paginated+filtered findHistory, distinctFields/Actors for filter dropdowns - LeadHistoryDTO с вложенным ActorDTO; все Длинные идентификаторы, сериализованные как Струна для точной безопасности CockroachDB JS - LeadService: история крючков на создание, обновление, удаление, назначение Lead, назначение LeadAccount, unassignLeadAccount
· SecurityService
Актер Wire LeadHistoryService следит за ведущим контролером
· kamo-internal
Добавить интерфейс назначения свинцового счета, валютную систему, страницы назначения / нового счета, настройки валютного поля
· SecurityService
Добавить конечные точки назначения свинцовой учетной записи, обновить AccountController для CurrencyType
· kamo-shared-library
Добавьте CurrencyType enum, обновите CountryType с основной валютой, добавьте валюту к Счету / Организации, добавьте назначение свинцового счета в LeadService
· kamo-internal
Динамическая этикетка типа участника в заголовке страницы моей учетной записи
Заголовок теперь гласит «Мой аккаунт участника команды», используя сконфигурированный этикетки поведения, автоматически переключающиеся после загрузки типа участника.
· kamo-internal
Переместить кнопку Create Document в панель инструментов DocManager
Кнопка была доступна только на /doc/manager. Перенес всю логику (состояние, обработчик, DOC TYPES, меню) в DocManager Он появляется на каждом встроенном экземпляре. Упрощенная страница.tsx DocManager без каких-либо действий.
· kamo-internal
Переместите почтовый адрес в строку 3 столбца с главной информацией и основным контактом
· kamo-internal
Международная поддержка — CountrySelect, LanguageSelect, Subdivision Поле во всех формах
- Добавить многоразовые CountrySelect (207 стран, значки флага), LanguageSelect (26 языков, значки флага), SubdivisionField (выпадение штата США с флагами; другие страны показывают помеченное текстовое поле) - Добавить константы стран (countries.ts, languages.ts, usStates.ts, timezones.ts) - Закладка «Lead view Details: per-card in-place editing» с полями **************** - Формы создания лидов: полный список стран/подразделений/временных зон, заменяющий ограниченные встроенные списки Настройки LabelManager: язык по умолчанию в разделе 8, CountrySelect+Subdivision Поле в обращении - ContactInfoStep (мастер сетевого создания): CountrySelect+SubdivisionField заменяет ограниченный выбор MyAccountTab: CountrySelect+SubdivisionField заменяет поля с простым текстом - types/leads.ts: add country and subdivision fields
· kamo-shared-library
Добавить международную поддержку — Ведущая страна/подразделение/временная зона, язык организации, CountryType isProvince
CountryType: add PROVINCE NAMES set, isProvince(), getSubdivisionLabel() - Организация: добавить язык (язык) поле - Свинец: добавьте поля страны (CountryType), подразделения (String), часового пояса (TimezoneType) **************** Добавить страны, подразделения, часовые пояса - LeadService.createLead: обработка новых полей; язык по умолчанию + страна из настроек организации - LeadService.updateЛид: обработка новых полей ************* Добавить язык touchedKey
· kamo-internal
ASSIGN LEADS справа, фильтр агента неназначенный вариант, очистка колонки сетки
- Врата «Неназначенные лидеры» фильтр фильтра за ASSIGN LEADS «Все лидеры» исключают неназначенных лидеров для членов без права Удалить колонки Street, Product, Source; удалить выпадающие фильтры Product/Source - Удалить колонку компании; в колонке контактов указано название компании, возвращается имя контакта - Колонка поставщиков показывает инструментарий с деталью продукта - источник - Столбцы даты опускают префикс будни, уменьшаются с 170px до 140px DateTimeDisplay: добавить showWeekday prop (по умолчанию ложный)
· kamo-shared-library
Добавить ASSIGN LEADS (ID 137) в разделе CRM
· kamo-internal
Добавить назначение Отправляйтесь в раздел «Рынок и назначение» /leads / new
- Привлекает активных членов команды из **************** на гору - Члены групп по отделам с алфавитно сортированными отделами и членами - Форматы с названиями "Последний, Первый"; первый вариант - "Авто Ассигнован / Не назначен" - Поля разделов заказов: Ведущий рынок, Назначение, Лучшее время для контакта, Продавец, Продукт, Тип перспективы (все lg = 4) Исправления лидовApi.ts для отправки назначенного TeamMemberId вместо мертвого назначенного поля пользователя - Добавляет назначенный TeamMemberId к типу Lead
· kamo-asterisk-support
Emit записал расширение At + per-file в манифесте загрузки
- Наблюдатель: каждая выпущенная Запись несет Записанную Ат, полученную из Сегмент EPOCH нашего управляемого **************** Имя файла, возвращаясь к файлу mtime для голосовой почты / устаревших файлов. - Grouper: CallBatch теперь отслеживает расширения файлов (один на файл, параллельно) Запись (англ. RecordedAt) и запись (англ. Earlyly leg start). Сортировка ключа для ног записывается с FinalizedAt в качестве тай-брейка, поэтому Нога мастера детерминирована. Загрузчик: манифест теперь включает в себя запись верхнего уровня At и per-file расширение. ConversionService потребляет и то, и другое для записи (date recorded, длина от ffprobe) и строки RecordingExt.
· ConversionService
Передача записи метаданных в визуализацию — длина ffprobe + анализ манифеста
********************** Скачать ffprobe -show entries на мастере Opus/WebM, возвращается мс. 0 = неизвестно (не смертельно). **************** сейчас: * запускает зондDurationMs на мастере для получения длины записи; * анализирует манифест (отправленный с помощью kamo-asterisk-support) и данные расширения / канала для каждого файла, возвращаясь к строке постановки анализ даты и названия канала для более старых полезных нагрузок; * проходит **************** Дата Запись, longMs, участвующие расширения) в RecordingImagingService Можно писать новые строки Recording + RecordingExt.
· kamo-shared-library
Запись + ЗаписьСубъекты, RecordingImagingService пишет их
- Новая регистрирующая организация (UUID id, IMG ID, IS MASTER, IS VM, EXTENSION, MEMBER ID, Длина, DATE RECORDED, DATE CREATED [DB-по умолчанию через @CreationTimestamp]. Один ряд на завершенную голосовую почту или запись вызова, загруженную на визуализацию. - Новая организация RecordingExt (UUID id, RECORDING ID, EXTENSION, MEMBER ID, IS MASTER. Один ряд на канал, который участвовал в записи; Основная нога помечена IS MASTER=true, каждая другая нога ложная. **************** теперь записывает Metadata пакет (phoneServerInstanceId, dateRecorded, longMs, участвующие расширения) и продолжает запись + запись в строках та же транзакция, что и Img / ImgDat. MemberId решается за одну ногу через **************************** VOIP экземпляр (нулевой, когда не назначен).
· kamo-internal
Обновление карт администрирования платформы в соответствии с унифицированной структурой вкладок
Заменить две устаревшие карты (отдельная страница организации + конфигурация) Пять карт, соответствующих фактическим вкладкам: General, Organizations, VOIP & SMS, System User, and Advanced — каждая ссылка напрямую на правильный ?tab= param.
· kamo-internal
Раскладка полнопроводной сетки и триггер синхронизации движения от Advanced Tab
- Перепроектировать вкладку VOIP и SMS для использования полной ширины области контента: охват статистики трубопроводов Верхний ряд, обработка записей и глобальный график синхронизации сидят бок о бок. в двухколонной сетке в точке разрыва lg+ - Трубопроводные карты показывают живые счета с галочками нулевого состояния и ошибкой цветовое кодирование; автообновление каждые 30 лет, отмеченное в подзаголовке - Карта Global Sync объединяет настройки расписания, строку временных меток последней синхронизации, и ручной триггер в одну панель; включенный / приостановленный чип в заголовке - Переместить «Force global VOIP sync» из вкладки Advanced (дубликат триггера) уже присутствует на VOIP и SMS; Расширенная вкладка теперь показывает текст заполнителя
· kamo-internal
Объединить организации на странице конфигурации с унифицированными вкладками nav
- Добавить организации в качестве вкладки в **************** (Общие организации · VOIP и SMS · Пользователь системы · Расширенный заказ) - Удалить ************* автономную страницу - Обновить Nav для администрирования платформы в SettingsStatusWindow, чтобы перечислить все 5 вкладок в качестве подпунктов, указывающих на конфигурацию?tab=... - Исправьте макет на всех вкладках: согласованная p: {xs:2, sm:3} накладка, чтобы содержимое больше не попадало в стены карт Улучшить карты GeneralTab с фоном значков и более жестким ритмом типографики - Update SettingsView title/subtitle для унифицированной страницы
· kamo-marketing
Add Go logo to BUILT WITH banner
· kamo-internal
Surface PHONE SERVER ID на вкладке обзора телефонных станций
Операторы, настраивающие поддержку kamo-asterisk на хосте FreePBX, должны вставлять Соответствие VoipProviderInstance UUID в файл конфигурации помощника PHONE SERVER ID. До сих пор им приходилось копаться в строке URL или в База данных. Новый раздел «Идентификатор сервера телефона» на /settings/features/phone/{id} Обзор показывает UUID в монопространственном поле только для чтения одним щелчком мыши Кнопка копирования (помощник CopyableIdField, также многоразовый для будущих аналогичных программ) идентификаторы).
· kamo-internal
Расширение VOIP в Interaction Center открывает софтфон с номером

Ваша вселенная ждет.
Начните бесплатно через несколько минут. Добавляйте продукты, когда будете готовы — без миграции, без новых логинов.
Бесплатно навсегда — не требуется кредитная карта