Справочник

Чат-каналы

Как Telegram, веб-виджет, HTTP API и MCP-сервер подключаются к одному интерфейсу ChatChannel.

Все входящие в Cradle сообщения используют единый абстрактный интерфейс ChatChannel. Независимо от того, пришло сообщение из Telegram, виджета на сайте, REST-вызова или MCP-клиента, оно проходит через один и тот же triage, RAG и approval pipeline.

Интерфейс ChatChannel

type IncomingMessage = {
  channelId: 'telegram' | 'widget' | 'api'
  chatId: string
  userId?: string
  text: string
  timestamp: number
  attachments?: Array<{ type: string; url?: string; name?: string }>
  channelMeta: Record<string, unknown>
}

type SendMeta = { inReplyTo?: string; markdown?: boolean }

interface ChatChannel {
  id: string
  start(): Promise<void>
  stop(): Promise<void>
  onMessage(handler: (msg: IncomingMessage) => void): void
  sendMessage(chatId: string, text: string, meta?: SendMeta): Promise<void>
  sendAttachment?(chatId: string, attachment: unknown): Promise<void>
  markTyping?(chatId: string): Promise<void>
}

ChannelManager (src/core/channels/channel-manager.ts) ведёт реестр каналов, запускает и останавливает их согласно channels_config.enabled, и маршрутизирует исходящие ответы обратно в нужный канал.

Telegram

TelegramChannel построен на grammY с long polling. Не требуется публичный URL, что подходит для on-premise-развёртываний за файрволом. Конфигурация — только токен бота в channels_config.telegram.config.botToken.

Веб-виджет

WidgetChannel поднимает Fastify-сервер в main process на порту 31415 по умолчанию. Раздаёт self-contained IIFE bundle (packages/widget/), который монтируется через shadow DOM и общается по WebSocket.

Embed-snippet:

<script
  src="https://cradle.example.com:31415/widget.js"
  data-cradle-widget
  data-api-key="wk_..."
  data-accent="#10b981"
  data-position="bottom-right"
  async></script>

Bundle ~49 KB gzipped. История хранится в браузерном localStorage, visitorId генерируется при первом открытии.

EndpointНазначение
GET /widget.jsРаздача bundle
GET /api/widget/config/:apiKeyТема, позиция, locale
POST /api/widget/messageПриём сообщения посетителя
WS /api/widget/wsReal-time ответы и typing

Аутентификация виджета — channel-level API key и опциональный allowedOrigins.

HTTP API

ApiChannel — REST-канал, подробно описан в HTTP API reference. Поддерживает sync, async и webhook режимы и предназначен для мобильных приложений, web-бэкендов, CLI-интеграций и инструментов автоматизации.

MCP-сервер

McpServerChannel выставляет возможности Cradle как MCP-tools через Streamable HTTP на порту 31417 по умолчанию. Это направление по умолчанию: Cradle — сервер, клиенты (SmartNotes, n8n, Claude Code) к нему подключаются.

ToolScopeНазначение
cradle_search_kbkb:readRAG-поиск
cradle_list_kbskb:readСписок баз знаний
cradle_list_agentsagents:readСписок агентов
cradle_execute_agentagents:executeStateless вызов агента
cradle_get_tickettickets:readЧтение тикета
cradle_list_ticketstickets:readСписок тикетов
cradle_summarize_notesagents:executeОчистка и суммаризация заметок
cradle_submit_issuemessages:writeСоздать тикет в общем Inbox

MCP-запросы reuse тот же Bearer / X-Api-Key middleware и scope-проверки, что и HTTP API, прежде чем попасть в MCP-транспорт.

SmartNotes flow

  1. SmartNotes (MCP-клиент) отправляет все надиктованные заметки скопом в cradle_summarize_notes. Cradle очищает текст, делает summary и извлекает issues, возвращает их клиенту.
  2. Оператор ревьюит issues в SmartNotes и отправляет выбранные через cradle_submit_issue. Cradle создаёт тикет в общем Inbox, прогоняет triage по всем проектам и маршрутизирует issue в проект победившего агента. Автоответа нет — каждый issue всегда уходит оператору на ревью.

Запуск и остановка каналов

Desktop-приложение показывает каждый канал в Integrations. На headless-сервере каналы стартуют автоматически, если включены в channels_config. CLI может показать список через cradle channels list.