# Реестр исходников и состояние портала

Где посмотреть все задепонированные снапшоты сразу — страница кабинета и её API-двойник `GET /v1/me/sources`. Плюс программная проверка того, включено ли сохранение исходников на портале.

Обзор хранилища и справочник эндпоинтов — [Хранилище исходного кода](/docs/source-storage).

## Проверка состояния портала

`GET /v1/me` возвращает блок `data.capabilities.apps.sourceStorage`:

При включённом сохранении:

```json
{
  "capabilities": {
    "apps": {
      "sourceStorage": {
        "enabled": true,
        "requiredBeforeDeploy": false,
        "automaticOnDeploy": true,
        "limits": {
          "maxBlobBytes": 524288000
        },
        "endpoint": "POST /v1/apps/:id/sources",
        "mcpToolName": "save_sources",
        "contentTypes": [
          "application/gzip",
          "application/x-tar",
          "application/zip",
          "application/octet-stream"
        ],
        "docs": "https://vibecode.bitrix24.tech/docs-content/source-storage.md"
      }
    }
  }
}
```

Вместе с лимитами блок отдаёт и указатели на способ сохранения: `endpoint`, `mcpToolName`, допустимые `contentTypes` и адрес этой документации.

Поле `freshnessWindowMinutes` приходит в этом блоке, только пока публикация проверяет возраст снапшота. Его отсутствие читается как «возраст не проверяется», поэтому по составу блока видно, какое правило действует для вашего портала.

При отключённом сохранении:

```json
{
  "capabilities": {
    "apps": {
      "sourceStorage": {
        "enabled": false,
        "requiredBeforeDeploy": false,
        "automaticOnDeploy": false,
        "disabledBy": "platform",
        "readOperations": "available",
        "reactivation": {
          "scope": "platform",
          "permission": "platform admin"
        }
      }
    }
  }
}
```

Два набора полей взаимоисключающие: при `enabled: false` указателей на сохранение в блоке нет. Поле `disabledBy` — `"platform"` (функция не включена на уровне платформы) или `"portal"` (владелец портала отключил). Поле `readOperations: "available"` означает, что список версий и скачивание остаются доступными даже при отключённом сохранении. Блок `reactivation` указывает, на каком уровне (платформа или портал) включается функция и какие права для этого нужны.

## Отключение для портала

Владелец портала может отключить сохранение исходников через раздел администрирования (`PATCH /api/admin/source-storage` с телом `{ "sourceStorageEnabled": false }`, требует сессии администратора). При отключении:

- `POST /v1/apps/:id/sources` возвращает `200 { skipped: true, reason: "DISABLED_FOR_PORTAL" }`.
- `POST /v1/apps/:id/publish` не проверяет наличие снапшота.
- `GET /v1/apps/:id/sources` продолжает возвращать ранее сохранённые версии.
- `GET /v1/apps/:id/sources/:versionId/download` остаётся доступным.

История сохранений переживает повторное включение — ранее созданные версии остаются доступными.

## Реестр исходников

Страница **«Исходники приложений»** доступна в личном кабинете через левое меню (иконка пакета). Она показывает сводный список всех задепонированных снапшотов — чтобы передать код новому разработчику или возобновить AI-сессию.

**Кто что видит:**
- **Участник портала (MEMBER)** — только свои снапшоты (те, что он загружал).
- **Администратор портала (ADMIN)** — все снапшоты портала, включая снапшоты других участников. Может скачать любой снапшот.

**Как скачать:**
1. Откройте «Исходники приложений» в меню.
2. Найдите нужную строку (сервер или приложение).
3. В меню строки выберите «Скачать последнюю версию» — браузер загрузит архив.

У строк-приложений в меню строки есть пункт «История версий» — он открывает страницу истории версий приложения в разделе «Хранилище».

**Примечание:** страница работает независимо от того, включено ли депонирование на уровне платформы — исторические снапшоты доступны даже если новые сохранения временно отключены.

## Сводный реестр исходников — `GET /v1/me/sources`

API-двойник страницы кабинета «Исходники приложений». Возвращает список владельцев снапшотов исходников (серверов и legacy-приложений) по всему, чем владеет вызывающий ключ. Ключ администратора аккаунта (ADMIN) видит весь аккаунт.

Требует **портального** ключа API. Менеджмент-ключ или ключ без привязки к порталу → `403 PORTAL_KEY_REQUIRED`.

### Параметры запроса

| Параметр | Тип | По умолчанию | Описание |
|----------|-----|--------------|----------|
| `page` | number | `1` | Номер страницы. |
| `limit` | number | `25` | Размер страницы, максимум `100`. |
| `search` | string | — | Фильтр по названию / имени сервера / имени владельца. |

### Ответ

`HTTP 200`:

```json
{
  "success": true,
  "data": [
    {
      "kind": "server",
      "ownerKey": "8de64f8d-...",
      "title": "Prod",
      "server": {
        "id": "8de64f8d-...",
        "name": "srv-prod",
        "displayName": "Prod",
        "mode": "blackhole",
        "status": "sleeping",
        "blackholeStatus": "DISCONNECTED",
        "deleted": false
      },
      "app": null,
      "user": { "id": "8f1a2b3c-...", "name": "Alex" },
      "latestVersionId": "v4",
      "latestSavedAt": "2026-05-21T10:15:30.000Z",
      "versionsCount": 4,
      "totalSizeBytes": 552960,
      "reachableViaApi": true,
      "listEndpoint": "/v1/infra/servers/8de64f8d-.../sources",
      "latestDownloadEndpoint": "/v1/infra/servers/8de64f8d-.../sources/v4/download"
    }
  ],
  "total": 1,
  "page": 1,
  "limit": 25
}
```

### Поля строки

| Поле | Тип | Описание |
|------|-----|----------|
| `kind` | string | `server` или `legacy-app`. |
| `ownerKey` | string | Идентификатор владельца строки: id сервера (`kind: server`) или id приложения (`kind: legacy-app`). |
| `title` | string | Отображаемое название (сервер или приложение). |
| `server` | object \| null | Для `kind: server`: `id`, `name`, `displayName`, `mode`, `status` (в нижнем регистре), `blackholeStatus`, `deleted`. Иначе `null`. |
| `app` | object \| null | Для `kind: legacy-app`: `id`, `title`. Иначе `null`. |
| `user` | object \| null | Владелец: `id`, `name`. Может быть `null`. |
| `latestVersionId` | string | Идентификатор самой свежей версии (`vN`). |
| `latestSavedAt` | string | Время сохранения последней версии (ISO 8601). |
| `versionsCount` | number | Количество версий. |
| `totalSizeBytes` | number | Суммарный размер архивов в байтах. |
| `reachableViaApi` | boolean | Доступна ли запись через V1-эндпоинты (см. ниже). |
| `listEndpoint` | string \| null | Готовый путь для получения списка версий владельца, либо `null`. |
| `latestDownloadEndpoint` | string \| null | Готовый путь для скачивания последней версии, либо `null`. |

- **`reachableViaApi`.** Значение `false` — у сервера, чей управляющий ключ был удалён, это осиротевшая запись, и у мягко удалённого legacy-приложения. У таких строк `listEndpoint` и `latestDownloadEndpoint` равны `null`. Строка всё равно попадает в список для видимости, но детальный переход по V1 на этого владельца вернёт `404`. Мягко удалённый сервер остаётся `true`: чтение и очистка его версий работают — [Версии удалённого сервера](/docs/source-storage/retention#версии-удалённого-сервера).
- **Статус сервера.** Для сервера Black Hole значение `status: "sleeping"` — это нормальное «припаркованное» состояние (сервер просыпается по требованию), а не сбой. Сопоставляйте его с `blackholeStatus`, чтобы отличить «припаркован, проснётся по требованию» от реальной проблемы. Значение — статус из БД, поддерживаемый флот-поллером (согласуется не мгновенно, ~15 с), а не результат живой сверки с провайдером.
- **Отличие от `GET /v1/infra/servers`.** Тот список ограничен строго серверами **вызывающего** ключа, поэтому сервер, привязанный к другому ключу того же владельца, там отсутствует, но присутствует в этом реестре.

### Коды ошибок

| HTTP | Код | Когда возвращается |
|------|-----|---------------------|
| 403 | `PORTAL_KEY_REQUIRED` | Ключ не привязан к порталу — менеджмент-ключ реестр не читает. |

Полный справочник кодов — [Коды ошибок](/docs/errors).

## Смотрите также

- [Хранилище исходного кода](/docs/source-storage)
- [Список версий и скачивание](/docs/source-storage/versions)
- [Серверные эндпоинты исходников](/docs/source-storage/servers)
- [Срок жизни версий и очистка](/docs/source-storage/retention)
- [Хранилище](/docs/storage)
