@torrow/sdk-client 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -3
- package/dist/index.d.ts +157 -52
- package/dist/index.js +416 -256
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/TorrowClientConfig.ts","../../../src/http/auth.ts","../../../src/http/TorrowHttpError.ts","../../../src/util/json.ts","../../../src/schema/response-dates.generated.ts","../../../src/util/response-dates.ts","../../../src/util/query-string.ts","../../../src/util/url.ts","../../../src/http/HttpClient.ts","../../../src/raw/RawClient.ts","../../../src/resources/common/facade-response-unwrap.ts","../../../src/util/path.ts","../../../src/resources/common/item-update-id.ts","../../../src/resources/common/discriminator.ts","../../../src/resources/common/item-create-defaults.ts","../../../src/util/torrow-id.ts","../../../src/resources/common/item-social-facet-base.ts","../../../src/resources/common/timetable-query.ts","../../../src/resources/calendars/CalendarsFacade.ts","../../../src/resources/cases/types.ts","../../../src/resources/cases/case-requests.ts","../../../src/resources/cases/CasesFacade.ts","../../../src/resources/contacts/contact-communications-write-defaults.ts","../../../src/resources/contacts/contact-structured-array-rids.ts","../../../src/resources/contacts/contact-visit-card-fields.ts","../../../src/resources/contacts/ContactsFacade.ts","../../../src/resources/contexts/ContextsFacade.ts","../../../src/resources/notes/types.ts","../../../src/resources/notes/NotesFacade.ts","../../../src/resources/common/item-type.ts","../../../src/resources/common/item-type-resolver.ts","../../../src/resources/relations/RelationsFacade.ts","../../../src/resources/common/implicit-tag-params.ts","../../../src/resources/resources/types.ts","../../../src/resources/resources/ResourcesFacade.ts","../../../src/resources/services/behavior-settings.ts","../../../src/resources/services/service-requests.ts","../../../src/resources/services/ServicesFacade.ts","../../../src/util/base64.ts","../../../src/resources/auth/AuthFacade.ts","../../../src/resources/user-profiles/user-profile-write-defaults.ts","../../../src/resources/user-profiles/ProfilesFacade.ts","../../../src/resources/views/view-domain-resolver.ts","../../../src/resources/views/view-paths.ts","../../../src/resources/views/PinnedViewsFacade.ts","../../../src/resources/views/UserViewsFacade.ts","../../../src/resources/views/ViewsFacade.ts","../../../src/resources/search/SearchFacade.ts","../../../src/resources/action-history/ActionHistoryFacade.ts","../../../src/resources/accounting-transactions/AccountingTransactionsFacade.ts","../../../src/resources/announcements/AnnouncementsFacade.ts","../../../src/resources/export-import/ExportImportFacade.ts","../../../src/resources/reports/ReportsFacade.ts","../../../src/resources/loyalty-systems/LoyaltySystemsFacade.ts","../../../src/resources/loyalty-cards/LoyaltyCardsFacade.ts","../../../src/util/opaque-json-settings.ts","../../../src/resources/user-settings/UserSettingsFacade.ts","../../../src/resources/user/UserFacade.ts","../../../src/resources/api-keys/ApiKeysFacade.ts","../../../src/resources/block-reason/BlockReasonsFacade.ts","../../../src/resources/external-auths/ExternalAuthsFacade.ts","../../../src/resources/id-generator/IdGeneratorFacade.ts","../../../src/resources/integrations/IntegrationsFacade.ts","../../../src/resources/item/ItemFacade.ts","../../../src/resources/short-url/ShortUrlFacade.ts","../../../src/resources/thesaurus/ThesaurusFacade.ts","../../../src/TorrowClient.ts","../../../src/resources/auth/auth-enum-values.ts","../../../src/resources/common/solution-data.ts","../../../src/resources/common/timetable-view-type.ts","../../../src/resources/contexts/context-icon-preset-paths.ts","../../../src/resources/contexts/context-icon-preset.ts","../../../src/resources/common/anyone-access.ts","../../../src/resources/common/participation-field.ts","../../../src/resources/common/user-access-level.ts","../../../src/resources/contacts/types.ts","../../../src/resources/contacts/communication-links.ts","../../../src/resources/reports/types.ts","../../../src/resources/loyalty-systems/types.ts","../../../src/resources/services/types.ts","../../../src/resources/services/service-type-preset.ts","../../../src/resources/services/booking-wizard-hints.ts","../../../src/resources/services/service-builder.ts","../../../src/resources/services/booking-wizard-expand.ts","../../../src/resources/services/check-in-schedule-hints.ts","../../../src/resources/services/service-order-errors.ts","../../../src/resources/cases/payment-hints.ts","../../../src/resources/resources/resource-builder.ts","../../../src/resources/common/device-type.ts","../../../src/resources/common/personal-list.ts"],"sourcesContent":["/**\n * Публичный продакшен-шлюз Torrow (только origin, без `/api/v1`).\n * Переопредели {@link TorrowClientConfig.baseUrl}, если бьёшься в другой стенд или мок.\n */\nexport const DEFAULT_TORROW_API_BASE_URL = \"https://torrow.net\";\n\n/**\n * HTTP **Basic** для **`/api/v1/auth/*`** на шлюзе (`Authorization: Basic …`).\n *\n * Это **креды приложения / типа клиента**, не логин пользователя:\n * - `username` ≈ `clientId` (torrow-apps: `CLIENT_SECRET` / InterceptorAuth)\n * - `password` ≈ `clientSecret`\n *\n * **Где:** поле {@link TorrowClientConfig.authIdentityBasic}; читает {@link AuthFacade}.\n * **Пара в auth-пакете:** `AppCredentials` (`clientId`/`clientSecret`) — маппинг внутри\n * `TokenSession`; приложениям на `@torrow/sdk-auth` достаточно `appCredentials`.\n * Low-level `new TorrowClient({ authIdentityBasic })` — задавай сам.\n */\nexport type AuthIdentityBasic = {\n username: string;\n password: string;\n};\n\n/**\n * Входной конфиг **`new TorrowClient(…)`** (`@torrow/sdk-client`).\n *\n * Содержит HTTP-транспорт + способ авторизации запросов:\n * - `getAccessToken` → Bearer на обычные API-вызовы\n * - `authIdentityBasic` → Basic на `/api/v1/auth/*` ({@link AuthFacade})\n *\n * **Не путать с:**\n * - {@link ResolvedTorrowClientConfig} — то же после default `baseUrl` (`client.config`)\n * - `TokenSessionOptions` / `TorrowAuth*` (`@torrow/sdk-auth`) — опции сессии; отсюда\n * берут только `baseUrl`/`fetch`/`defaultHeaders`/`userAgent`, а Bearer/Basic\n * сессия выставляет сама (`getAccessToken` + маппинг `appCredentials`)\n *\n * **Где используется:** конструктор {@link TorrowClient}, {@link HttpClient}.\n */\nexport interface TorrowClientConfig {\n /**\n * Origin API, например `https://torrow.net` (слэш в конце не нужен; пути `/api/v1/...` добавляет клиент).\n * Если не задан — используется {@link DEFAULT_TORROW_API_BASE_URL} (единый интернет-сервис Torrow).\n */\n baseUrl?: string;\n /**\n * Bearer для `Authorization`. Не задавай или возвращай `undefined` — заголовок не ставится\n * (подходит для публичных GET и гостевых сценариев; конкретные эндпоинты — по контракту API).\n *\n * Обновление access по **refresh** и хранение токенов — в приложении: удобно вызывать\n * **`client.auth.refresh`** (внутренний HTTP **без** этого колбэка) или\n * отдельный {@link HttpClient} без `getAccessToken`, чтобы избежать рекурсии. См. **`docs/sdk-development-plan.md`** §8,\n * пример **`examples/node/auth/auth-connect.ts`** / **`TorrowAuth.connect`** (`@torrow/sdk-auth`). Смысл полей ответа **`TokenResp`** —\n * **`@torrow/sdk-docs`** (`mcpAuthFieldCatalog.TokenResp`, **`tokenRespFieldDocEntries`**).\n *\n * С сессией (`@torrow/sdk-auth`) колбэк ставит `TokenSession` — снаружи не передавай.\n */\n getAccessToken?: () => Promise<string | undefined>;\n /**\n * HTTP **Basic** для вызовов **`/api/v1/auth/*`** через {@link AuthFacade}.\n * Без этого шлюз может вернуть **`AUTH_HEADER_MISSING`** / **`REQUEST_IS_INVALID`** на части эндпоинтов.\n * Не путай с пользовательским Bearer из **`getAccessToken`** — он на **`AuthFacade`** не передаётся.\n *\n * App/widget с сессией: обычно **`TorrowAuth`** + опциональный **`appCredentials`**\n * (дефолт SDK — `DEFAULT_APP_CREDENTIALS` в `@torrow/sdk-auth`; здесь Basic **не** дефолтится).\n * Low-level / одноразовый `sendCode`: задай {@link AuthIdentityBasic} явно.\n */\n authIdentityBasic?: AuthIdentityBasic;\n /** Inject `fetch` (tests, proxies, undici in older Node). Defaults to global `fetch`. */\n fetch?: typeof fetch;\n /** Merged into every request after defaults. */\n defaultHeaders?: Record<string, string>;\n /** e.g. `torrow-sdk-js/0.1.0` for server diagnostics. */\n userAgent?: string;\n}\n\n/**\n * Конфиг **после** применения дефолтов: `baseUrl` всегда `string`\n * (из входа или {@link DEFAULT_TORROW_API_BASE_URL}).\n *\n * **Где:** `TorrowClient.config`; конструкторы фасадов, которым нужен гарантированный origin\n * (`AuthFacade`, `ShortUrlFacade`, …). Снаружи в `new TorrowClient` передавай\n * {@link TorrowClientConfig} — `Resolved*` сам не собирай.\n */\nexport type ResolvedTorrowClientConfig = Omit<TorrowClientConfig, \"baseUrl\"> & {\n baseUrl: string;\n};\n","import type { TorrowClientConfig } from \"../TorrowClientConfig.js\";\n\n/**\n * Собирает заголовки авторизации из колбэка **`getAccessToken`** в {@link TorrowClientConfig}.\n * При непустом токене: `Authorization: Bearer <accessToken>`; иначе пустой объект (запрос без Bearer).\n *\n * Не вызывает **`/api/v1/auth/refresh`** — только то, что вернул колбэк. Для refresh используй **`TorrowClient.auth`** (см. **`src/resources/auth/AuthFacade.ts`**). Смыслы полей — **`mcpAuthFieldCatalog`** в **`@torrow/sdk-docs`**.\n */\nexport async function buildAuthHeaders(\n config: TorrowClientConfig,\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n const token = await config.getAccessToken?.();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n}\n","function pickApiErrorName(body: unknown): string | undefined {\n if (body === null || typeof body !== \"object\") {\n return undefined;\n }\n const o = body as Record<string, unknown>;\n if (typeof o.error === \"string\" && o.error.length > 0) {\n return o.error;\n }\n if (typeof o.name === \"string\" && o.name.length > 0) {\n return o.name;\n }\n if (typeof o.title === \"string\" && o.title.length > 0) {\n return o.title;\n }\n if (typeof o.message === \"string\" && o.message.length > 0) {\n return o.message;\n }\n return undefined;\n}\n\nfunction pickApiCode(body: unknown): string | undefined {\n if (body === null || typeof body !== \"object\") {\n return undefined;\n }\n const c = (body as Record<string, unknown>).code;\n if (typeof c === \"string\") {\n return c;\n }\n // `TorrowErrorClient.code` API Torrow отдаёт числом (311293, 211296, …).\n return typeof c === \"number\" && Number.isFinite(c) ? String(c) : undefined;\n}\n\n/** `TorrowErrorClient.traceIdentifier` (корень или вложенный `torrowError` / `torrowErrorClient`). */\nfunction pickTraceIdentifier(body: unknown): string | undefined {\n if (body === null || typeof body !== \"object\") {\n return undefined;\n }\n const o = body as Record<string, unknown>;\n if (typeof o.traceIdentifier === \"string\" && o.traceIdentifier.length > 0) {\n return o.traceIdentifier;\n }\n for (const key of [\"torrowError\", \"torrowErrorClient\", \"innerError\"] as const) {\n const nested = o[key];\n if (nested !== null && typeof nested === \"object\") {\n const t = (nested as Record<string, unknown>).traceIdentifier;\n if (typeof t === \"string\" && t.length > 0) {\n return t;\n }\n }\n }\n return undefined;\n}\n\nexport class TorrowHttpError extends Error {\n readonly status: number;\n readonly body: unknown;\n readonly apiErrorName?: string;\n /** Код ошибки API строкой: числовой `TorrowErrorClient.code` приводится к строке (`\"311293\"`). */\n readonly code?: string;\n readonly requestId?: string;\n /**\n * Идентификатор трассировки шлюза (`TorrowErrorClient.traceIdentifier`\n * или заголовок `trace-identifier`) — для саппорта/логов.\n */\n readonly traceIdentifier?: string;\n readonly url: string;\n\n constructor(init: {\n status: number;\n body: unknown;\n url: string;\n requestId?: string;\n /** Заголовок `trace-identifier`; иначе берётся из тела ошибки. */\n traceIdentifier?: string;\n cause?: unknown;\n }) {\n const apiName = pickApiErrorName(init.body);\n const code = pickApiCode(init.body);\n const traceIdentifier =\n (typeof init.traceIdentifier === \"string\" && init.traceIdentifier.length > 0\n ? init.traceIdentifier\n : undefined) ?? pickTraceIdentifier(init.body);\n const message = TorrowHttpError.buildMessage(\n init.status,\n init.url,\n apiName,\n code,\n traceIdentifier,\n );\n super(message, { cause: init.cause });\n this.name = \"TorrowHttpError\";\n this.status = init.status;\n this.body = init.body;\n this.url = init.url;\n this.requestId = init.requestId;\n this.traceIdentifier = traceIdentifier;\n this.apiErrorName = apiName;\n this.code = code;\n }\n\n private static buildMessage(\n status: number,\n url: string,\n apiErrorName?: string,\n code?: string,\n traceIdentifier?: string,\n ): string {\n const parts = [`HTTP ${status}`, url];\n if (code) {\n parts.push(`code=${code}`);\n }\n if (apiErrorName) {\n parts.push(apiErrorName);\n }\n if (traceIdentifier) {\n parts.push(`trace-identifier=${traceIdentifier}`);\n }\n return parts.join(\" — \");\n }\n}\n","/** Legacy NSwag-compatible parsing for operations not migrated to OpenAPI response-date descriptors. */\nconst ISO_DATE_REGEX =\n /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)(Z|([+-])(\\d{2}):(\\d{2}))$/;\n\n/** JSON-примитив (`JSON.parse` / `JSON.stringify`). */\nexport type JsonPrimitive = string | number | boolean | null;\n\n/** JSON-массив. */\nexport type JsonArray = JsonValue[];\n\n/** JSON-объект (не `Date`, не `undefined`, не функции). */\nexport type JsonObject = { [key: string]: JsonValue };\n\n/**\n * Значение, допустимое в JSON.\n * Для opaque `settings` (device/user): публичный тип вместо wire-`string`.\n */\nexport type JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\nexport function parseJsonWithIsoDates(json: string): unknown {\n if (json === \"\") {\n return undefined;\n }\n return JSON.parse(json, function (this: Record<string, unknown>, key: string, value: unknown) {\n if (typeof value !== \"string\") {\n return value;\n }\n // Note source is text even when its entire content happens to be an ISO date.\n if (key === \"data\" && (this.noteType === \"Html\" || this.noteType === \"Markdown\")) {\n return value;\n }\n return ISO_DATE_REGEX.exec(value) ? new Date(value) : value;\n });\n}\n\nexport function stringifyJsonBody(body: unknown): string {\n return JSON.stringify(body, (_key: string, value: unknown) => {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n });\n}\n","// Generated by npm run codegen. Do not edit.\nimport type { DateNode, DateRoute } from \"../util/response-dates.js\";\n\nexport const responseDateNodes: readonly DateNode[] = [\n {},\n {\n \"ref\": 2\n },\n {\n \"properties\": {\n \"files\": 3,\n \"image\": 7,\n \"rating\": 8,\n \"personalInfo\": 11,\n \"blockInfo\": 33,\n \"meta\": 36\n }\n },\n {\n \"items\": 4\n },\n {\n \"ref\": 5\n },\n {\n \"properties\": {\n \"urlExpiration\": 6\n }\n },\n {\n \"date\": true\n },\n {\n \"ref\": 5\n },\n {\n \"ref\": 9\n },\n {\n \"properties\": {\n \"date\": 10\n }\n },\n {\n \"date\": true\n },\n {\n \"ref\": 12\n },\n {\n \"properties\": {\n \"meta\": 13,\n \"lastUsageTime\": 17,\n \"personalReminders\": 18,\n \"subscriptionList\": 27\n }\n },\n {\n \"ref\": 14\n },\n {\n \"properties\": {\n \"lastModified\": 15,\n \"createDate\": 16\n }\n },\n {\n \"date\": true\n },\n {\n \"date\": true\n },\n {\n \"date\": true\n },\n {\n \"items\": 19\n },\n {\n \"ref\": 20\n },\n {\n \"properties\": {\n \"date\": 21,\n \"recurringConditions\": 22\n }\n },\n {\n \"date\": true\n },\n {\n \"ref\": 23\n },\n {\n \"properties\": {\n \"endDate\": 24,\n \"beginDate\": 25,\n \"firstWeekDate\": 26\n }\n },\n {\n \"date\": true\n },\n {\n \"date\": true\n },\n {\n \"date\": true\n },\n {\n \"items\": 28\n },\n {\n \"ref\": 29\n },\n {\n \"properties\": {\n \"openDate\": 30,\n \"closeDate\": 31,\n \"recurringConditions\": 32\n }\n },\n {\n \"date\": true\n },\n {\n \"date\": true\n },\n {\n \"ref\": 23\n },\n {\n \"ref\": 34\n },\n {\n \"properties\": {\n \"blockDate\": 35\n }\n },\n {\n \"date\": true\n },\n {\n \"ref\": 14\n },\n {\n \"ref\": 2\n },\n {\n \"ref\": 2\n },\n {\n \"ref\": 40\n },\n {\n \"properties\": {\n \"meta\": 41\n }\n },\n {\n \"ref\": 14\n },\n {\n \"ref\": 40\n },\n {\n \"ref\": 44\n },\n {\n \"properties\": {\n \"image\": 45,\n \"rating\": 46,\n \"personalInfo\": 47,\n \"blockInfo\": 48,\n \"meta\": 49\n }\n },\n {\n \"ref\": 5\n },\n {\n \"ref\": 9\n },\n {\n \"ref\": 12\n },\n {\n \"ref\": 34\n },\n {\n \"ref\": 14\n },\n {\n \"ref\": 51\n },\n {\n \"properties\": {\n \"includeResp\": 52\n }\n },\n {\n \"ref\": 53\n },\n {\n \"properties\": {\n \"linkMetaList\": 54\n }\n },\n {\n \"items\": 55\n },\n {\n \"ref\": 56\n },\n {\n \"properties\": {\n \"info\": 57\n }\n },\n {\n \"ref\": 14\n },\n {\n \"ref\": 59\n },\n {\n \"properties\": {\n \"meta\": 60,\n \"subscriptionList\": 61\n }\n },\n {\n \"ref\": 14\n },\n {\n \"items\": 62\n },\n {\n \"ref\": 29\n },\n {\n \"items\": 64\n },\n {\n \"ref\": 65\n },\n {\n \"properties\": {\n \"file\": 66,\n \"files\": 67,\n \"itemObject\": 69,\n \"itemLink\": 70,\n \"personalViewInfo\": 73,\n \"image\": 79\n }\n },\n {\n \"ref\": 5\n },\n {\n \"items\": 68\n },\n {\n \"ref\": 5\n },\n {\n \"ref\": 40\n },\n {\n \"ref\": 71\n },\n {\n \"properties\": {\n \"meta\": 72\n }\n },\n {\n \"ref\": 14\n },\n {\n \"ref\": 74\n },\n {\n \"properties\": {\n \"meta\": 75,\n \"lastUsageTime\": 76,\n \"personalReminders\": 77\n }\n },\n {\n \"ref\": 14\n },\n {\n \"date\": true\n },\n {\n \"items\": 78\n },\n {\n \"ref\": 20\n },\n {\n \"ref\": 5\n },\n {\n \"items\": 81\n },\n {\n \"ref\": 65\n },\n {\n \"items\": 83\n },\n {\n \"ref\": 65\n },\n {\n \"ref\": 85\n },\n {\n \"properties\": {\n \"image\": 86,\n \"rating\": 87,\n \"personalInfo\": 88,\n \"blockInfo\": 89,\n \"meta\": 90\n }\n },\n {\n \"ref\": 5\n },\n {\n \"ref\": 9\n },\n {\n \"ref\": 12\n },\n {\n \"ref\": 34\n },\n {\n \"ref\": 14\n },\n {\n \"items\": 92\n },\n {\n \"ref\": 85\n }\n];\n\nexport const responseDateRoutes: readonly DateRoute[] = [\n {\n \"method\": \"POST\",\n \"path\": \"/api/v1/notes\",\n \"responses\": {\n \"200\": 1\n }\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/search/notes\",\n \"responses\": {\n \"200\": 82\n }\n },\n {\n \"method\": \"POST\",\n \"path\": \"/api/v1/contexts\",\n \"responses\": {\n \"200\": 84\n }\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/contexts/personallist\",\n \"responses\": {\n \"200\": 91\n }\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/notes/personallist\",\n \"responses\": {},\n \"legacy\": true\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/notes/{torrowId}\",\n \"responses\": {\n \"200\": 37\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}\",\n \"responses\": {\n \"200\": 38\n }\n },\n {\n \"method\": \"DELETE\",\n \"path\": \"/api/v1/notes/{torrowId}\",\n \"responses\": {\n \"200\": 0\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}/tags\",\n \"responses\": {\n \"200\": 39\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}/solutiondata\",\n \"responses\": {\n \"200\": 42\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}/group/set\",\n \"responses\": {\n \"200\": 43\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}/updategroups\",\n \"responses\": {\n \"200\": 50\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}/savetomindmap\",\n \"responses\": {\n \"200\": 58\n }\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/notes/{parentId}/views/user\",\n \"responses\": {\n \"200\": 63\n }\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/notes/{parentId}/views/pinned\",\n \"responses\": {\n \"200\": 80\n }\n }\n];\n","import { responseDateNodes, responseDateRoutes } from \"../schema/response-dates.generated.js\";\nimport { parseJsonWithIsoDates } from \"./json.js\";\n\nexport interface DateNode {\n date?: boolean;\n ref?: number;\n properties?: Record<string, number>;\n items?: number;\n all?: number[];\n unions?: number[][];\n}\n\nexport interface DateRoute {\n method: string;\n path: string;\n responses: Record<string, number>;\n legacy?: boolean;\n}\n\nconst routes = responseDateRoutes.map((route) => ({\n ...route,\n segments: route.path.split(\"/\"),\n}));\n\n/** An unlisted operation retains legacy parsing; an unlisted status on a migrated route stays plain JSON. */\nexport function parseOperationResponse(json: string, method: string, path: string, status: number): unknown {\n const segments = path.split(\"?\")[0].split(\"/\");\n const route = routes.find((candidate) => candidate.method === method &&\n candidate.segments.length === segments.length &&\n candidate.segments.every((segment, i) => segment.startsWith(\"{\") ? segments[i] !== \"\" : segment === segments[i]));\n if (!route || route.legacy) return parseJsonWithIsoDates(json);\n if (json === \"\") return undefined;\n return reviveDeclaredDates(JSON.parse(json), responseDateNodes, route.responses[String(status)] ?? route.responses[\"2XX\"] ?? 0);\n}\n\n/** Collect before mutating so allOf/union branches inspect the same original JSON. */\nexport function reviveDeclaredDates(value: unknown, nodes: readonly DateNode[], root: number): unknown {\n type Candidate = { parent: Record<string, unknown>; key: string; date: Date };\n const holder: Record<string, unknown> = { value };\n function collect(parent: Record<string, unknown>, key: string, id: number, path: string, active: Set<number>): Map<string, Candidate> {\n const result = new Map<string, Candidate>();\n const current = parent[key];\n const node = nodes[id];\n if (!node || active.has(id) || current == null) return result;\n const next = new Set(active).add(id);\n const merge = (entries: Map<string, Candidate>) => entries.forEach((entry, name) => result.set(name, entry));\n if (node.date && typeof current === \"string\") {\n const date = new Date(current);\n if (!Number.isNaN(date.getTime())) result.set(path, { parent, key, date });\n }\n if (node.ref !== undefined) merge(collect(parent, key, node.ref, path, next));\n for (const child of node.all ?? []) merge(collect(parent, key, child, path, next));\n for (const union of node.unions ?? []) {\n const branches = union.map((child) => collect(parent, key, child, path, next));\n for (const [name, candidate] of branches[0] ?? []) {\n if (branches.every((branch) => branch.has(name))) result.set(name, candidate);\n }\n }\n if (Array.isArray(current) && node.items !== undefined) {\n current.forEach((_entry, i) => merge(collect(current as unknown as Record<string, unknown>, String(i), node.items!, `${path}/${i}`, new Set())));\n } else if (typeof current === \"object\" && !Array.isArray(current)) {\n for (const [property, child] of Object.entries(node.properties ?? {})) {\n if (Object.hasOwn(current, property)) merge(collect(current as Record<string, unknown>, property, child,\n `${path}/${property.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")}`, new Set()));\n }\n }\n return result;\n }\n for (const { parent, key, date } of collect(holder, \"value\", root, \"\", new Set()).values()) parent[key] = date;\n return holder.value;\n}\n","/** Mirrors NSwag `ClientBase.mapToQueryString` (torrow-apps `libs/api`). */\nexport function buildQueryString(queryStringParams: Record<string, unknown>): string {\n const queryString: string[] = [];\n for (const prop of Object.keys(queryStringParams)) {\n const value = queryStringParams[prop];\n if (value === undefined) {\n continue;\n }\n if (value === null) {\n continue;\n }\n if (value instanceof Date) {\n queryString.push(`${prop}=${encodeURIComponent(value.toISOString())}`);\n } else if (Array.isArray(value)) {\n for (const val of value) {\n queryString.push(buildQueryString({ [prop]: val }));\n }\n } else {\n queryString.push(`${prop}=${encodeURIComponent(String(value))}`);\n }\n }\n return queryString.join(\"&\");\n}\n","export function joinBaseUrlAndPath(baseUrl: string, path: string): string {\n const base = baseUrl.replace(/\\/+$/, \"\");\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n return `${base}${p}`;\n}\n","import { DEFAULT_TORROW_API_BASE_URL, type TorrowClientConfig } from \"../TorrowClientConfig.js\";\nimport { buildAuthHeaders } from \"./auth.js\";\nimport { TorrowHttpError } from \"./TorrowHttpError.js\";\nimport { stringifyJsonBody } from \"../util/json.js\";\nimport { parseOperationResponse } from \"../util/response-dates.js\";\nimport { buildQueryString } from \"../util/query-string.js\";\nimport { joinBaseUrlAndPath } from \"../util/url.js\";\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport interface HttpRequestInit {\n method: HttpMethod;\n /** Path starting with `/`, e.g. `/api/v1/contacts` */\n path: string;\n query?: Record<string, unknown>;\n headers?: Record<string, string>;\n body?: unknown;\n signal?: AbortSignal;\n}\n\nconst JSON_MIME = \"application/json\";\n\n/**\n * JSON поверх `fetch`: query, **`Authorization`** из **`getAccessToken`** (см. {@link buildAuthHeaders}).\n * Не выполняет refresh и не разбирает 401.\n */\nexport class HttpClient {\n constructor(private readonly config: TorrowClientConfig) {}\n\n async requestJson<T = unknown>(init: HttpRequestInit, /** @internal Маркер начала отправки, без logging/telemetry. */ onDispatch?: () => void): Promise<T> {\n const { fetch: fetchFn = globalThis.fetch } = this.config;\n const url = this.buildUrl(init.path, init.query);\n const authHeaders = await buildAuthHeaders(this.config);\n const headers: Record<string, string> = {\n Accept: JSON_MIME,\n ...authHeaders,\n ...this.config.defaultHeaders,\n ...init.headers,\n };\n if (this.config.userAgent) {\n headers[\"User-Agent\"] = this.config.userAgent;\n }\n\n const needsBody =\n init.body !== undefined && init.method !== \"GET\" && init.method !== \"DELETE\";\n if (needsBody) {\n headers[\"Content-Type\"] = JSON_MIME;\n }\n\n // Подготовка тела может завершиться ошибкой до отправки запроса.\n const requestInit: RequestInit = {\n method: init.method,\n headers,\n body: needsBody ? stringifyJsonBody(init.body) : undefined,\n signal: init.signal,\n };\n if (onDispatch) init.signal?.throwIfAborted();\n onDispatch?.();\n const res = await fetchFn(url, requestInit);\n\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const traceIdentifier = res.headers.get(\"trace-identifier\") ?? undefined;\n const text = await res.text();\n\n if (!res.ok) {\n const errBody = tryParseErrorBody(text, res.headers.get(\"content-type\"));\n throw new TorrowHttpError({\n status: res.status,\n body: errBody,\n url,\n requestId,\n traceIdentifier,\n });\n }\n\n if (text === \"\") {\n return undefined as T;\n }\n return parseOperationResponse(text, init.method, init.path, res.status) as T;\n }\n\n private buildUrl(path: string, query?: Record<string, unknown>): string {\n const origin = this.config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL;\n const basePath = joinBaseUrlAndPath(origin, path);\n const q: Record<string, unknown> = { ...query };\n const qs = buildQueryString(q);\n if (!qs) {\n return basePath;\n }\n const joiner = basePath.includes(\"?\") ? \"&\" : \"?\";\n return `${basePath}${joiner}${qs}`;\n }\n}\n\nfunction tryParseErrorBody(text: string, contentType: string | null): unknown {\n const ct = contentType ?? \"\";\n if (ct.includes(JSON_MIME) || (text.startsWith(\"{\") && text.endsWith(\"}\"))) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n}\n","import type { HttpClient, HttpMethod, HttpRequestInit } from \"../http/HttpClient.js\";\n\nexport type RawRequestOptions = Omit<HttpRequestInit, \"method\" | \"path\">;\n\n/**\n * Low-level REST calls (1:1 with paths). Prefer `TorrowClient` / `resources/*` when available.\n */\nexport class RawClient {\n constructor(private readonly http: HttpClient) {}\n\n request<T = unknown>(\n method: HttpMethod,\n path: string,\n options?: RawRequestOptions,\n ): Promise<T> {\n return this.http.requestJson<T>({ method, path, ...options });\n }\n\n get<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"GET\", path, options);\n }\n\n post<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"POST\", path, options);\n }\n\n put<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"PUT\", path, options);\n }\n\n patch<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"PATCH\", path, options);\n }\n\n delete<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"DELETE\", path, options);\n }\n}\n","import type { OpenApiSchemas as Schemas } from \"../../schema/openapi-schemas.js\";\n\nexport function unwrapDeleteCount(resp: Schemas[\"DeleteResponse\"] | null | undefined): number {\n if (resp == null || typeof resp !== \"object\") return 0;\n const n = resp.deleteCount;\n return typeof n === \"number\" && Number.isFinite(n) ? n : 0;\n}\n\nexport function unwrapDeletedUserAccountCount(\n resp: Schemas[\"DeleteUserAccountResp\"] | null | undefined,\n): number {\n if (resp == null || typeof resp !== \"object\") return 0;\n const n = resp.deletedCount;\n return typeof n === \"number\" && Number.isFinite(n) ? n : 0;\n}\n\nexport function unwrapAddProfileContact(resp: Schemas[\"AddProfileResp\"] | null | undefined): Schemas[\"ContactItem\"] {\n if (resp == null || typeof resp !== \"object\") {\n throw new Error(\"Add profile: expected JSON object response\");\n }\n const p = resp.profile;\n if (!p || typeof p !== \"object\") {\n throw new Error(\"Add profile: response missing profile\");\n }\n return p;\n}\n\nexport function unwrapRemoveProfileList(\n resp: Schemas[\"RemoveProfileResp\"] | null | undefined,\n): Schemas[\"ContactItem\"][] {\n if (resp == null || typeof resp !== \"object\") return [];\n const pl = resp.personalContactList;\n if (pl === undefined || pl === null) return [];\n if (!Array.isArray(pl)) {\n throw new Error(\"Remove profile: personalContactList must be an array when present\");\n }\n return pl;\n}\n\nexport function unwrapTorrowObjectFromProfilePropertiesUpdate(\n resp: Schemas[\"UpdateProfilePropertiesResp\"] | null | undefined,\n): Schemas[\"TorrowObject\"] | undefined {\n if (resp == null || typeof resp !== \"object\") return undefined;\n return resp.torrowObject ?? undefined;\n}\n\nexport function unwrapTorrowObjectFromContactPropertiesUpdate(\n resp: Schemas[\"UpdateContactPropertiesResp\"] | null | undefined,\n): Schemas[\"TorrowObject\"] | undefined {\n if (resp == null || typeof resp !== \"object\") return undefined;\n return resp.torrowObject ?? undefined;\n}\n\nexport function unwrapTorrowId(resp: Schemas[\"GetTorrowIdResp\"] | null | undefined): string {\n if (resp == null || typeof resp !== \"object\") {\n throw new Error(\"getNextId: expected JSON object response\");\n }\n const id = resp.torrowId?.trim();\n if (!id) {\n throw new Error(\"getNextId: response missing torrowId\");\n }\n return id;\n}\n\nexport function unwrapTimetableStatisticsList(\n resp: Schemas[\"GetTimetableStatisticsResponse\"] | null | undefined,\n): Schemas[\"TimetableStatisticsResp\"][] {\n if (resp == null || typeof resp !== \"object\") return [];\n const list = resp.timetableStatisticsRespList;\n if (list === undefined || list === null) return [];\n if (!Array.isArray(list)) {\n throw new Error(\"getTimetableStatistics: timetableStatisticsRespList must be an array when present\");\n }\n return list;\n}\n\nexport function unwrapCreatedViewInfoList(\n resp: Schemas[\"CreateViewListResp\"] | null | undefined,\n): Schemas[\"ViewInfo\"][] {\n if (resp == null || typeof resp !== \"object\") return [];\n const list = resp.createdViewInfoList;\n if (list === undefined || list === null) return [];\n if (!Array.isArray(list)) {\n throw new Error(\"create views: createdViewInfoList must be an array when present\");\n }\n return list;\n}\n\nexport function unwrapUpdatedViewInfoList(\n resp: Schemas[\"UpdateViewListOrderResp\"] | null | undefined,\n): Schemas[\"ViewInfo\"][] {\n if (resp == null || typeof resp !== \"object\") return [];\n const list = resp.updatedViewInfoList;\n if (list === undefined || list === null) return [];\n if (!Array.isArray(list)) {\n throw new Error(\"update view order: updatedViewInfoList must be an array when present\");\n }\n return list;\n}\n\nexport function unwrapLoyaltySystemsStatisticsList(\n resp: Schemas[\"GetLoyaltySystemsStatisticsResp\"] | null | undefined,\n): Schemas[\"LoyaltySystemsStatisticsResp\"][] {\n if (resp == null || typeof resp !== \"object\") return [];\n const list = resp.loyaltySystemsStatisticsRespList;\n if (list === undefined || list === null) return [];\n if (!Array.isArray(list)) {\n throw new Error(\"loyaltysystems statistics: loyaltySystemsStatisticsRespList must be an array when present\");\n }\n return list;\n}\n\nexport function unwrapSendCommunicationSessionId(\n resp: Schemas[\"SendCommunicationCodeResp\"] | null | undefined,\n): string {\n if (resp == null || typeof resp !== \"object\") {\n throw new Error(\"sendCommunicationCode: expected JSON object response\");\n }\n const sid = resp.sessionId?.trim();\n if (!sid) {\n throw new Error(\"sendCommunicationCode: response missing sessionId\");\n }\n return sid;\n}\n\nexport function unwrapFilePutUrl(\n resp: Schemas[\"PutUrlResp\"] | null | undefined,\n): { url: string; urlExpiration: string } {\n if (resp == null || typeof resp !== \"object\") {\n throw new Error(\"getFilePutUrl: expected JSON object response\");\n }\n const url = resp.url?.trim();\n if (!url) {\n throw new Error(\"getFilePutUrl: response missing url\");\n }\n const exp = resp.urlExpiration;\n const urlExpiration = exp == null ? \"\" : exp.toISOString();\n if (!urlExpiration) {\n throw new Error(\"getFilePutUrl: response missing urlExpiration\");\n }\n return { url, urlExpiration };\n}\n","/** Path segment for `{torrowId}` / `{itemId}` style parameters. */\nexport function encodePathSegment(id: string): string {\n return encodeURIComponent(id);\n}\n","/** Возвращает id для PUT item или отклоняет create-only payload. */\nexport function requireItemUpdateId(\n body: { id?: string | null },\n itemName: string,\n): string {\n const id = body.id;\n if (!id?.trim() || id !== id.trim()) {\n throw new TypeError(`${itemName} update requires a non-empty, normalized body.id`);\n }\n return id;\n}\n","export enum Discriminator {\n ActionHistoryInfo = \"ActionHistoryInfo\",\n AnnouncementInfo = \"AnnouncementInfo\",\n CalendarItem = \"CalendarItem\",\n TorrowItem = \"TorrowItem\",\n TorrowView = \"TorrowView\",\n CaseItem = \"CaseItem\",\n ResourceItem = \"ResourceItem\",\n ContactItem = \"ContactItem\",\n ContextItem = \"ContextItem\",\n NoteItem = \"NoteItem\",\n ServiceResourceItem = \"ServiceResourceItem\",\n ServiceItem = \"ServiceItem\",\n User = \"User\",\n TextNoteItem = \"TextNoteItem\",\n ItemView = \"ItemView\",\n ContactView = \"ContactView\",\n ContextView = \"ContextView\",\n NoteView = \"NoteView\",\n CaseView = \"CaseView\",\n CalendarView = \"CalendarView\",\n ServiceView = \"ServiceView\",\n ResourceView = \"ResourceView\",\n ParticipantView = \"ParticipantView\",\n CaseParticipantView = \"CaseParticipantView\",\n TimetableCase = \"TimetableCase\",\n PersonalInfo = \"PersonalInfo\",\n ContactPersonalInfo = \"ContactPersonalInfo\",\n CasePersonalInfo = \"CasePersonalInfo\",\n CustomLinkPaymentParameters = \"CustomLinkPaymentParameters\",\n RoboKassaPaymentParameters = \"RoboKassaPaymentParameters\",\n PaykeeperPaymentParameters = \"PaykeeperPaymentParameters\",\n ProdamusPaymentParameters = \"ProdamusPaymentParameters\",\n YooMoneyPaymentParameters = \"YooMoneyPaymentParameters\",\n YooKassaPaymentParameters = \"YooKassaPaymentParameters\",\n SberbankPaymentParameters = \"SberbankPaymentParameters\",\n UralsibPaymentParameters = \"UralsibPaymentParameters\",\n AlfabankPaymentParameters = \"AlfabankPaymentParameters\",\n MockPaymentProviderParameters = \"MockPaymentProviderParameters\",\n QiwiP2PPaymentParameters = \"QiwiP2PPaymentParameters\",\n TinkoffPaymentParameters = \"TinkoffPaymentParameters\",\n CashPaymentParameters = \"CashPaymentParameters\",\n CaseReportProperties = \"CaseReportProperties\",\n ServiceReportProperties = \"ServiceReportProperties\",\n ReportProperties = \"ReportProperties\",\n ServicesResourcesReportProperties = \"ServicesResourcesReportProperties\",\n ResourcesRentReportProperties = \"ResourcesRentReportProperties\",\n ResourceReportProperties = \"ResourceReportProperties\",\n LoyaltyCardItem = \"LoyaltyCardItem\",\n LoyaltySystemItem = \"LoyaltySystemItem\",\n LoyaltyCardView = \"LoyaltyCardView\",\n LoyaltySystemView = \"LoyaltySystemView\",\n VideoTelephonyIntegration = \"VideoTelephonyIntegration\",\n ExternalCalendarIntegration = \"ExternalCalendarIntegration\",\n WebHookIntegration = \"WebHookIntegration\",\n}\n\nexport type DiscriminatorType = `${Discriminator}`;\n","import type { DiscriminatorType } from \"./discriminator.js\";\n\ntype ItemCreateDefaultsInput = {\n discriminator?: string;\n};\n\n/**\n * Проставляет минимальные backend-safe дефолты для create item body.\n * `personalInfo` намеренно не заполняется на уровне SDK.\n */\nexport function applyItemCreateDefaults<TBody extends object>(\n body: TBody,\n discriminator: DiscriminatorType,\n): TBody {\n const payload: ItemCreateDefaultsInput & TBody = { ...body };\n payload.discriminator = discriminator;\n const withPublicity = payload as TBody & { publicityType?: string | null };\n withPublicity.publicityType = withPublicity.publicityType ?? \"Personal\";\n return payload;\n}\n","import type { TorrowObjectType } from \"../schema/sdk-shared-public-types.js\";\n\n/** Распакованный Torrow id (как в torrow-apps `unpackTorrowId`). */\nexport type UnpackedTorrowId = {\n shard: number;\n objectType: number;\n objectId: string;\n};\n\n/** Длина `objectId` в Torrow id и `rid` во вложенных структурах (MongoDB ObjectId hex). */\nexport const TORROW_OBJECT_ID_HEX_LENGTH = 24;\n\nconst OBJECT_ID_HEX_LENGTH = TORROW_OBJECT_ID_HEX_LENGTH;\n\nconst RID_HEX_PATTERN = /^[0-9a-fA-F]{24}$/;\nconst TORROW_ID_HEX_PATTERN = /^[0-9a-fA-F]+$/;\n\n/** Случайный `rid` / objectId: 24 hex-символа (как `ObjectID().toHexString()` в torrow-apps). */\nexport function generateRid(): string {\n const bytes = new Uint8Array(12);\n globalThis.crypto.getRandomValues(bytes);\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i]!.toString(16).padStart(2, \"0\");\n }\n return hex;\n}\n\n/** Проверка формата `rid` (24 hex). */\nexport function isValidRid(value: unknown): value is string {\n return typeof value === \"string\" && RID_HEX_PATTERN.test(value);\n}\nconst OBJECT_TYPE_HEX_LENGTH = 4;\nconst HEX_RADIX = 16;\n\n/** Разбирает строковый Torrow id на shard, числовой тип объекта и objectId (24 hex). */\nexport function unpackTorrowId(torrowId: string): UnpackedTorrowId {\n const objectId = torrowId.substring(torrowId.length - OBJECT_ID_HEX_LENGTH);\n const objectTypeString = torrowId.substring(\n torrowId.length - (OBJECT_ID_HEX_LENGTH + OBJECT_TYPE_HEX_LENGTH),\n torrowId.length - OBJECT_ID_HEX_LENGTH,\n );\n const objectType = Number.parseInt(objectTypeString, HEX_RADIX);\n const shardStartIndex = torrowId.length - (OBJECT_ID_HEX_LENGTH + objectTypeString.length);\n const shard =\n shardStartIndex === 0 ? 0 : Number.parseInt(torrowId.substring(0, shardStartIndex), HEX_RADIX);\n return { shard, objectType, objectId };\n}\n\n/** Собирает Torrow id из частей (как в torrow-apps `packTorrowId`). */\nexport function packTorrowId(parts: UnpackedTorrowId): string {\n const objectType = parts.objectType.toString(HEX_RADIX).padStart(OBJECT_TYPE_HEX_LENGTH, \"0\");\n const shard = parts.shard.toString(HEX_RADIX);\n return `${shard}${objectType}${parts.objectId}`.replace(/^0+/, \"\");\n}\n\n/** Shard из любого Torrow id того же пользователя (profileId, userId, …). */\nexport function getShardFromTorrowId(torrowId: string): number {\n return unpackTorrowId(torrowId).shard;\n}\n\n/**\n * Числовые коды типов в строковом Torrow id (как `OBJECT_TYPES` в torrow-apps + `File` для вложений).\n * Серверная выдача id — {@link IdGeneratorFacade.getNextId} (`TorrowObjectType` в path).\n */\nexport const TorrowObjectTypeCode = {\n User: 2,\n File: 10,\n Context: 1001,\n Contact: 1002,\n Note: 1003,\n Case: 1004,\n Service: 1005,\n Resource: 1009,\n Calendar: 1010,\n LoyaltySystem: 1019,\n LoyaltyCard: 1020,\n} as const;\n\nexport type TorrowObjectTypeCodeValue =\n (typeof TorrowObjectTypeCode)[keyof typeof TorrowObjectTypeCode];\n\nconst STRING_TYPE_TO_CODE: Readonly<\n Partial<Record<TorrowObjectType, TorrowObjectTypeCodeValue>>\n> = {\n User: TorrowObjectTypeCode.User,\n File: TorrowObjectTypeCode.File,\n Context: TorrowObjectTypeCode.Context,\n Contact: TorrowObjectTypeCode.Contact,\n Note: TorrowObjectTypeCode.Note,\n Case: TorrowObjectTypeCode.Case,\n Service: TorrowObjectTypeCode.Service,\n Resource: TorrowObjectTypeCode.Resource,\n Calendar: TorrowObjectTypeCode.Calendar,\n LoyaltySystem: TorrowObjectTypeCode.LoyaltySystem,\n LoyaltyCard: TorrowObjectTypeCode.LoyaltyCard,\n};\n\nconst CODE_TO_STRING_TYPE = new Map<number, TorrowObjectType>();\n\nfor (const [objectType, code] of Object.entries(STRING_TYPE_TO_CODE) as Array<\n [TorrowObjectType, TorrowObjectTypeCodeValue]\n>) {\n if (CODE_TO_STRING_TYPE.has(code)) {\n throw new Error(`Duplicate Torrow object type code: ${code}`);\n }\n CODE_TO_STRING_TYPE.set(code, objectType);\n}\n\nexport type TorrowIdErrorReason =\n | \"invalid-id\"\n | \"unknown-object-type-code\"\n | \"unsupported-item-type\"\n | \"empty-id-list\"\n | \"mixed-item-types\";\n\n/** Локальная ошибка разбора Torrow ID или проверки закодированного в нём типа. */\nexport class TorrowIdError extends TypeError {\n readonly reason: TorrowIdErrorReason;\n readonly objectTypeCode?: number;\n\n constructor(reason: TorrowIdErrorReason, message: string, objectTypeCode?: number) {\n super(message);\n this.name = \"TorrowIdError\";\n this.reason = reason;\n this.objectTypeCode = objectTypeCode;\n }\n}\n\nfunction unpackCanonicalTorrowId(torrowId: string): UnpackedTorrowId {\n if (\n typeof torrowId !== \"string\" ||\n torrowId.length <= OBJECT_ID_HEX_LENGTH ||\n !TORROW_ID_HEX_PATTERN.test(torrowId) ||\n !RID_HEX_PATTERN.test(torrowId.slice(-OBJECT_ID_HEX_LENGTH))\n ) {\n throw new TorrowIdError(\"invalid-id\", \"Invalid Torrow ID format\");\n }\n\n const unpacked = unpackTorrowId(torrowId);\n if (\n !Number.isSafeInteger(unpacked.shard) ||\n unpacked.shard < 0 ||\n !Number.isSafeInteger(unpacked.objectType) ||\n unpacked.objectType < 0 ||\n packTorrowId(unpacked).toLowerCase() !== torrowId.toLowerCase()\n ) {\n throw new TorrowIdError(\"invalid-id\", \"Non-canonical Torrow ID\");\n }\n\n return unpacked;\n}\n\n/** Возвращает известный SDK `TorrowObjectType`, закодированный в каноническом Torrow ID. */\nexport function getTorrowObjectTypeFromTorrowId(torrowId: string): TorrowObjectType {\n const { objectType } = unpackCanonicalTorrowId(torrowId);\n const result = CODE_TO_STRING_TYPE.get(objectType);\n if (result === undefined) {\n throw new TorrowIdError(\n \"unknown-object-type-code\",\n `Unknown Torrow object type code: ${objectType}`,\n objectType,\n );\n }\n return result;\n}\n\n/** Числовой код для {@link packTorrowId} по имени OpenAPI `TorrowObjectType`. */\nexport function torrowObjectTypeToCode(objectType: TorrowObjectType): TorrowObjectTypeCodeValue {\n const code = STRING_TYPE_TO_CODE[objectType];\n if (code === undefined) {\n throw new Error(`torrowObjectTypeToCode: unsupported object type \"${objectType}\"`);\n }\n return code;\n}\n\n/**\n * Генерация Torrow id на клиенте (как `TorrowIdGeneratorService` в torrow-apps).\n * Предпочтительнее методы фасадов: `client.notes.generateNoteId`, `generateFileId`, …\n */\nexport function generateTorrowId(\n objectTypeCode: TorrowObjectTypeCodeValue,\n shard: number,\n): string {\n return packTorrowId({\n shard,\n objectType: objectTypeCode,\n objectId: generateRid(),\n });\n}\n\n/**\n * Shard как у `ownerTorrowId` — обычно `profileId` / `userId` владельца до `create`.\n * Порядок аргументов: тип объекта, затем id владельца.\n */\nexport function generateTorrowIdForOwner(\n objectTypeCode: TorrowObjectTypeCodeValue,\n ownerTorrowId: string,\n): string {\n return generateTorrowId(objectTypeCode, getShardFromTorrowId(ownerTorrowId));\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { type PutUrlRespDto } from \"../../schema/openapi-dto-aliases.js\";\nimport { unwrapFilePutUrl } from \"./facade-response-unwrap.js\";\nimport type { ContactCaseParticipantsListQuery, ItemTagsListQuery } from \"./contact-case-participants-query.js\";\nimport type {\n FeedbackOptions,\n GroupStatus,\n IncludeExcludeResp,\n ExcludeResp,\n NotificationWay,\n ObjectInfo,\n PersonalReminder,\n PersonalSolutionData,\n PublicityType,\n SolutionData,\n UpdateItemAccountsReq,\n UpdateItemGroupsReq,\n UpdateMasterInfoReq,\n UpdatePersonalListOrderReq,\n UpdatePersonalListOrderResp,\n} from \"../contacts/types.js\";\nimport type {\n GenerateSecurityTokenReq,\n GenerateSecurityTokenResp,\n GetParticipationCountResp,\n GetShareItemSessionReq,\n LoyaltyGroupListQuery,\n ParticipantType,\n ParticipantView,\n Participation,\n ParticipationResp,\n SaveItemToMindMapReq,\n SendLinkOfItemReq,\n SendLinkOfItemResp,\n SetGroupItemReq,\n ShareItemReq,\n UnsetGroupItemReq,\n} from \"../loyalty-systems/types.js\";\nimport type { FileInfo, UpdateFileIdResp } from \"../notes/types.js\";\nimport type {\n ExcludeFromGroupsReq,\n IncludeToGroupsReq,\n BaseItemProperties,\n ItemProperties,\n} from \"../relations/types.js\";\nimport {\n generateTorrowIdForOwner,\n TorrowObjectTypeCode,\n type TorrowObjectTypeCodeValue,\n} from \"../../util/torrow-id.js\";\nimport type { TorrowItem, TorrowObject } from \"./torrow-entities.js\";\n\n/** Поведение «социального» слоя элемента: image puturl, опционально фото (только contacts). */\nexport type TorrowItemFacadeOptions = {\n /** Добавить `securityToken` в query `GET .../image/puturl` (contacts). */\n imagePutUrlSecurityToken?: boolean;\n /** `GET .../photo/info`, `GET .../photo/puturl` — только contacts. */\n withPhotoEndpoints?: boolean;\n /**\n * `GET .../group/list` есть не у всех доменов (например, есть у **loyaltysystems**, нет у **loyaltycards**).\n * Если `false`, {@link TorrowItemCoreFacade.listGroups} бросает ошибку. По умолчанию метод доступен.\n *\n * Важно: этот эндпоинт — список **групп родительского элемента, доступных для\n * включения дочерних элементов**, не членов группы.\n * Члены группы: `client.search.*(…, { groupIds })` (как в torrow-apps).\n */\n withGroupListEndpoint?: boolean;\n};\n\n/**\n * Общий HTTP-слой для item-доменов без эндпоинтов, отсутствующих у **loyaltysystems**\n * (например `GET .../participants/anonymous`, `GET .../tags`, `PUT .../updateaccounts`, block/unblock).\n * Полный набор — {@link TorrowItemFacade}.\n *\n * @typeParam TParticipantsQuery — query для `GET .../participants` (у **loyaltysystems** — `lmFrom`/`lmTo`, у contact/case — `lmfrom`/`lmto`).\n */\nexport abstract class TorrowItemCoreFacade<\n TItem,\n TParticipantsQuery = ContactCaseParticipantsListQuery,\n> {\n /** Числовой тип item этого фасада (`TorrowObjectTypeCode.Note`, …). */\n protected abstract readonly itemObjectTypeCode: TorrowObjectTypeCodeValue;\n\n protected constructor(\n protected readonly http: HttpClient,\n protected readonly basePath: string,\n protected readonly socialOpts: TorrowItemFacadeOptions = {},\n ) {}\n\n /**\n * Id вложения (presigned image/file) — тип **File**.\n * `ownerTorrowId`: profileId, userId или id item того же пользователя (shard).\n */\n generateFileId(ownerTorrowId: string): string {\n return generateTorrowIdForOwner(TorrowObjectTypeCode.File, ownerTorrowId);\n }\n\n /** Id item этого домена до `create` / upload (клиентская генерация, без запроса к API). */\n protected generateItemId(ownerTorrowId: string): string {\n return generateTorrowIdForOwner(this.itemObjectTypeCode, ownerTorrowId);\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/publicity` */\n updatePublicity(\n torrowId: string,\n body: PublicityType,\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/publicity`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/image/id` — тело: JSON-string **`fileId`**. */\n updateImageId(\n torrowId: string,\n fileId: string,\n options?: TorrowOptions,\n ): Promise<UpdateFileIdResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/image/id`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: fileId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/torrowaccount/id` — тело: JSON-string account id. */\n updateTorrowAccountId(\n torrowId: string,\n accountId: string,\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/torrowaccount/id`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: accountId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/masterinfo` */\n updateMasterInfo(\n torrowId: string,\n body: UpdateMasterInfoReq,\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/masterinfo`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/integrations` */\n updateIntegrations(\n torrowId: string,\n integrationIds: string[],\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/integrations`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: integrationIds,\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/{domain}/{torrowId}/participants` — список участников.\n * Фильтры: **`participantStateList`** (`Offered` / `Requested` / `Accepted` / …), **`participantTypeList`**.\n * Query-тип: {@link TorrowItemCoreFacade TParticipantsQuery}. Флоу: `docs/agents/participation-flow.md`.\n */\n listParticipants(\n torrowId: string,\n query?: TParticipantsQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ParticipantView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participants`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `POST /api/v1/{domain}/{torrowId}/generatesecuritytoken` — токен для внешней ссылки.\n * **`participantType: Reader`** — обычная ссылка; **`Owner`** — ссылка управления (apps: `ShareWithRightsService`).\n * Получатель сохраняет через {@link saveToMindMap} с `securityToken` в теле. Сам по себе Offered не создаёт.\n */\n generateSecurityToken(\n torrowId: string,\n body: GenerateSecurityTokenReq,\n options?: { signal?: AbortSignal },\n ): Promise<GenerateSecurityTokenResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/generatesecuritytoken`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/{participantProfileId}/type` */\n updateParticipationType(\n torrowId: string,\n participantProfileId: string,\n participantType: ParticipantType,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/${encodePathSegment(participantProfileId)}/type`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: participantType,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/requestaccess` — запрос доступа (не-владелец).\n * Body: **`profileId`**. Новый участник → **`Requested`**; некоторые существующие состояния → **`Accepted`**.\n * Проверять возвращённый participantState; после Accepted заново прочитать элемент и проверить полноту содержимого.\n * Владелец своего item вызвать не может. Дальше: {@link grantAccess} / {@link declineAccess} / {@link revokeAccessRequest}.\n */\n requestAccess(\n torrowId: string,\n profileId: string,\n options?: { userMessage?: string | null; signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/requestaccess`,\n query: { userMessage: options?.userMessage },\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/revokerequest` — requester отменяет свой запрос.\n * **`Requested`** → **`Revoked`**.\n */\n revokeAccessRequest(torrowId: string, options?: { signal?: AbortSignal }): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/revokerequest`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/group/set` */\n setGroup(\n torrowId: string,\n body: SetGroupItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/group/set`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/group/unset` */\n unsetGroup(\n torrowId: string,\n body: UnsetGroupItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/group/unset`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/tags` */\n updateTags(\n torrowId: string,\n tags: string[],\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/tags`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: tags,\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/{domain}/{parentId}/group/list` — список **групп родительского\n * элемента, доступных для включения дочерних элементов**\n * (torrow-apps: `getGroups(parentId)`).\n *\n * Контекст (иерархия + группы):\n * - `parentId` — родительский элемент, к которому крепятся дочерние.\n * - Ответ — каталог групп этого родителя, в которые UI/API предлагает включать\n * дочерние items (часть дочерних items сама может быть группами через `setGroup`).\n * - Часто в выборку входит и сам parent, если он группа; в apps при пустом\n * `group/list` UI fallback → `[parent]`.\n * - Членство child ↔ group в контексте родителя: {@link listItemGroups}\n * (`…/{itemId}/groups?parentId=`) и мутации `includeToGroups` / `updateGroups`\n * (там тоже передаётся `parentId`).\n *\n * **Не** список членов группы. Члены группы → `client.search.*(…, { groupIds })`.\n *\n * @param parentId родитель, чьи группы доступны для include дочерних\n */\n listGroups(\n parentId: string,\n query?: LoyaltyGroupListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem[]> {\n if (this.socialOpts.withGroupListEndpoint === false) {\n throw new Error(\n \"listGroups is not supported for this API domain (withGroupListEndpoint: false)\",\n );\n }\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/group/list`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{itemId}/updategroups` — включить/исключить **этот** item из групп\n * (в torrow-apps основной путь «включить в группу»: `updateItemGroups` с `parentId`).\n * Массовый вариант: {@link includeToGroups} / {@link excludeFromGroups}.\n */\n updateGroups(\n torrowId: string,\n body: UpdateItemGroupsReq[],\n options?: {\n parentId?: string | null;\n tags?: string[] | null;\n alias?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/updategroups`,\n query: {\n parentId: options?.parentId,\n tags: options?.tags,\n alias: options?.alias,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/include/togroups` — включить items в указанные группы.\n * Проверка членства после include — через search с `groupIds` (индекс асинхронный),\n * не через {@link listGroups}.\n */\n includeToGroups(body: IncludeToGroupsReq, options?: { signal?: AbortSignal }): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/include/togroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/exclude/fromgroups` */\n excludeFromGroups(body: ExcludeFromGroupsReq, options?: { signal?: AbortSignal }): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/exclude/fromgroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/include/items` */\n includeToParent(\n parentId: string,\n itemPropertiesList: readonly ItemProperties[],\n options?: TorrowOptions,\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/include/items`,\n body: {\n itemPropertiesList: [...itemPropertiesList],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/exclude/items` — removes the specified child items from the parent. */\n excludeFromParent(\n parentId: string,\n childIds: readonly string[],\n options?: TorrowOptions,\n ): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/exclude/items`,\n body: {\n itemIds: [...childIds],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/include/foruser` */\n includeForUser(\n parentId: string,\n itemPropertiesList: readonly BaseItemProperties[],\n options?: TorrowOptions,\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/include/foruser`,\n body: {\n itemPropertiesList: [...itemPropertiesList],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/exclude/fromuser` — removes the specified child items from the user's mind map. */\n excludeFromUser(\n parentId: string,\n childIds: readonly string[],\n options?: TorrowOptions,\n ): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/exclude/fromuser`,\n body: {\n itemIds: [...childIds],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/rejectoffer` — invitee отклоняет приглашение.\n * **`Offered`** → **`Rejected`**. Body: **`profileId`**. В UI часто только Hide announcement без этого вызова.\n */\n rejectOffer(\n torrowId: string,\n profileId: string,\n options?: { userMessage?: string | null; signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/rejectoffer`,\n query: { userMessage: options?.userMessage },\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/reject` — body: **`profileId`**. */\n reject(\n torrowId: string,\n profileId: string,\n options?: { signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/reject`,\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/share` — владелец приглашает профили.\n * Создаёт **`Offered`** (+ тип из body); invitee — announcement **`ShareItem`**.\n * Принять = {@link saveToMindMap} (отдельного `acceptOffer` нет). Отозвать = {@link revokeOffer}.\n * Флоу: `docs/agents/participation-flow.md`.\n */\n share(\n torrowId: string,\n body: ShareItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/share`,\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/revokeoffer` — владелец отзывает приглашение.\n * **`Offered`** → **`Revoked`**. Body: `profileIds[]`.\n */\n revokeOffer(\n torrowId: string,\n profileIds: string[],\n options?: { signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/revokeoffer`,\n body: profileIds,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/grantaccess` — владелец принимает запрос доступа.\n * **`Requested`** → **`Accepted`**. Body: `profileIds[]`. Не путать с {@link share}.\n */\n grantAccess(\n torrowId: string,\n profileIds: string[],\n options?: { signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/grantaccess`,\n body: profileIds,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/declineaccess` — владелец отклоняет запрос доступа.\n * **`Requested`** → **`Declined`**. Body: `profileIds[]`; query **`userMessage`**.\n */\n declineAccess(\n torrowId: string,\n profileIds: string[],\n options?: { userMessage?: string | null; signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/declineaccess`,\n query: { userMessage: options?.userMessage },\n body: profileIds,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/personallist/updateorder` */\n updatePersonalListOrder(\n body: UpdatePersonalListOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<UpdatePersonalListOrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/personallist/updateorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/alias` */\n updateAlias(\n itemId: string,\n alias: string,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/alias`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: alias,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/lastusagetime` — тело ISO date-time string. */\n updateLastUsageTime(\n itemId: string,\n lastUsageTime: string,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/lastusagetime`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: lastUsageTime,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/participation/profile` */\n updateParticipationProfile(\n itemId: string,\n profileId: string,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/participation/profile`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{itemId}/sendlink` — in-app «вот ссылка» другому профилю.\n * Announcement **`SendLinkOfItem`**. **Не** создаёт `Offered` и не меняет participation (не путать с {@link share}).\n */\n sendLink(\n itemId: string,\n body: SendLinkOfItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<SendLinkOfItemResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/sendlink`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{torrowId}/shorturl` → короткая URL элемента (`string`), без смены participation. */\n getShortUrl(torrowId: string, options?: { signal?: AbortSignal }): Promise<string> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/shorturl`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/uniquename` */\n updateUniqueName(\n itemId: string,\n uniqueName: string,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/uniquename`,\n body: uniqueName,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/uniquename/{uniqueName}` */\n getByUniqueName(uniqueName: string, options?: { signal?: AbortSignal }): Promise<TItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/uniquename/${encodePathSegment(uniqueName)}`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/image/info` */\n getImageInfo(torrowId: string, options?: { signal?: AbortSignal }): Promise<FileInfo> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/image/info`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/image/puturl` */\n async getImagePutUrl(\n torrowId: string,\n fileId: string,\n fileName?: string | null,\n fileSize?: number | null,\n options?: {\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<{ url: string; urlExpiration: string }> {\n const query: Record<string, unknown> = {\n fileId,\n fileName,\n fileSize,\n };\n if (this.socialOpts.imagePutUrlSecurityToken) {\n query.securityToken = options?.securityToken;\n }\n const resp = await this.http.requestJson<PutUrlRespDto>({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/image/puturl`,\n query,\n signal: options?.signal,\n });\n return unwrapFilePutUrl(resp);\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/savetomindmap` — сохранить в личный список / mind map.\n * Это же **accept** приглашения (`Offered` → `Accepted`); отдельного `acceptOffer` нет.\n * Также: open/link save без одобрения; save по **`securityToken`** (Reader / Owner link).\n * Флоу: `docs/agents/participation-flow.md`.\n * Placement User link (канон apps): `client.relations.saveToMindMap` + `offlinable` / `parentItemId` / `userProfileId` — см. `relations-flow.md` (этот item-метод — accept / open-link / `securityToken`).\n */\n saveToMindMap(\n torrowId: string,\n body: SaveItemToMindMapReq,\n options?: { signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/savetomindmap`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/solutiondata` */\n updateSolutionData(\n torrowId: string,\n body: SolutionData,\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/solutiondata`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/personalsolutiondata` */\n updatePersonalSolutionData(\n itemId: string,\n body: PersonalSolutionData,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/personalsolutiondata`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/photo/info` — только при {@link TorrowItemFacadeOptions.withPhotoEndpoints}. */\n getPhotoInfo(\n torrowId: string,\n options?: { photoId?: string | null; signal?: AbortSignal },\n ): Promise<FileInfo> {\n if (!this.socialOpts.withPhotoEndpoints) {\n throw new Error(\"getPhotoInfo is only supported when withPhotoEndpoints is true (contacts)\");\n }\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/photo/info`,\n query: { photoId: options?.photoId },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/photo/puturl` — только при {@link TorrowItemFacadeOptions.withPhotoEndpoints}. */\n async getPhotoPutUrl(\n torrowId: string,\n fileId: string,\n fileName?: string | null,\n fileSize?: number | null,\n options?: {\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<{ url: string; urlExpiration: string }> {\n if (!this.socialOpts.withPhotoEndpoints) {\n throw new Error(\"getPhotoPutUrl is only supported when withPhotoEndpoints is true (contacts)\");\n }\n const resp = await this.http.requestJson<PutUrlRespDto>({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/photo/puturl`,\n query: {\n fileId,\n fileName,\n fileSize,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n return unwrapFilePutUrl(resp);\n }\n}\n\n/**\n * Полный item-фасад для доменов с расширенным OpenAPI (contacts, cases, services, notes, …).\n * **LoyaltySystem** использует только {@link TorrowItemCoreFacade}.\n */\nexport abstract class TorrowItemFacade<TItem> extends TorrowItemCoreFacade<\n TItem,\n ContactCaseParticipantsListQuery\n> {\n protected constructor(\n http: HttpClient,\n basePath: string,\n socialOpts: TorrowItemFacadeOptions = {},\n ) {\n super(http, basePath, socialOpts);\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/feedbacks/options` */\n updateFeedbackOptions(\n torrowId: string,\n body: FeedbackOptions,\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/feedbacks/options`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/participants/anonymous` */\n getParticipantsAnonymousCount(\n torrowId: string,\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participants/anonymous`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/participants/nonanonymous` */\n getParticipantsNonAnonymousCount(\n torrowId: string,\n query?: Pick<ContactCaseParticipantsListQuery, \"participantStateList\" | \"participantTypeList\">,\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participants/nonanonymous`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/tags` */\n listTags(\n torrowId: string,\n query?: ItemTagsListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<string[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/tags`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/{domain}/{itemId}/groups` — **`GroupStatus[]`**: в каких группах состоит\n * `itemId` **в контексте родителя** `parentId` (torrow-apps: `getItemGroups(itemId, parentId)`).\n *\n * Контекст (иерархия + группы):\n * - Child крепится к `parentId` (иерархия / mind map).\n * - В этом же parent-scope есть набор групп, доступных для включения дочерних —\n * см. {@link listGroups} (`…/{parentId}/group/list`), плюс сам parent, если он группа.\n * - Этот метод для child отвечает: «в какие из этих групп он включён»\n * (`GroupStatus.include` + `GroupStatus.group`).\n *\n * Не путать с {@link listGroups} (группы родителя для include дочерних) и с поиском\n * членов группы (`search.*(groupIds)`).\n *\n * @param itemId child, чьё членство смотрим\n * @param query.parentId родительский scope (обязателен по смыслу API, как в apps)\n */\n listItemGroups(\n itemId: string,\n query?: LoyaltyGroupListQuery & { parentId?: string | null },\n options?: { signal?: AbortSignal },\n ): Promise<GroupStatus[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/groups`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/updateaccounts` */\n updateAccounts(\n torrowId: string,\n body: UpdateItemAccountsReq[],\n options?: TorrowOptions,\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/updateaccounts`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * **WIP / do not use in product.** `POST .../{torrowId}/participation/shareitemlink` —\n * invite-session URL (`GetShareItemSessionReq` → `string`).\n * Gateway stub → `\"\"` (HTTP 200). Apps: InvitationLink menu on ContactItem copies that response.\n * Activate: `client.item.activateShareItemSession` (also stub; unused in apps UI).\n * Product alternative: `generateSecurityToken` + client URI. Do not compose URL from `getShortUrl`.\n * Не путать с `sendLink` / `share`.\n */\n shareItemLink(\n torrowId: string,\n body: GetShareItemSessionReq,\n options?: { signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/shareitemlink`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/offlinable` */\n updateOfflinable(\n itemId: string,\n offlinable: boolean,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/offlinable`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: offlinable,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/reminders` */\n updateReminders(\n itemId: string,\n reminders: PersonalReminder[],\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/reminders`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: reminders,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/notificationwaylist` */\n updateNotificationWayList(\n itemId: string,\n ways: NotificationWay[],\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/notificationwaylist`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: ways,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{itemId}/block` */\n block(\n itemId: string,\n options?: {\n reasonId?: number | null;\n reasonNote?: string | null;\n language?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/block`,\n query: {\n reasonId: options?.reasonId,\n reasonNote: options?.reasonNote,\n language: options?.language,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{itemId}/unblock` */\n unblock(\n itemId: string,\n options?: TorrowOptions,\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/unblock`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n}\n","import type { ItemViewSortCondition, TimetableDetailsVisibility } from \"../services/types.js\";\n\n/**\n * Query-параметры `PUT .../{id}/timetable` (услуга, ресурс, календарь, контакт, карта лояльности).\n * Для **services** (и **loyaltycards** в OpenAPI) дополнительно поддерживаются `createDateFrom` / `createDateTo`.\n * Поля дат — **`Date`** (в URL уходят как ISO через **`buildQueryString`** в `src/util/query-string.ts`).\n */\nexport type TimetableQueryOptions = {\n /**\n * Глубина деталей ответа: `View` — CaseView/CaseSummary; `Time` — в основном интервалы занятости.\n * MCP: `TimetableQueryOptions.visibility` / enum `TimetableDetailsVisibility`.\n */\n visibility?: TimetableDetailsVisibility | null;\n take?: number | null;\n skip?: number | null;\n lmfrom?: Date | null;\n lmto?: Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemViewSortCondition | null;\n /** Только `GET/PUT` расписания **услуги** (NSwag `ServiceClient.getTimetable`). */\n createDateFrom?: Date | null;\n createDateTo?: Date | null;\n};\n\n/** Собирает query для `HttpClient`; `undefined`/`null` отбрасываются в {@link buildQueryString}. */\nexport function buildTimetableQuery(options: TimetableQueryOptions | undefined): Record<string, unknown> {\n const o = options ?? {};\n return {\n visibility: o.visibility,\n take: o.take,\n skip: o.skip,\n lmfrom: o.lmfrom,\n lmto: o.lmto,\n includeDeleted: o.includeDeleted,\n sort: o.sort,\n createDateFrom: o.createDateFrom,\n createDateTo: o.createDateTo,\n };\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount, unwrapTimetableStatisticsList } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n TimetableCase,\n TimetableFilter,\n TimetableStatisticsResp,\n} from \"../services/types.js\";\nimport type { CalendarItem, CalendarItemForCreateOrUpdate, DeleteResponse } from \"./types.js\";\n\nconst BASE = \"/api/v1/calendars\";\n\n/** CRUD + personal list + социальный слой для календарей (`CalendarItem`). `getById` использует `includeChildItems`. */\nexport class CalendarsFacade extends TorrowItemFacade<CalendarItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Calendar;\n\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** Id календаря до `create` / presigned upload. */\n generateCalendarId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/calendars` */\n create(\n body: CalendarItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CalendarItem> {\n const payload = applyItemCreateDefaults(body, Discriminator.CalendarItem);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{body.id}` */\n update(\n body: CalendarItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CalendarItem> {\n const itemId = requireItemUpdateId(body, \"Calendar\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/calendars/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/calendars/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildItems?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CalendarItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildItems: options?.includeChildItems,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/calendars/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<CalendarItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** Расписание кейсов календаря — `PUT /api/v1/calendars/{id}/timetable`. */\n getTimetable(\n calendarId: string,\n body: TimetableFilter,\n options?: Omit<TimetableQueryOptions, \"createDateFrom\" | \"createDateTo\"> & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /** `POST /api/v1/calendars/timetable/statistics` */\n async getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableStatisticsResp[]> {\n const resp = await this.http.requestJson<GetTimetableStatisticsResponse>({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n return unwrapTimetableStatisticsList(resp);\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/includecase` — тело: массив id кейсов. */\n includeCase(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/includecase`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/includecasetocustomcalendar` */\n includeCaseToCustomCalendar(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/includecasetocustomcalendar`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/excludecasefromcustomcalendar` */\n excludeCaseFromCustomCalendar(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/excludecasefromcustomcalendar`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/excludecase` */\n excludeCase(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/excludecase`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n}\n","import type { CaseItemDto, CreateCaseReqDto, AvailabilityTimeDto, CaseParticipantTypeDto, CaseParticipantDto, CaseParticipantViewDto, CaseParticipantFieldsDto, CaseParticipantStateDto, GetCaseParticipationCountRespDto, CheckInReqDto, CheckInPropsDto, BookResourcesForMeReqDto, BookResourcesForOthersReqDto, ChangeMoneyReceiveReqDto, CancelCaseParticipationReqDto, ApproveCaseParticipationReqDto, PatchCaseReqDto } from \"./dto.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type { DeleteResponse, ObjectInfo, ResourceView } from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nexport type { PersonalSolutionData, SolutionData };\n\n\n\n\nexport type CaseItem = TorrowItemFromDto<CaseItemDto>;\nexport type CreateCaseReq = CreateCaseReqDto;\nexport type AvailabilityTime = AvailabilityTimeDto;\nexport type CaseParticipantType = CaseParticipantTypeDto;\n/**\n * Участник кейса. В сгенерированных типах только **`loyaltyCardId`**.\n * Legacy `loyalityCardId` остаётся в `docs/torrow-swagger.json` (wire для старых клиентов),\n * но вырезается обёрткой codegen (`scripts/openapi-codegen.mjs` → `stripLegacyWireAliases`).\n * Сервер игнорирует опечатку при записи; в JSON ответов поле ещё может прийти — не использовать.\n * Проверка против живого API — отдельно (integration / ручные тесты).\n */\nexport type CaseParticipant = CaseParticipantDto;\nexport type CaseParticipantView = CaseParticipantViewDto;\nexport type CaseParticipantFields = CaseParticipantFieldsDto;\nexport type CaseParticipantState = CaseParticipantStateDto;\nexport type GetCaseParticipationCountResp = GetCaseParticipationCountRespDto;\nexport type CheckInReq = CheckInReqDto;\nexport type CheckInProps = CheckInPropsDto;\nexport type BookResourcesForMeReq = BookResourcesForMeReqDto;\nexport type BookResourcesForOthersReq = BookResourcesForOthersReqDto;\nexport type ChangeMoneyReceiveReq = ChangeMoneyReceiveReqDto;\nexport type ApproveCaseParticipationReq = ApproveCaseParticipationReqDto;\nexport type CancelCaseParticipationReq = CancelCaseParticipationReqDto;\nexport type PatchCaseReq = PatchCaseReqDto;\nexport type CaseState = CaseItem[\"caseState\"];\nexport type CaseType = CaseItem[\"caseType\"];\nexport const CaseStateValues = {\n Unknown: \"UnknownCaseState\",\n Verifying: \"Verifying\",\n Waiting: \"Waiting\",\n Processing: \"Processing\",\n Preparing: \"Preparing\",\n Completed: \"Completed\",\n Closed: \"Closed\",\n Rejected: \"Rejected\",\n Canceled: \"Canceled\",\n TimeControlled: \"TimeControlled\",\n TaskNotCompleted: \"TaskNotCompleted\",\n TaskCompleted: \"TaskCompleted\",\n} as const satisfies Record<string, NonNullable<CaseState>>;\nexport const CaseTypeValues = {\n Unknown: \"UnknownTimeType\",\n Time: \"Time\",\n RepeatedTime: \"RepeatedTime\",\n Today: \"Today\",\n Week: \"Week\",\n Later: \"Later\",\n Date: \"Date\",\n State: \"State\",\n} as const satisfies Record<string, NonNullable<CaseType>>;\nexport type CaseItemForCreateOrUpdate = TorrowItemForCreateOrUpdate<CaseItem>;\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { CancelCaseParticipationReq, CaseItem, CaseParticipant } from \"./types.js\";\n\n/*\n * Запросы гостя к своей записи — функциями поверх `HttpClient`, без `CasesFacade`\n * (причина — как у `service-requests.ts`: методы класса не выкидываются из бандла).\n * `securityToken` гостя — только в параметрах вызова, не Bearer. `CasesFacade` вызывает эти же функции.\n */\n\nconst BASE = \"/api/v1/cases\";\n\n/** Опции `GET /api/v1/cases/{torrowId}` — у `getCase` и `CasesFacade.getById`. */\nexport interface GetCaseOptions {\n profileId?: string | null;\n caseParticipantProfileId?: string | null;\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n /** Гостевой доступ: `OrderResp.consumerSecurityToken`. */\n securityToken?: string | null;\n /** Без него гость не получит свою часть: `personalInfo.caseParticipant`, `ticketResource`. */\n caseParticipantId?: string | null;\n signal?: AbortSignal;\n}\n\n/** `GET /api/v1/cases/{torrowId}` — событие-заказ; гостю — с `securityToken` и `caseParticipantId`. */\nexport function getCase(http: HttpClient, torrowId: string, options?: GetCaseOptions): Promise<CaseItem> {\n return http.requestJson<CaseItem>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n profileId: options?.profileId,\n caseParticipantProfileId: options?.caseParticipantProfileId,\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n caseParticipantId: options?.caseParticipantId,\n },\n signal: options?.signal,\n });\n}\n\n/**\n * Отмена участия — `PUT /api/v1/cases/{torrowId}/caseparticipation/cancelcaseparticipation`.\n * Гость отменяет свою запись с `{ consumerIdList: [caseParticipantId], securityToken }` — как\n * «Отменить запись» в приложении. Сроки отмены (`registrationClose`, тег услуги\n * `<минуты>:DisableCancelMyParticipation`) для гостя сервер сейчас не проверяет (отмена идёт от имени\n * организатора) — проверяй их в приложении, как `torrow-apps` `CaseItemHelper.canCancelMyCaseParticipation`.\n */\nexport function cancelCaseParticipation(\n http: HttpClient,\n torrowId: string,\n body: CancelCaseParticipationReq,\n options?: { signal?: AbortSignal },\n): Promise<CaseParticipant[]> {\n return http.requestJson<CaseParticipant[]>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/cancelcaseparticipation`,\n body,\n signal: options?.signal,\n });\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type {\n CaseParticipantsCountQuery,\n CaseParticipantsListQuery,\n} from \"../common/contact-case-participants-query.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport type { ExcludeFromGroupsReq, IncludeToGroupsReq } from \"../relations/types.js\";\nimport type { ExcludeResp, IncludeExcludeResp } from \"../contacts/types.js\";\nimport { CaseStateValues, CaseTypeValues } from \"./types.js\";\nimport { cancelCaseParticipation, getCase, type GetCaseOptions } from \"./case-requests.js\";\nimport type {\n ApproveCaseParticipationReq,\n AvailabilityTime,\n BookResourcesForMeReq,\n BookResourcesForOthersReq,\n CancelCaseParticipationReq,\n CaseItem,\n CaseItemForCreateOrUpdate,\n CaseParticipant,\n CaseParticipantFields,\n CaseParticipantType,\n CaseParticipantView,\n ChangeMoneyReceiveReq,\n CheckInReq,\n CreateCaseReq,\n DeleteResponse,\n GetCaseParticipationCountResp,\n PatchCaseReq,\n ResourceView,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/cases\";\n\n/**\n * События в продуктовой терминологии (REST **`/api/v1/cases`**, DTO **`CaseItem`**). **Заказ** — событие после записи на услугу (`createOrder`); событие без услуги — **`createWithOptions`** (`PUT` + `CreateCaseReq`) или **`createCaseItem`** (`POST` + `CaseItem`). Для оплаты заказа чаще **`getById`** + токены гостя.\n */\nexport class CasesFacade extends TorrowItemFacade<CaseItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Case;\n\n constructor(http: HttpClient) {\n super(http, BASE);\n }\n\n /** Id события до `createWithOptions` / `createCaseItem` / presigned upload. */\n generateCaseId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /**\n * Основной create события — `PUT /api/v1/cases` + **`CreateCaseReq`**\n * (`caseItem`, опционально `reminders`, `calendarId`, check-in / road time / participant type, …).\n * NSwag: `createCaseWithReminder`. Для «голого» `CaseItem` без оболочки — **`createCaseItem`**.\n */\n createWithOptions(\n body: CreateCaseReq,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n const payload: CreateCaseReq = {\n ...body,\n caseItem: body.caseItem\n ? this.withCreateDefaults(body.caseItem as CaseItemForCreateOrUpdate)\n : body.caseItem,\n };\n return this.http.requestJson({\n method: \"PUT\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /**\n * `POST /api/v1/cases` — create из тела **`CaseItem`** (query: calendar / check-in / road / participant).\n * NSwag: `createCase`. Предпочтительный путь с оболочкой — **`createWithOptions`** (`CreateCaseReq`).\n */\n createCaseItem(\n body: CaseItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n isNeedToCheckInMySelf?: boolean;\n availabilityTime?: AvailabilityTime | null;\n roadTime?: number | null;\n calendarId?: string | null;\n caseParticipantType?: CaseParticipantType | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n const payload = this.withCreateDefaults(body);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n isNeedToCheckInMySelf: options?.isNeedToCheckInMySelf,\n availabilityTime: options?.availabilityTime,\n roadTime: options?.roadTime,\n calendarId: options?.calendarId,\n caseParticipantType: options?.caseParticipantType,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{body.id}` */\n update(\n body: CaseItemForCreateOrUpdate,\n options?: {\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n const itemId = requireItemUpdateId(body, \"Case\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n profileId: options?.profileId,\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body,\n signal: options?.signal,\n });\n }\n\n private withCreateDefaults(body: CaseItemForCreateOrUpdate): CaseItemForCreateOrUpdate {\n const payload = applyItemCreateDefaults(body, Discriminator.CaseItem);\n return {\n ...payload,\n caseState: payload.caseState ?? CaseStateValues.Verifying,\n caseType: payload.caseType ?? CaseTypeValues.Time,\n // Сервер отклоняет create без VisitCard («Parameter VisitCard cannot have value null»).\n visitCard: payload.visitCard ?? {\n fields: [\n { number: 0, value: payload.name ?? \"\", expression: '{\"type\":\"Name\"}' },\n { number: 1, value: \"\", expression: null },\n { number: 2, value: \"\", expression: null },\n ],\n },\n };\n }\n\n /** `DELETE /api/v1/cases/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/cases/{torrowId}` */\n getById(torrowId: string, options?: GetCaseOptions): Promise<CaseItem> {\n return getCase(this.http, torrowId, options);\n }\n\n /** `GET /api/v1/cases/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<CaseItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `PUT /api/v1/cases/include/togroups` */\n includeToGroups(body: IncludeToGroupsReq, options?: { signal?: AbortSignal }): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/include/togroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/exclude/fromgroups` */\n excludeFromGroups(body: ExcludeFromGroupsReq, options?: { signal?: AbortSignal }): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/exclude/fromgroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/uniquename/{uniqueName}` — query **`profileId`** (в отличие от базового `GET .../uniquename/...`). */\n override getByUniqueName(\n uniqueName: string,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/uniquename/${encodePathSegment(uniqueName)}`,\n query: { profileId: options?.profileId },\n signal: options?.signal,\n });\n }\n\n\n /** `GET /api/v1/cases/{torrowId}/resources` */\n listResources(\n torrowId: string,\n query?: {\n resourceGroupId?: string | null;\n take?: number | null;\n skip?: number | null;\n includeDeleted?: boolean | null;\n },\n options?: { signal?: AbortSignal },\n ): Promise<ResourceView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/resources`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants` */\n listCaseParticipants(\n torrowId: string,\n query?: CaseParticipantsListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipantView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants/{caseParticipantId}` */\n getCaseParticipantById(\n torrowId: string,\n caseParticipantId: string,\n options?: { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<CaseParticipantView> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/${encodePathSegment(caseParticipantId)}`,\n query: { securityToken: options?.securityToken },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants/count` */\n getCaseParticipantsCount(\n torrowId: string,\n query?: CaseParticipantsCountQuery,\n options?: { signal?: AbortSignal },\n ): Promise<GetCaseParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/count`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants/nonanonymous` */\n getCaseParticipantsNonAnonymousCount(\n torrowId: string,\n query?: CaseParticipantsCountQuery,\n options?: { signal?: AbortSignal },\n ): Promise<GetCaseParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/nonanonymous`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/cases/{torrowId}/caseparticipants/{caseParticipantId}/fields` */\n patchCaseParticipantFields(\n torrowId: string,\n caseParticipantId: string,\n body: CaseParticipantFields,\n options?: {\n userMessage?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseParticipant> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/${encodePathSegment(caseParticipantId)}/fields`,\n query: {\n userMessage: options?.userMessage,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/cases/{torrowId}/caseparticipants/{caseParticipantId}/confirmparticipation` */\n confirmCaseParticipantParticipation(\n torrowId: string,\n caseParticipantId: string,\n options?: {\n userMessage?: string | null;\n profileId?: string | null;\n isNeedAnnouncement?: boolean | null;\n versionToCheck?: number | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseParticipant> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/${encodePathSegment(caseParticipantId)}/confirmparticipation`,\n query: {\n userMessage: options?.userMessage,\n profileId: options?.profileId,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n versionToCheck: options?.versionToCheck,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/checkin` */\n caseParticipationCheckIn(\n torrowId: string,\n body: CheckInReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/checkin`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/bookresourcesforme` */\n bookResourcesForMe(\n torrowId: string,\n body: BookResourcesForMeReq,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/bookresourcesforme`,\n query: { profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/bookresourcesforother` */\n bookResourcesForOthers(\n torrowId: string,\n body: BookResourcesForOthersReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/bookresourcesforother`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipants/approvemoneyreceive` */\n approveMoneyReceive(\n torrowId: string,\n body: ChangeMoneyReceiveReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/approvemoneyreceive`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipants/rejectmoneyreceive` */\n rejectMoneyReceive(\n torrowId: string,\n body: ChangeMoneyReceiveReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/rejectmoneyreceive`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/approvecaseparticipation` */\n approveCaseParticipation(\n torrowId: string,\n body: ApproveCaseParticipationReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/approvecaseparticipation`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/cancelcaseparticipation` */\n cancelCaseParticipation(\n torrowId: string,\n body: CancelCaseParticipationReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return cancelCaseParticipation(this.http, torrowId, body, options);\n }\n\n /** `POST /api/v1/cases/{torrowId}/reject` */\n rejectCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/reject`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/declinework` */\n declineWork(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/declinework`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/plan` */\n planCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/plan`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/takeinwork` */\n takeInWork(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/takeinwork`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/complete` */\n completeCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/complete`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/accept` */\n acceptCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/accept`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/returntoverification` */\n returnToVerification(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/returntoverification`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/cancel` */\n cancelCase(\n torrowId: string,\n options?: {\n profileId?: string | null;\n userMessage?: string | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/cancel`,\n query: {\n profileId: options?.profileId,\n userMessage: options?.userMessage,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/patch` */\n patchCase(torrowId: string, body: PatchCaseReq, options?: { signal?: AbortSignal }): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/patch`,\n body,\n signal: options?.signal,\n });\n }\n\n}\n","import type { ContactItemForCreateOrUpdate } from \"./types.js\";\n\n/** Как в torrow-apps при сохранении канала связи (`CommunicationFormMapper`, `add-contact-form`). */\nexport const CONTACT_COMMUNICATION_DEFAULT_CHECK_STATE = \"Unchecked\" as const;\n\n/**\n * Для каждого элемента `communications`: если `checkState` не передан — `Unchecked`.\n * `checkDate` не заполняем (read-only, выставляет сервер).\n */\nexport function normalizeContactCommunicationsForWrite(body: ContactItemForCreateOrUpdate): void {\n const items = body.communications;\n if (!Array.isArray(items)) {\n return;\n }\n for (const item of items) {\n if (item === null || item === undefined || typeof item !== \"object\") {\n continue;\n }\n if (item.checkState === undefined || item.checkState === null) {\n item.checkState = CONTACT_COMMUNICATION_DEFAULT_CHECK_STATE;\n }\n }\n}\n","import { generateRid, isValidRid, TORROW_OBJECT_ID_HEX_LENGTH } from \"../../util/torrow-id.js\";\nimport type { ContactItemForCreateOrUpdate } from \"./types.js\";\n\ntype RidCarrier = { rid?: string | null };\n\nconst CONTACT_STRUCTURED_ARRAY_KEYS = [\"addresses\", \"communications\", \"dates\"] as const;\n\nfunction isMissingRid(rid: unknown): boolean {\n if (rid === null || rid === undefined) {\n return true;\n }\n return typeof rid === \"string\" && rid.trim() === \"\";\n}\n\nfunction ensureRidsOnArray(items: RidCarrier[] | null | undefined, arrayKey: string): void {\n if (!Array.isArray(items)) {\n return;\n }\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item === null || item === undefined || typeof item !== \"object\") {\n continue;\n }\n const rid = item.rid;\n if (isMissingRid(rid)) {\n item.rid = generateRid();\n continue;\n }\n if (!isValidRid(rid)) {\n throw new Error(\n `Invalid rid for contact.${arrayKey}[${i}]: expected ${TORROW_OBJECT_ID_HEX_LENGTH} hexadecimal characters`,\n );\n }\n }\n}\n\n/**\n * Для `addresses`, `communications`, `dates`: если `rid` не передан — генерируется;\n * если передан — проверяется формат (24 hex), иначе исключение.\n */\nexport function normalizeContactStructuredArrayRidsForWrite(body: ContactItemForCreateOrUpdate): void {\n for (const key of CONTACT_STRUCTURED_ARRAY_KEYS) {\n ensureRidsOnArray(body[key] as RidCarrier[] | null | undefined, key);\n }\n}\n","import type { ContactItemForCreateOrUpdate } from \"./types.js\";\n\n/** Бэкенд / схема tnContact ожидают ровно три слота визитки (number 0…2). */\nexport const CONTACT_VISIT_CARD_SLOT_COUNT = 3;\n\n/** Выражение слота 0 по умолчанию (как в продуктовом JSON визитки). */\nexport const CONTACT_VISIT_CARD_DEFAULT_SLOT_0_EXPRESSION = JSON.stringify({ type: \"LastNameFirstName\" });\n\nfunction trimNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\n/** Значение слота 0 по умолчанию: `name`; иначе полное ФИО; иначе `company` (организация). */\nexport function contactVisitCardDefaultSlot0Value(body: ContactItemForCreateOrUpdate): string {\n const name = trimNonEmptyString(body.name);\n if (name !== undefined) {\n return name;\n }\n\n const lastName = trimNonEmptyString(body.lastName);\n const firstName = trimNonEmptyString(body.firstName);\n const middleName = trimNonEmptyString(body.middleName);\n if (lastName !== undefined && firstName !== undefined && middleName !== undefined) {\n return `${lastName} ${firstName} ${middleName}`;\n }\n\n return trimNonEmptyString(body.company) ?? \"\";\n}\n\n/**\n * Приводит `visitCard.fields` к ровно трём элементам с `number` 0…2: недостающие\n * слоты заполняются `{ number, value: \"\" }`; для каждого номера сохраняется\n * последняя переданная запись (остальные с тем же `number` отбрасываются).\n * Записи с нецелым `number` вне 0…2 игнорируются.\n *\n * Если `visitCard` нет / не объект, либо `fields` отсутствует, не массив или пустой —\n * перед нормализацией подставляется один слот 0: `expression` как у\n * {@link CONTACT_VISIT_CARD_DEFAULT_SLOT_0_EXPRESSION}, `value` — {@link contactVisitCardDefaultSlot0Value}.\n */\nexport function normalizeContactVisitCardFieldsForWrite(body: ContactItemForCreateOrUpdate): void {\n let visitCard = body.visitCard;\n if (visitCard === undefined || visitCard === null || typeof visitCard !== \"object\" || Array.isArray(visitCard)) {\n visitCard = {};\n }\n\n // Что пришло в fields (или пусто — тогда один дефолтный слот 0 из name).\n let incoming = Array.isArray(visitCard.fields) ? visitCard.fields : [];\n if (incoming.length === 0) {\n incoming = [\n {\n expression: CONTACT_VISIT_CARD_DEFAULT_SLOT_0_EXPRESSION,\n number: 0,\n value: contactVisitCardDefaultSlot0Value(body),\n },\n ];\n }\n\n // Для каждого номера 0…2 оставляем последнюю запись из incoming.\n const picked: Array<(typeof incoming)[number] | undefined> = [];\n for (let i = 0; i < CONTACT_VISIT_CARD_SLOT_COUNT; i++) {\n picked.push(undefined);\n }\n for (const field of incoming) {\n if (field === undefined || field === null || typeof field !== \"object\") continue;\n const n = field.number;\n if (typeof n !== \"number\" || !Number.isInteger(n) || n < 0 || n >= CONTACT_VISIT_CARD_SLOT_COUNT) continue;\n picked[n] = { ...field, number: n };\n }\n\n // Ровно три элемента для API.\n const fields = [];\n for (let i = 0; i < CONTACT_VISIT_CARD_SLOT_COUNT; i++) {\n fields.push(picked[i] ?? { number: i, value: \"\" });\n }\n body.visitCard = { ...visitCard, fields };\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n unwrapDeleteCount,\n unwrapSendCommunicationSessionId,\n unwrapTimetableStatisticsList,\n unwrapTorrowObjectFromContactPropertiesUpdate,\n} from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport type { TorrowItemFacadeOptions } from \"../common/item-social-facet-base.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n TimetableCase,\n TimetableFilter,\n TimetableStatisticsResp,\n} from \"../services/types.js\";\nimport type {\n ActivityStatus,\n ContactItem,\n ContactItemForCreateOrUpdate,\n ContactProperties,\n DeleteResponse,\n SendCommunicationCodeReq,\n SendCommunicationCodeResp,\n UpdateContactPropertiesResp,\n VerifyCommunicationCodeReq,\n VerifyCommunicationCodeResp,\n} from \"./types.js\";\nimport type { TorrowObject } from \"../common/torrow-entities.js\";\nimport { normalizeContactCommunicationsForWrite } from \"./contact-communications-write-defaults.js\";\nimport { normalizeContactStructuredArrayRidsForWrite } from \"./contact-structured-array-rids.js\";\nimport { normalizeContactVisitCardFieldsForWrite } from \"./contact-visit-card-fields.js\";\n\ntype ContactItemWithDiscriminator = ContactItemForCreateOrUpdate & {\n discriminator?: string;\n};\n\nconst BASE = \"/api/v1/contacts\";\n\nconst CONTACT_SOCIAL_OPTS: TorrowItemFacadeOptions = {\n imagePutUrlSecurityToken: true,\n withPhotoEndpoints: true,\n};\n\n/**\n * CRUD and personal list for contact items (`ContactItem`).\n */\nexport class ContactsFacade extends TorrowItemFacade<ContactItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Contact;\n\n constructor(http: HttpClient) {\n super(http, BASE, CONTACT_SOCIAL_OPTS);\n }\n\n /** Id контакта до `create` / presigned upload. */\n generateContactId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/contacts` */\n create(\n body: ContactItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContactItem> {\n const payload = this.withCreateDefaults(body);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n private withCreateDefaults(body: ContactItemForCreateOrUpdate): ContactItem {\n const payload = applyItemCreateDefaults<ContactItem>(body as ContactItemWithDiscriminator, Discriminator.ContactItem);\n normalizeContactStructuredArrayRidsForWrite(payload);\n normalizeContactCommunicationsForWrite(payload);\n normalizeContactVisitCardFieldsForWrite(payload);\n return payload;\n }\n\n /** `PUT /api/v1/contacts/{body.id}` */\n update(\n body: ContactItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContactItem> {\n const itemId = requireItemUpdateId(body, \"Contact\");\n const payload: ContactItemForCreateOrUpdate = { ...body };\n normalizeContactStructuredArrayRidsForWrite(payload);\n normalizeContactCommunicationsForWrite(payload);\n normalizeContactVisitCardFieldsForWrite(payload);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/contacts/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContactItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `DELETE /api/v1/contacts/{torrowId}`\n * @param options.cascade / withPinnedItems — required by API (see Swagger).\n */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/contacts/personallist` */\n listPersonal(\n options?: PersonalListQuery & { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<ContactItem[]> {\n const { signal, securityToken, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest, securityToken },\n signal,\n });\n }\n\n /** Расписание по контакту (профиль/исполнитель) — `PUT /api/v1/contacts/{id}/timetable`. */\n getTimetable(\n contactId: string,\n body: TimetableFilter,\n options?: Omit<TimetableQueryOptions, \"createDateFrom\" | \"createDateTo\"> & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(contactId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /** `POST /api/v1/contacts/timetable/statistics` */\n async getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableStatisticsResp[]> {\n const resp = await this.http.requestJson<GetTimetableStatisticsResponse>({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n return unwrapTimetableStatisticsList(resp);\n }\n\n /** `POST /api/v1/contacts/communication/sendcode` */\n async sendCommunicationCode(body: SendCommunicationCodeReq, options?: { signal?: AbortSignal }): Promise<string> {\n const resp = await this.http.requestJson<SendCommunicationCodeResp>({\n method: \"POST\",\n path: `${BASE}/communication/sendcode`,\n body,\n signal: options?.signal,\n });\n return unwrapSendCommunicationSessionId(resp);\n }\n\n /** `POST /api/v1/contacts/communication/verify` */\n verifyCommunicationCode(\n body: VerifyCommunicationCodeReq,\n options?: { signal?: AbortSignal },\n ): Promise<VerifyCommunicationCodeResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/communication/verify`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/contacts/{torrowId}/invite` — тело JSON-string (идентификатор приглашения / профиля по контракту API). */\n invite(\n torrowId: string,\n body: string,\n options?: { communicationId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/invite`,\n query: { communicationId: options?.communicationId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/contacts/activitystatuslist` */\n listActivityStatuses(\n itemIds: string[],\n options?: { signal?: AbortSignal },\n ): Promise<ActivityStatus[]> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/activitystatuslist`,\n body: itemIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/contacts/{contactId}/contactproperties` */\n async updateContactProperties(\n contactId: string,\n body: ContactProperties,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject | undefined> {\n const resp = await this.http.requestJson<UpdateContactPropertiesResp>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(contactId)}/contactproperties`,\n body,\n signal: options?.signal,\n });\n return unwrapTorrowObjectFromContactPropertiesUpdate(resp) as TorrowObject | undefined;\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport type { ContextItem, ContextItemForCreateOrUpdate, DeleteResponse } from \"./types.js\";\n\nconst BASE = \"/api/v1/contexts\";\n\n/** CRUD + personal list + социальный слой для контекстов (`ContextItem`). `POST` принимает только опциональный `profileId`. */\nexport class ContextsFacade extends TorrowItemFacade<ContextItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Context;\n\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** Id контекста до `create` / presigned upload. */\n generateContextId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/contexts` */\n create(\n body: ContextItemForCreateOrUpdate,\n options?: {\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContextItem> {\n const payload = applyItemCreateDefaults(body, Discriminator.ContextItem);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { profileId: options?.profileId },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/contexts/{body.id}` */\n update(\n body: ContextItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<ContextItem> {\n const itemId = requireItemUpdateId(body, \"Context\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/contexts/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/contexts/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContextItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/contexts/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<ContextItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n}\n","import type { NoteItemDto, NoteTypeDto } from \"./dto.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type {\n DeleteResponse,\n FileInfo,\n ObjectInfo,\n PutUrlResp,\n UpdateFileIdResp,\n} from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nexport type { PersonalSolutionData, SolutionData };\n\nexport type NoteItem = TorrowItemFromDto<NoteItemDto>;\n/** Supported authoring scenarios: Html and Markdown. Other server values remain for compatibility. */\nexport type NoteType = NoteTypeDto;\nexport type ImagePreviewSize = NonNullable<NoteItem[\"imagePreviewSize\"]>;\nexport const NoteTypeValues = {\n Unknown: \"Unknown\",\n Text: \"Text\",\n Html: \"Html\",\n Markdown: \"Markdown\",\n Hlink: \"Hlink\",\n File: \"File\",\n Photo: \"Photo\",\n Voice: \"Voice\",\n Geolocation: \"Geolocation\",\n Qr: \"Qr\",\n ServiceSpecification: \"ServiceSpecification\",\n} as const satisfies Record<string, NoteType>;\n\nexport const ImagePreviewSizeValues = {\n Undefined: \"Undefined\",\n Hidden: \"Hidden\",\n Small: \"Small\",\n Medium: \"Medium\",\n Large: \"Large\",\n SmallSlider: \"SmallSlider\",\n MediumSlider: \"MediumSlider\",\n LargeSlider: \"LargeSlider\",\n} as const satisfies Record<string, ImagePreviewSize>;\n\n/** Explicit publicity on create; meta.version on update preserves optimistic concurrency. */\nexport type NoteItemForCreateOrUpdate = TorrowItemForCreateOrUpdate<NoteItem> &\n Pick<NoteItem, \"publicityType\" | \"meta\">;\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { unwrapDeleteCount, unwrapFilePutUrl } from \"../common/facade-response-unwrap.js\";\nimport {\n ImagePreviewSizeValues,\n type DeleteResponse,\n type FileInfo,\n type NoteItem,\n type NoteItemForCreateOrUpdate,\n} from \"./types.js\";\nimport type { PutUrlRespDto } from \"./dto.js\";\n\nconst BASE = \"/api/v1/notes\";\nconst DEFAULT_NOTE_NAME = \"Untitled note\";\n\ntype NoteItemWithDiscriminator = NoteItemForCreateOrUpdate & {\n discriminator?: string;\n};\n\n/** CRUD, personal list, файлы, изображения и социальный слой для заметок (`NoteItem`). */\nexport class NotesFacade extends TorrowItemFacade<NoteItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Note;\n\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** Id заметки до `create` / presigned upload (`ownerTorrowId` — profileId и т.п.). */\n generateNoteId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/notes` */\n create(\n body: NoteItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<NoteItem> {\n const payload = this.withCreateDefaults(body);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/notes/{body.id}` */\n update(\n body: NoteItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<NoteItem> {\n const itemId = requireItemUpdateId(body, \"Note\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `DELETE /api/v1/notes/{torrowId}`\n * @param options.cascade — каскад по вложенным дочерним элементам; `false` — только заметка.\n * @param options.withPinnedItems — удалять закреплённые дочерние представления; `false` — не трогать pinned.\n */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/notes/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<NoteItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/notes/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<NoteItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `GET /api/v1/notes/{torrowId}/file/info` */\n getFileInfo(\n torrowId: string,\n fileId: string,\n options?: { signal?: AbortSignal },\n ): Promise<FileInfo> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/file/info`,\n query: { fileId },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/notes/{torrowId}/file/puturl` — URL для загрузки файла (presigned). */\n async getFilePutUrl(\n torrowId: string,\n fileId: string,\n fileName?: string | null,\n fileSize?: number | null,\n options?: { signal?: AbortSignal },\n ): Promise<{ url: string; urlExpiration: string }> {\n const resp = await this.http.requestJson<PutUrlRespDto>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/file/puturl`,\n query: {\n fileId,\n fileName,\n fileSize,\n },\n signal: options?.signal,\n });\n return unwrapFilePutUrl(resp);\n }\n\n private withCreateDefaults(body: NoteItemForCreateOrUpdate): NoteItem {\n const payload = applyItemCreateDefaults<NoteItem>(body as NoteItemWithDiscriminator, Discriminator.NoteItem);\n\n if (!payload.name?.trim()) {\n payload.name = this.getDefaultName(payload.data);\n }\n\n payload.imagePreviewSize = payload.imagePreviewSize ?? ImagePreviewSizeValues.Small;\n\n return payload;\n }\n\n private getDefaultName(data: unknown): string {\n if (typeof data !== \"string\") {\n return DEFAULT_NOTE_NAME;\n }\n const normalized = data.trim();\n if (!normalized) {\n return DEFAULT_NOTE_NAME;\n }\n return normalized.slice(0, 20);\n }\n\n}\n","import type { TorrowObjectType } from \"../../schema/sdk-shared-public-types.js\";\nimport {\n TorrowObjectTypeCode,\n type TorrowObjectTypeCodeValue,\n} from \"../../util/torrow-id.js\";\n\ntype TorrowItemDefinition = Readonly<{\n domain: string;\n objectTypeCode: TorrowObjectTypeCodeValue;\n}>;\n\n/**\n * Ручная runtime-проекция OpenAPI object types на item REST-домены.\n * После codegen новые item-типы и числовые коды нужно сверять отдельно.\n * Экспорт предназначен только для внутренних модулей SDK.\n */\nexport const TorrowItemDefinitions = {\n Contact: { domain: \"contacts\", objectTypeCode: TorrowObjectTypeCode.Contact },\n Note: { domain: \"notes\", objectTypeCode: TorrowObjectTypeCode.Note },\n Context: { domain: \"contexts\", objectTypeCode: TorrowObjectTypeCode.Context },\n Resource: { domain: \"resources\", objectTypeCode: TorrowObjectTypeCode.Resource },\n Service: { domain: \"services\", objectTypeCode: TorrowObjectTypeCode.Service },\n Case: { domain: \"cases\", objectTypeCode: TorrowObjectTypeCode.Case },\n Calendar: { domain: \"calendars\", objectTypeCode: TorrowObjectTypeCode.Calendar },\n LoyaltyCard: {\n domain: \"loyaltycards\",\n objectTypeCode: TorrowObjectTypeCode.LoyaltyCard,\n },\n LoyaltySystem: {\n domain: \"loyaltysystems\",\n objectTypeCode: TorrowObjectTypeCode.LoyaltySystem,\n },\n} as const satisfies Partial<Record<TorrowObjectType, TorrowItemDefinition>>;\n\nexport type TorrowItemType = keyof typeof TorrowItemDefinitions;\n\n/** Внутренний REST-сегмент item API; не экспортируется из package entrypoint. */\nexport type TorrowItemDomain =\n (typeof TorrowItemDefinitions)[TorrowItemType][\"domain\"];\n\nexport const TorrowItemTypeValues = {\n Contact: \"Contact\",\n Note: \"Note\",\n Context: \"Context\",\n Resource: \"Resource\",\n Service: \"Service\",\n Case: \"Case\",\n Calendar: \"Calendar\",\n LoyaltyCard: \"LoyaltyCard\",\n LoyaltySystem: \"LoyaltySystem\",\n} as const satisfies Record<TorrowItemType, TorrowItemType>;\n\nexport const TorrowItemTypeValueList: readonly TorrowItemType[] = Object.values(\n TorrowItemTypeValues,\n);\n\nexport function isTorrowItemType(value: string): value is TorrowItemType {\n return (TorrowItemTypeValueList as readonly string[]).includes(value);\n}\n\n/** Внутреннее преобразование предметного item-типа в REST-сегмент. */\nexport function getTorrowItemDomain(itemType: TorrowItemType): TorrowItemDomain {\n return TorrowItemDefinitions[itemType].domain;\n}\n","import {\n getTorrowObjectTypeFromTorrowId,\n TorrowIdError,\n} from \"../../util/torrow-id.js\";\nimport {\n getTorrowItemDomain,\n isTorrowItemType,\n type TorrowItemDomain,\n type TorrowItemType,\n} from \"./item-type.js\";\n\nexport function getTorrowItemTypeFromTorrowId(torrowId: string): TorrowItemType {\n const objectType = getTorrowObjectTypeFromTorrowId(torrowId);\n if (!isTorrowItemType(objectType)) {\n throw new TorrowIdError(\n \"unsupported-item-type\",\n `Torrow object type ${objectType} is not an item type`,\n );\n }\n return objectType;\n}\n\nexport function getTorrowItemTypeFromTorrowIds(\n torrowIds: readonly string[],\n): TorrowItemType {\n const firstId = torrowIds[0];\n if (firstId === undefined) {\n throw new TorrowIdError(\"empty-id-list\", \"Torrow ID list must not be empty\");\n }\n\n const itemType = getTorrowItemTypeFromTorrowId(firstId);\n for (const torrowId of torrowIds.slice(1)) {\n if (getTorrowItemTypeFromTorrowId(torrowId) !== itemType) {\n throw new TorrowIdError(\n \"mixed-item-types\",\n \"All Torrow IDs must have the same item type\",\n );\n }\n }\n return itemType;\n}\n\nexport function getTorrowItemDomainFromTorrowId(torrowId: string): TorrowItemDomain {\n return getTorrowItemDomain(getTorrowItemTypeFromTorrowId(torrowId));\n}\n\nexport function getTorrowItemDomainFromTorrowIds(\n torrowIds: readonly string[],\n): TorrowItemDomain {\n return getTorrowItemDomain(getTorrowItemTypeFromTorrowIds(torrowIds));\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport {\n getTorrowItemDomainFromTorrowId,\n getTorrowItemDomainFromTorrowIds,\n} from \"../common/item-type-resolver.js\";\nimport type { TorrowItemDomain } from \"../common/item-type.js\";\nimport type {\n ExcludeFromGroupsReq,\n ExcludeResp,\n IncludeExcludeResp,\n IncludeToGroupsReq,\n Participation,\n SaveItemToMindMapReq,\n TorrowOptions,\n BaseItemProperties,\n ItemProperties,\n} from \"./types.js\";\n\n/**\n * Связи между элементами: User/Pinned links, группы, mind map placement.\n *\n * - **Pinned link:** {@link includeToParent} / {@link excludeFromParent} (`LinkType.Pinned`).\n * - **User link (канон apps):** {@link saveToMindMap} сохраняет один item в личную структуру (`offlinable`, опциональный `parentItemId`, `userProfileId`); {@link includeForUser} добавляет batch дочерних item'ов под указанным родителем.\n * - **Groups:** {@link includeToGroups} / {@link excludeFromGroups}; `setGroup` / `updateGroups` — на item-фасадах (`notes.setGroup`, …).\n * - **Pin/Unpin (User↔Pinned):** не здесь — `client.views.pin` / `unpin` (HTTP `/views/…`; contacts unpin quirk). См. `docs/agents/relations-flow.md`.\n * - **View delete** (`DELETE …/views/user|pinned/…`) — apps UI path; здесь — `exclude*`.\n * REST-домен не передаётся отдельно: SDK выводит его из route-defining ID каждого метода.\n * - JSDoc `exclude*`: HTTP-путь + однострочный указатель на LinkType / `relations-flow.md`; детали — в bullets выше.\n */\nexport class RelationsFacade {\n constructor(private readonly http: HttpClient) {}\n\n private base(domain: TorrowItemDomain): string {\n return `/api/v1/${domain}`;\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/include/items` — **Pinned link**: привязать дочерние к родителю (`LinkType.Pinned`). Передай массив `itemPropertiesList`; технические параметры — в options. */\n includeToParent(\n parentId: string,\n itemPropertiesList: readonly ItemProperties[],\n options?: TorrowOptions,\n ): Promise<IncludeExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowId(parentId);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/include/items`,\n body: {\n itemPropertiesList: [...itemPropertiesList],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{parentId}/include/foruser` — массово добавить несколько дочерних item'ов\n * в личную структуру пользователя под указанным родителем (`LinkType.User`).\n * Это batch-операция: `parentId` задаётся в path, а дочерние item'ы передаются\n * первым аргументом как `itemPropertiesList` (`itemId`, опционально `order`).\n * Канон torrow-apps для сохранения одного item — {@link saveToMindMap}, не этот метод.\n */\n includeForUser(\n parentId: string,\n itemPropertiesList: readonly BaseItemProperties[],\n options?: TorrowOptions,\n ): Promise<IncludeExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowId(parentId);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/include/foruser`,\n body: {\n itemPropertiesList: [...itemPropertiesList],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{parentId}/exclude/items` — убрать дочерние элементы из родителя.\n * `childIds` — явный список дочерних item ID; снимается **Pinned** link\n * (`LinkType.Pinned`). См. class bullets и `docs/agents/relations-flow.md`.\n */\n excludeFromParent(\n parentId: string,\n childIds: readonly string[],\n options?: TorrowOptions,\n ): Promise<ExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowId(parentId);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/exclude/items`,\n body: {\n itemIds: [...childIds],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{parentId}/exclude/fromuser` — убрать дочерние элементы\n * из персонального mind map пользователя. `childIds` — явный список дочерних\n * item ID; снимается **User** link (`LinkType.User`). См. class bullets и\n * `docs/agents/relations-flow.md`.\n */\n excludeFromUser(\n parentId: string,\n childIds: readonly string[],\n options?: TorrowOptions,\n ): Promise<ExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowId(parentId);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/exclude/fromuser`,\n body: {\n itemIds: [...childIds],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/include/togroups` — включить элементы в несколько групп. */\n includeToGroups(\n body: IncludeToGroupsReq,\n options?: { signal?: AbortSignal },\n ): Promise<IncludeExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowIds(body.groupIds);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/include/togroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/exclude/fromgroups` — исключить элементы из групп. */\n excludeFromGroups(\n body: ExcludeFromGroupsReq,\n options?: { signal?: AbortSignal },\n ): Promise<ExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowIds(body.itemIds);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/exclude/fromgroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{itemId}/savetomindmap` — сохранить **один item** в личную\n * структуру пользователя (`LinkType.User`), опционально вложив его в `body.parentItemId`.\n * `itemId` задаётся в path; это не batch-операция. Канон apps: `userProfileId`, `offlinable: true`.\n * Не путать с participation accept на item-фасаде — см. `docs/agents/relations-flow.md` vs `participation-flow.md`.\n */\n saveToMindMap(\n itemId: string,\n body: SaveItemToMindMapReq,\n options?: { signal?: AbortSignal },\n ): Promise<Participation> {\n const domain = getTorrowItemDomainFromTorrowId(itemId);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(itemId)}/savetomindmap`,\n body,\n signal: options?.signal,\n });\n }\n}\n","/**\n * Неявные параметры, кодируемые в `tags` элементов (в основном ServiceItem).\n *\n * Источник логики: поведение в клиентских потоках `torrow-apps` (time zone, order name,\n * ограничения по времени, тексты unavailable booking, автозапуск уведомлений, discount field tag).\n */\n\nexport const SERVICE_IMPLICIT_TAG_SUFFIX = {\n orderNameLegacy: \":ordername\",\n orderName: \":OrderName\",\n timeZoneLegacy: \":timeZone\",\n timeZone: \":timezone\",\n disableCancelMyParticipation: \":DisableCancelMyParticipation\",\n disableUpdateOrderTime: \":DisableUpdateOrderTime\",\n unavailableBookingMessage: \":UnavailableBookingMessage\",\n discountPercentage: \":DiscountPercentage\",\n agreementText: \":AgreementText\",\n agreementLink: \":AgreementLink\",\n marginTime: \":MarginTime\",\n lockId: \":lockId\",\n autoStartTelegramNotificationBot: \"AutoStartTelegramNotificationBot\",\n autoStartTelegramNotificationBotTypo: \"AutoStartTelegramNotifcationBot\",\n autoStartConnectNotifications: \"AutoStartConnectNotifications\",\n hideMessengerConnectUi: \"HideMessengerNotifications\",\n /**\n * Резерв под серверную договоренность. Формат в `tags`: `NNN:payment_redirect_timeout_sec`.\n * Непосредственно в текущем `torrow-apps` литерал пока не используется.\n */\n paymentRedirectTimeoutSec: \":payment_redirect_timeout_sec\",\n} as const;\n\ntype PrimitiveTagConfig = {\n field: keyof ServiceImplicitTagParams;\n kind: \"string\" | \"positiveInt\";\n suffixes: readonly string[];\n caseInsensitive?: boolean;\n};\n\ntype ExactTagConfig = {\n field: keyof ServiceImplicitTagParams;\n kind: \"exactFlag\";\n tokens: readonly string[];\n};\n\ntype AutoStartTagConfig = {\n field: \"autoStartNotificationDelaySeconds\";\n kind: \"autoStart\";\n suffixes: readonly string[];\n};\n\ntype AgreementTagConfig = {\n field: \"agreementItems\";\n kind: \"agreement\";\n textSuffix: string;\n linkSuffix: string;\n};\n\nexport type ServiceImplicitTagConfig = PrimitiveTagConfig | ExactTagConfig | AutoStartTagConfig | AgreementTagConfig;\n\n// Только очистка при записи: monolith продолжает скрывать UI по старому тегу.\nconst OBSOLETE_MESSENGER_CONNECT_UI_TAG = \"HideTelegramNotificationBot\";\n\n/**\n * Единый реестр тегов (registry-driven). Это источник правды для parse/build/isImplicit.\n */\nexport const SERVICE_IMPLICIT_TAG_REGISTRY = {\n orderName: {\n field: \"orderName\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.orderName, SERVICE_IMPLICIT_TAG_SUFFIX.orderNameLegacy],\n caseInsensitive: true,\n },\n timeZone: {\n field: \"timeZone\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.timeZone, SERVICE_IMPLICIT_TAG_SUFFIX.timeZoneLegacy],\n caseInsensitive: true,\n },\n disableCancelMyParticipationBeforeMinutes: {\n field: \"disableCancelMyParticipationBeforeMinutes\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.disableCancelMyParticipation],\n },\n disableUpdateOrderTimeBeforeMinutes: {\n field: \"disableUpdateOrderTimeBeforeMinutes\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.disableUpdateOrderTime],\n },\n unavailableBookingMessage: {\n field: \"unavailableBookingMessage\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.unavailableBookingMessage],\n },\n discountPercentageFieldName: {\n field: \"discountPercentageFieldName\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.discountPercentage],\n },\n marginTimeSec: {\n field: \"marginTimeSec\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.marginTime],\n },\n paymentRedirectTimeoutSec: {\n field: \"paymentRedirectTimeoutSec\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.paymentRedirectTimeoutSec],\n },\n hideMessengerConnectUi: {\n field: \"hideMessengerConnectUi\",\n kind: \"exactFlag\",\n tokens: [SERVICE_IMPLICIT_TAG_SUFFIX.hideMessengerConnectUi],\n },\n autoStartNotificationDelaySeconds: {\n field: \"autoStartNotificationDelaySeconds\",\n kind: \"autoStart\",\n suffixes: [\n SERVICE_IMPLICIT_TAG_SUFFIX.autoStartConnectNotifications,\n SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBot,\n SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBotTypo,\n ],\n },\n agreementItems: {\n field: \"agreementItems\",\n kind: \"agreement\",\n textSuffix: SERVICE_IMPLICIT_TAG_SUFFIX.agreementText,\n linkSuffix: SERVICE_IMPLICIT_TAG_SUFFIX.agreementLink,\n },\n} as const satisfies Record<string, ServiceImplicitTagConfig>;\n\n/** Предметные значения; версия услуги передаётся отдельно. */\nexport type ServiceImplicitTagParams = {\n /** Пользовательское название заказа для отображения в приложении; не меняет серверное имя создаваемого заказа. */\n orderName?: string;\n /** Часовой пояс отображения услуги, например Europe/Moscow. */\n timeZone?: string;\n /** За сколько минут до начала запрещена отмена участия. */\n disableCancelMyParticipationBeforeMinutes?: number;\n /** За сколько минут до начала запрещён перенос заказа. */\n disableUpdateOrderTimeBeforeMinutes?: number;\n /** Сообщение пользователю при недоступной записи. */\n unavailableBookingMessage?: string;\n /** Название поля со скидкой в процентах. */\n discountPercentageFieldName?: string;\n /** Интервал между событиями в секундах. */\n marginTimeSec?: number;\n /** Задержка автоматического подключения уведомлений в секундах. */\n autoStartNotificationDelaySeconds?: number;\n /**\n * Скрывает UI подключения уведомлений Telegram и Max через точный тег `HideMessengerNotifications`.\n * BehaviorSettings API также читает точный legacy alias; в его состоянии флаг всегда boolean.\n */\n hideMessengerConnectUi?: boolean;\n /** Полный набор соглашений; пустой массив очищает набор. */\n agreementItems?: {\n /** Положительный уникальный номер соглашения. */\n index: number;\n /** Текст соглашения; хотя бы text или link должны быть заданы. */\n text?: string;\n /** Ссылка соглашения; кодирование хранения выполняет SDK. */\n link?: string;\n }[];\n /** Таймаут перехода после оплаты в секундах. */\n paymentRedirectTimeoutSec?: number;\n};\n\n/** Минимальная структура поведения ресурса (сейчас: только margin between events). */\nexport type ResourceBehaviorSettings = {\n marginTimeSec?: number;\n /**\n * Идентификатор TTLock-замка в формате тега `<lockNumber>:lockId`.\n */\n lockId?: number;\n};\n\nfunction isPositiveInt(value: number | undefined): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0;\n}\n\nfunction splitBySuffix(tag: string, suffix: string, caseInsensitive = false): string | undefined {\n if (caseInsensitive) {\n const lowerTag = tag.toLowerCase();\n const lowerSuffix = suffix.toLowerCase();\n if (!lowerTag.endsWith(lowerSuffix)) return undefined;\n return tag.slice(0, tag.length - suffix.length);\n }\n if (!tag.endsWith(suffix)) return undefined;\n return tag.slice(0, tag.length - suffix.length);\n}\n\nfunction firstPrefixBySuffix(\n tags: readonly string[],\n suffix: string,\n options?: { caseInsensitive?: boolean },\n): string | undefined {\n for (const tag of tags) {\n const prefix = splitBySuffix(tag, suffix, options?.caseInsensitive ?? false);\n if (prefix !== undefined) return prefix;\n }\n return undefined;\n}\n\nfunction toPositiveInt(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const value = Number.parseInt(raw.trim(), 10);\n return Number.isFinite(value) && value > 0 ? value : undefined;\n}\n\nfunction parseAutoStartDelay(tag: string): number | undefined {\n const suffixes = SERVICE_IMPLICIT_TAG_REGISTRY.autoStartNotificationDelaySeconds.suffixes;\n for (const suffix of suffixes) {\n const match = tag.match(new RegExp(`^(\\\\d+):${suffix}$`));\n if (match?.[1]) {\n const sec = Number.parseInt(match[1], 10);\n if (Number.isFinite(sec) && sec > 0) return sec;\n }\n }\n return undefined;\n}\n\nfunction parseAgreementIndexedTag(tag: string, baseSuffix: string): { index: number; value: string } | undefined {\n const escaped = baseSuffix.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = tag.match(new RegExp(`^(.*)${escaped}(\\\\d+)$`));\n if (!match?.[1] || !match[2]) return undefined;\n const index = Number.parseInt(match[2], 10);\n if (!Number.isFinite(index) || index <= 0) return undefined;\n return { index, value: match[1] };\n}\n\nfunction decodeAgreementLink(linkRaw: string): string {\n const trimmed = linkRaw.trim();\n if (trimmed.startsWith(\"https//\")) return `https://${trimmed.slice(\"https//\".length)}`;\n if (trimmed.startsWith(\"http//\")) return `http://${trimmed.slice(\"http//\".length)}`;\n return trimmed;\n}\n\nfunction encodeAgreementLink(linkRaw: string): string {\n const trimmed = linkRaw.trim();\n if (trimmed.startsWith(\"https://\")) return `https//${trimmed.slice(\"https://\".length)}`;\n if (trimmed.startsWith(\"http://\")) return `http//${trimmed.slice(\"http://\".length)}`;\n return trimmed;\n}\n\n/**\n * Парсинг используемых в продукте неявных \"тег-параметров\" сервиса.\n */\nexport function parseServiceImplicitTagParams(tags: readonly string[] | undefined | null): ServiceImplicitTagParams {\n const safeTags = tags ?? [];\n const result: ServiceImplicitTagParams = {};\n const mutable = result as Record<string, unknown>;\n\n for (const config of Object.values(SERVICE_IMPLICIT_TAG_REGISTRY) as ServiceImplicitTagConfig[]) {\n if (config.kind === \"string\" || config.kind === \"positiveInt\") {\n const raw = config.suffixes\n .map((suffix) => firstPrefixBySuffix(safeTags, suffix, { caseInsensitive: config.caseInsensitive ?? false }))\n .find((x) => x !== undefined);\n if (config.kind === \"string\") {\n if (raw?.trim()) mutable[config.field] = raw.trim();\n } else {\n const value = toPositiveInt(raw);\n if (value !== undefined) mutable[config.field] = value;\n }\n }\n if (config.kind === \"exactFlag\") {\n const hasAny = safeTags.some((tag) => config.tokens.some((token) => tag === token));\n if (hasAny) mutable[config.field] = true;\n }\n }\n\n let autoStartNotificationDelaySeconds: number | undefined = result.autoStartNotificationDelaySeconds;\n if (autoStartNotificationDelaySeconds === undefined) {\n for (const tag of safeTags) {\n autoStartNotificationDelaySeconds = parseAutoStartDelay(tag);\n if (autoStartNotificationDelaySeconds !== undefined) break;\n }\n }\n if (autoStartNotificationDelaySeconds !== undefined) {\n mutable.autoStartNotificationDelaySeconds = autoStartNotificationDelaySeconds;\n }\n\n const agreementsMap = new Map<number, { index: number; text?: string; link?: string }>();\n const agreementConfig = SERVICE_IMPLICIT_TAG_REGISTRY.agreementItems;\n for (const tag of safeTags) {\n const textTag = parseAgreementIndexedTag(tag, agreementConfig.textSuffix);\n if (textTag) {\n agreementsMap.set(textTag.index, {\n index: textTag.index,\n ...(agreementsMap.get(textTag.index) ?? {}),\n text: textTag.value.trim() || undefined,\n });\n }\n const linkTag = parseAgreementIndexedTag(tag, agreementConfig.linkSuffix);\n if (linkTag) {\n agreementsMap.set(linkTag.index, {\n index: linkTag.index,\n ...(agreementsMap.get(linkTag.index) ?? {}),\n link: decodeAgreementLink(linkTag.value),\n });\n }\n }\n const agreementItems = [...agreementsMap.values()]\n .sort((a, b) => a.index - b.index)\n .filter((x) => x.text || x.link);\n if (agreementItems.length) mutable.agreementItems = agreementItems;\n return result;\n}\n\n/**\n * Генерация service-тегов из явной структуры параметров.\n * Удобно для create/update запросов и codegen-агентов.\n */\nexport function buildServiceImplicitTags(\n params: ServiceImplicitTagParams,\n options?: {\n /**\n * Какой suffix использовать для auto-start delay.\n * По умолчанию новый: `AutoStartConnectNotifications`.\n */\n autoStartNotificationSuffix?:\n | typeof SERVICE_IMPLICIT_TAG_SUFFIX.autoStartConnectNotifications\n | typeof SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBot\n | typeof SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBotTypo;\n },\n): string[] {\n const tags: string[] = [];\n const singleValueConfigs = (Object.values(SERVICE_IMPLICIT_TAG_REGISTRY) as ServiceImplicitTagConfig[]).filter(\n (x) => x.kind === \"string\" || x.kind === \"positiveInt\",\n ) as PrimitiveTagConfig[];\n for (const config of singleValueConfigs) {\n const value = params[config.field] as unknown;\n const writeSuffix = config.suffixes[0];\n if (config.kind === \"string\") {\n if (typeof value === \"string\" && value.trim()) {\n tags.push(`${value.trim()}${writeSuffix}`);\n }\n } else if (isPositiveInt(typeof value === \"number\" ? value : undefined)) {\n tags.push(`${value}${writeSuffix}`);\n }\n }\n\n for (const agreement of params.agreementItems ?? []) {\n if (!isPositiveInt(agreement.index)) continue;\n if (agreement.text?.trim()) {\n tags.push(\n `${agreement.text.trim()}${SERVICE_IMPLICIT_TAG_REGISTRY.agreementItems.textSuffix}${agreement.index}`,\n );\n }\n if (agreement.link?.trim()) {\n tags.push(\n `${encodeAgreementLink(agreement.link)}${SERVICE_IMPLICIT_TAG_REGISTRY.agreementItems.linkSuffix}${agreement.index}`,\n );\n }\n }\n if (isPositiveInt(params.autoStartNotificationDelaySeconds)) {\n tags.push(\n `${params.autoStartNotificationDelaySeconds}:${\n options?.autoStartNotificationSuffix ?? SERVICE_IMPLICIT_TAG_SUFFIX.autoStartConnectNotifications\n }`,\n );\n }\n if (params.hideMessengerConnectUi) {\n tags.push(SERVICE_IMPLICIT_TAG_REGISTRY.hideMessengerConnectUi.tokens[0]);\n }\n\n return tags;\n}\n\nfunction isImplicitServiceTag(tag: string): boolean {\n for (const config of Object.values(SERVICE_IMPLICIT_TAG_REGISTRY) as ServiceImplicitTagConfig[]) {\n if (config.kind === \"string\" || config.kind === \"positiveInt\") {\n const matched = config.suffixes.some(\n (suffix) => splitBySuffix(tag, suffix, config.caseInsensitive ?? false) !== undefined,\n );\n if (matched) return true;\n }\n if (config.kind === \"exactFlag\") {\n if (config.tokens.some((token) => tag === token)) return true;\n }\n if (config.kind === \"autoStart\") {\n const isAutoStart = config.suffixes.some((suffix) => tag.match(new RegExp(`^\\\\d+:${suffix}$`)) !== null);\n if (isAutoStart) return true;\n }\n if (config.kind === \"agreement\") {\n if (\n parseAgreementIndexedTag(tag, config.textSuffix) !== undefined ||\n parseAgreementIndexedTag(tag, config.linkSuffix) !== undefined\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Обновляет только implicit service tags, не трогая \"обычные\" пользовательские теги.\n * Полезно для patch/update сценариев поверх существующего массива tags.\n */\nexport function mergeServiceImplicitTags(\n baseTags: readonly string[] | undefined | null,\n params: ServiceImplicitTagParams,\n options?: Parameters<typeof buildServiceImplicitTags>[1],\n): string[] {\n const safeBase = baseTags ?? [];\n const preservedNonImplicit = safeBase.filter(\n (tag) => tag !== OBSOLETE_MESSENGER_CONNECT_UI_TAG && !isImplicitServiceTag(tag),\n );\n const nextImplicit = buildServiceImplicitTags(params, options);\n return [...preservedNonImplicit, ...nextImplicit];\n}\n\n/**\n * One-liner для частичного обновления implicit service params.\n * Сценарий: parse(existing) -> apply patch -> mergeServiceImplicitTags(baseTags, next).\n */\nexport function upsertServiceImplicitTagParams(\n baseTags: readonly string[] | undefined | null,\n patch: Partial<ServiceImplicitTagParams>,\n options?: Parameters<typeof buildServiceImplicitTags>[1],\n): string[] {\n const current = parseServiceImplicitTagParams(baseTags);\n const next: ServiceImplicitTagParams = {\n ...current,\n ...patch,\n };\n return mergeServiceImplicitTags(baseTags, next, options);\n}\n\n/**\n * Конвенция сервера по шагам услуги:\n * если название шага начинается с `*`, выбранный ресурс из этого шага считается \"первичным\".\n */\nexport function isPrimaryServiceStepName(stepName: string | undefined | null): boolean {\n return !!stepName && stepName.trimStart().startsWith(\"*\");\n}\n\n/**\n * Возвращает \"чистое\" название шага без префикса `*`.\n */\nexport function getServiceStepDisplayName(stepName: string | undefined | null): string {\n if (!stepName) return \"\";\n const normalized = stepName.trimStart();\n return normalized.startsWith(\"*\") ? normalized.slice(1).trimStart() : stepName;\n}\n\n/** Парсинг поведения ресурса из `resource.tags`. */\nexport function parseResourceBehaviorSettings(tags: readonly string[] | undefined | null): ResourceBehaviorSettings {\n // Resource сохраняет историческую семантику независимо от нового Service reader.\n const marginTimeSec = toPositiveInt(firstPrefixBySuffix(tags ?? [], SERVICE_IMPLICIT_TAG_SUFFIX.marginTime));\n const lockId = toPositiveInt(firstPrefixBySuffix(tags ?? [], SERVICE_IMPLICIT_TAG_SUFFIX.lockId));\n const result: ResourceBehaviorSettings = {};\n if (marginTimeSec !== undefined) result.marginTimeSec = marginTimeSec;\n if (lockId !== undefined) result.lockId = lockId;\n return result;\n}\n\n/** Сериализация/merge behavior параметров ресурса в `resource.tags`. */\nexport function mergeResourceBehaviorTags(\n baseTags: readonly string[] | undefined | null,\n settings: ResourceBehaviorSettings,\n): string[] {\n const safeBase = baseTags ?? [];\n const nonManaged = safeBase.filter(\n (tag) =>\n splitBySuffix(tag, SERVICE_IMPLICIT_TAG_SUFFIX.marginTime) === undefined &&\n splitBySuffix(tag, SERVICE_IMPLICIT_TAG_SUFFIX.lockId) === undefined,\n );\n const managed: string[] = [];\n if (isPositiveInt(settings.marginTimeSec)) {\n managed.push(`${settings.marginTimeSec}${SERVICE_IMPLICIT_TAG_SUFFIX.marginTime}`);\n }\n if (isPositiveInt(settings.lockId)) {\n managed.push(`${settings.lockId}${SERVICE_IMPLICIT_TAG_SUFFIX.lockId}`);\n }\n return [...nonManaged, ...managed];\n}\n\n","import type { ResourceBehaviorSettings } from \"../common/implicit-tag-params.js\";\nimport type {\n ResourceItemApiDto,\n WorkloadPeriodDto,\n PickOrderReqDto,\n PickOrderRespDto,\n ReturnOrderReqDto,\n ReturnOrderRespDto,\n} from \"./dto.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type { DeleteResponse, ObjectInfo } from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { ResourceBehaviorSettings } from \"../common/implicit-tag-params.js\";\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nexport type { PersonalSolutionData, SolutionData };\n\nexport type ResourceItemApi = ResourceItemApiDto;\nexport type ServiceDescription = NonNullable<ResourceItemApi[\"serviceDescriptions\"]>[number];\nexport type UsageCondition = NonNullable<ResourceItemApi[\"usageCondition\"]>;\nexport type UsageConditionType = NonNullable<UsageCondition[\"usageConditionType\"]>;\nexport type ResourceUsageConditionType = Exclude<\n UsageConditionType,\n \"UnknownUsageConditionType\" | \"None\"\n>;\nexport type WorkloadPeriod = WorkloadPeriodDto;\nexport type PickOrderReq = PickOrderReqDto;\nexport type PickOrderResp = PickOrderRespDto;\nexport type ReturnOrderReq = ReturnOrderReqDto;\nexport type ReturnOrderResp = ReturnOrderRespDto;\nexport type ResourceItem = TorrowItemFromDto<ResourceItemApi> & {\n behaviorSettings?: ResourceBehaviorSettings;\n};\nexport type UsageType = ResourceItemApi[\"usageType\"];\nexport const UsageTypeValues = {\n Unknown: \"UnknownUsageType\",\n Specification: \"Specification\",\n Rent: \"Rent\",\n Sale: \"Sale\",\n Payment: \"Payment\",\n Ticket: \"Ticket\",\n} as const satisfies Record<string, NonNullable<UsageType>>;\nexport const UsageConditionTypeValues = {\n None: \"None\",\n Exclusion: \"Exclusion\",\n Additional: \"Additional\",\n} as const satisfies Record<string, UsageConditionType>;\nexport type ResourceItemForCreateOrUpdate = TorrowItemForCreateOrUpdate<ResourceItem>;\n\nexport interface ResourceServiceBindingOptions {\n usageAmount?: number | null;\n sortIndex?: number | null;\n}\n\nexport interface ResourceBuildResult {\n body: ResourceItemForCreateOrUpdate;\n}\n\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount, unwrapTimetableStatisticsList } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport {\n mergeResourceBehaviorTags,\n parseResourceBehaviorSettings,\n type ResourceBehaviorSettings,\n} from \"../common/implicit-tag-params.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n TimetableCase,\n TimetableFilter,\n TimetableStatisticsResp,\n} from \"../services/types.js\";\nimport { UsageTypeValues } from \"./types.js\";\nimport type {\n DeleteResponse,\n PickOrderReq,\n PickOrderResp,\n ResourceItem,\n ResourceItemApi,\n ResourceItemForCreateOrUpdate,\n ReturnOrderReq,\n ReturnOrderResp,\n WorkloadPeriod,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/resources\";\n\n/**\n * CRUD + personal list + социальный слой для **Resource** (`ResourceItem`, путь `/api/v1/resources`).\n * Свойство фасада — `client.resourceItems`.\n */\nexport class ResourcesFacade extends TorrowItemFacade<ResourceItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Resource;\n\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** Id ресурса до `create` / presigned upload. */\n generateResourceId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n private toSdkResourceItem(item: ResourceItemApi): ResourceItem {\n return {\n ...item,\n behaviorSettings: parseResourceBehaviorSettings(item.tags),\n };\n }\n\n private toApiResourceItem(item: ResourceItemForCreateOrUpdate): ResourceItemApi {\n const { behaviorSettings, ...rest } = item;\n const apiBase = rest as ResourceItemApi;\n const nextTags = behaviorSettings ? mergeResourceBehaviorTags(apiBase.tags, behaviorSettings) : apiBase.tags;\n return {\n ...apiBase,\n tags: nextTags,\n };\n }\n\n /** `POST /api/v1/resources` */\n create(\n body: ResourceItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n const payload = this.withCreateDefaults(body);\n return this.http\n .requestJson<ResourceItemApi>({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: this.toApiResourceItem(payload),\n signal: options?.signal,\n })\n .then((item) => this.toSdkResourceItem(item));\n }\n\n /** `PUT /api/v1/resources/{body.id}`. Требует непустой `id` в теле ресурса. */\n update(\n body: ResourceItemForCreateOrUpdate,\n options?: {\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n const resourceId = requireItemUpdateId(body, \"Resource\");\n return this.http\n .requestJson<ResourceItemApi>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(resourceId)}`,\n query: {\n profileId: options?.profileId,\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: this.toApiResourceItem(body),\n signal: options?.signal,\n })\n .then((item) => this.toSdkResourceItem(item));\n }\n\n private withCreateDefaults(body: ResourceItemForCreateOrUpdate): ResourceItemForCreateOrUpdate {\n const payload = applyItemCreateDefaults(body, Discriminator.ResourceItem);\n return {\n ...payload,\n usageType: payload.usageType ?? UsageTypeValues.Specification,\n };\n }\n\n /** `DELETE /api/v1/resources/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/resources/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n isNeedItem?: boolean | null;\n isNeedParentResource?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n return this.http\n .requestJson<ResourceItemApi>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n isNeedItem: options?.isNeedItem,\n isNeedParentResource: options?.isNeedParentResource,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n })\n .then((item) => this.toSdkResourceItem(item));\n }\n\n private getBehaviorSettingsFromResource(\n resource: Pick<ResourceItem, \"tags\"> & Partial<Pick<ResourceItem, \"behaviorSettings\">>,\n ): ResourceBehaviorSettings {\n return \"behaviorSettings\" in resource && resource.behaviorSettings\n ? resource.behaviorSettings\n : parseResourceBehaviorSettings(resource.tags);\n }\n\n async getBehaviorSettings(\n resourceId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n isNeedItem?: boolean | null;\n isNeedParentResource?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceBehaviorSettings> {\n const resource = await this.getById(resourceId, options);\n return this.getBehaviorSettingsFromResource(resource);\n }\n\n async updateBehaviorSettings(\n resourceId: string,\n settingsPatch: Partial<ResourceBehaviorSettings>,\n options?: {\n mergeParameters?: boolean;\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n includeDeleted?: boolean | null;\n isNeedItem?: boolean | null;\n isNeedParentResource?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n const resource = await this.getById(resourceId, {\n includeDeleted: options?.includeDeleted,\n isNeedItem: options?.isNeedItem,\n isNeedParentResource: options?.isNeedParentResource,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n signal: options?.signal,\n });\n\n const mergeParameters = options?.mergeParameters ?? true;\n const nextSettings: ResourceBehaviorSettings = mergeParameters\n ? {\n ...this.getBehaviorSettingsFromResource(resource),\n ...settingsPatch,\n }\n : { ...settingsPatch };\n\n const nextTags = mergeResourceBehaviorTags(resource.tags, nextSettings);\n await this.updateTags(resourceId, nextTags, {\n versionToCheck: options?.checkVersion ? (resource.meta?.version ?? undefined) : undefined,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n signal: options?.signal,\n });\n\n return this.getById(resourceId, {\n includeDeleted: options?.includeDeleted,\n isNeedItem: options?.isNeedItem,\n isNeedParentResource: options?.isNeedParentResource,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n signal: options?.signal,\n });\n }\n\n setBehaviorSettings(\n resourceId: string,\n settings: ResourceBehaviorSettings,\n options?: Omit<Parameters<ResourcesFacade[\"updateBehaviorSettings\"]>[2], \"mergeParameters\">,\n ): Promise<ResourceItem> {\n return this.updateBehaviorSettings(resourceId, settings, {\n ...options,\n mergeParameters: false,\n });\n }\n\n /** `GET /api/v1/resources/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<ResourceItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http\n .requestJson<ResourceItemApi[]>({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n })\n .then((items) => items.map((item) => this.toSdkResourceItem(item)));\n }\n\n /**\n * Расписание заказов, привязанных к **ресурсу** — `PUT /api/v1/resources/{id}/timetable`.\n */\n getTimetable(\n resourceId: string,\n body: TimetableFilter,\n options?: Omit<TimetableQueryOptions, \"createDateFrom\" | \"createDateTo\"> & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(resourceId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /**\n * Полосы занятости ресурса — `GET /api/v1/resources/{id}/workload`.\n */\n getWorkload(\n resourceId: string,\n options: {\n from: Date;\n to: Date;\n serviceId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<WorkloadPeriod[]> {\n const { signal, from, to, serviceId } = options;\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(resourceId)}/workload`,\n query: {\n From: from,\n To: to,\n serviceId,\n },\n signal,\n });\n }\n\n /** `POST /api/v1/resources/{id}/pickorder`. */\n pickOrder(\n resourceId: string,\n body: PickOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<PickOrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(resourceId)}/pickorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/resources/{id}/returnorder`. */\n returnOrder(\n resourceId: string,\n body: ReturnOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<ReturnOrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(resourceId)}/returnorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/resources/timetable/statistics`. */\n async getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableStatisticsResp[]> {\n const resp = await this.http.requestJson<GetTimetableStatisticsResponse>({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n return unwrapTimetableStatisticsList(resp);\n }\n}\n\n","import { SERVICE_IMPLICIT_TAG_REGISTRY, type ServiceImplicitTagConfig } from \"../common/implicit-tag-params.js\";\nimport type { ServiceBehaviorSettings } from \"./types.js\";\n\n/** Предметная причина отказа операции настроек. */\nexport enum ServiceBehaviorSettingsErrorCategory {\n /** Параметры отвергнуты до HTTP. */\n InvalidInput = \"InvalidInput\",\n /** Нет доступа к содержимому либо известного разрешения изменения. */\n AccessDenied = \"AccessDenied\",\n /** Неизвестна полнота, версия или разрешение. */\n InsufficientData = \"InsufficientData\",\n /** Ответ чтения имеет неверный ID или структуру. */\n InvalidResponse = \"InvalidResponse\",\n /** Версия разошлась до PUT либо сервер доказанно отклонил CAS. */\n VersionConflict = \"VersionConflict\",\n /** PUT отправлен, но исход не подтверждён валидным ответом. */\n WriteOutcomeUnknown = \"WriteOutcomeUnknown\",\n /** PUT не дошёл до fetch; причина сохранена в cause. */\n RequestNotSent = \"RequestNotSent\",\n}\n/** Причина неполного предметного чтения конкретной настройки. */\nexport enum ServiceBehaviorSettingsIssueReason {\n /** Есть некорректное значение; поле исключено из предметного снимка. */\n InvalidValue = \"InvalidValue\",\n /** Есть противоречивые значения; порядок не определяет результат. */\n AmbiguousValue = \"AmbiguousValue\",\n}\n/** Ошибка SDK; cause сохраняется для безопасной диагностики приложения. */\nexport class ServiceBehaviorSettingsError extends Error {\n /** Предметная категория; не зависит от кодов MCP. */\n readonly category: ServiceBehaviorSettingsErrorCategory;\n /** Исходная ошибка транспорта или сервера, если она существует. */\n override readonly cause?: unknown;\n constructor(category: ServiceBehaviorSettingsErrorCategory, cause?: unknown) {\n super(`Service BehaviorSettings: ${category}`);\n this.name = \"ServiceBehaviorSettingsError\";\n this.category = category;\n this.cause = cause;\n }\n}\n/** Диагностика настройки без раскрытия внутреннего представления. */\nexport interface ServiceBehaviorSettingsIssue {\n /** Поле, значение которого не может быть достоверно прочитано. */\n field: keyof ServiceBehaviorSettings;\n /** Некорректное значение либо несколько противоречивых значений. */\n reason: ServiceBehaviorSettingsIssueReason;\n}\n/** Проверенное предметное состояние услуги. */\nexport interface ServiceBehaviorSettingsState {\n /** ID услуги, для которой выполнено чтение. */\n serviceId: string;\n /** Положительная int32 meta.version всей услуги, не отдельный счётчик настроек. */\n version: number;\n /** Прочитанные значения; поля с issues не являются полным снимком. */\n settings: ServiceBehaviorSettings;\n /** Проблемы предметного чтения; пустой массив означает полный снимок настроек. */\n issues: ServiceBehaviorSettingsIssue[];\n}\n/** Результат изменения; поля состояния имеют смысл из ServiceBehaviorSettingsState. */\nexport interface ServiceBehaviorSettingsUpdateResult extends ServiceBehaviorSettingsState {\n /** Был ли PUT; settings описывают ожидаемый результат, без автоматического readback. */\n changed: boolean;\n}\n/** Управление записью BehaviorSettings; проверку версии выбирает потребитель. */\nexport interface ServiceBehaviorSettingsUpdateOptions {\n /** Ожидаемая meta.version: 1..2147483647. При наличии включает проверку указанной версии. */\n versionToCheck?: number;\n /** true включает CAS по версии внутреннего GET, если versionToCheck не задан. По умолчанию CAS выключен. */\n checkVersion?: true;\n /** true (по умолчанию) сохраняет пропущенные поля; false полностью заменяет настройки. */\n mergeParameters?: boolean;\n /** Выбранный профиль только для внутреннего GET; не предоставляет право записи. */\n profileId?: string | null;\n /** Гостевой контекст только для GET; не Bearer и не право записи. */\n securityToken?: string | null;\n /** Создание объявления при PUT; отсутствие/null означает false. */\n isNeedAnnouncement?: boolean | null;\n /** Отмена чтения и записи; после отмены автоматических запросов нет. */\n signal?: AbortSignal;\n}\n/** Именованные виды реестра для сравнения в реализации. */\nenum BehaviorKind {\n String = \"string\", PositiveInt = \"positiveInt\", ExactFlag = \"exactFlag\", AutoStart = \"autoStart\", Agreement = \"agreement\",\n}\n/** Wire-полнота и разрешённая операция; не входят в предметные результаты. */\nenum BehaviorAccess { Full = \"Full\", NoRights = \"NoRights\", SubscriptionIsNotValid = \"SubscriptionIsNotValid\", SetItemTags = \"SetItemTags\" }\nenum BehaviorFlag { LegacyHide = \"HideTelegramNotificationBot\" }\nconst configs: readonly ServiceImplicitTagConfig[] = Object.values(SERVICE_IMPLICIT_TAG_REGISTRY);\n\n/** Проверяет положительную int32-версию независимо от TypeScript. */\nexport function isBehaviorVersion(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 1 && value <= 2147483647;\n}\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n/** Валидирует GET до проекции; отсутствие данных не превращается в пустое состояние. */\nexport function validateBehaviorResponse(value: unknown, serviceId: string): { tags: string[]; version: number; operations: unknown } {\n if (!record(value) || value.id !== serviceId) throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.InvalidResponse);\n const personal = value.personalInfo;\n if (record(personal) && (personal.itemContentType === BehaviorAccess.NoRights || personal.itemContentType === BehaviorAccess.SubscriptionIsNotValid)) {\n throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.AccessDenied);\n }\n if (!record(personal) || personal.itemContentType !== BehaviorAccess.Full || value.tags == null || !record(value.meta) || !isBehaviorVersion(value.meta.version)) {\n throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.InsufficientData);\n }\n if (!Array.isArray(value.tags) || !value.tags.every((tag): tag is string => typeof tag === \"string\")) {\n throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.InvalidResponse);\n }\n const operations = personal.operationList;\n if (operations != null && (!Array.isArray(operations) || !operations.every(operation => typeof operation === \"string\" || (typeof operation === \"number\" && Number.isSafeInteger(operation))))) {\n throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.InvalidResponse);\n }\n return { tags: [...new Set(value.tags)], version: value.meta.version, operations };\n}\n/** Наличие данных или профиль не заменяют известное разрешение операции. */\nexport function assertBehaviorPermission(operations: unknown): void {\n if (!Array.isArray(operations)) throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.InsufficientData);\n if (!operations.includes(BehaviorAccess.SetItemTags)) throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.AccessDenied);\n}\n\nfunction suffixPrefix(tag: string, suffix: string, ignoreCase = false): string | undefined {\n const matches = ignoreCase ? tag.toLowerCase().endsWith(suffix.toLowerCase()) : tag.endsWith(suffix);\n return matches ? tag.slice(0, -suffix.length) : undefined;\n}\nfunction positive(raw: string): number | undefined {\n const value = Number(raw);\n return /^\\d+$/.test(raw) && Number.isSafeInteger(value) && value > 0 ? value : undefined;\n}\n/** Принадлежность семейству отделена от валидности значения: ошибочное выбранное поле можно заменить. */\nfunction prefix(tag: string, config: ServiceImplicitTagConfig): string | undefined {\n if (config.kind === BehaviorKind.String || config.kind === BehaviorKind.PositiveInt) {\n for (const suffix of config.suffixes) {\n const value = suffixPrefix(tag, suffix, config.caseInsensitive);\n if (value !== undefined) return value;\n }\n } else if (config.kind === BehaviorKind.ExactFlag) {\n if (config.tokens.includes(tag) || tag === BehaviorFlag.LegacyHide) return \"true\";\n } else if (config.kind === BehaviorKind.AutoStart) {\n for (const suffix of config.suffixes) {\n const value = suffixPrefix(tag, `:${suffix}`);\n if (value !== undefined) return value;\n }\n } else if (config.kind === BehaviorKind.Agreement) {\n for (const suffix of [config.textSuffix, config.linkSuffix]) {\n const position = tag.lastIndexOf(suffix);\n if (position >= 0 && /^\\d+$/.test(tag.slice(position + suffix.length))) return tag;\n }\n }\n return undefined;\n}\n/** Читает все семейства без зависимости от порядка или одинаковых дублей. */\nexport function readBehaviorSettings(tags: readonly string[]): Pick<ServiceBehaviorSettingsState, \"settings\" | \"issues\"> {\n const settings: ServiceBehaviorSettings = { hideMessengerConnectUi: false };\n const issues: ServiceBehaviorSettingsIssue[] = [];\n const target = settings as Record<string, unknown>;\n for (const config of configs) {\n // Собираем выбранное семейство без зависимости от порядка/дублей ответа.\n const matching = [...new Set(tags)].filter(tag => prefix(tag, config) !== undefined);\n if (!matching.length) continue;\n let invalid = false;\n let ambiguous = false;\n let result: unknown;\n if (config.kind === BehaviorKind.Agreement) {\n // Соглашения агрегируются по index, конфликт любого атрибута делает набор неполным.\n const entries = new Map<number, { index: number; text?: string; link?: string }>();\n for (const tag of matching) {\n for (const [attribute, suffix] of [[\"text\", config.textSuffix], [\"link\", config.linkSuffix]] as const) {\n const position = tag.lastIndexOf(suffix);\n if (position < 0 || !/^\\d+$/.test(tag.slice(position + suffix.length))) continue;\n const index = positive(tag.slice(position + suffix.length));\n let value = tag.slice(0, position).trim();\n if (attribute === \"link\") value = value.replace(/^(https?)\\/\\//, \"$1://\");\n if (!index || !value) { invalid = true; continue; }\n const entry = entries.get(index) ?? { index };\n if (entry[attribute] !== undefined && entry[attribute] !== value) ambiguous = true;\n entry[attribute] = value;\n entries.set(index, entry);\n }\n }\n result = [...entries.values()].sort((a, b) => a.index - b.index);\n } else {\n const values = new Set<string | number | boolean>();\n for (const tag of matching) {\n const raw = prefix(tag, config)!;\n const value = config.kind === BehaviorKind.ExactFlag ? true : config.kind === BehaviorKind.String ? raw.trim() || undefined : positive(raw);\n if (value === undefined) invalid = true;\n else values.add(value);\n }\n ambiguous = values.size > 1;\n result = [...values][0];\n }\n if (invalid || ambiguous) {\n // Неполное значение не выдаём за достоверное; другие семейства остаются читаемыми.\n issues.push({ field: config.field, reason: invalid ? ServiceBehaviorSettingsIssueReason.InvalidValue : ServiceBehaviorSettingsIssueReason.AmbiguousValue });\n } else target[config.field] = result;\n }\n return { settings, issues };\n}\n\n/** Нормализует и валидирует вход; undefined/null не служат неявной очисткой. */\nexport function normalizeBehaviorInput(input: ServiceBehaviorSettings): ServiceBehaviorSettings {\n function fail(): never { throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.InvalidInput); }\n if (!record(input) || Object.keys(input).some(key => !Object.hasOwn(SERVICE_IMPLICIT_TAG_REGISTRY, key))) fail();\n const output: Record<string, unknown> = {};\n for (const config of configs) {\n if (!Object.hasOwn(input, config.field)) continue;\n const value: unknown = input[config.field];\n if (config.kind === BehaviorKind.String) {\n if (typeof value !== \"string\" || !value.trim()) fail();\n output[config.field] = value.trim();\n } else if (config.kind === BehaviorKind.PositiveInt || config.kind === BehaviorKind.AutoStart) {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value <= 0) fail();\n output[config.field] = value;\n } else if (config.kind === BehaviorKind.ExactFlag) {\n if (typeof value !== \"boolean\") fail();\n output[config.field] = value;\n } else {\n if (!Array.isArray(value)) fail();\n const seen = new Set<number>();\n output[config.field] = value.map((entry: unknown) => {\n if (!record(entry) || Object.keys(entry).some(key => ![\"index\", \"text\", \"link\"].includes(key)) || typeof entry.index !== \"number\" || !Number.isSafeInteger(entry.index) || entry.index <= 0 || seen.has(entry.index)) fail();\n seen.add(entry.index);\n const normalized: { index: number; text?: string; link?: string } = { index: entry.index };\n for (const attribute of [\"text\", \"link\"] as const) {\n if (Object.hasOwn(entry, attribute)) {\n if (typeof entry[attribute] !== \"string\" || !entry[attribute].trim()) fail();\n normalized[attribute] = entry[attribute].trim();\n }\n }\n if (!normalized.text && !normalized.link) fail();\n return normalized;\n }).sort((a, b) => a.index - b.index);\n }\n }\n return output as ServiceBehaviorSettings;\n}\n\n/** Формирует только выбранные семейства; порядок/кратность не входят в серверный контракт. */\nexport function mergeBehaviorSettings(tags: readonly string[], settings: ServiceBehaviorSettings, mergeParameters: boolean): string[] {\n const selected = configs.filter(config => !mergeParameters || Object.hasOwn(settings, config.field));\n const output = tags.filter(tag => !selected.some(config => prefix(tag, config) !== undefined));\n for (const config of selected) {\n const value = settings[config.field];\n if (value === undefined) continue;\n if (config.kind === BehaviorKind.String || config.kind === BehaviorKind.PositiveInt) output.push(`${value}${config.suffixes[0]}`);\n else if (config.kind === BehaviorKind.ExactFlag) { if (value) output.push(config.tokens[0]!); }\n else if (config.kind === BehaviorKind.AutoStart) output.push(`${value}:${config.suffixes[0]}`);\n else if (config.kind === BehaviorKind.Agreement) for (const entry of settings.agreementItems ?? []) {\n if (entry.text) output.push(`${entry.text}${config.textSuffix}${entry.index}`);\n if (entry.link) output.push(`${entry.link.replace(/^(https?):\\/\\//, \"$1//\")}${config.linkSuffix}${entry.index}`);\n }\n }\n return [...new Set(output)];\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { parseServiceImplicitTagParams } from \"../common/implicit-tag-params.js\";\nimport type {\n CreateOrderReq,\n GetCheckInScheduleReq,\n GetCheckInScheduleResp,\n OrderResp,\n ResourceView,\n SearchServiceResourcesReq,\n ServiceItem,\n ServiceItemApi,\n} from \"./types.js\";\n\n/*\n * Запросы записи на услугу — функциями поверх `HttpClient`, без `ServicesFacade`.\n * Фасад — класс со всеми методами услуги (CRUD, соцслой, отчёты), и сборщик не может выкинуть\n * неиспользуемые методы класса. Браузерному виджету записи нужно четыре запроса — функции\n * попадают в бандл поштучно. `ServicesFacade` вызывает эти же функции: поведение одно.\n */\n\nconst BASE = \"/api/v1/services\";\n\n/** Опции `GET /api/v1/services/{torrowId}` — у `getService` и `ServicesFacade.getById`. */\nexport interface GetServiceOptions {\n profileId?: string | null;\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n}\n\n/** Ответ API услуги → `ServiceItem` SDK: `behaviorSettings` из hash-tags. */\nexport function toSdkServiceItem(service: ServiceItemApi): ServiceItem {\n return {\n ...service,\n behaviorSettings: parseServiceImplicitTagParams(service.tags),\n };\n}\n\n/** `GET /api/v1/services/{torrowId}` — услуга с `behaviorSettings`, как `ServicesFacade.getById`. */\nexport async function getService(\n http: HttpClient,\n torrowId: string,\n options?: GetServiceOptions,\n): Promise<ServiceItem> {\n const item = await http.requestJson<ServiceItemApi>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n profileId: options?.profileId,\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n return toSdkServiceItem(item);\n}\n\n/** Доступные ресурсы группы для шага «Ресурс» — `POST /api/v1/services/{serviceId}/resources`. */\nexport function getServiceResources(\n http: HttpClient,\n serviceId: string,\n body: SearchServiceResourcesReq,\n options?: { signal?: AbortSignal },\n): Promise<ResourceView[]> {\n return http.requestJson<ResourceView[]>({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/resources`,\n body,\n signal: options?.signal,\n });\n}\n\n/**\n * Расчёт доступности записи — `POST /api/v1/services/{id}/checkinschedule`.\n * `type: \"FreeTimeSlots\"` возвращает выбираемые свободные слоты; `AsIs` — исходные периоды нагрузки.\n */\nexport function getCheckInSchedule(\n http: HttpClient,\n serviceId: string,\n body: GetCheckInScheduleReq,\n options?: { signal?: AbortSignal },\n): Promise<GetCheckInScheduleResp> {\n return http.requestJson<GetCheckInScheduleResp>({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/checkinschedule`,\n body,\n signal: options?.signal,\n });\n}\n\n/**\n * Заказ услуги (запись) — `POST /api/v1/services/{serviceId}/order`. Тело и отказы —\n * как у `ServicesFacade.createOrder`; гостю в ответе приходит `consumerSecurityToken`.\n */\nexport function createOrder(\n http: HttpClient,\n serviceId: string,\n body: CreateOrderReq,\n options?: { signal?: AbortSignal },\n): Promise<OrderResp> {\n return http.requestJson<OrderResp>({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/order`,\n body,\n signal: options?.signal,\n });\n}\n","import { TorrowHttpError } from \"../../http/TorrowHttpError.js\";\nimport type { TorrowObjectDto } from \"../../schema/openapi-dto-aliases.js\";\nimport {\n assertBehaviorPermission, isBehaviorVersion,\n mergeBehaviorSettings, normalizeBehaviorInput, readBehaviorSettings,\n validateBehaviorResponse, ServiceBehaviorSettingsError, ServiceBehaviorSettingsErrorCategory,\n type ServiceBehaviorSettingsState, type ServiceBehaviorSettingsUpdateOptions,\n type ServiceBehaviorSettingsUpdateResult,\n} from \"./behavior-settings.js\";\nimport type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount, unwrapTimetableStatisticsList } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type { CaseItem } from \"../cases/types.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport {\n mergeServiceImplicitTags,\n} from \"../common/implicit-tag-params.js\";\nimport {\n createOrder,\n getCheckInSchedule,\n getService,\n getServiceResources,\n toSdkServiceItem,\n type GetServiceOptions,\n} from \"./service-requests.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n ChangeOrderServiceReq,\n CreateOrderReq,\n DeleteResponse,\n GetCheckInScheduleReq,\n GetCheckInScheduleResp,\n GetReCheckInScheduleReq,\n GetServiceWorkloadInfoRequest,\n GetServiceWorkloadInfoResp,\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n OrderResp,\n ResourceView,\n SearchServiceResourcesReq,\n SearchServiceResourcesResp,\n ServiceBehaviorSettings,\n ServiceItem,\n ServiceItemApi,\n ServiceItemForCreateOrUpdate,\n TimetableCase,\n TimetableFilter,\n TimetableStatisticsResp,\n UpdateOrderInfoReq,\n UpdateOrderReq,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/services\";\n/** Подтверждённые корневые значения CAS-отказа Service /tags. */\nenum ServiceBehaviorServerErrorName { VersionConflict = \"OBJECT_HAS_WRONG_VERSION\" }\nenum ServiceBehaviorServerErrorCode { VersionConflict = 208213 }\n\n/** CRUD, personal list, booking, session/order, и социальный слой для `ServiceItem`. */\nexport class ServicesFacade extends TorrowItemFacade<ServiceItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Service;\n\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** Id услуги до `create` / presigned upload. */\n generateServiceId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n private toApiServiceItem(service: ServiceItemForCreateOrUpdate): ServiceItemApi {\n const { behaviorSettings, ...rest } = service;\n const apiBase = rest as ServiceItemApi;\n const nextTags = behaviorSettings ? mergeServiceImplicitTags(apiBase.tags, behaviorSettings) : apiBase.tags;\n return {\n ...apiBase,\n tags: nextTags,\n };\n }\n\n /** `POST /api/v1/services` */\n create(\n body: ServiceItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ServiceItem> {\n const payload = applyItemCreateDefaults(body, Discriminator.ServiceItem);\n return this.http\n .requestJson<ServiceItemApi>({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: this.toApiServiceItem(payload),\n signal: options?.signal,\n })\n .then((item) => toSdkServiceItem(item));\n }\n\n /** `PUT /api/v1/services/{body.id}` */\n update(\n body: ServiceItemForCreateOrUpdate,\n options?: {\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<ServiceItem> {\n const itemId = requireItemUpdateId(body, \"Service\");\n return this.http\n .requestJson<ServiceItemApi>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n profileId: options?.profileId,\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: this.toApiServiceItem(body),\n signal: options?.signal,\n })\n .then((item) => toSdkServiceItem(item));\n }\n\n /** `DELETE /api/v1/services/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/services/{torrowId}` */\n getById(torrowId: string, options?: GetServiceOptions): Promise<ServiceItem> {\n return getService(this.http, torrowId, options);\n }\n\n /** Читает сырой OpenAPI DTO до проекции, чтобы malformed tags не маскировались парсером. */\n private async readBehaviorState(serviceId: string, options?: GetServiceOptions) {\n if (typeof serviceId !== \"string\" || !serviceId.trim()) {\n throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.InvalidInput);\n }\n const value = await this.http.requestJson<ServiceItemApi>({\n method: \"GET\", path: `${BASE}/${encodePathSegment(serviceId)}`,\n query: {\n profileId: options?.profileId, versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted, includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n }, signal: options?.signal,\n });\n return validateBehaviorResponse(value, serviceId);\n }\n\n /** Один GET: версия всей услуги, предметные настройки и диагностика неполного снимка. */\n async getBehaviorSettings(serviceId: string, options?: GetServiceOptions): Promise<ServiceBehaviorSettingsState> {\n const state = await this.readBehaviorState(serviceId, options);\n return { serviceId, version: state.version, ...readBehaviorSettings(state.tags) };\n }\n\n /**\n * GET → локальный patch → PUT /tags с необязательной проверкой версии; автоматического readback нет.\n * mergeParameters=true сохраняет пропущенные поля, false заменяет все настройки.\n * Порядок и одинаковые дубли сервер не сохраняет; no-op определяется множеством строк.\n */\n async updateBehaviorSettings(\n serviceId: string,\n settingsPatch: Partial<ServiceBehaviorSettings>,\n options: ServiceBehaviorSettingsUpdateOptions = {},\n ): Promise<ServiceBehaviorSettingsUpdateResult> {\n // Вход проверяется до первого внешнего эффекта; указанная версия должна быть корректной.\n if (!options || (options.versionToCheck !== undefined && !isBehaviorVersion(options.versionToCheck)) ||\n (Object.hasOwn(options, \"checkVersion\") && options.checkVersion !== true) ||\n (Object.hasOwn(options, \"mergeParameters\") && typeof options.mergeParameters !== \"boolean\") ||\n (options.isNeedAnnouncement != null && typeof options.isNeedAnnouncement !== \"boolean\") ||\n Object.keys(options).some(key => ![\"versionToCheck\", \"checkVersion\", \"mergeParameters\", \"profileId\", \"securityToken\", \"isNeedAnnouncement\", \"signal\"].includes(key))) {\n throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.InvalidInput);\n }\n const normalized = normalizeBehaviorInput(settingsPatch);\n // Фиксируем CAS и опции до await: изменение объекта вызывающим кодом не меняет условие PUT.\n options = { ...options };\n const state = await this.readBehaviorState(serviceId, {\n profileId: options.profileId, securityToken: options.securityToken, signal: options.signal,\n });\n assertBehaviorPermission(state.operations);\n if (options.versionToCheck !== undefined && state.version !== options.versionToCheck) {\n throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.VersionConflict);\n }\n const tags = mergeBehaviorSettings(state.tags, normalized, options.mergeParameters ?? true);\n const projected = readBehaviorSettings(tags);\n const unchanged = tags.length === state.tags.length && tags.every(tag => state.tags.includes(tag));\n if (unchanged) return { serviceId, version: state.version, ...projected, changed: false };\n\n // Только маркер fetch отличает локальный отказ от неопределённого исхода PUT.\n let dispatched = false;\n let result: TorrowObjectDto;\n try {\n result = await this.http.requestJson<TorrowObjectDto>({\n method: \"PUT\", path: `${BASE}/${encodePathSegment(serviceId)}/tags`,\n query: { versionToCheck: options.versionToCheck ?? (options.checkVersion ? state.version : undefined), isNeedAnnouncement: options.isNeedAnnouncement ?? false },\n body: tags, signal: options.signal,\n }, () => { dispatched = true; });\n } catch (cause) {\n // Доказан только корневой CAS-отказ этого маршрута, не любой HTTP 500/409.\n if (dispatched && cause instanceof TorrowHttpError && cause.status === 500 &&\n cause.body !== null && typeof cause.body === \"object\" &&\n \"name\" in cause.body && cause.body.name === ServiceBehaviorServerErrorName.VersionConflict &&\n \"code\" in cause.body && (cause.body.code === ServiceBehaviorServerErrorCode.VersionConflict || cause.body.code === String(ServiceBehaviorServerErrorCode.VersionConflict))) {\n throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.VersionConflict, cause);\n }\n throw new ServiceBehaviorSettingsError(dispatched\n ? ServiceBehaviorSettingsErrorCategory.WriteOutcomeUnknown\n : ServiceBehaviorSettingsErrorCategory.RequestNotSent, cause);\n }\n if (!result || result.id !== serviceId || !isBehaviorVersion(result.meta?.version)) {\n throw new ServiceBehaviorSettingsError(ServiceBehaviorSettingsErrorCategory.WriteOutcomeUnknown);\n }\n return { serviceId, version: result.meta.version, ...projected, changed: true };\n }\n\n /** Полная замена: пропущенные поля очищаются, посторонние данные сохраняются. */\n setBehaviorSettings(\n serviceId: string,\n settings: ServiceBehaviorSettings,\n options: Omit<ServiceBehaviorSettingsUpdateOptions, \"mergeParameters\"> = {},\n ): Promise<ServiceBehaviorSettingsUpdateResult> {\n return this.updateBehaviorSettings(serviceId, settings, { ...options, mergeParameters: false });\n }\n\n /**\n * Запись на услугу — `POST /api/v1/services/{serviceId}/order`.\n * Минимум в теле: непустой смысл в `checkInProperties` (слот, участник, контакты — по правилам услуги и OpenAPI).\n * Успех: `OrderResp` (часто интересен `order` как кейс и `consumerSecurityToken` для гостевого доступа).\n * Типичные отказы: нет слота, услуга недоступна по времени, подписка/баланс — разбирай тело `TorrowHttpError` (`name` / `code`); эталон UX — `torrow-apps` `CreateOrderTask`.\n */\n createOrder(\n serviceId: string,\n body: CreateOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<OrderResp> {\n return createOrder(this.http, serviceId, body, options);\n }\n\n /**\n * События/заказы и занятость услуги — `PUT /api/v1/services/{serviceId}/timetable`.\n * Не вычисляет свободные слоты записи: для них используй `getCheckInSchedule` с `type: \"FreeTimeSlots\"`.\n */\n getTimetable(\n serviceId: string,\n body: TimetableFilter,\n options?: TimetableQueryOptions & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /**\n * Нагрузка и расписание по ресурсам услуги — `PUT /api/v1/services/workloadinfo`.\n * Эталон: torrow-apps `ServiceItemService.getWorkloadInfo`, экран заказов по ресурсам (`service-resource-orders`).\n */\n getWorkloadInfo(\n body: GetServiceWorkloadInfoRequest,\n options?: { signal?: AbortSignal },\n ): Promise<GetServiceWorkloadInfoResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/workloadinfo`,\n body,\n signal: options?.signal,\n });\n }\n\n /** Агрегаты по расписанию услуги — `POST /api/v1/services/timetable/statistics`. */\n async getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableStatisticsResp[]> {\n const resp = await this.http.requestJson<GetTimetableStatisticsResponse>({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n return unwrapTimetableStatisticsList(resp);\n }\n\n /**\n * Расчёт доступности записи — `POST /api/v1/services/{id}/checkinschedule`.\n * `type: \"FreeTimeSlots\"` возвращает выбираемые свободные слоты; `AsIs` — исходные периоды нагрузки.\n */\n getCheckInSchedule(\n serviceId: string,\n body: GetCheckInScheduleReq,\n options?: { signal?: AbortSignal },\n ): Promise<GetCheckInScheduleResp> {\n return getCheckInSchedule(this.http, serviceId, body, options);\n }\n\n /** Пересчёт расписания чекина — `PUT /api/v1/services/{id}/recheckinschedule`. */\n getReCheckInSchedule(\n serviceId: string,\n body: GetReCheckInScheduleReq,\n options?: { signal?: AbortSignal },\n ): Promise<GetCheckInScheduleResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/recheckinschedule`,\n body,\n signal: options?.signal,\n });\n }\n\n /** Доступные ресурсы группы для шага «Ресурс» — `POST /api/v1/services/{serviceId}/resources`. */\n getServiceResources(\n serviceId: string,\n body: SearchServiceResourcesReq,\n options?: { signal?: AbortSignal },\n ): Promise<ResourceView[]> {\n return getServiceResources(this.http, serviceId, body, options);\n }\n\n /**\n * Ресурсы с детализацией (в т.ч. гарантированные количества) — `POST .../resourceswithdetalization`.\n * Удобно для виджетов с лимитами мест / «осталось N».\n */\n getServiceResourcesWithDetalization(\n serviceId: string,\n body: SearchServiceResourcesReq,\n options?: { signal?: AbortSignal },\n ): Promise<SearchServiceResourcesResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/resourceswithdetalization`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/services/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<ServiceItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http\n .requestJson<ServiceItemApi[]>({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n })\n .then((items) => items.map((item) => toSdkServiceItem(item)));\n }\n\n /** `POST /api/v1/services/{serviceId}/session` — создать сессию записи (тело `CaseItem`). */\n createSession(\n serviceId: string,\n body: CaseItem,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/session`,\n query: { profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/services/{serviceId}/session` — получить/обновить сессию по `caseId`. */\n refreshSession(\n serviceId: string,\n options?: { caseId?: string | null; profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/session`,\n query: { caseId: options?.caseId, profileId: options?.profileId },\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/services/{serviceId}/updateorder` */\n patchUpdateOrder(\n serviceId: string,\n body: UpdateOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(serviceId)}/updateorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/services/{serviceId}/updateorder2` */\n patchUpdateOrder2(\n serviceId: string,\n body: UpdateOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(serviceId)}/updateorder2`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/services/{serviceId}/changeorderservice` */\n changeOrderService(\n serviceId: string,\n body: ChangeOrderServiceReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/changeorderservice`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/services/{serviceId}/updateorderinfo` */\n patchUpdateOrderInfo(\n serviceId: string,\n body: UpdateOrderInfoReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(serviceId)}/updateorderinfo`,\n body,\n signal: options?.signal,\n });\n }\n}\n","/**\n * UTF-8 → Base64 без Node-only `Buffer` (браузер + Node 18+ `btoa`).\n */\nexport function utf8ToBase64(value: string): string {\n const bytes = new TextEncoder().encode(value);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n return btoa(binary);\n}\n","import { HttpClient } from \"../../http/HttpClient.js\";\nimport type { ResolvedTorrowClientConfig } from \"../../TorrowClientConfig.js\";\nimport { utf8ToBase64 } from \"../../util/base64.js\";\nimport type {\n CreateAuthSessionReq,\n CreateAuthSessionResp,\n RefreshReq,\n RevokeReq,\n SendCodeReq,\n SendCodeResp,\n TokenReq,\n TokenResp,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/auth\";\n\nfunction authFacadeDefaultHeaders(config: ResolvedTorrowClientConfig): Record<string, string> | undefined {\n const merged: Record<string, string> = { ...(config.defaultHeaders ?? {}) };\n const basic = config.authIdentityBasic;\n if (basic?.username && basic.password !== undefined && basic.password !== \"\") {\n merged.Authorization = `Basic ${utf8ToBase64(`${basic.username}:${basic.password}`)}`;\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\n/**\n * **AuthIdentity** (`/api/v1/auth/*`): выдача и обновление токенов, сессия, код.\n *\n * Все методы ходят через **отдельный** {@link HttpClient} **без** `getAccessToken`, чтобы вызовы вроде\n * **`refresh`** не зацикливались на Bearer основного **`TorrowClient`**. При необходимости шлюза\n * подставляется **HTTP Basic** из **`config.authIdentityBasic`** (`AuthIdentityBasic`;\n * см. {@link TorrowClientConfig.authIdentityBasic}).\n */\nexport class AuthFacade {\n private readonly anonHttp: HttpClient;\n\n constructor(config: ResolvedTorrowClientConfig) {\n this.anonHttp = new HttpClient({\n baseUrl: config.baseUrl,\n fetch: config.fetch,\n defaultHeaders: authFacadeDefaultHeaders(config),\n userAgent: config.userAgent,\n });\n }\n\n /** `POST /api/v1/auth/refresh` — новая пара токенов по `refreshToken`. */\n refresh(body: RefreshReq, options?: { signal?: AbortSignal }): Promise<TokenResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/refresh`,\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `POST /api/v1/auth/token` — обмен `sessionId` / `code` на `TokenResp` (смотри `status`).\n * `body.splitTokens: false` — полные токены в JSON (Node, MCP, интеграционные ключи).\n * `true` — сервер возвращает части токенов в JSON и HttpOnly cookies;\n * приложение обеспечивает передачу cookies, SDK не управляет ими и не восстанавливает токены.\n * Подробности и выбор режима — в README `@torrow/sdk-auth`, раздел «Когда использовать splitTokens».\n */\n requestToken(body: TokenReq, options?: { signal?: AbortSignal }): Promise<TokenResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/token`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/auth/revoke` — инвалидация refresh (тело `RevokeReq`). */\n revoke(body: RevokeReq, options?: { signal?: AbortSignal }): Promise<void> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/revoke`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/auth/sendcode` — отправка кода входа; ответ `SendCodeResp` (`usedMethod`, `codeLength`, …). */\n sendCode(body: SendCodeReq, options?: { signal?: AbortSignal }): Promise<SendCodeResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/sendcode`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/auth/session` — создание сессии аутентификации. */\n createSession(\n body: CreateAuthSessionReq,\n options?: { signal?: AbortSignal },\n ): Promise<CreateAuthSessionResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/session`,\n body,\n signal: options?.signal,\n });\n }\n}\n","/**\n * Field normalizations mirror `ContactsFacade.withCreateDefaults` / `update`, plus profile-only\n * `name` fill (server rejects null Name/VisitCard on profile POSTs). Not used by\n * `contacts.create`/`update` — those must not auto-fill `name`. Do not “DRY into contacts”\n * unless both domains need the same behavior change.\n */\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { normalizeContactCommunicationsForWrite } from \"../contacts/contact-communications-write-defaults.js\";\nimport { normalizeContactStructuredArrayRidsForWrite } from \"../contacts/contact-structured-array-rids.js\";\nimport { normalizeContactVisitCardFieldsForWrite } from \"../contacts/contact-visit-card-fields.js\";\nimport type { ContactItemForCreateOrUpdate } from \"../contacts/types.js\";\nimport type { UserProfileItemForAdd } from \"./types.js\";\n\ntype UserProfileItemForAddWithDiscriminator = UserProfileItemForAdd & {\n discriminator?: string;\n};\n\nfunction trimNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\n/** Empty/whitespace `name` → FIO parts → string `company` → `\"Profile\"`. */\nexport function ensureContactNameForProfileWrite(body: ContactItemForCreateOrUpdate): void {\n if (trimNonEmptyString(body.name) !== undefined) {\n return;\n }\n const fromParts = [body.lastName, body.firstName, body.middleName]\n .map((p) => (typeof p === \"string\" ? p.trim() : \"\"))\n .filter(Boolean)\n .join(\" \");\n body.name = fromParts || trimNonEmptyString(body.company) || \"Profile\";\n}\n\n/**\n * Prep for `POST /api/v1/user/profiles` and `POST /api/v1/user/defaultprofile`.\n * Order: create defaults → name fill → contact field normalizations (VisitCard last among them).\n *\n * Shallow-copies `body` (top-level keys like `name` / `discriminator` are not written back\n * onto the caller object). Nested arrays/objects (`communications`, `visitCard`, …) may still\n * be mutated in place by contact write normalizers — same pattern as `contacts.create`.\n */\nexport function prepareUserProfileItemForAdd(body: UserProfileItemForAdd): UserProfileItemForAdd {\n const payload = applyItemCreateDefaults<UserProfileItemForAdd>(\n body as UserProfileItemForAddWithDiscriminator,\n Discriminator.ContactItem,\n );\n ensureContactNameForProfileWrite(payload);\n normalizeContactStructuredArrayRidsForWrite(payload);\n normalizeContactCommunicationsForWrite(payload);\n normalizeContactVisitCardFieldsForWrite(payload);\n return payload;\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n unwrapAddProfileContact,\n unwrapRemoveProfileList,\n unwrapTorrowObjectFromProfilePropertiesUpdate,\n} from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type {\n AddProfileResp,\n ProfileListResp,\n ProfileProperties,\n RemoveProfileResp,\n UpdateProfilePropertiesResp,\n UserProfileItemForAdd,\n} from \"./types.js\";\nimport type { ContactItem } from \"../contacts/types.js\";\nimport type { TorrowObject } from \"../common/torrow-entities.js\";\nimport { prepareUserProfileItemForAdd } from \"./user-profile-write-defaults.js\";\n\nconst BASE = \"/api/v1/user/profiles\";\n\n/**\n * **Профили пользователя** Torrow: `ContactItem`, привязанные к учётной записи (`profileType`, напр. `MyProfile`).\n * REST раздел **User**, не домен `/api/v1/contacts`.\n */\nexport class ProfilesFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `GET /api/v1/user/profiles` — список Профилей текущего пользователя.\n * Возвращает **`profileList`** из ответа API (пустой массив, если поля нет или **`null`**).\n * @throws Если тело ответа не объект или **`profileList`** не массив при наличии поля.\n */\n async list(options?: { signal?: AbortSignal }): Promise<ContactItem[]> {\n const resp = await this.http.requestJson<ProfileListResp>({ method: \"GET\", path: BASE, signal: options?.signal });\n if (resp === null || typeof resp !== \"object\") {\n throw new Error(\"GET /api/v1/user/profiles: expected a JSON object body\");\n }\n const pl = resp.profileList;\n if (pl === undefined || pl === null) return [];\n if (!Array.isArray(pl)) {\n throw new Error(\"GET /api/v1/user/profiles: profileList must be an array when present\");\n }\n return pl as ContactItem[];\n }\n\n /**\n * `POST /api/v1/user/profiles` — создать Профиль по телу **`UserProfileItemForAdd`** (контакт для write + поля Профиля).\n * Тело перед POST проходит через {@link prepareUserProfileItemForAdd}.\n * Возвращает созданный **`ContactItem`** (`AddProfileResp.profile`).\n */\n async add(body: UserProfileItemForAdd, options?: { signal?: AbortSignal }): Promise<ContactItem> {\n const payload = prepareUserProfileItemForAdd(body);\n const resp = await this.http.requestJson<AddProfileResp>({\n method: \"POST\",\n path: BASE,\n body: payload,\n signal: options?.signal,\n });\n return unwrapAddProfileContact(resp) as ContactItem;\n }\n\n /**\n * `PUT /api/v1/user/profiles` — в OpenAPI тело **JSON-строка** (id существующего контакта), не объект.\n * Добавляет этот контакт как Профиль; возвращает **`ContactItem`** (`AddProfileResp.profile`).\n */\n async addByContactId(contactId: string, options?: { signal?: AbortSignal }): Promise<ContactItem> {\n const resp = await this.http.requestJson<AddProfileResp>({\n method: \"PUT\",\n path: BASE,\n body: contactId,\n signal: options?.signal,\n });\n return unwrapAddProfileContact(resp) as ContactItem;\n }\n\n /**\n * `PUT /api/v1/user/profiles/{profileId}/profileproperties` — обновить расширенные свойства Профиля\n * (цвет, доступность и т.д., см. тип `ProfileProperties`).\n * Возвращает **`torrowObject`** из ответа (если сервер его прислал).\n */\n async updateProfileProperties(\n profileId: string,\n body: ProfileProperties,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject | undefined> {\n const resp = await this.http.requestJson<UpdateProfilePropertiesResp>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(profileId)}/profileproperties`,\n body,\n signal: options?.signal,\n });\n return unwrapTorrowObjectFromProfilePropertiesUpdate(resp) as TorrowObject | undefined;\n }\n\n /** `DELETE /api/v1/user/profiles/{profileId}` — удалить Профиль; возвращает актуальный **`personalContactList`**. */\n async remove(profileId: string, options?: { signal?: AbortSignal }): Promise<ContactItem[]> {\n const resp = await this.http.requestJson<RemoveProfileResp>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(profileId)}`,\n signal: options?.signal,\n });\n return unwrapRemoveProfileList(resp) as ContactItem[];\n }\n}\n","import { getTorrowItemDomainFromTorrowIds } from \"../common/item-type-resolver.js\";\nimport type { TorrowItemDomain } from \"../common/item-type.js\";\nimport type { ViewOrderInput } from \"./types.js\";\n\nexport function getCreateViewDomain(childIds: readonly string[]): TorrowItemDomain {\n return getTorrowItemDomainFromTorrowIds(childIds);\n}\n\nexport function getUpdateViewOrderDomain(\n orderedViews: readonly ViewOrderInput[],\n): TorrowItemDomain {\n const childIds = orderedViews.flatMap(({ childId }) => childId ? [childId] : []);\n return getTorrowItemDomainFromTorrowIds(childIds);\n}\n","import { encodePathSegment } from \"../../util/path.js\";\nimport type { TorrowItemDomain } from \"../common/item-type.js\";\n\nexport function viewDomainPath(domain: TorrowItemDomain): string {\n return `/api/v1/${domain}`;\n}\n\n/** View domain задаёт тип дочернего view и не выводится из `parentId`. */\nexport function viewParentPath(domain: TorrowItemDomain, parentId: string): string {\n return `${viewDomainPath(domain)}/${encodePathSegment(parentId)}`;\n}\n\nexport function viewChildPath(\n domain: TorrowItemDomain,\n parentId: string,\n kind: \"user\" | \"pinned\",\n childId: string,\n): string {\n return `${viewParentPath(domain, parentId)}/views/${kind}/${encodePathSegment(childId)}`;\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n unwrapCreatedViewInfoList,\n unwrapDeleteCount,\n unwrapUpdatedViewInfoList,\n} from \"../common/facade-response-unwrap.js\";\nimport { getTorrowItemDomainFromTorrowId } from \"../common/item-type-resolver.js\";\nimport { getTorrowItemDomain } from \"../common/item-type.js\";\nimport type {\n CreateViewListReq,\n CreateViewListResp,\n DeleteResponse,\n TorrowItemType,\n TorrowItemView,\n TorrowItemViewByTypeMap,\n UpdateViewListOrderReq,\n UpdateViewListOrderResp,\n ViewInfo,\n ViewListQuery,\n ViewOrderInput,\n} from \"./types.js\";\nimport {\n getCreateViewDomain,\n getUpdateViewOrderDomain,\n} from \"./view-domain-resolver.js\";\nimport { viewChildPath, viewParentPath } from \"./view-paths.js\";\n\n/** Закреплённые представления (`views/pinned`). */\nexport class PinnedViewsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Возвращает закреплённые представления дочерних элементов одного типа под указанным родителем.\n *\n * `childItemType` задаёт `{domain}` и тип элементов в результате. Это тип дочернего\n * элемента, а не родителя: один `parentId` может содержать представления разных типов,\n * поэтому вывести этот параметр из `parentId` нельзя.\n *\n * @param childItemType Тип дочерних элементов, представления которых нужно получить.\n * @param parentId ID родительского объекта, под которым размещены элементы.\n */\n listForParent<T extends TorrowItemType>(\n childItemType: T,\n parentId: string,\n options?: ViewListQuery & { signal?: AbortSignal },\n ): Promise<TorrowItemViewByTypeMap[T][]> {\n const { signal, ...query } = options ?? {};\n const domain = getTorrowItemDomain(childItemType);\n return this.http.requestJson({\n method: \"GET\",\n path: `${viewParentPath(domain, parentId)}/views/pinned`,\n query: { ...query },\n signal,\n });\n }\n\n /**\n * Создаёт закреплённые представления дочерних элементов под родителем.\n * `{domain}` определяется по `childIds`; все ID должны относиться к одному типу элементов.\n */\n async create(\n parentId: string,\n childIds: readonly string[],\n options?: { signal?: AbortSignal },\n ): Promise<ViewInfo[]> {\n const domain = getCreateViewDomain(childIds);\n const body: CreateViewListReq = { childIdList: [...childIds] };\n const resp = await this.http.requestJson<CreateViewListResp>({\n method: \"POST\",\n path: `${viewParentPath(domain, parentId)}/views/pinned`,\n body,\n signal: options?.signal,\n });\n return unwrapCreatedViewInfoList(resp);\n }\n\n /**\n * Возвращает закреплённое представление дочернего элемента.\n * `{domain}` определяется по `childId`, а не по `parentId`.\n */\n get(\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItemView> {\n const domain = getTorrowItemDomainFromTorrowId(childId);\n return this.http.requestJson({\n method: \"GET\",\n path: viewChildPath(domain, parentId, \"pinned\", childId),\n signal: options?.signal,\n });\n }\n\n /**\n * Удаляет закреплённое представление дочернего элемента.\n * `{domain}` определяется по `childId`, а не по `parentId`.\n */\n async delete(\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<number> {\n const domain = getTorrowItemDomainFromTorrowId(childId);\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: viewChildPath(domain, parentId, \"pinned\", childId),\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /**\n * Изменяет порядок закреплённых представлений одного типа под родителем.\n * `{domain}` определяется по `orderedViews[].childId`; все ID должны иметь один тип.\n */\n async updateOrder(\n parentId: string,\n orderedViews: readonly ViewOrderInput[],\n options?: { signal?: AbortSignal },\n ): Promise<ViewInfo[]> {\n const domain = getUpdateViewOrderDomain(orderedViews);\n const body: UpdateViewListOrderReq = { orderedViewList: [...orderedViews] };\n const resp = await this.http.requestJson<UpdateViewListOrderResp>({\n method: \"POST\",\n path: `${viewParentPath(domain, parentId)}/views/pinned/updateorder`,\n body,\n signal: options?.signal,\n });\n return unwrapUpdatedViewInfoList(resp);\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n unwrapCreatedViewInfoList,\n unwrapDeleteCount,\n unwrapUpdatedViewInfoList,\n} from \"../common/facade-response-unwrap.js\";\nimport { getTorrowItemDomainFromTorrowId } from \"../common/item-type-resolver.js\";\nimport { getTorrowItemDomain } from \"../common/item-type.js\";\nimport type {\n CreateViewListReq,\n CreateViewListResp,\n DeleteResponse,\n TorrowItemType,\n TorrowItemView,\n TorrowItemViewByTypeMap,\n UpdateViewListOrderReq,\n UpdateViewListOrderResp,\n ViewInfo,\n ViewListQuery,\n ViewListRootQuery,\n ViewOrderInput,\n} from \"./types.js\";\nimport {\n getCreateViewDomain,\n getUpdateViewOrderDomain,\n} from \"./view-domain-resolver.js\";\nimport { viewChildPath, viewDomainPath, viewParentPath } from \"./view-paths.js\";\n\n/** Персональные представления текущего пользователя (`views/user`). */\nexport class UserViewsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Возвращает персональные представления дочерних элементов одного типа под родителем.\n *\n * `childItemType` задаёт `{domain}` и тип элементов в результате. Это тип дочернего\n * элемента, а не родителя: один `parentId` может содержать представления разных типов,\n * поэтому вывести этот параметр из `parentId` нельзя.\n *\n * @param childItemType Тип дочерних элементов, представления которых нужно получить.\n * @param parentId ID родительского объекта, под которым размещены элементы.\n */\n listForParent<T extends TorrowItemType>(\n childItemType: T,\n parentId: string,\n options?: ViewListQuery & { signal?: AbortSignal },\n ): Promise<TorrowItemViewByTypeMap[T][]> {\n const { signal, ...query } = options ?? {};\n const domain = getTorrowItemDomain(childItemType);\n return this.http.requestJson({\n method: \"GET\",\n path: `${viewParentPath(domain, parentId)}/views/user`,\n query: { ...query },\n signal,\n });\n }\n\n /**\n * Создаёт персональные представления дочерних элементов под родителем.\n * `{domain}` определяется по `childIds`; все ID должны относиться к одному типу элементов.\n */\n async create(\n parentId: string,\n childIds: readonly string[],\n options?: { signal?: AbortSignal },\n ): Promise<ViewInfo[]> {\n const domain = getCreateViewDomain(childIds);\n const body: CreateViewListReq = { childIdList: [...childIds] };\n const resp = await this.http.requestJson<CreateViewListResp>({\n method: \"POST\",\n path: `${viewParentPath(domain, parentId)}/views/user`,\n body,\n signal: options?.signal,\n });\n return unwrapCreatedViewInfoList(resp);\n }\n\n /**\n * Возвращает все персональные представления дочерних элементов указанного типа.\n * `viewItemType` задаёт `{domain}` и тип элементов в результате.\n */\n listAll<T extends TorrowItemType>(\n viewItemType: T,\n options?: ViewListRootQuery & { signal?: AbortSignal },\n ): Promise<TorrowItemViewByTypeMap[T][]> {\n const { signal, ...query } = options ?? {};\n const domain = getTorrowItemDomain(viewItemType);\n return this.http.requestJson({\n method: \"GET\",\n path: `${viewDomainPath(domain)}/views/user`,\n query: { ...query },\n signal,\n });\n }\n\n /**\n * Возвращает персональное представление дочернего элемента.\n * `{domain}` определяется по `childId`, а не по `parentId`.\n */\n get(\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItemView> {\n const domain = getTorrowItemDomainFromTorrowId(childId);\n return this.http.requestJson({\n method: \"GET\",\n path: viewChildPath(domain, parentId, \"user\", childId),\n signal: options?.signal,\n });\n }\n\n /**\n * Удаляет персональное представление дочернего элемента.\n * `{domain}` определяется по `childId`, а не по `parentId`.\n */\n async delete(\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<number> {\n const domain = getTorrowItemDomainFromTorrowId(childId);\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: viewChildPath(domain, parentId, \"user\", childId),\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /**\n * Изменяет порядок персональных представлений одного типа под родителем.\n * `{domain}` определяется по `orderedViews[].childId`; все ID должны иметь один тип.\n */\n async updateOrder(\n parentId: string,\n orderedViews: readonly ViewOrderInput[],\n options?: { signal?: AbortSignal },\n ): Promise<ViewInfo[]> {\n const domain = getUpdateViewOrderDomain(orderedViews);\n const body: UpdateViewListOrderReq = { orderedViewList: [...orderedViews] };\n const resp = await this.http.requestJson<UpdateViewListOrderResp>({\n method: \"POST\",\n path: `${viewParentPath(domain, parentId)}/views/user/updateorder`,\n body,\n signal: options?.signal,\n });\n return unwrapUpdatedViewInfoList(resp);\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n getTorrowItemDomainFromTorrowId,\n getTorrowItemTypeFromTorrowId,\n} from \"../common/item-type-resolver.js\";\nimport { getTorrowItemDomain } from \"../common/item-type.js\";\nimport type { ObjectInfo } from \"./types.js\";\nimport { PinnedViewsFacade } from \"./PinnedViewsFacade.js\";\nimport { UserViewsFacade } from \"./UserViewsFacade.js\";\nimport { viewChildPath } from \"./view-paths.js\";\n\n/**\n * Представления дочерних элементов под родителем.\n * CRUD разделён на {@link UserViewsFacade} и {@link PinnedViewsFacade}; здесь остаются переходы между ними.\n */\nexport class ViewsFacade {\n readonly user: UserViewsFacade;\n readonly pinned: PinnedViewsFacade;\n\n constructor(private readonly http: HttpClient) {\n this.user = new UserViewsFacade(http);\n this.pinned = new PinnedViewsFacade(http);\n }\n\n /**\n * `POST /api/v1/{domain}/{parentId}/views/user/{childId}/pin` — переход **User → Pinned**.\n * Создание исходной User view: `client.views.user.create` или `client.relations.saveToMindMap`.\n */\n pin(\n parentId: string,\n childId: string,\n options?: { alias?: string | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n const { signal, alias } = options ?? {};\n const domain = getTorrowItemDomainFromTorrowId(childId);\n return this.http.requestJson({\n method: \"POST\",\n path: `${viewChildPath(domain, parentId, \"user\", childId)}/pin`,\n query: { alias },\n signal,\n });\n }\n\n /**\n * Переход **Pinned → User**. Для `contacts` API использует сегмент `pinned`, для остальных доменов — `user`.\n */\n unpin(\n parentId: string,\n childId: string,\n options?: { alias?: string | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n const { signal, alias } = options ?? {};\n const itemType = getTorrowItemTypeFromTorrowId(childId);\n const domain = getTorrowItemDomain(itemType);\n const kind = itemType === \"Contact\" ? \"pinned\" : \"user\";\n return this.http.requestJson({\n method: \"POST\",\n path: `${viewChildPath(domain, parentId, kind, childId)}/unpin`,\n query: { alias },\n signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { TorrowItemDto } from \"../common/dto.js\";\nimport type { CaseView, CalendarView, ContactView, NoteView, ServiceView } from \"../views/types.js\";\nimport type { ResourceView } from \"../services/types.js\";\nimport type {\n AdvisedItemsSearchQuery,\n ContactSearchQuery,\n OrderFilter,\n OrderSearchQuery,\n ItemTextSearchQuery,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/search\";\n\n/**\n * Поиск по API (**OpenAPI** тег **Search**): рекомендации, текстовый поиск по типам элементов,\n * фильтруемый список заказов под родителем.\n *\n * Текстовые `contacts` / `notes` / `calendars` / `cases` / `resources` / `services` —\n * в выдаче только **`PublicAvailable`** / **`PublicWithRequest`**\n * (`Personal` / `Private` / `Link` — нет). Смена: **`updatePublicity`**.\n * Таблица: **`docs/agents/participation-flow.md`** §3.\n */\nexport class SearchFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/search/adviseditems` — `NearLocation` (гео) / `Recommendation`. */\n advisedItems(\n query?: AdvisedItemsSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItemDto[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/adviseditems`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/search/{torrowId}/orders` — заказы (события-заказы) под элементом с фильтром.\n * Тело **`OrderFilter`**; см. также **`examples/node/raw/search-orders-raw.ts`** (сырой `raw.put`).\n */\n orders(\n torrowId: string,\n body: OrderFilter,\n query?: OrderSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<CaseView[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/orders`,\n query: { ...(query ?? {}) },\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/contacts` — текстовый поиск контактов.\n * Индексируются только **`PublicAvailable`** / **`PublicWithRequest`** (см. class JSDoc).\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps —\n * «поиск в группе» / `SearchInGroup`). Канонический способ получить элементы группы;\n * не путать с `contacts.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` / смены publicity индекс асинхронный — в примерах нужна пауза перед вызовом.\n * Доп. фильтр: **`usersOnly`** (`ContactSearchQuery`).\n */\n contacts(\n query?: ContactSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ContactView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/contacts`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/notes` — текстовый поиск заметок.\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps так устроен\n * «поиск в группе» / `SearchInGroup`). Это канонический способ получить элементы группы;\n * не путать с `notes.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` индекс асинхронный — в примерах нужна пауза перед вызовом.\n */\n notes(query?: ItemTextSearchQuery, options?: { signal?: AbortSignal }): Promise<NoteView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/notes`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/calendars` — текстовый поиск календарей.\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps —\n * «поиск в группе» / `SearchInGroup`). Канонический способ получить элементы группы;\n * не путать с `calendars.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` индекс асинхронный — в примерах нужна пауза перед вызовом.\n */\n calendars(\n query?: ItemTextSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<CalendarView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/calendars`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/cases` — текстовый поиск дел/событий.\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps —\n * «поиск в группе» / `SearchInGroup`). Канонический способ получить элементы группы;\n * не путать с `cases.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` индекс асинхронный — в примерах нужна пауза перед вызовом.\n */\n cases(query?: ItemTextSearchQuery, options?: { signal?: AbortSignal }): Promise<CaseView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/cases`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/resources` — текстовый поиск ресурсов.\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps —\n * «поиск в группе» / `SearchInGroup`). Канонический способ получить элементы группы;\n * не путать с `resourceItems.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` индекс асинхронный — в примерах нужна пауза перед вызовом.\n */\n resources(\n query?: ItemTextSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ResourceView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/resources`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/services` — текстовый поиск услуг.\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps —\n * «поиск в группе» / `SearchInGroup`). Канонический способ получить элементы группы;\n * не путать с `services.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` индекс асинхронный — в примерах нужна пауза перед вызовом.\n */\n services(\n query?: ItemTextSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ServiceView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/services`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type { ActionHistoryInfo, ActionHistoryListQuery } from \"./types.js\";\n\nconst BASE = \"/api/v1/actionhistory\";\n\n/** История действий пользователя/системы (OpenAPI tag `ActionHistory`). */\nexport class ActionHistoryFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `GET /api/v1/actionhistory`.\n * Query: {@link ActionHistoryListQuery} — на шлюзе нужен непустой `language`;\n * `itemIds` фильтрует по элементам (без него — лента пользователя).\n */\n list(\n query?: ActionHistoryListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ActionHistoryInfo[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: BASE,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { DeleteResponse } from \"../contacts/types.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type {\n AccountingTransaction,\n AccountingTransactionState,\n AccountingTransactionsListQuery,\n BalanceValue,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/accountingtransactions\";\n\n/**\n * Учётные транзакции (**OpenAPI** **AccountingTransaction**): CRUD, смена состояния, баланс, список транзакций.\n */\nexport class AccountingTransactionsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/accountingtransactions` */\n create(\n transaction: AccountingTransaction,\n options?: { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<AccountingTransaction> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { securityToken: options?.securityToken },\n body: transaction,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/accountingtransactions/{transaction.id}` */\n update(\n transaction: AccountingTransaction,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<AccountingTransaction> {\n const transactionId = requireItemUpdateId(transaction, \"Accounting transaction\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(transactionId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body: transaction,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/accountingtransactions/{torrowId}` */\n async delete(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /**\n * `PUT /api/v1/accountingtransactions/{torrowId}/state` — смена **`AccountingTransactionState`**\n * (в query **`state`**).\n */\n updateState(\n torrowId: string,\n state: AccountingTransactionState,\n options?: {\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<AccountingTransaction> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/state`,\n query: {\n state,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/accountingtransactions/{torrowId}/balance` */\n getBalance(\n torrowId: string,\n options?: { balanceDate?: string | null; securityToken?: string | null; signal?: AbortSignal },\n ): Promise<BalanceValue[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/balance`,\n query: {\n balanceDate: options?.balanceDate,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/accountingtransactions/{torrowId}/transactions` */\n listTransactions(\n torrowId: string,\n query?: AccountingTransactionsListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<AccountingTransaction[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/transactions`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type {\n AnnouncementInfo,\n AnnouncementsListQuery,\n TorrowObject,\n UpdateAnnouncementStateReq,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/announcements\";\n\n/**\n * Объявления (**OpenAPI** **Announcement**): список и массовое обновление состояния.\n */\nexport class AnnouncementsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `GET /api/v1/announcements`.\n * На шлюзе нужны **`language`** и **`state`/`stateList`** (иначе 500 или пустой список) —\n * см. **`AnnouncementsListQuery`** / MCP **`AnnouncementsListQuery`**.\n */\n list(query?: AnnouncementsListQuery, options?: { signal?: AbortSignal }): Promise<AnnouncementInfo[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: BASE,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/announcements/updatestate` */\n updateState(\n body: UpdateAnnouncementStateReq[],\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject[]> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/updatestate`,\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type {\n ExportGraph,\n ExportRequest,\n ImportByFileRequest,\n ImportByUniqueNameRequest,\n TorrowItem,\n} from \"./types.js\";\n\n/**\n * Экспорт / импорт графа элементов (**OpenAPI** **ExportImport**).\n */\nexport class ExportImportFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/export` */\n exportSubgraph(body: ExportRequest, options?: { signal?: AbortSignal }): Promise<ExportGraph> {\n return this.http.requestJson({\n method: \"POST\",\n path: \"/api/v1/export\",\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/import` */\n importFromFile(body: ImportByFileRequest, options?: { signal?: AbortSignal }): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: \"/api/v1/import\",\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/importbyuniquename` */\n importByUniqueName(\n body: ImportByUniqueNameRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: \"/api/v1/importbyuniquename\",\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { GenerateReportReq, GenerateReportResp } from \"./types.js\";\n\nconst BASE = \"/api/v1/reports\";\n\n/**\n * Отчёты (**OpenAPI** тег **Report**): генерация ссылки / доставка по **`GenerateReportReq`**.\n */\nexport class ReportsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `POST /api/v1/reports` — опционально **`profileId`** в query (как в Swagger).\n */\n generate(\n body: GenerateReportReq,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<GenerateReportResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/reports/{profileId}` */\n generateForProfile(\n profileId: string,\n body: GenerateReportReq,\n options?: { signal?: AbortSignal },\n ): Promise<GenerateReportResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(profileId)}`,\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type { DeleteResponse } from \"../contacts/types.js\";\nimport { unwrapDeleteCount, unwrapLoyaltySystemsStatisticsList } from \"../common/facade-response-unwrap.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemCoreFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { LoyaltySystemPersonalListQuery } from \"../loyalty/loyalty-personal-list-query.js\";\nimport type { LoyaltyCardItem } from \"../loyalty-cards/types.js\";\nimport type {\n CreateLoyaltyCardReq,\n GetParticipationCountResp,\n GetLoyaltySystemsStatisticsReq,\n GetLoyaltySystemsStatisticsResp,\n LoyaltyParticipantsQuery,\n LoyaltySystemsStatisticsResp,\n LoyaltySystemItem,\n LoyaltySystemItemForCreateOrUpdate,\n SearchLoyaltyCardsReq,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/loyaltysystems\";\n\n/**\n * Программы лояльности (**OpenAPI** **LoyaltySystem**): CRUD, персональный список, выпуск карты, статистика.\n * Общий item-слой — {@link TorrowItemCoreFacade} (без эндпоинтов, которых нет в Swagger loyaltysystems).\n */\nexport class LoyaltySystemsFacade extends TorrowItemCoreFacade<LoyaltySystemItem, LoyaltyParticipantsQuery> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.LoyaltySystem;\n\n constructor(http: HttpClient) {\n super(http, BASE);\n }\n\n /** Id программы лояльности до `create` / presigned upload. */\n generateLoyaltySystemId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/loyaltysystems` */\n create(\n body: LoyaltySystemItemForCreateOrUpdate,\n options?: { parentId?: string | null; profileId?: string | null; signal?: AbortSignal },\n ): Promise<LoyaltySystemItem> {\n const payload = applyItemCreateDefaults(body, Discriminator.LoyaltySystemItem);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { parentId: options?.parentId, profileId: options?.profileId },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/loyaltysystems/{body.id}` */\n update(\n body: LoyaltySystemItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltySystemItem> {\n const itemId = requireItemUpdateId(body, \"Loyalty system\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltysystems/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/loyaltysystems/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildItems?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltySystemItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildItems: options?.includeChildItems,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltysystems/personallist` */\n listPersonal(\n options?: LoyaltySystemPersonalListQuery & { signal?: AbortSignal },\n ): Promise<LoyaltySystemItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltysystems/personallist/{torrowId}` */\n deleteFromPersonalList(torrowId: string, options?: { signal?: AbortSignal }): Promise<void> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/personallist/${encodePathSegment(torrowId)}`,\n signal: options?.signal,\n });\n }\n\n /**\n * `POST /api/v1/loyaltysystems/{loyaltySystemId}/loyaltycard` — выпуск **`LoyaltyCardItem`**.\n * Тело **`CreateLoyaltyCardReq`**: обязателен **`profileId`**; **`basisItemId`** — id элемента-основания\n * (напр. заказ), от которого создают карту и абонемент (MCP **`CreateLoyaltyCardReq`**).\n */\n createLoyaltyCard(\n loyaltySystemId: string,\n body: CreateLoyaltyCardReq,\n options?: { signal?: AbortSignal },\n ): Promise<LoyaltyCardItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(loyaltySystemId)}/loyaltycard`,\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `POST /api/v1/loyaltysystems/{torrowId}/loyaltycards` — поиск карт в программе\n * (**`SearchLoyaltyCardsReq`**: `text`, `filter`, `sort`, `take`/`skip`, …).\n * В torrow-apps: `LoyaltySystemItemService.searchLoyaltyCards` / `SearchLoyaltyCardsTask`.\n */\n searchLoyaltyCards(\n torrowId: string,\n body: SearchLoyaltyCardsReq,\n options?: { signal?: AbortSignal },\n ): Promise<LoyaltyCardItem[]> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/loyaltycards`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/loyaltysystems/statistics` */\n async postStatistics(\n body: GetLoyaltySystemsStatisticsReq,\n options?: { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<LoyaltySystemsStatisticsResp[]> {\n const resp = await this.http.requestJson<GetLoyaltySystemsStatisticsResp>({\n method: \"POST\",\n path: `${BASE}/statistics`,\n query: { securityToken: options?.securityToken },\n body,\n signal: options?.signal,\n });\n return unwrapLoyaltySystemsStatisticsList(resp);\n }\n\n /** `GET /api/v1/loyaltysystems/{torrowId}/participants/count` */\n getParticipantsCount(\n torrowId: string,\n query?: {\n participantStateList?: LoyaltyParticipantsQuery[\"participantStateList\"];\n participantTypeList?: LoyaltyParticipantsQuery[\"participantTypeList\"];\n },\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/participants/count`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount, unwrapTimetableStatisticsList } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type { DeleteResponse, NotificationWay } from \"../contacts/types.js\";\nimport { TorrowItemCoreFacade } from \"../common/item-social-facet-base.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { LoyaltyPersonalListQuery } from \"../loyalty/loyalty-personal-list-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n TimetableCase,\n TimetableFilter,\n TimetableStatisticsResp,\n} from \"../services/types.js\";\nimport type {\n AccountingTransaction,\n BalanceValue,\n CreateLoyaltyCardSubscriptionReq,\n GetParticipationCountResp,\n LoyaltyCardItem,\n LoyaltyCardItemForCreateOrUpdate,\n LoyaltyCardSubscription,\n LoyaltyParticipantsQuery,\n LoyaltyTransactionsQuery,\n ObjectInfo,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/loyaltycards\";\n\nconst LOYALTY_CARD_SOCIAL_OPTS = { withGroupListEndpoint: false as const };\n\n/**\n * Карты лояльности (**OpenAPI** **LoyaltyCard**). Создание — через **`LoyaltySystems.createLoyaltyCard`**;\n * здесь CRUD-часть (без `POST` корня), персональный список, presigned image.\n * Общий item-слой — {@link TorrowItemCoreFacade} (`GET .../group/list` в OpenAPI нет → {@link TorrowItemFacadeOptions.withGroupListEndpoint}).\n */\nexport class LoyaltyCardsFacade extends TorrowItemCoreFacade<LoyaltyCardItem, LoyaltyParticipantsQuery> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.LoyaltyCard;\n\n constructor(http: HttpClient) {\n super(http, BASE, LOYALTY_CARD_SOCIAL_OPTS);\n }\n\n /** Id карты лояльности до `create` / presigned upload. */\n generateLoyaltyCardId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/loyaltycards/{loyaltyCardId}/subscription` */\n createSubscription(\n loyaltyCardId: string,\n body: CreateLoyaltyCardSubscriptionReq,\n options?: { signal?: AbortSignal },\n ): Promise<LoyaltyCardSubscription> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(loyaltyCardId)}/subscription`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/participants/count` */\n getParticipantsCount(\n torrowId: string,\n query?: {\n participantStateList?: LoyaltyParticipantsQuery[\"participantStateList\"];\n participantTypeList?: LoyaltyParticipantsQuery[\"participantTypeList\"];\n },\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/participants/count`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/balance` */\n getBalance(\n torrowId: string,\n options?: { balanceDate?: Date | null; securityToken?: string | null; signal?: AbortSignal },\n ): Promise<BalanceValue[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/balance`,\n query: {\n balanceDate: options?.balanceDate,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/transactions` */\n listTransactions(\n torrowId: string,\n query?: LoyaltyTransactionsQuery,\n options?: { signal?: AbortSignal },\n ): Promise<AccountingTransaction[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/transactions`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/subscriptions/{subscriptionId}/balance` */\n getSubscriptionBalance(\n torrowId: string,\n subscriptionId: string,\n options?: { balanceDate?: Date | null; securityToken?: string | null; signal?: AbortSignal },\n ): Promise<BalanceValue[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/subscriptions/${encodePathSegment(subscriptionId)}/balance`,\n query: {\n balanceDate: options?.balanceDate,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/subscriptions/{subscriptionId}/transactions` */\n getSubscriptionTransactions(\n torrowId: string,\n subscriptionId: string,\n query?: LoyaltyTransactionsQuery,\n options?: { signal?: AbortSignal },\n ): Promise<AccountingTransaction[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/subscriptions/${encodePathSegment(subscriptionId)}/transactions`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/loyaltycards/{body.id}` */\n update(\n body: LoyaltyCardItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltyCardItem> {\n const itemId = requireItemUpdateId(body, \"Loyalty card\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltycards/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildItems?: boolean | null;\n includeBalance?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltyCardItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildItems: options?.includeChildItems,\n includeBalance: options?.includeBalance,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/personallist` */\n listPersonal(\n options?: LoyaltyPersonalListQuery & { signal?: AbortSignal },\n ): Promise<LoyaltyCardItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltycards/personallist/{torrowId}` */\n deleteFromPersonalList(torrowId: string, options?: { signal?: AbortSignal }): Promise<void> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/personallist/${encodePathSegment(torrowId)}`,\n signal: options?.signal,\n });\n }\n\n /**\n * Расписание по карте — `PUT /api/v1/loyaltycards/{torrowId}/timetable`.\n * В torrow-apps: `LoyaltyCardClient.getTimetable`.\n */\n getTimetable(\n torrowId: string,\n body: TimetableFilter,\n options?: TimetableQueryOptions & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /** `POST /api/v1/loyaltycards/timetable/statistics` */\n async getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableStatisticsResp[]> {\n const resp = await this.http.requestJson<GetTimetableStatisticsResponse>({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n return unwrapTimetableStatisticsList(resp);\n }\n\n /**\n * `PUT /api/v1/loyaltycards/{itemId}/notificationwaylist` — в OpenAPI есть у **loyaltycards**, но не у **loyaltysystems**,\n * поэтому метод не вынесен в общий {@link TorrowItemCoreFacade}.\n */\n updateNotificationWayList(\n itemId: string,\n ways: NotificationWay[],\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}/notificationwaylist`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: ways,\n signal: options?.signal,\n });\n }\n}\n","import type { JsonValue } from \"./json.js\";\n\n/**\n * OpenAPI хранит `DeviceSettingsInfo.settings` / `UserSettingsInfo.settings` как **string**;\n * публичный SDK API отдаёт/принимает {@link JsonValue} (`null`, если пусто/не JSON).\n */\n\n/** Wire-строка → JSON; пустая / невалидная → `null`. */\nexport function parseOpaqueJsonSettings(raw: string | null | undefined): JsonValue | null {\n if (raw == null) return null;\n const trimmed = String(raw).trim();\n if (trimmed === \"\") return null;\n try {\n return JSON.parse(trimmed) as JsonValue;\n } catch {\n return null;\n }\n}\n\n/**\n * JSON → wire-строка для query/body.\n * `null` / `undefined` → пустая строка (на чтении снова станет `null`).\n */\nexport function stringifyOpaqueJsonSettings(value: JsonValue | null | undefined): string {\n if (value === undefined || value === null) return \"\";\n return JSON.stringify(value);\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n parseOpaqueJsonSettings,\n stringifyOpaqueJsonSettings,\n} from \"../../util/opaque-json-settings.js\";\nimport type { UserSettingsInfoDto } from \"./dto.js\";\nimport type { TorrowObject, UserSettingsInfo } from \"./types.js\";\n\nconst BASE = \"/api/v1/user/settings\";\n\n/**\n * Настройки пользователя (User API).\n * OpenAPI: `GET /api/v1/user/settings`, `PUT /api/v1/user/settings/update`.\n * Публично `settings` — JSON; на wire — string (`null`/невалидное → `null` при чтении).\n */\nexport class UserSettingsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/user/settings` — `settings` как JSON (`null` если пусто/не распарсилось). */\n async get(options?: { signal?: AbortSignal }): Promise<UserSettingsInfo> {\n const dto = await this.http.requestJson<UserSettingsInfoDto>({\n method: \"GET\",\n path: BASE,\n signal: options?.signal,\n });\n return { settings: parseOpaqueJsonSettings(dto.settings) };\n }\n\n /**\n * `PUT /api/v1/user/settings/update` — принимает JSON в `settings`, на wire уходит string.\n * `null`/`undefined` → `settings: null` в теле.\n */\n update(body: UserSettingsInfo, options?: { signal?: AbortSignal }): Promise<TorrowObject> {\n const wire: UserSettingsInfoDto = {\n settings:\n body.settings === undefined || body.settings === null\n ? null\n : stringifyOpaqueJsonSettings(body.settings),\n };\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/update`,\n body: wire,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport {\n parseOpaqueJsonSettings,\n stringifyOpaqueJsonSettings,\n} from \"../../util/opaque-json-settings.js\";\nimport {\n unwrapAddProfileContact,\n unwrapDeletedUserAccountCount,\n unwrapDeleteCount,\n} from \"../common/facade-response-unwrap.js\";\nimport type { DeviceSettingsInfoDto, LoyaltyCardItemDto } from \"./dto.js\";\nimport type { ContactItem } from \"../contacts/types.js\";\nimport type { UserProfileItemForAdd } from \"../user-profiles/types.js\";\nimport { prepareUserProfileItemForAdd } from \"../user-profiles/user-profile-write-defaults.js\";\nimport type {\n Account,\n AddProfileResp,\n CompleteAddingAccountReq,\n CompleteDeletingUserReq,\n CompleteDeletingUserResp,\n DeleteResponse,\n DeleteUserAccountReq,\n DeleteUserAccountResp,\n DeliveryChannel,\n DeviceInfo,\n DeviceSettingsInfo,\n DeviceType,\n InitAddingAccountReq,\n InitAddingAccountResp,\n InitDeletingUserResp,\n JsonValue,\n NotificationWay,\n RegisterUserForAccountResp,\n RegistrationUserInfo,\n TimetableCase,\n TimetableFilter,\n TorrowObject,\n UserAccountsQuery,\n UserCalendar,\n UserDeliveryWay,\n UserTimetableQuery,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/user\";\n\nexport class UserFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/user/loyaltycard` */\n getLoyaltyCard(options?: { signal?: AbortSignal }): Promise<LoyaltyCardItemDto> {\n return this.http.requestJson({ method: \"GET\", path: `${BASE}/loyaltycard`, signal: options?.signal });\n }\n\n /** `GET /api/v1/user/accounts` */\n listAccounts(query?: UserAccountsQuery, options?: { signal?: AbortSignal }): Promise<Account[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/accounts`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/user/accounts/add/init` */\n initAddAccount(body: InitAddingAccountReq, options?: { signal?: AbortSignal }): Promise<InitAddingAccountResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/accounts/add/init`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/user/accounts/add/complete` */\n completeAddAccount(body: CompleteAddingAccountReq, options?: { signal?: AbortSignal }): Promise<Account> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/accounts/add/complete`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/accounts/delete` */\n async deleteAccount(body: DeleteUserAccountReq, options?: { signal?: AbortSignal }): Promise<number> {\n const resp = await this.http.requestJson<DeleteUserAccountResp>({\n method: \"DELETE\",\n path: `${BASE}/accounts/delete`,\n body,\n signal: options?.signal,\n });\n return unwrapDeletedUserAccountCount(resp);\n }\n\n /** `GET /api/v1/user/devices` */\n listDevices(\n query?: { deviceTypes?: DeviceType[] },\n options?: { signal?: AbortSignal },\n ): Promise<DeviceInfo[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/devices`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/devices/{deviceId}` */\n async deleteDevice(deviceId: string, options?: { signal?: AbortSignal }): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/devices/${encodePathSegment(deviceId)}`,\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/user/devices/{deviceId}/settings` — `settings` как JSON (`null` если не распарсилось). */\n async getDeviceSettings(\n deviceId: string,\n options?: { signal?: AbortSignal },\n ): Promise<DeviceSettingsInfo> {\n const dto = await this.http.requestJson<DeviceSettingsInfoDto>({\n method: \"GET\",\n path: `${BASE}/devices/${encodePathSegment(deviceId)}/settings`,\n signal: options?.signal,\n });\n return {\n deviceId: dto.deviceId ?? null,\n settings: parseOpaqueJsonSettings(dto.settings),\n };\n }\n\n /**\n * `PUT /api/v1/user/devices/{deviceId}/settings` — принимает JSON, на wire уходит string в query.\n * `null`/`undefined` → `\"{}\"` (пустой query `settings=` шлюз отклоняет VALIDATION_FAILED).\n */\n updateDeviceSettings(\n deviceId: string,\n settings: JsonValue | null,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject> {\n // Пустая строка в query не проходит валидацию; «сброс» = пустой JSON-объект.\n const wire =\n settings === null || settings === undefined ? \"{}\" : stringifyOpaqueJsonSettings(settings);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/devices/${encodePathSegment(deviceId)}/settings`,\n query: { settings: wire },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/defaultprofile` */\n getDefaultProfile(options?: { signal?: AbortSignal }): Promise<ContactItem> {\n return this.http.requestJson<ContactItem>({ method: \"GET\", path: `${BASE}/defaultprofile`, signal: options?.signal });\n }\n\n /** `PUT /api/v1/user/defaultprofile` */\n async setDefaultProfileByContactId(contactId: string, options?: { signal?: AbortSignal }): Promise<ContactItem> {\n const resp = await this.http.requestJson<AddProfileResp>({\n method: \"PUT\",\n path: `${BASE}/defaultprofile`,\n body: contactId,\n signal: options?.signal,\n });\n return unwrapAddProfileContact(resp) as ContactItem;\n }\n\n /**\n * `POST /api/v1/user/defaultprofile` — создать и назначить дефолтный профиль.\n * Тело перед POST проходит через {@link prepareUserProfileItemForAdd} (как у `profiles.add`).\n */\n async createDefaultProfile(\n body: UserProfileItemForAdd,\n options?: { signal?: AbortSignal },\n ): Promise<ContactItem> {\n const payload = prepareUserProfileItemForAdd(body);\n const resp = await this.http.requestJson<AddProfileResp>({\n method: \"POST\",\n path: `${BASE}/defaultprofile`,\n body: payload,\n signal: options?.signal,\n });\n return unwrapAddProfileContact(resp) as ContactItem;\n }\n\n /** `GET /api/v1/user/deliveryways` */\n listDeliveryWays(\n query?: { deliveryChannelList?: DeliveryChannel[] },\n options?: { signal?: AbortSignal },\n ): Promise<UserDeliveryWay[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/deliveryways`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/defaultnotificationways` */\n listDefaultNotificationWays(options?: { signal?: AbortSignal }): Promise<NotificationWay[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/defaultnotificationways`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/defaultnotificationways` */\n updateDefaultNotificationWays(\n body: NotificationWay[],\n options?: { versionToCheck?: number; isNeedAnnouncement?: boolean; signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/defaultnotificationways`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/place` */\n updatePlace(\n query: { profileId?: string; placeId?: number },\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/place`,\n query,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/user/register` */\n register(\n body: RegistrationUserInfo,\n options?: { signal?: AbortSignal },\n ): Promise<RegisterUserForAccountResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/register`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/timetable` */\n getTimetable(\n body: TimetableFilter,\n query?: UserTimetableQuery,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/timetable`,\n query: { ...(query ?? {}) },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/calendars` */\n listCalendars(options?: { signal?: AbortSignal }): Promise<UserCalendar[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/calendars`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/calendars/update` */\n updateCalendars(body: UserCalendar[], options?: { signal?: AbortSignal }): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/calendars/update`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/delete/init` */\n initDelete(options?: { signal?: AbortSignal }): Promise<InitDeletingUserResp> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/delete/init`,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/delete/complete` */\n completeDelete(\n body: CompleteDeletingUserReq,\n options?: { signal?: AbortSignal },\n ): Promise<CompleteDeletingUserResp> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/delete/complete`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/count` — публичный счётчик пользователей (без Bearer ок). */\n count(options?: { signal?: AbortSignal }): Promise<number> {\n return this.http.requestJson({ method: \"GET\", path: `${BASE}/count`, signal: options?.signal });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { ApiKeyInfo, CreateApiKeyRequest, CreateApiKeyResponse } from \"./types.js\";\n\nconst BASE = \"/api/v1/apikeys\";\n\n/** API keys (`/api/v1/apikeys`). */\nexport class ApiKeysFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/apikeys` */\n list(options?: { signal?: AbortSignal }): Promise<ApiKeyInfo[]> {\n return this.http.requestJson<ApiKeyInfo[]>({\n method: \"GET\",\n path: BASE,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/apikeys` */\n create(body: CreateApiKeyRequest, options?: { signal?: AbortSignal }): Promise<CreateApiKeyResponse> {\n return this.http.requestJson<CreateApiKeyResponse>({\n method: \"POST\",\n path: BASE,\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/apikeys/{keyId}` */\n delete(keyId: string, options?: { signal?: AbortSignal }): Promise<void> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(keyId)}`,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { BlockReason, BlockReasonListQuery } from \"./types.js\";\n\nconst BASE = \"/api/v1/blockreason\";\n\n/**\n * Справочник причин блокировки (**OpenAPI** `/api/v1/blockreason`).\n */\nexport class BlockReasonsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/blockreason` — создать; ответ: числовой id. */\n create(body: BlockReason, options?: { signal?: AbortSignal }): Promise<number> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/blockreason/{id}` */\n getById(\n id: number,\n options?: { lng?: string | null; signal?: AbortSignal },\n ): Promise<BlockReason> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(String(id))}`,\n query: { lng: options?.lng },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/blockreason/all` */\n listAll(query?: BlockReasonListQuery, options?: { signal?: AbortSignal }): Promise<BlockReason[]> {\n const { signal } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/all`,\n query: { ...(query ?? {}) },\n signal,\n });\n }\n\n /** `DELETE /api/v1/blockreason/{id}` — ответ: число (код/количество по контракту API). */\n delete(id: number, options?: { signal?: AbortSignal }): Promise<number> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(String(id))}`,\n signal: options?.signal,\n });\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport type { AddExternalAuthReq, AddExternalAuthResp, DeleteResponse, ExternalAuth } from \"./types.js\";\n\nconst BASE = \"/api/v1/externalauths\";\n\n/** Внешняя авторизация (`/api/v1/externalauths`). */\nexport class ExternalAuthsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/externalauths` */\n add(body: AddExternalAuthReq, options?: { signal?: AbortSignal }): Promise<AddExternalAuthResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/externalauths/{torrowId}` */\n getById(\n torrowId: string,\n options?: { includeDeleted?: boolean | null; signal?: AbortSignal },\n ): Promise<ExternalAuth> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: { includeDeleted: options?.includeDeleted },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/externalauths/all` */\n listAll(\n options?: PersonalListQuery & { includeDeleted?: boolean | null; signal?: AbortSignal },\n ): Promise<ExternalAuth[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/all`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `DELETE /api/v1/externalauths/{externalAuthId}` */\n async delete(\n externalAuthId: string,\n options?: TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(externalAuthId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapTorrowId } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { GetTorrowIdResp, TorrowObjectType } from \"./types.js\";\n\nconst BASE = \"/api/v1/idgenerator\";\n\n/** Выдача Torrow id по типу объекта — `GET /api/v1/idgenerator/{objectType}`. */\nexport class IdGeneratorFacade {\n constructor(private readonly http: HttpClient) {}\n\n async getNextId(objectType: TorrowObjectType, options?: { signal?: AbortSignal }): Promise<string> {\n const resp = await this.http.requestJson<GetTorrowIdResp>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(String(objectType))}`,\n signal: options?.signal,\n });\n return unwrapTorrowId(resp);\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport type { DeleteResponse, Integration } from \"./types.js\";\n\nconst BASE = \"/api/v1/integrations\";\n\n/** Интеграции (`/api/v1/integrations`). */\nexport class IntegrationsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/integrations` */\n create(body: Integration, options?: { signal?: AbortSignal }): Promise<Integration> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/integrations/{body.id}` */\n update(\n body: Integration,\n options?: { checkVersion?: boolean | null; signal?: AbortSignal },\n ): Promise<Integration> {\n const itemId = requireItemUpdateId(body, \"Integration\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: { checkVersion: options?.checkVersion },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/integrations/list` */\n list(\n options?: {\n integrationIds?: string[] | null;\n includeDeleted?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Integration[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/list`,\n query: {\n integrationIds: options?.integrationIds,\n includeDeleted: options?.includeDeleted,\n },\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/integrations/{integrationId}` */\n async delete(\n integrationId: string,\n options?: TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(integrationId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport type {\n DeleteResponse,\n Feedback,\n ItemFeedback,\n ItemViewSortCondition,\n ParticipationResp,\n UserFeedback,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/item\";\n\n/**\n * Кросс-доменные операции **Item** (отзывы, шаринг-сессия, uniquename).\n * Не путать с CRUD конкретных типов (`contacts`, `services`, …).\n */\nexport class ItemFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * **WIP / do not use in product.** `PUT /api/v1/item/activateshareitemsession/{shareItemSessionId}`.\n * Gateway stub (empty `ParticipationResp`). Unused in torrow-apps UI.\n * Pair with stub `shareItemLink` → empty URL. Fix in monolith, not SDK.\n */\n activateShareItemSession(\n shareItemSessionId: string,\n options?: { userProfileId?: string | null; code?: string | null; signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/activateshareitemsession/${encodePathSegment(shareItemSessionId)}`,\n query: { userProfileId: options?.userProfileId, code: options?.code },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/item/uniquename/{uniqueName}` — ответ: строка (часто id / url по контракту). */\n getByUniqueName(uniqueName: string, options?: { signal?: AbortSignal }): Promise<string> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/uniquename/${encodePathSegment(uniqueName)}`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/item/{torrowId}/userfeedback` */\n getUserFeedback(\n torrowId: string,\n options?: {\n throwExceptionIfNotFound?: boolean | null;\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<UserFeedback> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/userfeedback`,\n query: {\n throwExceptionIfNotFound: options?.throwExceptionIfNotFound,\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/item/{torrowId}/userfeedback` */\n putUserFeedback(\n torrowId: string,\n options?: {\n profileId?: string | null;\n score?: number | null;\n header?: string | null;\n text?: string | null;\n surveyResponse?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<UserFeedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/userfeedback`,\n query: { ...query },\n signal,\n });\n }\n\n /** `DELETE /api/v1/item/{torrowId}/userfeedback` */\n async deleteUserFeedback(\n torrowId: string,\n options?: {\n profileId?: string | null;\n messageId?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<number> {\n const { signal, ...query } = options ?? {};\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}/userfeedback`,\n query: { ...query },\n signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/item/{torrowId}/feedbacks` */\n listFeedbacks(\n torrowId: string,\n options?: {\n createDateFrom?: Date | null;\n createDateTo?: Date | null;\n scoreFrom?: number | null;\n scoreTo?: number | null;\n profileIdsFilter?: string[] | null;\n take?: number | null;\n skip?: number | null;\n lmfrom?: Date | null;\n lmto?: Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemViewSortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<ItemFeedback[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks`,\n query: { ...query },\n signal,\n });\n }\n\n /** `POST /api/v1/item/{torrowId}/feedbacks/newmessage` */\n postFeedbackNewMessage(\n torrowId: string,\n options?: {\n profileId?: string | null;\n header?: string | null;\n text?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Feedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/newmessage`,\n query: { ...query },\n signal,\n });\n }\n\n /** `GET /api/v1/item/{torrowId}/feedbacks/{messageId}` */\n getFeedback(\n torrowId: string,\n messageId: string,\n options?: { versionToCheck?: number | null; includeDeleted?: boolean | null; signal?: AbortSignal },\n ): Promise<Feedback> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/item/{torrowId}/feedbacks/{messageId}` */\n updateFeedback(\n torrowId: string,\n messageId: string,\n options?: {\n profileId?: string | null;\n header?: string | null;\n text?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Feedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}`,\n query: { ...query },\n signal,\n });\n }\n\n /** `DELETE /api/v1/item/{torrowId}/feedbacks/{messageId}` */\n async deleteFeedback(\n torrowId: string,\n messageId: string,\n options?: TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `POST /api/v1/item/{torrowId}/feedbacks/{messageId}/reply` */\n replyToFeedback(\n torrowId: string,\n messageId: string,\n options?: {\n profileId?: string | null;\n header?: string | null;\n text?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Feedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}/reply`,\n query: { ...query },\n signal,\n });\n }\n\n /** `GET /api/v1/item/{torrowId}/feedbacks/{messageId}/replies` — массив **`Feedback`** (не `ItemFeedback`). */\n listFeedbackReplies(\n torrowId: string,\n messageId: string,\n options?: {\n createDateFrom?: Date | null;\n createDateTo?: Date | null;\n profileIdsFilter?: string[] | null;\n take?: number | null;\n skip?: number | null;\n lmfrom?: Date | null;\n lmto?: Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemViewSortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<Feedback[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}/replies`,\n query: { ...query },\n signal,\n });\n }\n}\n","import { buildAuthHeaders } from \"../../http/auth.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { joinBaseUrlAndPath } from \"../../util/url.js\";\nimport type { ResolvedTorrowClientConfig } from \"../../TorrowClientConfig.js\";\nimport { DEFAULT_TORROW_API_BASE_URL } from \"../../TorrowClientConfig.js\";\n\nconst BASE = \"/api/v1/u\";\n\n/** Литерал для `scripts/gap-openapi-facades.mjs` (совпадение с `GET /api/v1/u/{shortUrl}`). */\nconst _GAP_SDK_PATH_REDIRECT = \"/api/v1/u/{p}\";\nvoid _GAP_SDK_PATH_REDIRECT;\n\n/**\n * Короткие ссылки (`/api/v1/u/*`).\n * `getFull` — JSON-строка цели; `getRedirectLocation` — `Location` при `redirect: manual` (302).\n */\nexport class ShortUrlFacade {\n constructor(\n private readonly http: HttpClient,\n private readonly config: ResolvedTorrowClientConfig,\n ) {}\n\n /** `GET /api/v1/u/{shortUrl}/full` */\n getFull(shortUrl: string, options?: { signal?: AbortSignal }): Promise<string> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(shortUrl)}/full`,\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/u/{shortUrl}` — обычно **302 Redirect**.\n * Возвращает заголовок `Location` без следования редиректу.\n */\n async getRedirectLocation(shortUrl: string, options?: { signal?: AbortSignal }): Promise<string | null> {\n const fetchFn = this.config.fetch ?? globalThis.fetch;\n const origin = this.config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL;\n const url = joinBaseUrlAndPath(origin, `${BASE}/${encodePathSegment(shortUrl)}`);\n const authHeaders = await buildAuthHeaders(this.config);\n const res = await fetchFn(url, {\n method: \"GET\",\n redirect: \"manual\",\n headers: {\n Accept: \"*/*\",\n ...authHeaders,\n ...this.config.defaultHeaders,\n },\n signal: options?.signal,\n });\n return res.headers.get(\"Location\");\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type { DictionarySortCondition, Hobby, Place } from \"./types.js\";\n\nconst BASE = \"/api/v1/thesaurus\";\n\n/** Справочники мест и хобби (`/api/v1/thesaurus/*`). */\nexport class ThesaurusFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/thesaurus/places` */\n listPlaces(\n options?: {\n lat?: number | null;\n lon?: number | null;\n r?: number | null;\n txt?: string | null;\n lng?: string | null;\n take?: number | null;\n skip?: number | null;\n includeDeleted?: boolean | null;\n sort?: DictionarySortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<Place[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/places`,\n query: { ...query },\n signal,\n });\n }\n\n /** `GET /api/v1/thesaurus/hobbies` */\n listHobbies(\n options?: {\n lng?: string | null;\n take?: number | null;\n skip?: number | null;\n includeDeleted?: boolean | null;\n sort?: DictionarySortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<Hobby[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/hobbies`,\n query: { ...query },\n signal,\n });\n }\n}\n","import { HttpClient } from \"./http/HttpClient.js\";\nimport { RawClient } from \"./raw/RawClient.js\";\nimport { CalendarsFacade } from \"./resources/calendars/CalendarsFacade.js\";\nimport { CasesFacade } from \"./resources/cases/CasesFacade.js\";\nimport { ContactsFacade } from \"./resources/contacts/ContactsFacade.js\";\nimport { ContextsFacade } from \"./resources/contexts/ContextsFacade.js\";\nimport { NotesFacade } from \"./resources/notes/NotesFacade.js\";\nimport { RelationsFacade } from \"./resources/relations/RelationsFacade.js\";\nimport { ResourcesFacade } from \"./resources/resources/ResourcesFacade.js\";\nimport { ServicesFacade } from \"./resources/services/ServicesFacade.js\";\nimport { AuthFacade } from \"./resources/auth/AuthFacade.js\";\nimport { ProfilesFacade } from \"./resources/user-profiles/ProfilesFacade.js\";\nimport { ViewsFacade } from \"./resources/views/ViewsFacade.js\";\nimport { SearchFacade } from \"./resources/search/SearchFacade.js\";\nimport { ActionHistoryFacade } from \"./resources/action-history/ActionHistoryFacade.js\";\nimport { AccountingTransactionsFacade } from \"./resources/accounting-transactions/AccountingTransactionsFacade.js\";\nimport { AnnouncementsFacade } from \"./resources/announcements/AnnouncementsFacade.js\";\nimport { ExportImportFacade } from \"./resources/export-import/ExportImportFacade.js\";\nimport { ReportsFacade } from \"./resources/reports/ReportsFacade.js\";\nimport { LoyaltySystemsFacade } from \"./resources/loyalty-systems/LoyaltySystemsFacade.js\";\nimport { LoyaltyCardsFacade } from \"./resources/loyalty-cards/LoyaltyCardsFacade.js\";\nimport { UserSettingsFacade } from \"./resources/user-settings/UserSettingsFacade.js\";\nimport { UserFacade } from \"./resources/user/UserFacade.js\";\nimport { ApiKeysFacade } from \"./resources/api-keys/ApiKeysFacade.js\";\nimport { BlockReasonsFacade } from \"./resources/block-reason/BlockReasonsFacade.js\";\nimport { ExternalAuthsFacade } from \"./resources/external-auths/ExternalAuthsFacade.js\";\nimport { IdGeneratorFacade } from \"./resources/id-generator/IdGeneratorFacade.js\";\nimport { IntegrationsFacade } from \"./resources/integrations/IntegrationsFacade.js\";\nimport { ItemFacade } from \"./resources/item/ItemFacade.js\";\nimport { ShortUrlFacade } from \"./resources/short-url/ShortUrlFacade.js\";\nimport { ThesaurusFacade } from \"./resources/thesaurus/ThesaurusFacade.js\";\nimport {\n DEFAULT_TORROW_API_BASE_URL,\n type ResolvedTorrowClientConfig,\n type TorrowClientConfig,\n} from \"./TorrowClientConfig.js\";\n\nexport type { AuthIdentityBasic, ResolvedTorrowClientConfig, TorrowClientConfig } from \"./TorrowClientConfig.js\";\nexport { DEFAULT_TORROW_API_BASE_URL } from \"./TorrowClientConfig.js\";\n\n/**\n * Main entry: config, `raw` REST, domain facades (item CRUD + `listPersonal`), {@link AuthFacade}, {@link RelationsFacade}, {@link ViewsFacade}, {@link ProfilesFacade}, {@link SearchFacade},\n * {@link ActionHistoryFacade}, {@link AccountingTransactionsFacade}, {@link AnnouncementsFacade}, {@link ExportImportFacade}, {@link ReportsFacade},\n * {@link LoyaltySystemsFacade}, {@link LoyaltyCardsFacade}, {@link UserSettingsFacade}, {@link BlockReasonsFacade},\n * {@link ExternalAuthsFacade}, {@link IntegrationsFacade}, {@link ApiKeysFacade}, {@link IdGeneratorFacade}, {@link ItemFacade}, {@link ThesaurusFacade}, {@link ShortUrlFacade}.\n */\nexport class TorrowClient {\n /**\n * Эффективный конфиг после default `baseUrl` ({@link ResolvedTorrowClientConfig}).\n * В конструктор передавай {@link TorrowClientConfig} (`baseUrl` опционален).\n */\n readonly config: ResolvedTorrowClientConfig;\n readonly http: HttpClient;\n readonly raw: RawClient;\n readonly contacts: ContactsFacade;\n readonly notes: NotesFacade;\n readonly contexts: ContextsFacade;\n /** API domain `Resource` (`/api/v1/resources`), не каталог `src/resources/`. */\n readonly resourceItems: ResourcesFacade;\n readonly services: ServicesFacade;\n readonly cases: CasesFacade;\n readonly calendars: CalendarsFacade;\n /** Поиск по API (тег OpenAPI **Search**): advised items, текстовый поиск по типам, заказы под родителем. */\n readonly search: SearchFacade;\n /** История действий (`/api/v1/actionhistory`). */\n readonly actionHistory: ActionHistoryFacade;\n /** Учётные транзакции (`/api/v1/accountingtransactions`). */\n readonly accountingTransactions: AccountingTransactionsFacade;\n /** Объявления (`/api/v1/announcements`). */\n readonly announcements: AnnouncementsFacade;\n /** Экспорт/импорт графа (`/api/v1/export`, `import`, `importbyuniquename`). */\n readonly exportImport: ExportImportFacade;\n /** Генерация отчётов (`/api/v1/reports`). */\n readonly reports: ReportsFacade;\n /** Программы лояльности (`/api/v1/loyaltysystems`). */\n readonly loyaltySystems: LoyaltySystemsFacade;\n /** Карты лояльности (`/api/v1/loyaltycards`); создание карты — **`loyaltySystems.createLoyaltyCard`**. */\n readonly loyaltyCards: LoyaltyCardsFacade;\n /** Настройки пользователя (`/api/v1/user/settings`). */\n readonly userSettings: UserSettingsFacade;\n /** User endpoints (`/api/v1/user/*`): accounts/devices/default profile/delivery/register/calendars/timetable. */\n readonly user: UserFacade;\n /** Include/exclude в иерархии и группах, mind map (`includeToParent`, `saveToMindMap`, …). */\n readonly relations: RelationsFacade;\n /** Представления под родителем: CRUD в `views.user` / `views.pinned`, переходы через `views.pin` / `views.unpin`. */\n readonly views: ViewsFacade;\n /** Профили пользователя Torrow (`/api/v1/user/profiles`), не CRUD `/api/v1/contacts`. `list` — **`ContactItem[]`**. */\n readonly profiles: ProfilesFacade;\n /** AuthIdentity: `refresh`, `requestToken`, `revoke`, `sendCode`, `createSession` — без Bearer основного клиента. */\n readonly auth: AuthFacade;\n /** Справочник причин блокировки (`/api/v1/blockreason`). */\n readonly blockReasons: BlockReasonsFacade;\n /** Внешняя авторизация (`/api/v1/externalauths`). */\n readonly externalAuths: ExternalAuthsFacade;\n /** Интеграции (`/api/v1/integrations`). */\n readonly integrations: IntegrationsFacade;\n /** API keys (`/api/v1/apikeys`). */\n readonly apiKeys: ApiKeysFacade;\n /** Генерация id (`/api/v1/idgenerator`). */\n readonly idGenerator: IdGeneratorFacade;\n /** Отзывы и шаринг-сессии (`/api/v1/item/...`). */\n readonly item: ItemFacade;\n /** Тезаурус мест/хобби (`/api/v1/thesaurus`). */\n readonly thesaurus: ThesaurusFacade;\n /** Короткие ссылки (`/api/v1/u`). */\n readonly shortUrl: ShortUrlFacade;\n\n constructor(config: TorrowClientConfig) {\n this.config = {\n ...config,\n baseUrl: config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL,\n };\n this.http = new HttpClient(this.config);\n this.raw = new RawClient(this.http);\n this.contacts = new ContactsFacade(this.http);\n this.notes = new NotesFacade(this.http);\n this.contexts = new ContextsFacade(this.http);\n this.resourceItems = new ResourcesFacade(this.http);\n this.services = new ServicesFacade(this.http);\n this.cases = new CasesFacade(this.http);\n this.calendars = new CalendarsFacade(this.http);\n this.search = new SearchFacade(this.http);\n this.actionHistory = new ActionHistoryFacade(this.http);\n this.accountingTransactions = new AccountingTransactionsFacade(this.http);\n this.announcements = new AnnouncementsFacade(this.http);\n this.exportImport = new ExportImportFacade(this.http);\n this.reports = new ReportsFacade(this.http);\n this.loyaltySystems = new LoyaltySystemsFacade(this.http);\n this.loyaltyCards = new LoyaltyCardsFacade(this.http);\n this.userSettings = new UserSettingsFacade(this.http);\n this.user = new UserFacade(this.http);\n this.relations = new RelationsFacade(this.http);\n this.views = new ViewsFacade(this.http);\n this.profiles = new ProfilesFacade(this.http);\n this.auth = new AuthFacade(this.config);\n this.blockReasons = new BlockReasonsFacade(this.http);\n this.externalAuths = new ExternalAuthsFacade(this.http);\n this.integrations = new IntegrationsFacade(this.http);\n this.apiKeys = new ApiKeysFacade(this.http);\n this.idGenerator = new IdGeneratorFacade(this.http);\n this.item = new ItemFacade(this.http);\n this.thesaurus = new ThesaurusFacade(this.http);\n this.shortUrl = new ShortUrlFacade(this.http, this.config);\n }\n}\n","import type { components } from \"../../schema/generated.js\";\n\n/** OpenAPI `AccountType` (`SendCodeReq.type`, `CreateAuthSessionReq.type`, …). */\nexport type AccountType = components[\"schemas\"][\"AccountType\"];\n\n/**\n * Значения OpenAPI enum **`AccountType`**.\n *\n * @example\n * ```ts\n * import { AccountTypeValues } from \"@torrow/sdk-client\";\n * await client.auth.sendCode({ type: AccountTypeValues.Email, accountName });\n * ```\n */\nexport const AccountTypeValues = {\n Undefined: \"Undefined\",\n Phone: \"Phone\",\n Email: \"Email\",\n Telegram: \"Telegram\",\n} as const satisfies Record<string, AccountType>;\n\nexport const AccountTypeValueList: readonly AccountType[] = [\n AccountTypeValues.Undefined,\n AccountTypeValues.Phone,\n AccountTypeValues.Email,\n AccountTypeValues.Telegram,\n];\n\nexport function isAccountType(value: string): value is AccountType {\n return (AccountTypeValueList as readonly string[]).includes(value);\n}\n\nexport function parseAccountType(raw: string | undefined | null): AccountType | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return AccountTypeValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n\n/**\n * Подмножество `AccountType` для OTP **`sendCode`** (не Telegram deep-link / не `Undefined`).\n * Telegram → `createSession`; Undefined Identity на sendCode отвергает.\n */\nexport type SendCodeAccountType = Extract<AccountType, \"Phone\" | \"Email\">;\n\nexport const SendCodeAccountTypeValues = {\n Phone: AccountTypeValues.Phone,\n Email: AccountTypeValues.Email,\n} as const satisfies Record<string, SendCodeAccountType>;\n\nexport const SendCodeAccountTypeValueList: readonly SendCodeAccountType[] = [\n SendCodeAccountTypeValues.Phone,\n SendCodeAccountTypeValues.Email,\n];\n\nexport function isSendCodeAccountType(value: string): value is SendCodeAccountType {\n return (SendCodeAccountTypeValueList as readonly string[]).includes(value);\n}\n\nexport function parseSendCodeAccountType(\n raw: string | undefined | null,\n): SendCodeAccountType | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return SendCodeAccountTypeValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n\n/** OpenAPI `VerificationMethod` (`preferredMethod` / `usedMethod` / `supportedMethods`). */\nexport type VerificationMethod = components[\"schemas\"][\"VerificationMethod\"];\n\n/** Именованные способы подтверждения с неизменными wire-значениями OpenAPI. */\nexport enum VerificationMethodValues {\n /** Неопределённый способ подтверждения; допустим в OTP-flow для Email. */\n UnknownMethod = \"UnknownMethod\",\n /** Подтверждение кодом из SMS. */\n Sms = \"Sms\",\n /** Доставка кода через Telegram Gateway. */\n TelegramGateway = \"TelegramGateway\",\n /** Подтверждение через Flash Call. */\n FlashCall = \"FlashCall\",\n /** Подтверждение через MTS Mobile ID, с возможным SMS fallback. */\n MtsMobileId = \"MtsMobileId\",\n}\n\n/** Все способы подтверждения; список формируется из enum без повторения его членов. */\nexport const VerificationMethodValueList: readonly VerificationMethodValues[] =\n Object.values(VerificationMethodValues);\n\n/** Строго проверяет wire-значение без изменения регистра и пробелов. */\nexport function isVerificationMethod(value: string): value is VerificationMethodValues {\n return VerificationMethodValueList.some((method) => method === value);\n}\n\n/** Разбирает пользовательский ввод, игнорируя регистр и крайние пробелы. */\nexport function parseVerificationMethod(\n raw: string | undefined | null,\n): VerificationMethodValues | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return VerificationMethodValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n\n/** OpenAPI `TokenStatus` (`TokenResp.status`). */\nexport type TokenStatus = components[\"schemas\"][\"TokenStatus\"];\n\n/** Именованные серверные статусы для типизации и проверки переходов аутентификации. */\nexport enum TokenStatusValues {\n /** Аутентификация завершена, сервер выдал токены. */\n TokenReady = \"TokenReady\",\n /** Ожидание завершения Mobile ID; возможен повторный Pending после отправки SMS-кода. */\n Pending = \"Pending\",\n /** Та же Mobile ID auth-сессия продолжается через SMS fallback: Mobile ID не удалось завершить, требуется SMS-код. */\n AwaitingSmsCode = \"AwaitingSmsCode\",\n /** Терминальный отказ текущей auth-сессии. */\n Failed = \"Failed\",\n}\n\nexport const TokenStatusValueList: readonly TokenStatusValues[] = [\n TokenStatusValues.TokenReady,\n TokenStatusValues.Pending,\n TokenStatusValues.AwaitingSmsCode,\n TokenStatusValues.Failed,\n];\n\nexport function isTokenStatus(value: string): value is TokenStatusValues {\n return (TokenStatusValueList as readonly string[]).includes(value);\n}\n\nexport function parseTokenStatus(raw: string | undefined | null): TokenStatus | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return TokenStatusValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n\n/**\n * Готовность токенов: `TokenReady` или отсутствие `status` (legacy).\n * `Pending` / `AwaitingSmsCode` / `Failed` → `false`.\n */\nexport function isTokenRespReadyStatus(\n status: TokenStatus | string | null | undefined,\n): boolean {\n return status == null || status === TokenStatusValues.TokenReady;\n}\n\n/**\n * Провайдер captcha для `SendCodeReq.captchaType` / `CreateAuthSessionReq.captchaType`.\n * В OpenAPI поле — `string`; здесь известные wire-значения Identity / torrow-apps.\n */\nexport type AuthCaptchaType = \"YandexSmartCaptcha\" | \"GoogleRecaptcha\";\n\nexport const AuthCaptchaTypeValues = {\n YandexSmartCaptcha: \"YandexSmartCaptcha\",\n GoogleRecaptcha: \"GoogleRecaptcha\",\n} as const satisfies Record<string, AuthCaptchaType>;\n\nexport const AuthCaptchaTypeValueList: readonly AuthCaptchaType[] = [\n AuthCaptchaTypeValues.YandexSmartCaptcha,\n AuthCaptchaTypeValues.GoogleRecaptcha,\n];\n\nexport function isAuthCaptchaType(value: string): value is AuthCaptchaType {\n return (AuthCaptchaTypeValueList as readonly string[]).includes(value);\n}\n\nexport function parseAuthCaptchaType(\n raw: string | undefined | null,\n): AuthCaptchaType | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return AuthCaptchaTypeValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n\n/**\n * OAuth/API scopes для `TokenReq.scopes` / `RefreshReq.scopes`.\n * В OpenAPI — `string[]`; здесь известные значения Identity (`user_api`, `admin_api`, `offline_access`).\n */\nexport type AuthScope = \"user_api\" | \"admin_api\" | \"offline_access\";\n\nexport const AuthScopeValues = {\n UserApi: \"user_api\",\n AdminApi: \"admin_api\",\n OfflineAccess: \"offline_access\",\n} as const satisfies Record<string, AuthScope>;\n\nexport const AuthScopeValueList: readonly AuthScope[] = [\n AuthScopeValues.UserApi,\n AuthScopeValues.AdminApi,\n AuthScopeValues.OfflineAccess,\n];\n\n/** Дефолт для OTP / LoginTask в SDK и примерах. */\nexport const DefaultAuthScopes: readonly AuthScope[] = [\n AuthScopeValues.UserApi,\n AuthScopeValues.OfflineAccess,\n];\n\nexport function isAuthScope(value: string): value is AuthScope {\n return (AuthScopeValueList as readonly string[]).includes(value);\n}\n\nexport function parseAuthScope(raw: string | undefined | null): AuthScope | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return AuthScopeValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n","import type { OpenApiSchemas as Schemas } from \"../../schema/openapi-schemas.js\";\n\nexport type SolutionData = Schemas[\"SolutionData\"];\nexport type PersonalSolutionData = Schemas[\"PersonalSolutionData\"];\nexport type Metrics = Schemas[\"Metrics\"];\nexport type ViewBlockSettings = Schemas[\"ViewBlockSettings\"];\nexport type BlockSettings = Schemas[\"BlockSettings\"];\nexport type Filter = Schemas[\"Filter\"];\n\n/**\n * Известные int-коды `SolutionData.layoutType` (torrow-apps `LayoutType` в\n * `libs/domain-models/.../layout-type.model.ts`).\n *\n * Не TypeScript-enum: в OpenAPI поле — `number | null`, UI appearance обычно\n * предлагает `NonImage`…`BigImagePanel`; `SmallSlider`/`BigSlider` тоже есть в модели.\n * Значения вне этого списка API не запрещает.\n *\n * Смысл кодов для MCP/ИИ: каталог **`LayoutTypeValues`** в `@torrow/sdk-docs`\n * (`layoutTypeValuesFieldDocEntries` / `mcpFullFieldCatalog.LayoutTypeValues`).\n */\nexport const LayoutTypeValues = {\n Unknown: 0,\n SideImage: 1,\n SmallImagePanel: 2,\n MediumImagePanel: 3,\n BigImagePanel: 4,\n SmallSlider: 5,\n BigSlider: 6,\n NonImage: 7,\n} as const;\n\n/** Union известных кодов {@link LayoutTypeValues}; `SolutionData.layoutType` шире (`number | null`). */\nexport type LayoutTypeValue = (typeof LayoutTypeValues)[keyof typeof LayoutTypeValues];\n\n/**\n * Поля `solutionData`, которые реально управляются UI и бизнес-процессами torrow-apps.\n * Используется как \"рабочий\" срез для codegen/интеграций, чтобы не терять важные аспекты поведения.\n */\nexport type ManagedSolutionData = Pick<\n SolutionData,\n \"layoutType\" | \"viewBlockSettings\" | \"homeItemIds\" | \"quickFilterTags\" | \"metrics\"\n>;\n","/**\n * Индексы «вида расписания по умолчанию» (`CalendarItem.calendarViewIndex`,\n * `ServiceItem.timetableView`). Совпадает с `TimetableViewTypeMapper` в torrow-apps\n * (`libs/domain-utils/.../timetable-view-type.mapper.ts`).\n *\n * В OpenAPI поля — `number | null`, не string-enum.\n */\nexport const TimetableViewTypeValues = {\n Day: 0,\n Month: 1,\n MonthEventList: 2,\n ConnectCalendar: 3,\n Poster: 4,\n Schedule: 5,\n} as const;\n\n/** Union известных индексов {@link TimetableViewTypeValues}. */\nexport type TimetableViewTypeValue =\n (typeof TimetableViewTypeValues)[keyof typeof TimetableViewTypeValues];\n","/** Path `d` for context icon presets — snapshot of torrow-apps `IconSetService.icons`. */\nexport const CONTEXT_ICON_PRESET_PATHS = {\n \"anchor\": \"M35.4783 29.6467C30.6084 24.7768 26.629 15.4085 26.586 15.307C26.585 15.3045 26.5825 15.3015 26.5825 15.3015C26.5594 15.2485 26.527 15.2036 26.4889 15.1626C26.4775 15.1501 26.4645 15.1401 26.4515 15.129C26.4195 15.1006 26.3845 15.0771 26.3465 15.058C26.331 15.0505 26.317 15.042 26.301 15.0361C26.2465 15.0155 26.19 15.0011 26.13 15.0005H26.1265H26.125L26.1215 15.001C25.9914 14.9915 25.8714 15.0495 25.78 15.141C25.776 15.145 25.772 15.148 25.768 15.152C25.7279 15.195 25.6924 15.2425 25.668 15.2975L25.6644 15.3055C25.561 15.536 21.6095 24.3088 16.7716 29.1467C16.6441 29.2742 16.5951 29.4602 16.6431 29.6337C16.6911 29.8072 16.8291 29.9417 17.0037 29.9852C20.5716 30.8772 20.6245 37.3121 20.6251 37.5006C20.6256 37.7765 20.8495 37.9995 21.125 37.9995C21.401 37.999 21.6251 37.7761 21.6251 37.5C21.6251 37.4495 21.5811 30.7692 18.0356 29.2767C21.4051 25.6693 24.22 20.5154 25.6249 17.707V27.0508C24.4854 27.2833 23.625 28.2928 23.625 29.5002C23.625 30.8787 24.7465 32.0002 26.125 32.0002C27.5035 32.0002 28.6249 30.8787 28.6249 29.5002C28.6249 28.2928 27.7644 27.2833 26.625 27.0508V17.8115C28.0315 20.7629 30.8454 26.1428 34.2113 29.7717C30.6684 31.2087 30.6249 37.4546 30.6249 37.5C30.6249 37.776 30.8483 37.999 31.1238 37.9995C31.3998 37.9995 31.6239 37.7765 31.6249 37.501C31.6253 37.3331 31.6814 31.3761 35.2463 30.4852C35.4208 30.4417 35.5588 30.3072 35.6068 30.1337C35.6547 29.9602 35.6058 29.7742 35.4783 29.6467ZM27.6249 29.5002C27.6249 30.3272 26.9519 31.0002 26.125 31.0002C25.298 31.0002 24.625 30.3272 24.625 29.5002C24.625 28.6733 25.298 28.0003 26.125 28.0003C26.9519 28.0003 27.6249 28.6733 27.6249 29.5002ZM32.1248 37.0001H20.1251C19.8491 37.0001 19.6251 37.2241 19.6251 37.5V38.5C19.6251 38.776 19.8491 39 20.1251 39C20.4011 39 20.6251 38.776 20.6251 38.5V38.0001H31.6248V38.5C31.6248 38.776 31.8488 39 32.1248 39C32.4007 39 32.6247 38.776 32.6247 38.5V37.5C32.6248 37.2241 32.4008 37.0001 32.1248 37.0001Z\",\n \"animals\": \"M38.1434 21.1127L38.2291 21.1445C38.3104 21.1763 38.4006 21.2127 38.4999 21.2582L38.5044 21.2627C38.6398 21.3309 38.7662 21.4263 38.87 21.5445C38.9693 21.6581 39.0551 21.7945 39.1137 21.9399L39.1182 21.9581C39.1769 22.1263 39.1995 22.2899 39.1905 22.4627C39.1814 22.6308 39.1363 22.799 39.0551 22.9763L39.046 22.9945C38.685 23.6717 38.2021 24.2262 37.6334 24.6353C37.0557 25.0535 36.3877 25.3216 35.6837 25.4126C35.5528 25.4262 35.4174 25.4398 35.2775 25.4444H35.2053C34.93 26.7125 34.6727 27.9897 34.3793 29.2488C34.2484 29.8351 34.1266 30.4033 33.6753 30.8805V35.4076C33.6753 35.7576 33.5308 36.0758 33.3052 36.3031C33.075 36.5349 32.7591 36.6758 32.4116 36.6758H31.9377C31.6308 36.6758 31.3419 36.5622 31.1208 36.3712C30.8996 36.1849 30.7417 35.9167 30.692 35.6076L30.024 31.3669L27.4605 30.9351L24.721 30.4624C24.1974 31.1396 23.3805 31.7169 22.6765 32.2169C22.4869 32.3487 22.3109 32.4714 22.1213 32.6123L20.6365 33.7259L20.9028 35.1804C20.9389 35.3667 20.9298 35.5531 20.8847 35.7304C20.8351 35.9122 20.7493 36.0804 20.6275 36.2258L20.6094 36.2485C20.483 36.3758 20.3567 36.4758 20.2032 36.5531C20.0407 36.6349 19.8692 36.6758 19.6616 36.6758H19.0884C18.7861 36.6758 18.5017 36.5667 18.2806 36.3849C18.0594 36.2031 17.9015 35.9394 17.8473 35.6395L17.2831 32.5941C17.1568 31.9032 17.8699 31.026 18.3663 30.4215L18.4972 30.2578C18.2264 29.6215 18.082 29.0261 18.0233 28.4943C17.933 27.7261 18.0233 27.0761 18.1632 26.5716C18.2219 26.3489 18.2986 26.1489 18.3753 25.9625L18.4115 25.8898C17.8247 25.6353 17.2786 25.2944 16.7957 24.8762C16.209 24.3717 15.7125 23.7535 15.3379 23.0445L15.3334 23.0399C15.1754 22.7263 15.1529 22.3808 15.2522 22.0763C15.347 21.7672 15.5591 21.4991 15.866 21.3354L15.8705 21.3309C16.1142 21.2036 16.385 21.1627 16.6377 21.1991C16.8995 21.24 17.1432 21.3582 17.3373 21.5491C17.4953 21.7036 17.6036 21.8036 17.7299 21.9172L18.0007 22.1581C18.6732 22.7808 19.9234 23.9399 21.1329 23.8672C23.7687 23.8672 26.6707 23.6081 29.3471 23.4853C29.5502 22.9399 29.7848 22.3263 30.024 21.7081C30.5656 20.2991 31.1253 18.8355 31.5179 17.5174L31.527 17.4901C31.6262 17.2401 31.7978 17.031 32.0099 16.8856C32.2265 16.7447 32.4838 16.6674 32.75 16.6765C33.4316 16.6992 33.7023 17.0401 33.8739 17.4765L33.9822 17.4401C34.2169 17.3765 34.4741 17.381 34.7133 17.4628C34.9525 17.5401 35.1556 17.6901 35.3046 17.881C35.4535 18.0674 35.5528 18.3037 35.5708 18.5537L35.6385 19.29C35.8732 19.4219 36.0944 19.5991 36.2839 19.8037C36.5322 20.0764 36.7353 20.3991 36.8526 20.7354C36.8932 20.8582 37.4799 20.8627 37.8591 21.0036L38.1434 21.1127ZM37.9493 21.8809L37.5883 21.7445C37.0828 21.5536 36.1891 21.2172 36.1124 20.9991C36.0312 20.7627 35.8913 20.5355 35.7107 20.3446C35.5392 20.1582 35.3316 20.0037 35.115 19.9128L34.8938 19.8218L34.79 18.6219C34.781 18.5264 34.7449 18.4401 34.6907 18.3674C34.6366 18.2946 34.5554 18.2401 34.4651 18.2083C34.3748 18.181 34.2755 18.1764 34.1853 18.2037C34.095 18.2264 34.0138 18.2764 33.9551 18.3446L33.4812 18.8946L33.2736 18.1719C33.1743 17.8219 33.075 17.4765 32.7275 17.4628C32.6237 17.4628 32.5244 17.4901 32.4431 17.5447C32.3664 17.5947 32.3032 17.6719 32.2626 17.7628C31.87 19.0901 31.3013 20.5673 30.7552 21.9899C30.4979 22.6581 30.2452 23.3126 29.9925 24.0035L29.9067 24.249L21.1826 24.6535C19.6391 24.7444 18.2264 23.4444 17.4727 22.7445L17.2064 22.499C17.062 22.3672 16.9356 22.249 16.7912 22.1127C16.719 22.0399 16.6242 21.9945 16.5249 21.9809C16.4301 21.9672 16.3263 21.9854 16.2361 22.0309L16.227 22.0354C16.1142 22.0945 16.033 22.199 15.9969 22.3127C15.9608 22.4263 15.9698 22.5581 16.0285 22.6717L16.033 22.6763C16.3579 23.299 16.7912 23.8353 17.3057 24.2808C17.8292 24.7308 18.434 25.0807 19.0839 25.308L19.5353 25.4671L19.296 25.8807C19.2283 25.9943 19.1607 26.1262 19.093 26.2807C19.0298 26.4262 18.9666 26.5943 18.9169 26.7852C18.7996 27.2034 18.7274 27.7534 18.7996 28.4034C18.8583 28.9215 19.0117 29.5033 19.3096 30.1487L19.4089 30.3624L19.269 30.5487L18.9711 30.9214C18.5694 31.4123 17.9917 32.1214 18.0504 32.4532L18.6145 35.494C18.6371 35.6076 18.6958 35.7031 18.7815 35.7758C18.8628 35.844 18.9711 35.8849 19.0884 35.8849H19.6616C19.7429 35.8849 19.806 35.8713 19.8557 35.8485C19.9144 35.8167 19.973 35.7667 20.0407 35.6985C20.0814 35.6485 20.1084 35.5895 20.1265 35.5304C20.1445 35.4622 20.1491 35.3895 20.1355 35.3213L19.779 33.385L21.6565 31.9805C21.8099 31.8669 22.013 31.7214 22.2251 31.5714C22.9473 31.0623 23.7958 30.4624 24.22 29.8169L24.3644 29.5988L27.5869 30.1578C28.643 30.3396 29.654 30.5078 30.4257 30.6351L30.7055 30.6805L31.4638 35.4804C31.4818 35.5985 31.5405 35.6985 31.6263 35.7713C31.712 35.844 31.8203 35.8849 31.9377 35.8849H32.4116C32.5424 35.8849 32.6643 35.8304 32.7546 35.744C32.8358 35.6622 32.89 35.5395 32.89 35.4076V30.5442L33.0208 30.426C33.3954 30.0851 33.5038 29.5897 33.6166 29.0761C33.8784 27.617 34.2665 26.0898 34.5824 24.6308L34.9164 24.6489C35.0338 24.658 35.1466 24.658 35.2504 24.658C35.3542 24.6535 35.467 24.6444 35.5844 24.6308C36.1576 24.558 36.7037 24.3353 37.1776 23.9944C37.6469 23.6581 38.0486 23.199 38.3465 22.6445C38.3826 22.5581 38.4052 22.4808 38.4097 22.4127C38.4142 22.3536 38.4052 22.2945 38.3871 22.2354C38.36 22.1718 38.3284 22.1127 38.2878 22.0718C38.2472 22.0263 38.2021 21.9899 38.1524 21.9672L37.9493 21.8809Z\",\n \"auto\": \"M42.598 27.613v2.053c0 1.427-1.174 2.567-2.612 2.567h-.889l-.037.14a3.335 3.335 0 0 1-2.38 2.38 3.347 3.347 0 0 1-4.08-2.38l-.037-.14H21.679l-.037.14a3.335 3.335 0 0 1-2.38 2.38 3.346 3.346 0 0 1-4.08-2.38l-.037-.14h-.533c-1.438 0-2.612-1.14-2.612-2.567v-1.801c0-1.171.785-2.194 1.916-2.502l4.791-1.306 2.857-3.751A3.308 3.308 0 0 1 24.195 19h9.31c1.142 0 2.198.585 2.803 1.551l2.22 3.547 2.54 1.15a2.598 2.598 0 0 1 1.53 2.365zm-24.183 6.355a2.416 2.416 0 1 0 0-4.832 2.416 2.416 0 0 0 0 4.832zm17.41 0a2.416 2.416 0 1 0 .002-4.832 2.416 2.416 0 0 0-.001 4.832zm4.161-2.657c.929 0 1.69-.733 1.69-1.645l.002-2.045a1.697 1.697 0 0 0-.992-1.528l-2.668-1.21a.414.414 0 0 1-.193-.168l-2.301-3.67a2.36 2.36 0 0 0-2.017-1.124h-9.312a2.39 2.39 0 0 0-1.898.943l-2.95 3.875a.48.48 0 0 1-.254.167l-4.933 1.347a1.686 1.686 0 0 0-1.24 1.609v1.805c0 .914.76 1.645 1.692 1.645h.465l.019-.167a3.33 3.33 0 0 1 2.939-2.938 3.34 3.34 0 0 1 3.693 2.94l.02.165h10.746l.019-.167a3.332 3.332 0 0 1 2.939-2.938 3.34 3.34 0 0 1 3.693 2.939l.02.166h.821z\",\n \"beauty\": \"M38.29 26.814c0 3.618-1.12 7.088-3.231 9.727-2.074 2.59-4.863 4.086-7.914 4.086-3.052 0-5.841-1.497-7.915-4.086-2.112-2.639-3.23-6.11-3.23-9.727 0-3.618 1.118-7.089 3.23-9.727C21.304 14.497 24.093 13 27.145 13c3.051 0 5.84 1.497 7.914 4.087 2.112 2.638 3.23 6.109 3.23 9.727zM27.144 39.699c.815 0 1.62-.12 2.395-.357 2.253-.687 4.204-2.302 5.599-4.514 1.458-2.311 2.222-5.123 2.222-8.014 0-2.895-.765-5.712-2.222-8.015-1.395-2.212-3.346-3.827-5.6-4.514a8.248 8.248 0 0 0-4.797 0c-2.247.687-4.198 2.304-5.592 4.514-1.457 2.303-2.222 5.12-2.222 8.015 0 2.891.764 5.703 2.222 8.014 1.394 2.21 3.345 3.827 5.592 4.514a8.249 8.249 0 0 0 2.403.357zm8.482-12.885c0 3.02-.91 5.897-2.649 8.062-1.556 1.945-3.604 3.09-5.833 3.09-2.23 0-4.278-1.145-5.834-3.09-1.739-2.165-2.649-5.042-2.649-8.062 0-3.02.91-5.897 2.649-8.07 1.553-1.941 3.602-3.082 5.834-3.082 2.231 0 4.28 1.14 5.833 3.082 1.74 2.173 2.649 5.05 2.649 8.07zM32.253 34.3c1.607-2.004 2.446-4.67 2.446-7.487 0-2.821-.84-5.491-2.446-7.487-1.377-1.727-3.176-2.744-5.108-2.744-1.933 0-3.732 1.017-5.11 2.745-1.605 1.995-2.445 4.665-2.445 7.486 0 2.818.839 5.483 2.446 7.487 1.374 1.723 3.173 2.736 5.109 2.736 1.935 0 3.734-1.013 5.108-2.736zm-1.037-13.304c1.074 1.618 1.663 3.742 1.663 5.817 0 .255-.213.46-.468.46a.46.46 0 0 1-.46-.46c0-1.841-.508-3.718-1.433-5.18-.89-1.4-2.093-2.296-3.373-2.296a.466.466 0 0 1-.461-.467.46.46 0 0 1 .46-.46c1.572 0 3.028 1.016 4.072 2.586z\",\n \"beauty2\": \"M19.9856 39.8118L16.3104 36.1366C14.9636 34.7897 14.9635 32.5999 16.3104 31.253L31.253 16.3104C32.5999 14.9635 34.7897 14.9635 36.1366 16.3104L39.8118 19.9856C40.5188 20.6926 40.5188 21.8388 39.8118 22.5457C39.224 23.1335 38.3326 23.2326 37.6425 22.843C38.0321 23.5331 37.933 24.4245 37.3452 25.0123C36.7575 25.6001 35.866 25.6991 35.1758 25.3095C35.5655 25.9996 35.4664 26.8911 34.8786 27.4789C34.2909 28.0667 33.3995 28.1657 32.7093 27.7761C33.0989 28.4663 32.9998 29.3577 32.4121 29.9455C31.8243 30.5332 30.9328 30.6323 30.2427 30.2427C30.6323 30.9328 30.5333 31.8243 29.9455 32.4121C29.3577 32.9998 28.4663 33.0989 27.7762 32.7093C28.1658 33.3995 28.0667 34.2909 27.4789 34.8786C26.8911 35.4664 25.9997 35.5655 25.3095 35.1758C25.6992 35.866 25.6001 36.7574 25.0123 37.3452C24.4245 37.933 23.5331 38.0321 22.843 37.6425C23.2326 38.3326 23.1335 39.224 22.5457 39.8118C21.8388 40.5187 20.6926 40.5187 19.9856 39.8118ZM20.5513 39.2461L16.8761 35.5709C15.8416 34.5364 15.8416 32.8532 16.8761 31.8187L31.8187 16.8761C32.8532 15.8416 34.5364 15.8416 35.5709 16.8761L39.2461 20.5513C39.6407 20.9458 39.6407 21.5855 39.2461 21.98C38.8516 22.3746 38.2119 22.3746 37.8174 21.98L34.1422 18.3048C33.8955 18.0581 33.4941 18.0581 33.2474 18.3048L32.657 18.8953L36.7796 23.0179C37.1741 23.4124 37.1741 24.0521 36.7796 24.4466C36.385 24.8411 35.7454 24.8411 35.3509 24.4466L31.2282 20.324L30.1903 21.3619L34.313 25.4845C34.7075 25.879 34.7075 26.5187 34.313 26.9132C33.9184 27.3077 33.2788 27.3077 32.8842 26.9132L28.7616 22.7906L27.7238 23.8284L31.8464 27.9511C32.2409 28.3456 32.2409 28.9852 31.8464 29.3798C31.4519 29.7743 30.8122 29.7743 30.4177 29.3798L26.2951 25.2572L25.2572 26.2951L29.3798 30.4177C29.7743 30.8122 29.7743 31.4518 29.3798 31.8464C28.9853 32.2409 28.3456 32.2409 27.9511 31.8464L23.8285 27.7238L22.7906 28.7616L26.9132 32.8842C27.3077 33.2788 27.3077 33.9184 26.9132 34.3129C26.5187 34.7075 25.879 34.7075 25.4845 34.3129L21.3619 30.1903L20.324 31.2282L24.4466 35.3508C24.8411 35.7454 24.8411 36.385 24.4466 36.7795C24.0521 37.1741 23.4124 37.1741 23.0179 36.7795L18.8953 32.6569L18.3048 33.2474C18.0581 33.4941 18.0581 33.8955 18.3048 34.1422L21.98 37.8174C22.3746 38.2119 22.3746 38.8516 21.98 39.2461C21.5855 39.6406 20.9459 39.6406 20.5513 39.2461Z\",\n \"botanical\": \"M40.8394 28.2455C40.6261 28.044 40.2816 28.045 40.0705 28.248C37.7819 30.4427 34.9907 30.998 32.1098 30.5256C31.558 29.0642 28.0498 21 17.9432 21C16.5136 21 14.9949 21.1628 13.4292 21.484C13.2701 21.5167 13.135 21.6152 13.0604 21.7527C12.9861 21.89 12.98 22.052 13.044 22.1943C16.6947 30.2986 22.8312 32 27.3356 32C27.3359 32 27.3356 32 27.3359 32C29.3661 32 30.923 31.6467 31.5476 31.4793C32.3494 31.6267 33.1352 31.7048 33.8979 31.7048C36.5478 31.7048 38.932 30.8093 40.8422 28.9776C41.0536 28.7748 41.0526 28.4469 40.8394 28.2455ZM27.3355 30.9647C23.2672 30.9647 17.7582 29.4552 14.3166 22.3702C15.5733 22.1478 16.7906 22.0353 17.9432 22.0353C26.4744 22.0353 29.877 28.0418 30.8414 30.255C27.1474 29.2852 23.405 26.7869 20.467 24.0093C20.2541 23.8076 19.9096 23.8091 19.6982 24.0118C19.4867 24.2148 19.4877 24.5426 19.7009 24.7441C22.8746 27.7443 26.1261 29.7934 29.2066 30.8552C28.6529 30.919 28.0245 30.9647 27.3355 30.9647Z\",\n \"children\": \"M32.871 34.797a3.051 3.051 0 0 1 1.956 2.84 3.056 3.056 0 0 1-3.052 3.052 3.056 3.056 0 0 1-3.052-3.052c0-.568.163-1.12.471-1.61l.423-.677-.79.1c-.485.062-.921.093-1.34.093-.415 0-.845-.032-1.34-.093l-.79-.098.423.674c.308.493.471 1.044.471 1.61a3.055 3.055 0 0 1-3.053 3.052 3.056 3.056 0 0 1-3.052-3.052 3.05 3.05 0 0 1 1.955-2.84l.739-.286-.688-.394a10.775 10.775 0 0 1-5.437-9.345V21.82H15.48a.479.479 0 1 1 0-.96l1.715.002c.266 0 .48.214.48.48v2.95h9.333V14.48c0-.266.214-.48.48-.48 5.939 0 10.77 4.833 10.77 10.772 0 3.863-2.075 7.418-5.437 9.345l-.687.394.738.286zM23.2 39.73a2.094 2.094 0 1 0-.004-4.188 2.094 2.094 0 0 0 .004 4.188zm10.67-2.093c0-1.155-.94-2.094-2.094-2.094a2.095 2.095 0 0 0-2.093 2.094c0 1.154.939 2.093 2.094 2.093a2.095 2.095 0 0 0 2.093-2.093zm-5.903-14.69l.013 2.304H17.677l.037.412c.456 5.04 4.708 8.921 9.773 8.921 5.065 0 9.317-3.88 9.772-8.92l.055-.602.001-.565-.056-.617a9.753 9.753 0 0 0-1.38-4.189c-.562-.927-1.516-1.996-2.375-2.665a9.775 9.775 0 0 0-5.126-2.027l-.412-.037v7.984z\",\n \"devices\": \"M35.309 17.1091C35.2563 16.5905 34.8183 16.1857 34.2857 16.1857H19.7143C19.1462 16.1857 18.6857 16.6462 18.6857 17.2143V20.8143H35.3143V17.2143C35.3143 17.1788 35.3125 17.1437 35.309 17.1091ZM35.3143 21.5H18.6857V37.1H35.3143V21.5ZM18 21.5V17.2143C18 16.2675 18.7675 15.5 19.7143 15.5H34.2857C35.1733 15.5 35.9034 16.1746 35.9911 17.039C35.997 17.0966 36 17.1551 36 17.2143V21.5V37.7857H18V21.5ZM27.1528 33.5031C29.3777 33.5031 31.1813 31.6995 31.1813 29.4745C31.1813 27.2496 29.3777 25.446 27.1528 25.446C24.9278 25.446 23.1242 27.2496 23.1242 29.4745C23.1242 31.6995 24.9278 33.5031 27.1528 33.5031ZM27.1528 34.1888C29.7564 34.1888 31.867 32.0782 31.867 29.4745C31.867 26.8709 29.7564 24.7603 27.1528 24.7603C24.5491 24.7603 22.4385 26.8709 22.4385 29.4745C22.4385 32.0782 24.5491 34.1888 27.1528 34.1888ZM32.5714 19.2714L27.4286 19.2714V18.5857L32.5714 18.5857V19.2714ZM21.4286 19.3572C21.6653 19.3572 21.8571 19.1653 21.8571 18.9286C21.8571 18.6919 21.6653 18.5 21.4286 18.5C21.1919 18.5 21 18.6919 21 18.9286C21 19.1653 21.1919 19.3572 21.4286 19.3572Z\",\n \"entertainment\": \"M16.013 20.395a1.896 1.896 0 0 1 1.266-.704l22.428-2.677a1.91 1.91 0 0 1 2.126 1.672l.385 3.219a.455.455 0 0 1-.39.504 2.554 2.554 0 0 0-2.177 2.816 2.558 2.558 0 0 0 2.778 2.225.456.456 0 0 1 .498.398l.384 3.218a1.906 1.906 0 0 1-.397 1.409 1.899 1.899 0 0 1-1.275.716l-4.226.505v1.149a1.915 1.915 0 0 1-1.913 1.913H12.913A1.915 1.915 0 0 1 11 34.845v-3.241c0-.248.198-.45.446-.454a2.55 2.55 0 0 0 2.496-2.539 2.55 2.55 0 0 0-2.496-2.538.455.455 0 0 1-.446-.455v-3.242c0-1.054.858-1.912 1.913-1.912h3.045l.055-.069zm-4.105 14.45c0 .553.451 1.003 1.005 1.003h22.585c.554 0 1.005-.45 1.005-1.003v-2.819l-.149-.028a3.42 3.42 0 0 1-1.803-.967 3.428 3.428 0 0 1-.99-2.419c0-.91.351-1.77.99-2.419a3.43 3.43 0 0 1 1.802-.967l.15-.029v-2.82c0-.553-.45-1.003-1.003-1.003h-3.96l-1.277-.001h-17.35c-.554 0-1.005.45-1.005 1.003v2.82l.15.028c.685.13 1.309.466 1.803.967.639.65.99 1.508.99 2.419s-.351 1.77-.99 2.419a3.43 3.43 0 0 1-1.803.968l-.15.028v2.82zm30.5-3.67l-.334-2.801-.152-.01a3.416 3.416 0 0 1-1.904-.747 3.427 3.427 0 0 1-1.27-2.284c-.108-.9.142-1.804.697-2.52a3.426 3.426 0 0 1 1.675-1.174l.145-.046-.334-2.8a1 1 0 0 0-1.115-.877l-18.641 2.225-3.958.362 3.983-.04h14.3c1.054 0 1.913.858 1.913 1.913v3.24c0 .25-.2.451-.448.455a2.55 2.55 0 0 0-2.495 2.539 2.55 2.55 0 0 0 2.495 2.54.455.455 0 0 1 .448.454v1.177l4.119-.491a1 1 0 0 0 .876-1.116zM28.782 27.14a.454.454 0 0 1 .253.777l-2.099 2.046.495 2.888a.455.455 0 0 1-.658.48l-2.595-1.365-2.595 1.365a.454.454 0 0 1-.659-.48l.496-2.89-2.1-2.044a.457.457 0 0 1 .252-.776l2.9-.422 1.299-2.63a.456.456 0 0 1 .814.002l1.297 2.628 2.9.421zM26 29.881a.454.454 0 0 1 .13-.402l1.612-1.57-2.227-.323a.453.453 0 0 1-.342-.248l-.995-2.017-.995 2.016a.457.457 0 0 1-.306.242c-.01.003-.01.003-.036.007l-2.225.324 1.608 1.568a.46.46 0 0 1 .132.403l-.38 2.217 1.991-1.047c.132-.07.29-.07.423 0l1.99 1.047-.38-2.217z\",\n \"evolution\": \"M33.962 25.089a2.694 2.694 0 1 1 .382 5.31l-4.056 6.744h1.731a.55.55 0 0 1 .535.552v.956h6.288a.542.542 0 0 1 0 1.085H14.389a.542.542 0 0 1 0-1.085H24.87v-.956c0-.3.24-.544.542-.552h3.61l4.253-7.07a2.69 2.69 0 0 1-1.391-2.36c0-.859.404-1.648 1.073-2.153l-6.246-8.125c.501 1.284.47 2.67-.1 4.058a7.312 7.312 0 0 1-1.348 2.137.544.544 0 0 1-.601.124 15.362 15.362 0 0 1-8.017-7.744l-.062-.13a.534.534 0 0 1 .105-.606 7.401 7.401 0 0 1 2.091-1.415c1.519-.678 3.06-.69 4.478-.036a2.31 2.31 0 0 1 1.88-.973c.598 0 1.175.235 1.607.653.443.437.694 1.034.694 1.655 0 .38-.094.756-.274 1.09l6.798 8.84zm.613 1.034a1.592 1.592 0 1 0 .001 3.183 1.592 1.592 0 0 0-.001-3.183zM31.473 38.65v-.426h-5.518v.426h5.518zm-6.151-21.57a.538.538 0 0 1 .265-.784 1.23 1.23 0 0 0-.45-2.365 1.22 1.22 0 0 0-1.147.805.541.541 0 0 1-.78.28c-1.257-.734-2.592-.791-3.986-.17a6.55 6.55 0 0 0-1.49.939 14.31 14.31 0 0 0 6.987 6.811c.367-.47.671-.99.899-1.537.57-1.41.47-2.743-.298-3.98z\",\n \"family\": \"M30.365 32.267a.407.407 0 0 1-.346-.203.453.453 0 0 1-.018-.418l2.098-4.405V25.27c0-1.38 1.068-2.502 2.382-2.502 1.311 0 2.38 1.122 2.38 2.502v1.972l2.097 4.405a.46.46 0 0 1-.018.418.406.406 0 0 1-.348.203h-2.366v6.167c0 .246-.295.556-.525.556L16.452 39a.398.398 0 0 1-.386-.406c0-.134-.005-.272-.005-.408v-7.454A2.553 2.553 0 0 1 15 28.64v-4.7c0-1.39 1.075-2.52 2.398-2.52h2.089c1.32 0 2.398 1.13 2.398 2.52v4.7a2.56 2.56 0 0 1-1.062 2.092v7.45h3.68v-3.855a2.551 2.551 0 0 1-1.06-2.091v-2.454c0-1.39 1.076-2.52 2.399-2.52l.802.003c1.32 0 2.398 1.13 2.398 2.519v2.454c0 .843-.4 1.622-1.062 2.09v3.853h4.769v-5.914h-2.384zm-13.49 5.914h3.132v-7.669l.002-.012a.43.43 0 0 1 .214-.389c.523-.291.846-.855.846-1.47v-4.702c0-.917-.71-1.664-1.582-1.664h-2.09c-.872 0-1.583.745-1.583 1.664v4.701c0 .616.325 1.18.845 1.471a.431.431 0 0 1 .216.38v7.69zm16.688 0h1.85v-6.344c0-.028.002-.057.007-.086l.01-.04a.412.412 0 0 1 .39-.301h2.116l-1.846-3.878a.426.426 0 0 1-.043-.19v-2.073c0-.907-.703-1.647-1.566-1.647-.866 0-1.568.74-1.568 1.647v2.072a.426.426 0 0 1-.044.191l-1.845 3.878h2.132c.182 0 .336.126.388.3l.012.041a.548.548 0 0 1 .007.086v6.344zm.916-16.653c-1.36 0-2.464-1.163-2.464-2.59 0-1.429 1.104-2.589 2.464-2.589 1.359 0 2.466 1.16 2.466 2.588 0 1.428-1.107 2.59-2.466 2.59zm0-4.324c-.91 0-1.65.778-1.65 1.736 0 .955.74 1.73 1.65 1.73.911 0 1.65-.775 1.65-1.73 0-.958-.739-1.736-1.65-1.736zm-9.16 20.977h1.848v-4.073-.01a.435.435 0 0 1 .216-.389c.52-.294.845-.857.845-1.473v-2.454c0-.917-.711-1.665-1.584-1.665h-.802c-.873 0-1.585.748-1.585 1.665v2.454c0 .616.323 1.18.844 1.47a.427.427 0 0 1 .216.38l.002.02v4.075zm.916-12.158c-1.36 0-2.464-1.162-2.464-2.59s1.105-2.588 2.464-2.588c1.357 0 2.464 1.16 2.464 2.588 0 1.428-1.107 2.59-2.464 2.59zm0-4.323c-.91 0-1.65.778-1.65 1.733 0 .957.74 1.733 1.65 1.733.909 0 1.65-.776 1.65-1.733 0-.955-.741-1.733-1.65-1.733zm-7.8-1.521c-1.36 0-2.467-1.163-2.467-2.588 0-1.428 1.107-2.591 2.466-2.591 1.357 0 2.464 1.163 2.464 2.59 0 1.426-1.107 2.589-2.464 2.589zm0-4.324c-.912 0-1.65.778-1.65 1.733 0 .958.738 1.734 1.65 1.734.908 0 1.65-.776 1.65-1.734 0-.955-.742-1.733-1.65-1.733z\",\n \"friends\": \"M26.125 29.568v6.248a.993.993 0 0 1-.992.993H14.55a1.55 1.55 0 0 1-1.55-1.55v-5.57a3.777 3.777 0 0 1 3.777-3.777H36.83a3.777 3.777 0 0 1 3.777 3.777v5.57a1.55 1.55 0 0 1-1.55 1.55H29.032a1.55 1.55 0 0 1-1.55-1.55v-5.691h-1.356zm-.992 0a.435.435 0 1 1 0-.871h9.746a.957.957 0 1 0 0-1.914H16.777a2.906 2.906 0 0 0-2.906 2.906v5.57c0 .375.304.679.679.679h1.235V31.36a.435.435 0 1 1 .872 0v4.578h8.596v-6.37h-.12zm3.22 5.691c0 .375.304.679.678.679h1.235V31.36a.435.435 0 1 1 .872 0v4.578h5.812V31.36a.435.435 0 1 1 .871 0v4.578h1.236a.678.678 0 0 0 .678-.679v-5.57a2.906 2.906 0 0 0-2.906-2.906h-.39l.086.174c.12.245.183.513.183.783a1.827 1.827 0 0 1-1.829 1.828h-6.526v5.691zm8.912-14.481a3.778 3.778 0 1 1-7.556 0 3.778 3.778 0 0 1 7.556 0zm-6.684 0a2.906 2.906 0 1 0 5.812 0 2.906 2.906 0 0 0-5.812 0zm-6.015 0a3.778 3.778 0 1 1-7.556 0 3.778 3.778 0 0 1 7.556 0zm-6.683 0a2.906 2.906 0 1 0 5.812 0 2.906 2.906 0 0 0-5.812 0z\",\n \"gamepad\": \"M23.72 24.983h-2.3v-2.278a.457.457 0 0 0-.456-.456.457.457 0 0 0-.456.456v2.278h-2.255a.457.457 0 0 0-.456.455c0 .251.205.456.456.456h2.255v2.278a.457.457 0 0 0 .911 0v-2.278h2.301c.25 0 .456-.205.456-.456a.457.457 0 0 0-.456-.455zm5.445-.456l-.16.16a.908.908 0 0 0 0 1.298c.183.16.41.25.639.25a.9.9 0 0 0 .637-.273l.16-.16a.908.908 0 0 0 0-1.298.88.88 0 0 0-1.276.023zm2.324-2.437l-.137.182a.908.908 0 0 0 0 1.298c.182.16.41.25.638.25a.9.9 0 0 0 .638-.273l.16-.159a.908.908 0 0 0 0-1.299.908.908 0 0 0-1.3 0zm.023 4.852l-.16.16a.908.908 0 0 0 0 1.298.9.9 0 0 0 .638.273.9.9 0 0 0 .638-.273l.16-.16a.908.908 0 0 0 0-1.298.88.88 0 0 0-1.276 0zm2.483-2.415l-.16.16a.908.908 0 0 0 0 1.298.9.9 0 0 0 .638.274.9.9 0 0 0 .638-.274l.16-.16a.908.908 0 0 0 0-1.298.88.88 0 0 0-1.276 0zM38.073 23.229l-.274-1.14v-.045c-.683-2.073-2.597-3.463-4.761-3.44h-.364c-.456 0-.912.068-1.413.205l-2.46.729a5.17 5.17 0 0 1-1.481.205h-1.663a5.169 5.169 0 0 1-1.481-.205l-2.46-.73a6.163 6.163 0 0 0-1.413-.181h-.342a5.022 5.022 0 0 0-4.761 3.44v.045l-.273 1.14a34.909 34.909 0 0 0-.912 8.998l.046 1.731c.023.684.341 1.345.866 1.8a2.45 2.45 0 0 0 1.64.615c.09 0 .16 0 .25-.022l.524-.046c1.299-.137 2.46-.911 3.053-2.073l.843-1.595a4.064 4.064 0 0 1 3.622-2.21h3.645c1.572 0 3.008.912 3.691 2.324l.66 1.39a3.837 3.837 0 0 0 3.099 2.164l.228.023a2.509 2.509 0 0 0 1.89-.615 2.527 2.527 0 0 0 .866-1.823l.046-1.708a34.255 34.255 0 0 0-.911-8.976zm0 8.976l-.046 1.708a1.609 1.609 0 0 1-.547 1.162 1.556 1.556 0 0 1-1.207.387l-.228-.022c-1.025-.092-1.913-.73-2.37-1.663l-.66-1.39c-.82-1.709-2.597-2.825-4.51-2.825h-3.646a5.013 5.013 0 0 0-4.442 2.71l-.843 1.596c-.456.865-1.344 1.48-2.324 1.572l-.524.045a1.583 1.583 0 0 1-1.207-.387 1.608 1.608 0 0 1-.547-1.162l-.045-1.731a34.245 34.245 0 0 1 .865-8.771l.274-1.117a4.1 4.1 0 0 1 3.895-2.78h.342c.364 0 .752.047 1.14.16l2.46.73a6.29 6.29 0 0 0 1.754.25h1.663c.615 0 1.207-.091 1.754-.25l2.46-.73c.388-.113.775-.16 1.162-.16h.41c1.709 0 3.28 1.14 3.85 2.803l.274 1.116c.638 2.848.934 5.81.843 8.749z\",\n \"health\": \"M41.47 26.874h-2.623c1.093-2.474.973-4.478.56-5.836C38.7 18.623 36.312 16 32.778 16c-.945 0-1.889.176-2.862.53-1.68.62-2.8 1.298-3.3 1.653-.5-.355-1.59-1.034-3.298-1.653a8.418 8.418 0 0 0-2.862-.53c-3.535 0-5.923 2.623-6.628 5.038-.414 1.444-.56 3.627.824 6.366H11.47a.467.467 0 0 0-.47.474c0 .265.205.47.47.47h3.743c.146.265.325.53.53.795 3.064 4.422 9.725 9.225 10.934 9.52v.03s.03 0 .06-.03h.086v-.03c1.033-.5 7.426-4.627 10.788-9.52.325-.44.59-.88.825-1.324h3.094c.265 0 .47-.206.47-.47 0-.27-.265-.445-.53-.445zm-4.713 1.74c-3.124 4.567-8.87 8.25-10.11 9.049-1.268-.799-6.985-4.512-10.139-9.05-.06-.086-.116-.175-.175-.265h4.332c.176 0 .355-.09.44-.265l1.978-3.888 3.094 7.926c.056.176.265.295.44.295h.03c.206 0 .385-.15.44-.355l2.714-9.284 1.444 4.687c.06.175.205.295.384.325.176.03.351-.06.47-.206l1.15-1.68.974 1.65a.469.469 0 0 0 .41.236h2.654c-.18.294-.355.56-.53.824zm1.06-1.74h-2.889l-1.209-2.063a.469.469 0 0 0-.41-.235c-.18 0-.325.06-.415.205l-1 1.474-1.623-5.273c-.06-.206-.265-.325-.47-.355-.206 0-.411.15-.47.355l-2.743 9.46-2.978-7.605a.438.438 0 0 0-.41-.295.463.463 0 0 0-.445.265l-2.325 4.57h-4.687c-1.179-2.152-1.504-4.216-.974-6.07.62-2.094 2.654-4.333 5.717-4.333.825 0 1.683.175 2.538.47 2.15.795 3.299 1.71 3.329 1.71a.452.452 0 0 0 .59 0s1.149-.915 3.328-1.71a7.116 7.116 0 0 1 2.537-.47c3.034 0 5.098 2.239 5.714 4.332.504 1.71.239 3.594-.705 5.568z\",\n \"hobbies\": \"M37.164 19.512A2.844 2.844 0 0 1 40 22.357v11.718a3 3 0 0 1-2.996 3.006H16.996A3 3 0 0 1 14 34.075V22.357a2.852 2.852 0 0 1 2.836-2.845h4.488l.146-.634A3.691 3.691 0 0 1 25.084 16h3.832a3.69 3.69 0 0 1 3.615 2.88l.14.632h4.493zm-15.5.853h-4.828a1.99 1.99 0 0 0-1.986 1.992v11.718c0 1.192.958 2.154 2.146 2.154h20.008c1.183 0 2.14-.963 2.14-2.154V22.357c0-1.1-.89-1.992-1.986-1.992l-4.821-.006a.413.413 0 0 1-.411-.324l-.223-.964a2.858 2.858 0 0 0-2.792-2.224l-3.827.006a2.842 2.842 0 0 0-2.787 2.218l-.223.964a.424.424 0 0 1-.41.33zm-2.776 3.071a.647.647 0 0 1-.645.653.647.647 0 0 1-.645-.653.646.646 0 1 1 1.29 0zM27 33.666c-2.932 0-5.318-2.391-5.318-5.335 0-2.94 2.388-5.336 5.318-5.336 2.93 0 5.318 2.396 5.318 5.336 0 2.94-2.388 5.336-5.318 5.336zm0-9.824c-2.463 0-4.474 2.017-4.474 4.489 0 2.475 2.009 4.489 4.474 4.489 2.465 0 4.474-2.014 4.474-4.489 0-2.472-2.01-4.489-4.474-4.489z\",\n \"home\": \"M36.863 40.113H18.167a.462.462 0 0 1-.46-.464V27.983h-3.243a.465.465 0 0 1-.43-.287.465.465 0 0 1 .103-.503L27.17 14.137a.456.456 0 0 1 .653 0l13.014 13.03a.462.462 0 0 1-.3.817l-3.21-.001v11.666a.462.462 0 0 1-.464.464zm-10.086-.924H36.4V27.52c0-.253.21-.46.463-.46h2.557L27.5 15.118 15.577 27.06h2.59c.257 0 .464.206.464.46v11.67h2.003v-9.974c0-.253.206-.463.463-.463h5.22c.253 0 .46.21.46.463v9.973zm-5.22 0h4.297v-9.51h-4.297v9.51zm12.346-5.066H29.46a.464.464 0 0 1-.463-.463v-4.444c0-.253.207-.463.463-.463h4.443c.254 0 .46.21.46.463v4.444a.464.464 0 0 1-.46.463zm-3.98-.927h3.517V29.68h-3.516v3.516z\",\n \"idea\": \"M30.86 31.2513L31.304 31.0307C34.1245 29.629 36.06 26.7198 36.06 23.36C36.06 18.6324 32.2276 14.8 27.5 14.8C22.7725 14.8 18.94 18.6324 18.94 23.36C18.94 26.7198 20.8755 29.629 23.696 31.0306L24.14 31.2513V33.84C24.14 34.5027 24.6773 35.04 25.34 35.04H29.66C30.3227 35.04 30.86 34.5027 30.86 33.84V31.2513ZM31.66 31.7471V33.84C31.66 34.9446 30.7646 35.84 29.66 35.84H25.34C24.2354 35.84 23.34 34.9446 23.34 33.84V31.7471C20.258 30.2154 18.14 27.0351 18.14 23.36C18.14 18.1906 22.3306 14 27.5 14C32.6694 14 36.86 18.1906 36.86 23.36C36.86 27.0351 34.742 30.2155 31.66 31.7471ZM29.82 35.8H25.18V38.2C25.18 38.8627 25.7173 39.4 26.38 39.4H28.62C29.2827 39.4 29.82 38.8627 29.82 38.2V35.8ZM24.38 35V38.2C24.38 39.3046 25.2754 40.2 26.38 40.2H28.62C29.7246 40.2 30.62 39.3046 30.62 38.2V35H24.38ZM27.9 25.44L27.9 35.8L27.1 35.8L27.1 25.44L27.9 25.44ZM26.98,22.84a0.52,0.52 0 1,0 1.04,0a0.52,0.52 0 1,0 -1.04,0z\",\n \"money\": \"M38.49 25.364h-.61v-4.132c0-.972-.764-1.736-1.687-1.736l-.46.003v-2.766c0-.969-.714-1.733-1.58-1.733h-.104l-17.466 4.49c-.006 0-.016.006-.021.006-.863.07-1.562.808-1.562 1.736v16.035c0 .972.764 1.736 1.684 1.736h19.51a1.72 1.72 0 0 0 1.735-1.736v-4.242h.562c.309 0 .509-.205.509-.509v-6.637a.511.511 0 0 0-.51-.515zm-4.24-9.395c.254.05.509.359.509.764v2.758H20.668l13.581-3.522zm2.66 21.298c0 .408-.309.764-.717.764H16.684c-.405 0-.715-.356-.715-.764V21.232c0-.408.31-.764.715-.764h19.457c.406 0 .715.356.715.764v4.132h-5.055a3.793 3.793 0 0 0-3.83 3.83 3.823 3.823 0 0 0 3.83 3.831h5.11v4.242zm1.066-5.211h-6.175c-1.533 0-2.806-1.279-2.806-2.807s1.278-2.806 2.806-2.806h6.175v5.613z\",\n \"music\": \"M16.0946 41C15.6758 40.9998 15.2613 40.9141 14.8763 40.7478C14.4913 40.5816 14.1438 40.3384 13.8549 40.033C13.5659 39.7275 13.3414 39.3662 13.1951 38.9708C13.0487 38.5754 12.9836 38.1542 13.0035 37.7327C13.0234 37.3112 13.1281 36.8982 13.3111 36.5186C13.494 36.1391 13.7516 35.8008 14.0681 35.5245C14.3846 35.2481 14.7535 35.0393 15.1524 34.9107C15.5513 34.7821 15.972 34.7364 16.389 34.7764L14.6146 26.5102C14.5938 26.4131 14.6087 26.3118 14.6566 26.225C14.7045 26.1383 14.782 26.072 14.8748 26.0386L25.8085 22.105C25.8629 22.0854 25.9208 22.0777 25.9784 22.0824C26.0359 22.0872 26.0918 22.1043 26.1423 22.1326C26.1928 22.1608 26.2368 22.1996 26.2712 22.2464C26.3056 22.2931 26.3297 22.3467 26.3419 22.4036L28.849 34.0823C28.8553 34.1122 28.8583 34.1427 28.8581 34.1732C28.953 34.8152 28.8469 35.4711 28.5543 36.0494C28.2617 36.6277 27.7974 37.0997 27.2259 37.3995C26.6545 37.6993 26.0044 37.812 25.3664 37.722C24.7283 37.6319 24.134 37.3436 23.6664 36.8971C23.1987 36.4506 22.8809 35.8683 22.7574 35.2313C22.6338 34.5942 22.7106 33.9342 22.977 33.3432C23.2435 32.7522 23.6863 32.2597 24.2438 31.9343C24.8012 31.6089 25.4456 31.4668 26.087 31.5278L24.7909 25.4897L17.1952 28.2221L19.1273 37.2215C19.2243 37.677 19.2189 38.1486 19.1115 38.6018C19.0041 39.055 18.7975 39.4782 18.5067 39.8404C18.2159 40.2027 17.8484 40.4949 17.4311 40.6955C17.0137 40.8961 16.5571 41.0002 16.0946 41V41ZM16.096 35.5802C15.9355 35.5801 15.7754 35.5974 15.6184 35.6316C15.1769 35.7276 14.7735 35.9533 14.4593 36.2803C14.1451 36.6072 13.9342 37.0207 13.8533 37.4684C13.7723 37.9162 13.825 38.378 14.0047 38.7956C14.1843 39.2131 14.4828 39.5676 14.8625 39.8142C15.2421 40.0609 15.6858 40.1885 16.1375 40.181C16.5892 40.1736 17.0285 40.0313 17.3999 39.7723C17.7713 39.5133 18.0581 39.1491 18.2241 38.7258C18.39 38.3026 18.4277 37.8392 18.3322 37.3944L16.3263 28.044C16.3056 27.947 16.3205 27.8457 16.3684 27.759C16.4163 27.6723 16.4938 27.6061 16.5866 27.5727L24.9535 24.563C25.0079 24.5433 25.0658 24.5356 25.1234 24.5404C25.181 24.5451 25.2369 24.5622 25.2874 24.5905C25.338 24.6187 25.3819 24.6575 25.4163 24.7043C25.4507 24.7511 25.4748 24.8047 25.487 24.8616L27.012 31.9653C27.0269 32.0353 27.0233 32.108 27.0016 32.1762C26.9799 32.2444 26.9408 32.3057 26.8882 32.3539C26.8356 32.402 26.7713 32.4355 26.7019 32.4508C26.6325 32.4662 26.5602 32.4629 26.4925 32.4413C26.0177 32.2882 25.5062 32.2958 25.0362 32.463C24.5661 32.6302 24.1632 32.9477 23.8891 33.3672C23.615 33.7867 23.4846 34.285 23.518 34.7861C23.5513 35.2872 23.7465 35.7635 24.0737 36.1424C24.4009 36.5212 24.8422 36.7818 25.3302 36.8843C25.8182 36.9869 26.3261 36.9257 26.7764 36.7101C27.2266 36.4946 27.5945 36.1365 27.8238 35.6906C28.0532 35.2447 28.1314 34.7354 28.0465 34.2405C28.0435 34.2233 28.0416 34.2059 28.0409 34.1884L25.6461 23.032L15.4835 26.6871L17.3135 35.2131C17.3285 35.2832 17.325 35.3561 17.3032 35.4244C17.2814 35.4927 17.2422 35.554 17.1895 35.6022C17.1367 35.6504 17.0723 35.6838 17.0028 35.699C16.9332 35.7142 16.8608 35.7107 16.793 35.6889C16.5676 35.6166 16.3325 35.5799 16.096 35.5802V35.5802ZM32.7424 25.1081C32.3884 25.1073 32.0356 25.0655 31.6912 24.9834C29.8486 24.5494 28.6167 23.0683 28.9448 21.6848C29.273 20.3014 31.0409 19.5302 32.8832 19.9647C33.2999 20.0622 33.7004 20.2187 34.0726 20.4294L35.7608 13.3246C35.787 13.2158 35.8552 13.1218 35.9506 13.0631C36.0461 13.0043 36.1609 12.9857 36.2701 13.0111L37.5591 13.3154C37.5742 13.3189 37.5891 13.3234 37.6036 13.3287C39.1526 13.7107 40.4602 14.865 40.8653 16.2137C41.2218 17.3992 40.8653 18.6375 39.86 19.7002C39.7944 19.7695 39.7073 19.8147 39.6127 19.8284C39.5181 19.842 39.4217 19.8234 39.3391 19.7754C39.2565 19.7275 39.1927 19.6531 39.1579 19.5643C39.1231 19.4756 39.1194 19.3777 39.1475 19.2866C39.2703 18.8908 39.3135 18.4747 39.2748 18.0622C39.236 17.6497 39.116 17.2489 38.9217 16.8827C38.5874 16.3177 38.0554 15.896 37.4281 15.6987L35.6302 23.2658C35.6143 23.3294 35.5946 23.392 35.5712 23.4534C35.2164 24.4809 34.0837 25.1081 32.7424 25.1081ZM31.8563 20.6882C30.8189 20.6882 29.9417 21.1531 29.7693 21.8792C29.5516 22.7941 30.5216 23.8397 31.8868 24.1621C33.2065 24.4732 34.4745 24.0415 34.771 23.1768C34.785 23.1422 34.7968 23.1067 34.8065 23.0707L36.7067 15.0719C36.7326 14.963 36.8008 14.8688 36.8963 14.81C36.9919 14.7512 37.107 14.7327 37.2162 14.7584C37.7197 14.8569 38.197 15.0593 38.6173 15.3529C39.0376 15.6464 39.3915 16.0244 39.6564 16.4626C39.871 16.8418 40.0159 17.2563 40.0839 17.6864C40.1869 17.2811 40.1768 16.8554 40.0547 16.4554C39.7345 15.3897 38.6278 14.4367 37.3635 14.1385C37.3487 14.1348 37.3347 14.1307 37.3209 14.1259L36.4871 13.9289L34.7548 21.2213C34.7383 21.291 34.7042 21.3553 34.6559 21.4083C34.6076 21.4612 34.5465 21.501 34.4785 21.524C34.4105 21.5469 34.3377 21.5522 34.2671 21.5394C34.1965 21.5266 34.1303 21.496 34.0747 21.4507C33.6687 21.128 33.1948 20.9008 32.6885 20.7861C32.4159 20.7214 32.1366 20.6886 31.8563 20.6882Z\",\n \"palm\": \"M17.6524 19.9464C19.3386 18.3308 21.0374 17.8884 22.5216 18.0699C24.0877 18.2615 25.3542 19.1402 26.0674 19.9216L26.6525 20.5627L25.785 20.591C23.9571 20.6506 22.6183 21.0316 21.6518 21.6025C20.6903 22.1703 20.0769 22.9376 19.7126 23.811C19.0201 25.4707 19.216 27.5461 19.752 29.3671C20.0706 27.5716 21.1593 26.164 22.409 25.1297C23.7269 24.0391 25.2551 23.3359 26.3578 23.0023L26.8417 22.8559L26.8729 23.3605C27.3722 31.4395 23.3709 36.4639 20.4761 38.6H27.3175C31.2763 32.8381 30.0426 26.5141 28.9068 23.5273L28.7006 22.9851H29.2807C31.1411 22.9851 32.4738 24.3418 33.3841 25.9639C34.2018 27.4208 34.7338 29.1822 35.0389 30.6669C36.5193 26.0858 35.7542 23.5235 34.336 22.1367C32.8301 20.6641 30.4456 20.3654 28.6276 20.5882L27.1558 20.7687L28.3372 19.8725C31.4012 17.5483 34.6599 18.9084 36.4431 20.2465C36.1571 18.7984 35.658 17.8412 35.062 17.23C34.4236 16.5754 33.6414 16.2841 32.7926 16.2385C31.0616 16.1454 29.0887 17.0798 27.7593 18.0322L27.5044 18.2148L27.2662 18.0109C23.932 15.1575 21.7129 15.0232 20.278 15.8259C18.9213 16.5848 18.0765 18.2689 17.6524 19.9464ZM27.5497 17.2035C24.2402 14.4533 21.7219 14.1016 19.8875 15.1277C18.0725 16.1429 17.1343 18.4114 16.7496 20.3095C16.6824 20.6407 16.8722 20.9073 17.1124 21.0153C17.3456 21.1201 17.6546 21.092 17.8696 20.8636C19.5218 19.1086 21.1158 18.7039 22.4245 18.864C23.3615 18.9786 24.1838 19.3869 24.8039 19.8537C23.3374 20.0005 22.1654 20.37 21.245 20.9136C20.1278 21.5735 19.4019 22.4779 18.9742 23.503C18.1278 25.5319 18.4618 27.9958 19.1 29.9665C19.1626 30.1598 19.3033 30.2893 19.4628 30.3527C19.6117 30.412 19.7665 30.4113 19.8956 30.3837C20.1306 30.3335 20.4528 30.1432 20.5002 29.7677C20.711 28.0964 21.6965 26.7578 22.9191 25.746C23.957 24.8871 25.1431 24.2835 26.1004 23.9322C26.4233 32.5112 21.4389 37.3163 18.9186 38.6462L19.1053 39.4H27.7335L27.853 39.2307C31.9135 33.4813 30.9859 27.1858 29.8698 23.8466C31.0131 24.0894 31.9448 25.0338 32.6865 26.3554C33.5441 27.8835 34.0808 29.8065 34.3534 31.3401C34.4121 31.6703 34.6819 31.8546 34.9397 31.8804C35.2 31.9065 35.5063 31.7752 35.6197 31.4499C37.3777 26.4068 36.687 23.3167 34.8954 21.5647C33.6086 20.3065 31.8257 19.8148 30.2067 19.7346C32.5514 18.8515 34.8696 19.9816 36.2156 21.0844C36.4471 21.274 36.7412 21.2695 36.9547 21.1577C37.1721 21.0439 37.3494 20.7933 37.2979 20.4791C37.0099 18.7229 36.4289 17.4858 35.6347 16.6715C34.8345 15.8509 33.8517 15.4942 32.8356 15.4396C30.9561 15.3386 28.9372 16.2662 27.5497 17.2035Z\",\n \"party\": \"M27.46 39.01h3.006c.472 0 .9.247 1.139.642l.169.28h-9.551l.17-.28a1.327 1.327 0 0 1 1.138-.642h3.006v-7.19L17.09 18.937a.461.461 0 0 1 .372-.735H30.25l4.197-5.037a.463.463 0 0 1 .71.592l-3.704 4.445h5.082a.463.463 0 0 1 .373.735 4729.84 4729.84 0 0 1-5.855 7.987l-.106.145c-1.661 2.263-2.457 3.347-3.408 4.645l-.079.107v7.189zm-9.087-19.885l8.625 11.763 8.626-11.763h-17.25z\",\n \"reparingService\": \"M17.6264 35.9866L14.9033 31.3082L17.2692 29.9535C17.0676 29.1684 16.9592 28.3465 16.9592 27.4998C16.9592 26.6532 17.0676 25.8313 17.2692 25.0463L14.9033 23.6915L17.6264 19.0133L19.9935 20.3688C21.1773 19.2228 22.6451 18.3639 24.2819 17.9066V15.2H29.7182V17.9068C31.3549 18.3641 32.8227 19.223 34.0065 20.3689L36.3736 19.0134L39.0967 23.6916L36.7309 25.0464C36.9326 25.8314 37.0409 26.6533 37.0409 27.5001C37.0409 28.3468 36.9326 29.1687 36.7309 29.9537L39.0967 31.3085L36.3736 35.9866L34.0066 34.6311C32.8228 35.777 31.355 36.636 29.7182 37.0933V39.8H24.2819V37.0933C22.6452 36.6359 21.1774 35.777 19.9935 34.6311L17.6264 35.9866ZM20.1352 33.6281C21.4188 35.0414 23.1385 36.0571 25.0819 36.4658V39H28.9182V36.4658C30.8617 36.0571 32.5813 35.0414 33.8649 33.6281L36.0818 34.8976L38 31.6024L35.7864 30.3347C36.08 29.4414 36.2409 28.4893 36.2409 27.5001C36.2409 26.5109 36.08 25.5587 35.7864 24.6654L38 23.3978L36.0819 20.1025L33.8649 21.3719C32.5812 19.9586 30.8616 18.9429 28.9182 18.5343V16H25.0819V18.5341C23.1384 18.9427 21.4188 19.9585 20.1352 21.3718L17.9182 20.1023L16 23.3976L18.2137 24.6653C17.9201 25.5584 17.7592 26.5107 17.7592 27.4998C17.7592 28.489 17.9201 29.4412 18.2137 30.3345L16 31.6021L17.9182 34.8976L20.1352 33.6281ZM27.0001 22.9394C24.4556 22.9394 22.3956 24.9921 22.3956 27.4999C22.3956 30.0078 24.4556 32.0605 27.0001 32.0605C29.5445 32.0605 31.6046 30.0078 31.6046 27.4999C31.6046 24.9921 29.5445 22.9394 27.0001 22.9394ZM27.0001 22.1394C24.02 22.1394 21.5956 24.5441 21.5956 27.4999C21.5956 30.4557 24.02 32.8605 27.0001 32.8605C29.9801 32.8605 32.4046 30.4557 32.4046 27.4999C32.4046 24.5441 29.9801 22.1394 27.0001 22.1394Z\",\n \"security\": \"M35.7582 19.8593L26.5878 15.0529C26.4517 14.9815 26.2887 14.9825 26.1536 15.0554L17.2369 19.8618C17.0907 19.9408 17 20.0916 17 20.2558V26.5343C17.0054 31.6953 20.1141 36.3644 24.9216 38.4321L26.1592 38.9626C26.2749 39.0122 26.4066 39.0125 26.5225 38.9631L27.9172 38.3707C32.8138 36.3479 35.9995 31.6337 36 26.4097V20.2558C36 20.0899 35.907 19.9373 35.7582 19.8593ZM35.0869 26.4097C35.0859 31.2736 32.1191 35.6623 27.5597 37.5445L27.5567 37.546L26.3422 38.0617L25.2869 37.6089C20.8119 35.6843 17.9179 31.3385 17.9128 26.5343V20.5217L26.3761 15.9593L35.0869 20.5249V26.4097ZM22.8092 26.0853C22.6443 25.8753 22.3543 25.8505 22.1612 26.0298C21.9681 26.2088 21.9453 26.5244 22.1102 26.7341L24.5376 29.8247C24.6997 30.031 24.9836 30.0592 25.1769 29.888L30.8304 24.8872C31.0274 24.7132 31.0571 24.3984 30.8968 24.1843C30.7368 23.9704 30.4473 23.9378 30.2503 24.1121L24.9451 28.8045L22.8092 26.0853Z\",\n \"smile\": \"M32.0437 29.7417C31.8288 29.5492 31.4985 29.568 31.307 29.7824C30.2187 30.9986 28.6493 31.6957 27.0001 31.6957C25.3514 31.6957 23.7815 30.9986 22.6931 29.7824C22.5006 29.568 22.1714 29.5492 21.9564 29.7417C21.7415 29.9337 21.7237 30.2635 21.9157 30.4784C23.2018 31.9153 25.055 32.7391 27.0001 32.7391C28.9456 32.7391 30.7989 31.9148 32.0844 30.4784C32.2764 30.2635 32.2582 29.9337 32.0437 29.7417ZM27 15C20.3833 15 15 20.3833 15 27C15 33.6167 20.3833 39 27 39C33.6167 39 39 33.6167 39 27C39 20.3833 33.6167 15 27 15ZM27 37.9565C20.9583 37.9565 16.0435 33.0417 16.0435 27C16.0435 20.9583 20.9583 16.0435 27 16.0435C33.0417 16.0435 37.9565 20.9583 37.9565 27C37.9565 33.0417 33.0417 37.9565 27 37.9565ZM31.1739 23.3478C29.7355 23.3478 28.5652 24.5181 28.5652 25.9565C28.5652 26.2445 28.799 26.4783 29.087 26.4783C29.375 26.4783 29.6087 26.2445 29.6087 25.9565C29.6087 25.0936 30.311 24.3913 31.1739 24.3913C32.0369 24.3913 32.7391 25.0936 32.7391 25.9565C32.7391 26.2445 32.9729 26.4783 33.2609 26.4783C33.5489 26.4783 33.7826 26.2445 33.7826 25.9565C33.7826 24.5181 32.6123 23.3478 31.1739 23.3478ZM24.3912 25.9565C24.3912 26.2445 24.625 26.4783 24.913 26.4783C25.201 26.4783 25.4347 26.2445 25.4347 25.9565C25.4347 24.5181 24.2644 23.3478 22.826 23.3478C21.3876 23.3478 20.2173 24.5181 20.2173 25.9565C20.2173 26.2445 20.4511 26.4783 20.7391 26.4783C21.0271 26.4783 21.2608 26.2445 21.2608 25.9565C21.2608 25.0936 21.9631 24.3913 22.826 24.3913C23.689 24.3913 24.3912 25.0936 24.3912 25.9565Z\",\n \"sport\": \"M19.565 26.508v1.901h15.597v-1.9H19.565zm0-.948v-4.943c0-.892-.715-1.617-1.595-1.617h-.75c-.879 0-1.594.725-1.594 1.617v2.567h-1.031c-.88 0-1.595.723-1.595 1.614v5.323c0 .892.715 1.615 1.595 1.615h1.031v2.567c0 .892.715 1.617 1.595 1.617h.75c.879 0 1.594-.725 1.594-1.617V29.36h15.597v4.943c0 .892.715 1.617 1.595 1.617h.75c.881 0 1.594-.725 1.594-1.617v-2.567h1.031c.882 0 1.595-.723 1.595-1.615v-5.323c0-.891-.713-1.614-1.595-1.614h-1.031v-2.567c0-.892-.713-1.617-1.595-1.617h-.75c-.879 0-1.594.725-1.594 1.617v4.943H19.565zm-3.939 5.225h-1.031a.66.66 0 0 1-.657-.664v-5.323a.66.66 0 0 1 .657-.664h1.031v6.651zm.938.95V20.618c0-.368.294-.667.657-.667h.75c.362 0 .656.3.656.667v13.686a.66.66 0 0 1-.657.664h-.75a.66.66 0 0 1-.656-.664v-2.567zm22.537-.95h1.031a.66.66 0 0 0 .657-.664v-5.323a.66.66 0 0 0-.657-.664h-1.031v6.651zm-.938.95V20.618a.662.662 0 0 0-.657-.667h-.75a.662.662 0 0 0-.656.667v13.686a.66.66 0 0 0 .657.664h.75a.66.66 0 0 0 .656-.664v-2.567z\",\n \"theater\": \"M28.7364 18.87C30.2876 18.87 31.5096 19.6791 31.5096 20.7169C31.5096 21.7492 30.2932 22.5639 28.7364 22.5639C27.1852 22.5639 25.9632 21.7548 25.9632 20.7169C25.9632 19.6791 27.1796 18.87 28.7364 18.87ZM28.7364 21.6432C29.791 21.6432 30.5833 21.1578 30.5833 20.7169C30.5833 20.2761 29.7966 19.7907 28.7364 19.7907C27.6818 19.7907 26.8895 20.2761 26.8895 20.7169C26.8895 21.1522 27.6818 21.6432 28.7364 21.6432ZM19.8701 26.9608C21.2985 26.3414 22.7381 26.6037 23.1454 27.5523C23.5584 28.5008 22.7604 29.734 21.3376 30.3478C19.9147 30.9616 18.4695 30.7049 18.0622 29.7563C17.6493 28.8077 18.4416 27.5802 19.8701 26.9608ZM18.9048 29.388C19.0777 29.7898 19.9984 29.9237 20.9693 29.4996C21.9402 29.0811 22.4703 28.3167 22.2973 27.915C22.1243 27.5132 21.2037 27.3793 20.2328 27.8034C19.2674 28.2274 18.7318 28.9919 18.9048 29.388ZM28.5634 25.5435C29.4227 26.8604 30.8679 27.6416 32.4358 27.6416C34.0038 27.6416 35.449 26.8548 36.3083 25.5435L37.0839 26.0457C36.0572 27.6248 34.3163 28.5678 32.4358 28.5678C30.5498 28.5678 28.8145 27.6248 27.7878 26.0457L28.5634 25.5435ZM36.1298 18.8644C37.681 18.8644 38.903 19.6735 38.903 20.7114C38.903 21.7492 37.6865 22.5583 36.1298 22.5583C34.573 22.5639 33.3566 21.7492 33.3566 20.7114C33.3566 19.6735 34.573 18.8644 36.1298 18.8644ZM36.1298 21.6376C37.1844 21.6376 37.9767 21.1522 37.9767 20.7114C37.9767 20.2761 37.1844 19.7851 36.1298 19.7851C35.0752 19.7851 34.2828 20.2706 34.2828 20.7114C34.2828 21.1466 35.0752 21.6376 36.1298 21.6376ZM23.6587 21.4814V13C23.6587 13 27.7878 15.4775 32.4359 15.4775C37.0783 15.4775 41.2074 13 41.2074 13V24.5949C41.2074 27.781 39.4776 30.7216 36.6933 32.2673C35.8396 32.7415 34.9077 33.0652 33.9536 33.2326C33.6467 34.2593 33.1668 35.2134 32.5196 36.0616C30.84 38.26 28.2677 39.7889 24.7078 39.4708C21.5384 39.1863 18.7764 37.1664 17.5042 34.2425L12.8617 23.6185C12.8617 23.6185 18.648 24.5894 23.6587 21.4814ZM36.2469 31.4582C38.7355 30.0744 40.2867 27.4463 40.2867 24.5949V14.5512C37.8539 15.762 35.1588 16.4037 32.4359 16.4037C29.7129 16.4037 27.0178 15.7676 24.585 14.5512V24.5949C24.585 27.4463 26.1306 30.0744 28.6248 31.4582C30.946 32.7527 33.9201 32.7527 36.2469 31.4582ZM18.3467 33.8798C19.485 36.4912 21.9569 38.2823 24.7915 38.5557C27.5144 38.8124 30.1258 37.6741 31.783 35.5091C32.2852 34.8563 32.6646 34.1309 32.938 33.3609C32.7707 33.3721 30.2095 33.5283 27.5702 31.9046C25.2044 31.9269 23.7536 34.1867 23.4969 35.7379L22.5874 35.5873C22.8999 33.7292 24.5292 31.447 26.5993 31.1569C24.7524 29.5108 23.6587 27.1394 23.6587 24.6061V22.5416C20.8186 24.0872 17.56 24.8405 14.3292 24.6786L18.3467 33.8798Z\",\n \"travel\": \"M42.158 34.859v-.04H26.766a5.54 5.54 0 0 1-.429-2.144 5.488 5.488 0 0 1 5.495-5.495 5.522 5.522 0 0 1 4.831 2.844c2.185-.35 4.365.899 5.185 3.042.232.585.31 1.208.31 1.793zm-14.732-.966h13.705a3.167 3.167 0 0 0-.15-.494c-.65-1.687-2.372-2.749-4.171-2.46l-.64.103-.316-.565a4.594 4.594 0 0 0-4.022-2.371 4.564 4.564 0 0 0-4.57 4.569c0 .418.055.823.164 1.218zm-6.22-15.035a.484.484 0 0 1 .276-.63.485.485 0 0 1 .63.276l.626 1.6a.491.491 0 0 1-.28.632.489.489 0 0 1-.629-.279l-.622-1.599zm-6.708 6.669a.489.489 0 0 1 .374-.902l1.868.78a.487.487 0 0 1 .265.635.493.493 0 0 1-.64.266l-1.867-.78zm22.676-.745a.487.487 0 0 1 .384.898l-1.636.7a.489.489 0 0 1-.64-.255.483.483 0 0 1 .255-.64l1.637-.703zm-6.887-6.516a.486.486 0 0 1 .633-.269c.252.1.371.381.273.633l-.701 1.752a.488.488 0 0 1-.905-.36l.7-1.756zm-14.633 1.531a.488.488 0 0 1 .708-.67l2.729 2.885a.485.485 0 0 1-.02.687.485.485 0 0 1-.688-.017l-2.729-2.885zM11.48 30.082a.487.487 0 1 1 .017-.973l4.014.078a.486.486 0 1 1-.02.974l-4.011-.079zm24.336-10.656c.19-.187.5-.187.687.007.191.19.188.5-.003.687l-2.844 2.807a.489.489 0 0 1-.688-.694l2.848-2.807zm-10.397-3.94a.487.487 0 0 1 .976 0v4.015a.487.487 0 1 1-.976 0v-4.014zm11.503 22.445a.49.49 0 0 1 .218.654.491.491 0 0 1-.654.217c-.017-.01-.04-.017-.102-.044-.085-.034-.122-.048-.187-.082-1.065-.581-2.718-.581-3.78 0-1.354.742-3.361.742-4.715 0-1.065-.581-2.719-.581-3.78 0-1.354.742-3.365.742-4.72 0-1.06-.581-2.714-.581-3.776 0a.487.487 0 1 1-.47-.854c1.355-.745 3.362-.745 4.716 0 1.062.582 2.719.582 3.78 0 1.354-.745 3.362-.745 4.716 0 1.061.582 2.718.582 3.78 0 1.354-.745 3.361-.745 4.698-.01.017.01.041.02.102.044.085.034.123.048.174.075zM18.645 33.86a8.206 8.206 0 0 1-1.017-3.95c0-4.57 3.698-8.285 8.28-8.285 2.447 0 4.747 1.096 6.332 2.94.174.2.154.51-.054.684a.482.482 0 0 1-.684-.051c-1.405-1.63-3.436-2.596-5.593-2.596a7.305 7.305 0 0 0-7.308 7.308c0 1.333.37 2.613 1.061 3.763a.63.63 0 0 1 .058.143 5.135 5.135 0 0 0 1.419-.371c.803-.381 1.81-.558 2.84-.514a.487.487 0 1 1-.04.973c-.881-.037-1.732.112-2.395.425-1.528.68-3.777.68-5.304 0-1.276-.568-3.24-.568-4.515 0a.487.487 0 1 1-.395-.891c1.528-.68 3.777-.68 5.304 0 .575.255 1.286.398 2.01.422z\",\n \"work\": \"M23.893 27.36v1.009c0 .146.105.258.248.258h.216v1.467c0 .552.43 1.027 1.003 1.027h2.538c.573 0 1.003-.475 1.003-1.027v-1.467h.216c.143 0 .248-.112.248-.258v-1.01h8.07v9.67c0 .042-.014.056-.052.056H15.84c-.038 0-.052-.014-.052-.056v-9.67h8.105zm-8.999-.004v9.673c0 .548.416.974.946.974h21.543c.53 0 .946-.426.946-.974v-9.673c.506-.028.894-.44.894-.97v-7.048c0-.544-.412-.97-.946-.97h-7.802v-.57c0-1.03-.904-1.798-2.004-1.798h-3.684c-1.1 0-2.005.768-2.005 1.798v.57h-7.836c-.53 0-.946.426-.946.97v7.047c0 .52.412.943.894.971zm8.964-8.988v-.57c0-.37.384-.698.929-.698h3.684c.545 0 .932.328.932.698v.57h-5.545zm-8.912 8.073c-.02 0-.052-.031-.052-.056v-7.047c0-.038.014-.055.052-.055h23.33c.04 0 .053.017.053.055v7.047c0 .042-.014.056-.052.056h-23.33zm13.193 1.233h-3.055v2.287c0 .21.153.395.37.395h2.315c.217 0 .37-.185.37-.395v-2.287z\",\n \"world\": \"M38.745 22.8998C36.9315 18.1411 32.3667 14.9974 27.2741 15C26.1415 14.9979 25.0141 15.154 23.9246 15.4637L23.9082 15.4686C20.8844 16.3235 18.3068 18.3118 16.7122 21.0195C16.684 21.0672 16.6657 21.1201 16.6585 21.175C16.4625 21.4365 16.2999 21.7215 16.1743 22.0231L16.1435 22.0896C14.3781 25.8923 14.6735 30.3327 16.9271 33.868C19.1808 37.4032 23.0816 39.5453 27.2741 39.5499C30.0925 39.5523 32.8251 38.5801 35.0088 36.7982C35.1857 36.8134 35.3519 36.7118 35.4191 36.5475C35.432 36.5096 35.4393 36.4701 35.4408 36.4301C39.2436 33.043 40.5585 27.6586 38.745 22.8998ZM23.8651 16.3381C24.4076 17.0035 25.207 17.4073 26.0645 17.4493C26.2989 17.4553 26.5335 17.4451 26.7666 17.4185C27.1435 17.333 27.5383 17.38 27.8847 17.5514C28.0786 17.6551 28.1856 17.8702 28.1514 18.0874C28.0624 18.2509 27.9402 18.3941 27.7928 18.508C27.4261 18.7567 27.2052 19.1699 27.2019 19.613C27.2297 19.8888 27.3774 20.1385 27.6057 20.2957C27.9433 20.5212 28.3594 20.5966 28.7546 20.5037C28.9736 20.4464 29.1869 20.3692 29.3918 20.2731C29.5782 20.1815 29.7753 20.1138 29.9786 20.0716C30.4981 19.9986 31.0315 20.342 31.576 20.7327C31.8489 20.9301 32.2933 21.303 32.2014 21.5861C32.1308 21.8032 31.8657 21.96 31.5859 22.1265C31.4726 22.1934 31.3619 22.259 31.2338 22.3481C30.7805 22.6913 30.2838 22.9729 29.7566 23.1856C29.5574 23.2519 29.3545 23.3067 29.1489 23.3497C28.7209 23.4246 28.3095 23.5748 27.9339 23.7933C27.1802 24.28 27.2721 25.0588 27.3299 25.5269C27.3164 25.5224 27.3016 25.5171 27.2856 25.5101C27.2154 25.4814 27.1465 25.4485 27.078 25.4165C26.6537 25.1303 26.104 25.1083 25.6582 25.3597C25.2124 25.6111 24.9468 26.0928 24.9722 26.604C24.9722 27.5778 25.6952 28.1457 26.2762 28.6015L26.4781 28.7615C26.6063 28.8793 26.7217 29.0104 26.8223 29.1526C25.9975 28.9449 25.1722 28.7407 24.3464 28.54C23.6521 28.3721 22.9513 28.1653 22.664 27.6516C22.5542 27.4188 22.4802 27.1708 22.4445 26.9159C22.3925 26.5114 22.2503 26.1239 22.0284 25.7817C21.6073 25.3117 21.0398 24.9977 20.4179 24.8905L20.3428 24.8692C19.7273 24.6862 19.39 24.4658 19.2801 24.1774C19.2115 23.803 19.2726 23.4164 19.4532 23.0814C19.6852 22.5988 19.7625 22.0564 19.6748 21.5282C19.5827 21.1232 19.312 20.7817 18.9386 20.5997C18.7168 20.4964 18.4747 20.4444 18.23 20.4474C18.1779 20.4474 18.1249 20.4499 18.0716 20.454C19.5129 18.4978 21.5434 17.0552 23.8651 16.3381ZM25.5499 38.596L25.5536 38.5997C25.3926 38.5104 25.2364 38.4126 25.0858 38.3067C24.7541 38.1 24.5274 37.7607 24.4634 37.3752C24.4863 37.1277 24.5663 36.8889 24.6973 36.6776C24.789 36.4823 24.8568 36.2766 24.8991 36.065C24.9252 35.8729 24.9954 35.6895 25.1043 35.5291C25.2256 35.4185 25.3662 35.3312 25.5191 35.2714C25.6904 35.1956 25.8532 35.1021 26.0049 34.9924C26.3324 34.7316 26.6039 34.4076 26.8035 34.0396C26.8999 33.8706 26.9832 33.6863 27.0636 33.5062C27.1727 33.2206 27.3249 32.9534 27.515 32.7139C27.9253 32.2818 28.7336 32.6026 29.0611 32.7594C29.6859 33.04 30.2604 33.4213 30.7615 33.8882L30.8087 33.9366C31.3396 34.4978 31.9046 35.0259 32.5005 35.5176C32.9934 35.8984 33.5335 36.2139 34.1073 36.4561C31.6555 38.2845 28.5737 39.0551 25.5499 38.596ZM34.8324 35.8722C34.1816 35.6314 33.5696 35.2967 33.0158 34.8788C32.4463 34.4074 31.906 33.9018 31.3979 33.3647L31.3507 33.3167C30.785 32.7806 30.133 32.3437 29.4222 32.0241C28.3841 31.526 27.474 31.5727 26.9237 32.1529C26.6672 32.4567 26.4629 32.801 26.3193 33.1718C26.2459 33.3334 26.1744 33.4931 26.0952 33.6326C25.9493 33.9054 25.7505 34.1464 25.5105 34.3416C25.4027 34.4168 25.2877 34.481 25.1671 34.5333C24.9171 34.6359 24.6901 34.7874 24.4995 34.9789C24.2917 35.2384 24.1549 35.5475 24.1027 35.8759C24.0741 36.0226 24.0294 36.1657 23.9693 36.3026C23.7738 36.629 23.6619 36.9985 23.6436 37.3785C23.6496 37.6766 23.7367 37.9673 23.8955 38.2196C20.735 37.2398 18.1516 34.9429 16.8088 31.9188C15.4661 28.8946 15.4947 25.4379 16.8874 22.4364L16.9186 22.3687C17.03 22.0745 17.1963 21.8043 17.4086 21.5722C17.484 21.497 17.573 21.4365 17.6708 21.3942C17.8477 21.315 18.0391 21.2731 18.2329 21.2711C18.3528 21.2683 18.4718 21.2921 18.5813 21.3409C18.7363 21.419 18.8462 21.5645 18.8792 21.7348C18.9152 22.1019 18.8468 22.4717 18.6819 22.8016C18.4199 23.318 18.3596 23.9133 18.5124 24.4717C18.7878 25.191 19.5551 25.493 20.1127 25.6588L20.1948 25.6818C20.6382 25.7528 21.0489 25.9587 21.3712 26.2714C21.5168 26.5186 21.6092 26.7935 21.6424 27.0785C21.6929 27.4178 21.7967 27.747 21.9502 28.0539C22.3982 28.8569 23.3244 29.1388 24.1565 29.3398C25.0494 29.5567 25.9431 29.7781 26.8376 30.0037C27.0175 30.0624 27.2116 30.0599 27.3899 29.9968C27.5979 29.916 27.7468 29.7302 27.7806 29.5097C27.8742 28.888 27.0153 28.1404 27.001 28.1297L26.7851 27.9582C26.2759 27.5586 25.795 27.1811 25.795 26.6041C25.7901 26.3618 25.9298 26.1397 26.1504 26.0391C26.3034 25.9755 26.4314 26.0219 26.7297 26.1622C26.8118 26.2008 26.8939 26.2394 26.969 26.2698C27.2878 26.4407 27.6799 26.3914 27.9463 26.1467C28.1197 25.9532 28.1928 25.6899 28.1441 25.4347C28.0768 24.8878 28.1031 24.6617 28.3788 24.4832C28.6766 24.3196 28.9998 24.2073 29.3349 24.1512C29.571 24.1007 29.8039 24.0364 30.0325 23.9588C30.6378 23.7172 31.208 23.3957 31.728 23.0027C31.8101 22.9448 31.9048 22.8898 32 22.8336C32.4392 22.6368 32.7887 22.2825 32.9795 21.8406C33.1728 21.2473 32.8613 20.6506 32.053 20.0676C31.5339 19.6954 30.7469 19.1328 29.8581 19.2604C29.5824 19.3111 29.3147 19.3989 29.0625 19.5214C28.9018 19.5972 28.7348 19.659 28.5635 19.7061C28.399 19.744 28.2263 19.7168 28.0814 19.6301C28.0211 19.5866 28.0178 19.5526 28.0165 19.5399C28.0075 19.4332 28.1396 19.3015 28.3448 19.1123C28.5976 18.9137 28.7966 18.655 28.9238 18.3598C29.0926 17.7794 28.8435 17.1588 28.3202 16.8563C27.8233 16.583 27.2462 16.4928 26.6896 16.6015C26.4943 16.6245 26.2977 16.6338 26.1012 16.6294C25.6106 16.6028 25.1425 16.4153 24.7692 16.096C29.8767 14.9455 35.1138 17.4063 37.4882 22.0723C39.8623 26.7384 38.7689 32.4206 34.8324 35.8722Z\",\n \"register_order\": \"M33.7842 18.4074C33.7842 16.0611 32.9999 11 28.4999 11C26 11 23 13 23.3607 18.4074M22.3757 18.3749H18.2507C17.3963 18.3749 17.3571 17.4289 18.2507 17.4289C18.2507 17.4289 19.9064 17.4398 22.3413 17.453M22.3757 18.3749C22.3502 18.0945 22.3376 17.7842 22.3413 17.453M22.3757 18.3749C22.3757 18.3749 29.9051 18.3638 34.7251 18.3562M22.3757 18.3749H23.8756M22.3413 17.453C22.3733 14.5363 23.6647 10 28.5 10C33.0233 10 34.5595 14.5881 34.7187 17.499M22.3413 17.453C25.7428 17.4716 30.6651 17.4947 34.7187 17.499M34.7251 18.3562C35.5107 18.3757 37.8004 18.0621 39.2507 19.8749C40.7507 21.7499 40.5 22.9997 40.5 25.9997V36.9997C40.5 37.9997 39.5823 39.9997 37.5 39.9997H19.5C18.5 39.9997 17.5 39.5 17 39C16.5 38.5 16 37.4997 16 36.4997C16 35.4997 15 35.5 15 36.4997C15.5 40 17.5 41 19 41C20.5 41 29.9834 40.9997 37.5 40.9997C40.3355 40.9997 41.5 38.4997 41.5 36.9997C41.5 32.9997 41.3863 29.4997 41.3863 22.9997C41.3863 19.874 39.0063 17.4997 36 17.4997C35.5851 17.4997 35.157 17.4995 34.7187 17.499M34.7251 18.3562C34.737 18.094 34.7355 17.8058 34.7187 17.499M36.0015 25.0068H34.6554C34.3189 25.0068 33.9824 25.309 33.9824 25.6818V27.0318C33.9824 27.4046 34.2837 27.7068 34.6554 27.7068H36.0015C36.3732 27.7068 36.6745 27.4046 36.6745 27.0318V25.6818C36.6745 25.2599 36.338 25.0068 36.0015 25.0068ZM36.0117 24H34.5117C34.0117 24 33.0832 24.3318 33.0117 25.5C32.9854 25.9315 33.0116 26.482 33.0116 26.9318C33.0116 27.3046 32.9778 28.6238 34.4778 28.6238C35.3867 28.6238 35.4727 28.6212 36.5117 28.5867C37.5508 28.5522 37.6754 27.4818 37.6754 27.0068V25.4818C37.6754 24.659 36.9302 24 36.0117 24ZM29.0015 25.0068H27.6554C27.3189 25.0068 26.9824 25.309 26.9824 25.6818V27.0318C26.9824 27.4046 27.2837 27.7068 27.6554 27.7068H29.0015C29.3732 27.7068 29.6745 27.4046 29.6745 27.0318V25.6818C29.6745 25.2599 29.338 25.0068 29.0015 25.0068ZM29.0117 24H27.5117C27.0117 24 26.0832 24.3318 26.0117 25.5C25.9854 25.9315 26.0116 26.482 26.0116 26.9318C26.0116 27.3046 25.9778 28.6238 27.4778 28.6238C28.3867 28.6238 28.4727 28.6212 29.5117 28.5867C30.5508 28.5522 30.6754 27.4818 30.6754 27.0068V25.4818C30.6754 24.659 29.9302 24 29.0117 24ZM16.7508 29.9998C14.8758 28.4998 14.5006 28.4998 12.6258 26.2498C10.751 23.9998 9.69068 20.4322 10.7507 17.2499C11.1255 16.1249 11.5004 16.4999 11.5006 17.9999C11.5008 19.1249 12 20.5 12.5 21.5C13 22.5 13.7815 23.5899 14.7501 24.3749C15.7187 25.1598 16.8744 26 18.5001 26.9998C18.5464 27.0284 20.1256 24.7499 20.8756 23.9999C21.2278 23.6477 21.7127 23.9727 21.907 24.7499L23.6882 31.8748C23.7837 32.2568 23.5179 32.6779 23.1256 32.7114C19.7506 32.9998 18.25 33.2548 16 33.5C15.1192 33.596 14.5545 33.1365 15 32.5C16.0499 31 16.768 30.0136 16.7508 29.9998ZM12.5 24.5C11.948 23.3953 11.5 21.5 11.5 21.5L12.7269 23.5899C13.3006 24.3749 14.7226 25.6589 16 26.5C17.8985 27.7502 16.7507 26.9998 18.5 28C18.934 28.2482 19.5 27.5 20.5 26C21.0914 25.1129 21.1167 24.966 21.5001 26.5C22 28.5 22.0001 28.5 22.5001 30.5C22.8425 31.8697 22.7897 31.8748 21.5145 31.9986L21.5001 32C21.2354 32.0257 18.5179 32.3266 17 32.5C16.2698 32.5834 15.7821 32.7724 16 32.5C18 30 17.8898 29.7541 17.6709 29.5899C15.5341 27.9873 13.3119 26.1249 12.5 24.5ZM23.8894 18.4008C24.226 18.4008 24.6747 18.4005 24.6747 18.4005V19.1941C24.6747 19.5669 24.3716 20.0001 23.9999 20.0001H22.6538C22.2821 20.0001 21.9413 19.5979 21.9413 19.2251V18.3955C22.4413 18.3955 23.5529 18.4008 23.8894 18.4008ZM22 18.3955C21.5002 18.3955 22.0752 18.3956 21.0752 18.3956C21.0752 18.8279 21.0752 18.9458 21.0752 19.3956C21.0752 19.8454 21.5312 20.8169 22.4779 20.8478C23.3864 20.8775 23.5185 20.8437 24.324 20.8169C25.1296 20.7901 25.4999 19.9134 25.4999 19.2967C25.4999 18.68 25.4999 19.5116 25.4999 18.4008C24.3247 18.4188 24.5002 18.3954 22 18.3955ZM34.8142 18.4008C35.1508 18.4008 35.5995 18.4005 35.5995 18.4005V19.1941C35.5995 19.5669 35.2964 20.0001 34.9247 20.0001H33.5786C33.2069 20.0001 32.8661 19.5979 32.8661 19.2251V18.3955C33.3661 18.3955 34.4777 18.4008 34.8142 18.4008ZM32.9248 18.3955C32.425 18.3955 33 18.3956 32 18.3956C32 18.8279 32 18.9458 32 19.3956C32 19.8454 32.456 20.8169 33.4027 20.8478C34.3112 20.8775 34.4433 20.8437 35.2488 20.8169C36.0544 20.7901 36.4247 19.9134 36.4247 19.2967C36.4247 18.68 36.4247 18.3796 36.4247 18.4008C36.4247 18.4219 35.5995 18.4005 32.9248 18.3955ZM29.0015 32.0068H27.6554C27.3189 32.0068 26.9824 32.309 26.9824 32.6818V34.0318C26.9824 34.4046 27.2837 34.7068 27.6554 34.7068H29.0015C29.3732 34.7068 29.6745 34.4046 29.6745 34.0318V32.6818C29.6745 32.2599 29.338 32.0068 29.0015 32.0068ZM29.0117 31H27.5117C27.0117 31 26.0832 31.3318 26.0117 32.5C25.9854 32.9315 26.0116 33.482 26.0116 33.9318C26.0116 34.3046 25.9778 35.6238 27.4778 35.6238C28.3867 35.6238 28.4727 35.6212 29.5117 35.5867C30.5508 35.5522 30.6754 34.4818 30.6754 34.0068V32.4818C30.6754 31.659 29.9302 31 29.0117 31ZM36.0015 32.0068H34.6554C34.3189 32.0068 33.9824 32.309 33.9824 32.6818V34.0318C33.9824 34.4046 34.2837 34.7068 34.6554 34.7068H36.0015C36.3732 34.7068 36.6745 34.4046 36.6745 34.0318V32.6818C36.6745 32.2599 36.338 32.0068 36.0015 32.0068ZM36.0117 31H34.5117C34.0117 31 33.0832 31.3318 33.0117 32.5C32.9854 32.9315 33.0116 33.482 33.0116 33.9318C33.0116 34.3046 32.9778 35.6238 34.4778 35.6238C35.3867 35.6238 35.4727 35.6212 36.5117 35.5867C37.5508 35.5522 37.6754 34.4818 37.6754 34.0068V32.4818C37.6754 31.659 36.9302 31 36.0117 31Z\",\n} as const;\n\nexport type ContextIconPresetPathKey = keyof typeof CONTEXT_ICON_PRESET_PATHS;\n","/**\n * Пресеты иконок контекста (torrow-apps `IconSetService` + `ContextFormMapper`).\n *\n * На wire нет поля `iconName`: пресет = SVG-файл в `ContextItem.image`\n * с `fileName` вида `{preset}.svg` (и заливка из `color`). Произвольные\n * JPEG/PNG/прочие SVG тоже допустимы через обычный upload `image`.\n */\nimport {\n CONTEXT_ICON_PRESET_PATHS,\n type ContextIconPresetPathKey,\n} from \"./context-icon-preset-paths.js\";\n\n/** Ключи пресетов — значения совпадают с `IconSetService.icons` / basename `*.svg`. */\nexport const ContextIconPresetValues = {\n Anchor: \"anchor\",\n Animals: \"animals\",\n Auto: \"auto\",\n Beauty: \"beauty\",\n Beauty2: \"beauty2\",\n Botanical: \"botanical\",\n Children: \"children\",\n Devices: \"devices\",\n Entertainment: \"entertainment\",\n Evolution: \"evolution\",\n Family: \"family\",\n Friends: \"friends\",\n Gamepad: \"gamepad\",\n Health: \"health\",\n Hobbies: \"hobbies\",\n Home: \"home\",\n Idea: \"idea\",\n Money: \"money\",\n Music: \"music\",\n Palm: \"palm\",\n Party: \"party\",\n ReparingService: \"reparingService\",\n Security: \"security\",\n Smile: \"smile\",\n Sport: \"sport\",\n Theater: \"theater\",\n Travel: \"travel\",\n Work: \"work\",\n World: \"world\",\n RegisterOrder: \"register_order\",\n} as const satisfies Record<string, ContextIconPresetPathKey>;\n\nexport type ContextIconPresetValue =\n (typeof ContextIconPresetValues)[keyof typeof ContextIconPresetValues];\n\nconst PRESET_SET = new Set<string>(Object.values(ContextIconPresetValues));\n\nlet nextSvgId = 0;\n\nexport function isContextIconPreset(value: string | null | undefined): value is ContextIconPresetValue {\n return typeof value === \"string\" && PRESET_SET.has(value);\n}\n\n/** Имя файла image для пресета — как в `ContextFormMapper` (`iconName + \".svg\"`). */\nexport function getContextIconPresetFileName(preset: ContextIconPresetValue): string {\n return `${preset}.svg`;\n}\n\n/**\n * Восстановить ключ пресета из `image.fileName` (basename без `.svg`).\n * Для кастомных картинок / неизвестных имён — `undefined`.\n */\nexport function parseContextIconPresetFromImage(\n image: { fileName?: string | null } | null | undefined,\n): ContextIconPresetValue | undefined {\n const fileName = image?.fileName;\n if (!fileName) {\n return undefined;\n }\n const base = fileName.split(/[/\\\\]/).pop() ?? fileName;\n const withoutExt = base.replace(/\\.svg$/i, \"\");\n return isContextIconPreset(withoutExt) ? withoutExt : undefined;\n}\n\nexport type BuildContextIconSvgOptions = {\n /** Заливка path; в apps обычно `ContextItem.color`. */\n color?: string;\n backgroundColor?: string;\n /** Атрибут `inversed` на path — как в `IconSetService.createSvg`. */\n inversed?: boolean;\n};\n\n/**\n * SVG-разметка пресета (без DOM) — эквивалент `IconSetService.getIcon` / blob из `getIconUrl`.\n * Готово к upload как `image/svg+xml` с именем {@link getContextIconPresetFileName}.\n */\nexport function buildContextIconSvg(\n preset: ContextIconPresetValue,\n options?: BuildContextIconSvgOptions,\n): string {\n const d = CONTEXT_ICON_PRESET_PATHS[preset];\n const id = `iconSet${(nextSvgId += 1)}`;\n const colorAttr = options?.color ? ` fill=\"${escapeXmlAttr(options.color)}\"` : \"\";\n const inversedAttr =\n options?.inversed !== undefined ? ` inversed=\"${options.inversed ? \"true\" : \"false\"}\"` : \"\";\n const styleAttr = options?.backgroundColor\n ? ` style=\"background-color: ${escapeXmlAttr(options.backgroundColor)};\"`\n : \"\";\n\n return (\n `<svg viewBox=\"7 7 40 40\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"${styleAttr}>` +\n `<defs><path d=\"${escapeXmlAttr(d)}\" id=\"${id}\"${colorAttr}${inversedAttr}/></defs>` +\n `<use xlink:href=\"#${id}\" stroke=\"none\" stroke-width=\"1\" fill-rule=\"evenodd\"/>` +\n `</svg>`\n );\n}\n\n/** UTF-8 bytes SVG для `uploadBytes` / `getImagePutUrl`. */\nexport function buildContextIconSvgBytes(\n preset: ContextIconPresetValue,\n options?: BuildContextIconSvgOptions,\n): Uint8Array {\n return new TextEncoder().encode(buildContextIconSvg(preset, options));\n}\n\nfunction escapeXmlAttr(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n","import type { OpenApiSchemas as Schemas } from \"../../schema/openapi-schemas.js\";\n\n/** OpenAPI `AnyoneAccess` — публичность «для любого» у item / карт лояльности. */\nexport type AnyoneAccess = Schemas[\"AnyoneAccess\"];\n\nexport const AnyoneAccessValues = {\n Unknown: \"UnknownAnyoneAccess\",\n None: \"NoneAnyoneAccess\",\n Read: \"Read\",\n ReadWrite: \"ReadWrite\",\n Denied: \"Denied\",\n} as const satisfies Record<string, AnyoneAccess>;\n","import type { OpenApiSchemas as Schemas } from \"../../schema/openapi-schemas.js\";\n\n/** OpenAPI `ParticipationFieldType` — тип поля контакта при записи. */\nexport type ParticipationFieldType = Schemas[\"ParticipationFieldType\"];\n\nexport const ParticipationFieldTypeValues = {\n Unknown: \"UnknownParticipationField\",\n FullName: \"FullName\",\n LastName: \"LastName\",\n FirstName: \"FirstName\",\n MiddleName: \"MiddleName\",\n Company: \"Company\",\n Position: \"Position\",\n MainPhone: \"MainPhone\",\n VerifiedMainPhone: \"VerifiedMainPhone\",\n AdditionalPhone: \"AdditionalPhone\",\n MainEmail: \"MainEmail\",\n VerifiedMainEmail: \"VerifiedMainEmail\",\n AdditionalEmail: \"AdditionalEmail\",\n Address: \"Address\",\n AddressLocation: \"AddressLocation\",\n PaymentAccount: \"PaymentAccount\",\n CustomString: \"CustomString\",\n CustomBoolean: \"CustomBoolean\",\n CustomInt32: \"CustomInt32\",\n CustomDouble: \"CustomDouble\",\n CustomMoney: \"CustomMoney\",\n CustomDate: \"CustomDate\",\n CustomTime: \"CustomTime\",\n CustomDateTime: \"CustomDateTime\",\n} as const satisfies Record<string, ParticipationFieldType>;\n\n/** OpenAPI `ParticipationFieldRequirementType` — обязательность поля. */\nexport type ParticipationFieldRequirementType = Schemas[\"ParticipationFieldRequirementType\"];\n\nexport const ParticipationFieldRequirementTypeValues = {\n Unknown: \"UnknownParticipationFieldRequirement\",\n None: \"NoneRequirement\",\n Optional: \"OptionalField\",\n Required: \"RequiredField\",\n} as const satisfies Record<string, ParticipationFieldRequirementType>;\n","import type { OpenApiSchemas as Schemas } from \"../../schema/openapi-schemas.js\";\n\n/** OpenAPI `UserAccessLevel` — кто может check-in / запись. */\nexport type UserAccessLevel = Schemas[\"UserAccessLevel\"];\n\nexport const UserAccessLevelValues = {\n Unknown: \"UnknownUserAccessLevel\",\n Authenticated: \"Authenticated\",\n Unauthenticated: \"Unauthenticated\",\n} as const satisfies Record<string, UserAccessLevel>;\n","import type { ContactItemDto, SendCommunicationCodeReqDto, SendCommunicationCodeRespDto, VerifyCommunicationCodeReqDto, VerifyCommunicationCodeRespDto, ActivityStatusDto, ContactPropertiesDto, UpdateContactPropertiesRespDto, UpdateMasterInfoReqDto, FeedbackOptionsDto, PersonalReminderDto, PublicityTypeDto, GroupStatusDto, UpdateItemAccountsReqDto, UpdateItemGroupsReqDto, UpdatePersonalListOrderReqDto, UpdatePersonalListOrderRespDto } from \"./dto.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\n\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type {\n DeleteResponse,\n ExcludeResp,\n IncludeExcludeResp,\n NotificationWay,\n ObjectInfo,\n} from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { PersonalSolutionData, SolutionData };\n\nexport type ContactItem = TorrowItemFromDto<ContactItemDto>;\n\n/** Элемент `ContactItem.addresses` (ответ GET). */\nexport type Address = NonNullable<ContactItem[\"addresses\"]>[number];\n\n/** Элемент `ContactItem.communications` (ответ GET, полная модель). */\nexport type Communication = NonNullable<ContactItem[\"communications\"]>[number];\n\n/** `communications[]` в теле `POST`/`PUT` контакта: без read-only `checkDate`; `checkState` опционален (SDK подставляет `Unchecked`). */\nexport type CommunicationForCreateOrUpdate = Omit<Communication, \"checkDate\">;\n\n/** Элемент `ContactItem.dates`. */\nexport type MemorableDate = NonNullable<ContactItem[\"dates\"]>[number];\n\n/** `ContactItem.rating`. */\nexport type Rating = NonNullable<ContactItem[\"rating\"]>;\n\n/** `ContactItem.visitCard` (3 слота отображения). */\nexport type ContactVisitCard = NonNullable<ContactItem[\"visitCard\"]>;\n\n/** Элемент `ContactVisitCard.fields`. */\nexport type ContactVisitCardField = NonNullable<NonNullable<ContactVisitCard[\"fields\"]>[number]>;\n\n/** `ContactItem.personalInfo`. */\nexport type ContactPersonalInfo = NonNullable<ContactItem[\"personalInfo\"]>;\n\n/** `ContactItem.profileType`. */\nexport type ProfileType = NonNullable<ContactItem[\"profileType\"]>;\n\n/** `ContactItem.registerInfo`. */\nexport type RegisterInfo = NonNullable<ContactItem[\"registerInfo\"]>;\n\nexport type Gender = NonNullable<ContactItem[\"gender\"]>;\nexport type CommunicationType = NonNullable<Communication[\"type\"]>;\n\nexport const GenderValues = {\n Unknown: \"UnknownGender\",\n Male: \"Male\",\n Female: \"Female\",\n Other: \"OtherGender\",\n} as const satisfies Record<string, Gender>;\n\nexport const CommunicationTypeValues = {\n Unknown: \"UnknownCommunicationType\",\n Phone: \"Phone\",\n Sms: \"Sms\",\n Email: \"Email\",\n WebSite: \"WebSite\",\n Telegram: \"Telegram\",\n WhatsApp: \"WhatsApp\",\n Viber: \"Viber\",\n Facebook: \"Facebook\",\n Instagram: \"Instagram\",\n Vkontakte: \"Vkontakte\",\n Odnoklassniki: \"Odnoklassniki\",\n Skype: \"Skype\",\n Youtube: \"Youtube\",\n Twitter: \"Twitter\",\n LinkedIn: \"LinkedIn\",\n Max: \"Max\",\n Other: \"Other\",\n} as const satisfies Record<string, CommunicationType>;\n\nexport const ProfileTypeValues = {\n Unknown: \"UnknownProfile\",\n None: \"None\",\n MyProfile: \"MyProfile\",\n AnyProfile: \"AnyProfile\",\n CopyProfile: \"CopyProfile\",\n} as const satisfies Record<string, ProfileType>;\nexport type SendCommunicationCodeReq = SendCommunicationCodeReqDto;\nexport type SendCommunicationCodeResp = SendCommunicationCodeRespDto;\nexport type VerifyCommunicationCodeReq = VerifyCommunicationCodeReqDto;\nexport type VerifyCommunicationCodeResp = VerifyCommunicationCodeRespDto;\nexport type ActivityStatus = ActivityStatusDto;\nexport type ContactProperties = ContactPropertiesDto;\nexport type UpdateContactPropertiesResp = UpdateContactPropertiesRespDto;\nexport type UpdateMasterInfoReq = UpdateMasterInfoReqDto;\nexport type FeedbackOptions = FeedbackOptionsDto;\nexport type PersonalReminder = PersonalReminderDto;\nexport type PublicityType = PublicityTypeDto;\nexport type GroupStatus = GroupStatusDto;\nexport type UpdateItemAccountsReq = UpdateItemAccountsReqDto;\nexport type UpdateItemGroupsReq = UpdateItemGroupsReqDto;\nexport type UpdatePersonalListOrderReq = UpdatePersonalListOrderReqDto;\nexport type UpdatePersonalListOrderResp = UpdatePersonalListOrderRespDto;\n/**\n * Тело `POST`/`PUT` **`/api/v1/contacts`** (обычный контакт).\n * `communications` — {@link CommunicationForCreateOrUpdate} (без read-only `checkDate`).\n */\nexport type ContactItemForCreateOrUpdate = Omit<TorrowItemForCreateOrUpdate<ContactItem>, \"communications\"> & {\n communications?: CommunicationForCreateOrUpdate[] | null;\n};","import type { Communication } from \"./types.js\";\n\n/**\n * Brand id for messenger / known-website icons.\n * SVG map: optional package `@torrow/sdk-brand-assets` (`brandIconUrl`).\n * Revisit only if a dedicated UI-kit package appears.\n */\nexport type CommunicationBrandId =\n | \"telegram\"\n | \"whatsapp\"\n | \"viber\"\n | \"skype\"\n | \"max\"\n | \"youtube\"\n | \"vkontakte\"\n | \"facebook\"\n | \"odnoklassniki\"\n | \"twitter\"\n | \"linkedin\"\n | \"instagram\"\n | \"zoom\";\n\nfunction digitsOnly(value: string): string {\n return value.replace(/\\D+/g, \"\");\n}\n\nfunction looksLikeUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value) || value.includes(\".\");\n}\n\nfunction removeFirstAt(value: string): string {\n return value.replace(/^@/, \"\");\n}\n\nfunction ensureHttpUrl(value: string): string {\n return /^[a-z][a-z0-9+.-]*:/i.test(value) ? value : `https://${value}`;\n}\n\nfunction getDomain(url?: string): string | undefined {\n if (!url?.trim()) {\n return undefined;\n }\n const withScheme = /^[a-z][a-z0-9+.-]*:/i.test(url) ? url : `https://${url}`;\n const match = withScheme.match(/:\\/\\/(www[0-9]?\\.)?([^/:]+)/i);\n const hostName = match?.[2];\n if (!hostName) {\n return undefined;\n }\n const parts = hostName.split(\".\").reverse();\n if (parts.length > 1) {\n let domain = `${parts[1]}.${parts[0]}`;\n if (hostName.toLowerCase().includes(\".co.uk\") && parts.length > 2) {\n domain = `${parts[2]}.${domain}`;\n }\n return domain;\n }\n return hostName;\n}\n\nfunction websiteBrandFromDomain(domain: string | undefined): CommunicationBrandId | null {\n switch ((domain ?? \"\").toLowerCase()) {\n case \"youtube.com\":\n case \"youtu.be\":\n return \"youtube\";\n case \"vk.com\":\n return \"vkontakte\";\n case \"ok.ru\":\n return \"odnoklassniki\";\n case \"facebook.com\":\n case \"fb.com\":\n case \"fb.me\":\n return \"facebook\";\n case \"twitter.com\":\n case \"x.com\":\n return \"twitter\";\n case \"instagram.com\":\n case \"instagr.am\":\n case \"instagr.com\":\n return \"instagram\";\n case \"linkedin.com\":\n case \"linked.in\":\n case \"lnkd.in\":\n return \"linkedin\";\n case \"zoom.us\":\n return \"zoom\";\n default:\n return null;\n }\n}\n\n/** Canonical deep-link / mailto / tel URL for a communication channel. */\nexport function communicationHref(\n comm: Pick<Communication, \"type\" | \"value\" | \"valueForSearch\">,\n): string | null {\n const value = comm.value?.trim() ?? \"\";\n if (!value) {\n return null;\n }\n const digits = digitsOnly(comm.valueForSearch?.trim() || value);\n switch (comm.type) {\n case \"Phone\":\n return digits ? `tel:${digits}` : `tel:${value}`;\n case \"Sms\":\n return digits ? `sms:${digits}` : `sms:${value}`;\n case \"Email\":\n return `mailto:${value}`;\n case \"WebSite\":\n return ensureHttpUrl(value);\n case \"Telegram\":\n if (/^https?:\\/\\//i.test(value) || /^tg:/i.test(value)) {\n return value;\n }\n return `https://telegram.me/${removeFirstAt(value)}`;\n case \"WhatsApp\":\n return digits ? `https://wa.me/${digits}` : null;\n case \"Viber\":\n return digits ? `viber://add?number=${digits}` : null;\n case \"Skype\":\n return `skype:${removeFirstAt(value)}?call`;\n case \"Max\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://max.ru/${removeFirstAt(value)}`;\n case \"Vkontakte\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://vk.com/${removeFirstAt(value)}`;\n case \"Facebook\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://www.facebook.com/${removeFirstAt(value)}`;\n case \"Instagram\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://www.instagram.com/${removeFirstAt(value)}`;\n case \"Odnoklassniki\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://ok.ru/${removeFirstAt(value)}`;\n case \"Twitter\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://twitter.com/${removeFirstAt(value)}`;\n case \"LinkedIn\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://www.linkedin.com/in/${removeFirstAt(value)}`;\n case \"Youtube\":\n return ensureHttpUrl(value);\n default:\n return looksLikeUrl(value) ? ensureHttpUrl(value) : null;\n }\n}\n\n/** Brand for messenger / known-website icons; `null` → generic UI icon. */\nexport function resolveCommunicationBrand(\n comm: Pick<Communication, \"type\" | \"value\">,\n): CommunicationBrandId | null {\n switch (comm.type) {\n case \"Telegram\":\n return \"telegram\";\n case \"WhatsApp\":\n return \"whatsapp\";\n case \"Viber\":\n return \"viber\";\n case \"Skype\":\n return \"skype\";\n case \"Max\":\n return \"max\";\n case \"Youtube\":\n return \"youtube\";\n case \"Vkontakte\":\n return \"vkontakte\";\n case \"Facebook\":\n return \"facebook\";\n case \"Odnoklassniki\":\n return \"odnoklassniki\";\n case \"Twitter\":\n return \"twitter\";\n case \"LinkedIn\":\n return \"linkedin\";\n case \"Instagram\":\n return \"instagram\";\n case \"WebSite\":\n return websiteBrandFromDomain(getDomain(comm.value?.trim()));\n default:\n return websiteBrandFromDomain(getDomain(comm.value?.trim()));\n }\n}\n","import type { GenerateReportReqDto, GenerateReportRespDto } from \"./dto.js\";\nimport type { CaseState } from \"../cases/types.js\";\nimport { type Discriminator } from \"../common/discriminator.js\";\n\n/** Опции доставки/локали — из OpenAPI **`ReportOptions`**. */\nexport type ReportOptions = GenerateReportReqDto[\"options\"];\n\n/**\n * База полиморфного **`ReportProperties`**.\n * В Swagger subtypes не описаны (только `fakeForTsGeneratorDoNotRemove`);\n * реальный контракт — NSwag / `torrow-apps` (`CaseReportProperties`, …).\n */\nexport type ReportPropertiesBase = {\n fakeForTsGeneratorDoNotRemove?: number | null;\n discriminator: string;\n};\n\nexport type TimePeriod = {\n from?: Date | null;\n to?: Date | null;\n};\n\nexport const TimeSplitTypeValues = {\n UnknownTimeSplitType: \"UnknownTimeSplitType\",\n None: \"None\",\n Monthly: \"Monthly\",\n Daily: \"Daily\",\n Hourly: \"Hourly\",\n} as const satisfies Record<string, string>;\nexport type TimeSplitType = (typeof TimeSplitTypeValues)[keyof typeof TimeSplitTypeValues];\n\nexport const CellValueTypeValues = {\n UnknownCellValueType: \"UnknownCellValueType\",\n Time: \"Time\",\n Items: \"Items\",\n ItemsPerPeriod: \"ItemsPerPeriod\",\n} as const satisfies Record<string, string>;\nexport type CellValueType = (typeof CellValueTypeValues)[keyof typeof CellValueTypeValues];\n\nexport const ColumnTypeValues = {\n UnknownColumnType: \"UnknownColumnType\",\n Busy: \"Busy\",\n Balance: \"Balance\",\n Total: \"Total\",\n} as const satisfies Record<string, string>;\nexport type ColumnType = (typeof ColumnTypeValues)[keyof typeof ColumnTypeValues];\n\nexport type ResourcesFilterOptions = {\n resourceGroupIds?: string[] | null;\n text?: string | null;\n};\n\nexport type CaseReportProperties = {\n discriminator: typeof Discriminator.CaseReportProperties;\n caseId: string;\n includeParticipants?: boolean | null;\n includeParticipantAddress?: boolean | null;\n includeCaseDescription?: boolean | null;\n includeAvatars?: boolean | null;\n};\n\nexport type ServiceReportProperties = {\n discriminator: typeof Discriminator.ServiceReportProperties;\n serviceId: string;\n timePeriod: TimePeriod;\n caseStateList?: CaseState[] | null;\n includeOrders?: boolean | null;\n includeUniqueResources?: boolean | null;\n includeParticipants?: boolean | null;\n includeAvatars?: boolean | null;\n};\n\nexport type ServicesResourcesReportProperties = {\n discriminator: typeof Discriminator.ServicesResourcesReportProperties;\n serviceIds: string[];\n timePeriod: TimePeriod;\n timeSplitType: TimeSplitType;\n};\n\nexport type ResourcesRentReportProperties = {\n discriminator: typeof Discriminator.ResourcesRentReportProperties;\n serviceIds: string[];\n timePeriod: TimePeriod;\n timeSplitType: TimeSplitType;\n cellValueType: CellValueType;\n columns?: ColumnType[] | null;\n needToDetailResources?: boolean | null;\n includeOrderCount?: boolean | null;\n hideEmptyData?: boolean | null;\n resourcesFilterOptions?: ResourcesFilterOptions | null;\n};\n\nexport type ResourceReportProperties = {\n discriminator: typeof Discriminator.ResourceReportProperties;\n resourceIds: string[];\n timePeriod: TimePeriod;\n timeSplitType: TimeSplitType;\n serviceIds?: string[] | null;\n};\n\n/** Полиморфные свойства отчёта (discriminator + payload subtype). */\nexport type ReportProperties =\n | CaseReportProperties\n | ServiceReportProperties\n | ServicesResourcesReportProperties\n | ResourcesRentReportProperties\n | ResourceReportProperties\n | ReportPropertiesBase;\n\nexport type GenerateReportReq = {\n options: ReportOptions;\n properties: ReportProperties;\n};\n\nexport type GenerateReportResp = GenerateReportRespDto;\n","import type {\n LoyaltySystemItemDto,\n CreateLoyaltyCardReqDto,\n GetLoyaltySystemsStatisticsReqDto,\n GetLoyaltySystemsStatisticsRespDto,\n LoyaltyCardFilterConditionDto,\n LoyaltyCardSortConditionDto,\n LoyaltySystemsStatisticsRespDto,\n OperationTypeDto,\n ItemSortConditionDto,\n SearchLoyaltyCardsReqDto,\n} from \"./dto.js\";\nimport type { ParticipantType, TorrowObjectType } from \"../../schema/sdk-shared-public-types.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\n\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type {\n GenerateSecurityTokenReq,\n GenerateSecurityTokenResp,\n GetParticipationCountResp,\n GetShareItemSessionReq,\n ObjectInfo,\n ObjectSortCondition,\n ParticipantState,\n ParticipantType,\n ParticipantView,\n Participation,\n ParticipationResp,\n SaveItemToMindMapReq,\n SendLinkOfItemReq,\n SendLinkOfItemResp,\n SetGroupItemReq,\n ShareItemReq,\n TorrowObjectType,\n UnsetGroupItemReq,\n} from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { PersonalSolutionData, SolutionData };\n\nexport type LoyaltySystemItem = TorrowItemFromDto<LoyaltySystemItemDto>;\nexport type CreateLoyaltyCardReq = CreateLoyaltyCardReqDto;\nexport type SearchLoyaltyCardsReq = SearchLoyaltyCardsReqDto;\nexport type LoyaltyCardFilterCondition = LoyaltyCardFilterConditionDto;\nexport type LoyaltyCardSortCondition = LoyaltyCardSortConditionDto;\nexport type GetLoyaltySystemsStatisticsReq = GetLoyaltySystemsStatisticsReqDto;\nexport type GetLoyaltySystemsStatisticsResp = GetLoyaltySystemsStatisticsRespDto;\nexport type LoyaltySystemsStatisticsResp = LoyaltySystemsStatisticsRespDto;\nexport type OperationType = OperationTypeDto;\nexport type ItemSortCondition = ItemSortConditionDto;\nexport type LoyaltySystemItemForCreateOrUpdate = TorrowItemForCreateOrUpdate<LoyaltySystemItem>;\nexport type { LoyaltyParticipantsQuery } from \"../loyalty/loyalty-participants-query.js\";\n\nexport type LoyaltyCardIssueType = NonNullable<LoyaltySystemItem[\"loyaltyCardIssueType\"]>;\nexport type LoyaltyCardUpdateKeyInformation = NonNullable<\n LoyaltySystemItem[\"loyaltyCardUpdateKeyInformation\"]\n>;\nexport type LoyaltyCardUpdateNonKeyInformation = NonNullable<\n LoyaltySystemItem[\"loyaltyCardUpdateNonKeyInformation\"]\n>;\n\nexport const LoyaltyCardIssueTypeValues = {\n Unknown: \"UnknownLoyaltyCardIssueType\",\n Manual: \"Manual\",\n AutoActive: \"AutoActive\",\n AutoIssued: \"AutoIssued\",\n} as const satisfies Record<string, LoyaltyCardIssueType>;\n\nexport const LoyaltyCardUpdateKeyInformationValues = {\n Unknown: \"UnknownLoyaltyCardUpdateKeyInformation\",\n NonKeyDisallowed: \"NonKeyDisallowed\",\n NonKeyAllowed: \"NonKeyAllowed\",\n} as const satisfies Record<string, LoyaltyCardUpdateKeyInformation>;\n\nexport const LoyaltyCardUpdateNonKeyInformationValues = {\n Unknown: \"UnknownLoyaltyCardUpdateNonKeyInformation\",\n KeyDisallowed: \"KeyDisallowed\",\n KeyAllowed: \"KeyAllowed\",\n} as const satisfies Record<string, LoyaltyCardUpdateNonKeyInformation>;\n\n/** OpenAPI `LoyaltyCardSortCondition` — сортировка поиска карт в программе. */\nexport const LoyaltyCardSortConditionValues = {\n SequenceCardNumberAsc: \"SequenceCardNumberAsc\",\n SequenceCardNumberDesc: \"SequenceCardNumberDesc\",\n LoyaltyCardStateAsc: \"LoyaltyCardStateAsc\",\n LoyaltyCardStateDesc: \"LoyaltyCardStateDesc\",\n SequenceCardNumberAscLoyaltyCardStateAsc: \"SequenceCardNumberAscLoyaltyCardStateAsc\",\n SequenceCardNumberDescLoyaltyCardStateAsc: \"SequenceCardNumberDescLoyaltyCardStateAsc\",\n SequenceCardNumberAscLoyaltyCardStateDesc: \"SequenceCardNumberAscLoyaltyCardStateDesc\",\n SequenceCardNumberDescLoyaltyCardStateDesc: \"SequenceCardNumberDescLoyaltyCardStateDesc\",\n LoyaltyCardStateAscSequenceCardNumberAsc: \"LoyaltyCardStateAscSequenceCardNumberAsc\",\n LoyaltyCardStateAscSequenceCardNumberDesc: \"LoyaltyCardStateAscSequenceCardNumberDesc\",\n LoyaltyCardStateDescSequenceCardNumberAsc: \"LoyaltyCardStateDescSequenceCardNumberAsc\",\n LoyaltyCardStateDescSequenceCardNumberDesc: \"LoyaltyCardStateDescSequenceCardNumberDesc\",\n} as const satisfies Record<string, LoyaltyCardSortCondition>;\n\nexport type LoyaltyGroupListQuery = {\n itemType?: TorrowObjectType | null;\n minParticipantType?: ParticipantType | null;\n operationType?: OperationType | null;\n recursionDepth?: number | null;\n take?: number | null;\n skip?: number | null;\n lmfrom?: Date | null;\n lmto?: Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemSortCondition | null;\n};\n","import type { ServiceImplicitTagParams } from \"../common/implicit-tag-params.js\";\nimport type { ServiceItemApiDto, CreateOrderReqDto, OrderRespDto, SearchServiceResourcesReqDto, SearchServiceResourcesRespDto, StepDescriptionDto, SessionDurationPropertiesDto, GetServiceWorkloadInfoRequestDto, GetServiceWorkloadInfoRespDto, GetTimetableStatisticsRequestDto, GetTimetableStatisticsResponseDto, TimetableStatisticsRespDto, GetCheckInScheduleReqDto, GetCheckInScheduleRespDto, GetReCheckInScheduleReqDto, UpdateOrderReqDto, UpdateOrderInfoReqDto, ChangeOrderServiceReqDto } from \"./dto.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type {\n DeleteResponse,\n ItemViewSortCondition,\n ObjectInfo,\n ResourceView,\n TimetableCase,\n TimetableDetailsVisibility,\n TimetableFilter,\n} from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nexport type { PersonalSolutionData, SolutionData };\n\nexport type ServiceItemApi = ServiceItemApiDto;\nexport type ResourceGroup = NonNullable<ServiceItemApi[\"resourceGroupList\"]>[number];\nexport type BookingProperties = NonNullable<ResourceGroup[\"bookingProperties\"]>;\nexport type CreateOrderReq = CreateOrderReqDto;\nexport type OrderResp = OrderRespDto;\nexport type SearchServiceResourcesReq = SearchServiceResourcesReqDto;\nexport type SearchServiceResourcesResp = SearchServiceResourcesRespDto;\nexport type StepDescription = StepDescriptionDto;\nexport type SessionDurationProperties = SessionDurationPropertiesDto;\nexport type GetServiceWorkloadInfoRequest = GetServiceWorkloadInfoRequestDto;\nexport type GetServiceWorkloadInfoResp = GetServiceWorkloadInfoRespDto;\nexport type GetTimetableStatisticsRequest = GetTimetableStatisticsRequestDto;\nexport type GetTimetableStatisticsResponse = GetTimetableStatisticsResponseDto;\nexport type TimetableStatisticsResp = TimetableStatisticsRespDto;\nexport type GetCheckInScheduleReq = GetCheckInScheduleReqDto;\nexport type GetCheckInScheduleResp = GetCheckInScheduleRespDto;\nexport type GetReCheckInScheduleReq = GetReCheckInScheduleReqDto;\nexport type UpdateOrderReq = UpdateOrderReqDto;\nexport type UpdateOrderInfoReq = UpdateOrderInfoReqDto;\nexport type ChangeOrderServiceReq = ChangeOrderServiceReqDto;\n/**\n * Публичная доменная структура для настройки поведения услуги.\n * Внутри SDK маппится в `service.tags`.\n * orderName задаёт название для отображения в приложении, не серверное имя создаваемого заказа.\n */\nexport type ServiceBehaviorSettings = ServiceImplicitTagParams;\nexport type {\n ServiceBehaviorSettingsIssue,\n ServiceBehaviorSettingsState,\n ServiceBehaviorSettingsUpdateOptions,\n ServiceBehaviorSettingsUpdateResult,\n} from \"./behavior-settings.js\";\n\n/**\n * SDK-тип услуги: OpenAPI `ServiceItem` + удобный доменный слой.\n * `behaviorSettings` сериализуется/десериализуется через `tags` внутри SDK.\n */\nexport type ServiceItem = TorrowItemFromDto<ServiceItemApi> & {\n behaviorSettings?: ServiceBehaviorSettings;\n};\nexport type ServiceItemForCreateOrUpdate = TorrowItemForCreateOrUpdate<ServiceItem>;\n\nexport type ServiceResourceStepUsageType = Extract<\n NonNullable<ResourceGroup[\"usageType\"]>,\n \"Specification\" | \"Rent\" | \"Sale\"\n>;\n\nexport interface AddServiceResourceGroupInput {\n key: string;\n groupId?: string;\n groupName: string;\n minResources?: number | null;\n maxResources?: number | null;\n maxTotalAmount?: number | null;\n quickFilterTags?: string[] | null;\n bookingProperties?: BookingProperties | null;\n}\n\nexport interface AddServiceResourceStepInput extends AddServiceResourceGroupInput {\n usageType: ServiceResourceStepUsageType;\n stepOrder?: number;\n description?: string | null;\n autoChoiceResource?: boolean;\n hiddenStep?: boolean;\n hideResourceDetail?: boolean;\n}\n\nexport type AddServicePaymentGroupInput = AddServiceResourceGroupInput;\n\nexport interface ServiceBuildResult {\n body: ServiceItemForCreateOrUpdate;\n resourceGroupIds: Record<string, string>;\n}\n\nexport type SessionDurationType = NonNullable<SessionDurationProperties[\"sessionDurationType\"]>;\nexport type TimeSelectionType = NonNullable<SessionDurationProperties[\"timeSelectionType\"]>;\nexport type StateManagementType = NonNullable<SessionDurationProperties[\"stateManagementType\"]>;\nexport type SessionPrecisionType = NonNullable<SessionDurationProperties[\"sessionPrecisionType\"]>;\n\nexport const SessionDurationTypeValues = {\n Unknown: \"UnknownSessionDurationType\",\n None: \"SessionDurationNone\",\n Custom: \"Custom\",\n Constant: \"Constant\",\n Sum: \"Sum\",\n} as const satisfies Record<string, SessionDurationType>;\n\nexport const TimeSelectionTypeValues = {\n Unknown: \"UnknownTimeSelectionType\",\n None: \"TimeSelectionNone\",\n Consumer: \"Consumer\",\n Executor: \"Executor\",\n} as const satisfies Record<string, TimeSelectionType>;\n\nexport const StateManagementTypeValues = {\n Unknown: \"UnknownStateManagementType\",\n Auto: \"Auto\",\n Manual: \"Manual\",\n} as const satisfies Record<string, StateManagementType>;\n\nexport const SessionPrecisionTypeValues = {\n Unknown: \"UnknownSessionPrecisionType\",\n None: \"SessionPrecisionNone\",\n DateTime: \"DateTime\",\n Date: \"Date\",\n} as const satisfies Record<string, SessionPrecisionType>;\n\n\n","import {\n SessionDurationTypeValues,\n SessionPrecisionTypeValues,\n StateManagementTypeValues,\n TimeSelectionTypeValues,\n type SessionDurationProperties,\n} from \"./types.js\";\n\nexport const ServiceType = {\n Appeal: \"Appeal\",\n RegisterOnTime: \"RegisterOnTime\",\n OrderOnTime: \"OrderOnTime\",\n Rent: \"Rent\",\n AutoRent: \"AutoRent\",\n Custom: \"Custom\",\n} as const;\n\nexport type ServiceType = (typeof ServiceType)[keyof typeof ServiceType];\nexport type KnownServiceType = Exclude<ServiceType, typeof ServiceType.Custom>;\n\n/** @deprecated Используйте `ServiceType`; этот объект сохранён для совместимости. */\nexport const ServiceTypePresetValues = {\n Appeal: ServiceType.Appeal,\n RegisterOnTime: ServiceType.RegisterOnTime,\n OrderOnTime: ServiceType.OrderOnTime,\n Rent: ServiceType.Rent,\n AutoRent: ServiceType.AutoRent,\n} as const;\n\n/** @deprecated Используйте `KnownServiceType`. */\nexport type ServiceTypePreset = KnownServiceType;\n\nexport type ServiceSessionDurationOptions = Omit<\n SessionDurationProperties,\n \"sessionDurationType\" | \"timeSelectionType\" | \"stateManagementType\"\n>;\n\ntype ServiceSessionDurationPreset = Pick<\n SessionDurationProperties,\n \"sessionDurationType\" | \"timeSelectionType\" | \"stateManagementType\"\n>;\n\nconst serviceSessionDurationPresets = {\n [ServiceType.Appeal]: {\n sessionDurationType: SessionDurationTypeValues.None,\n timeSelectionType: TimeSelectionTypeValues.None,\n stateManagementType: StateManagementTypeValues.Manual,\n },\n [ServiceType.RegisterOnTime]: {\n sessionDurationType: SessionDurationTypeValues.Sum,\n timeSelectionType: TimeSelectionTypeValues.Consumer,\n stateManagementType: StateManagementTypeValues.Auto,\n },\n [ServiceType.OrderOnTime]: {\n sessionDurationType: SessionDurationTypeValues.Sum,\n timeSelectionType: TimeSelectionTypeValues.Consumer,\n stateManagementType: StateManagementTypeValues.Manual,\n },\n [ServiceType.Rent]: {\n sessionDurationType: SessionDurationTypeValues.Custom,\n timeSelectionType: TimeSelectionTypeValues.Consumer,\n stateManagementType: StateManagementTypeValues.Manual,\n },\n [ServiceType.AutoRent]: {\n sessionDurationType: SessionDurationTypeValues.Custom,\n timeSelectionType: TimeSelectionTypeValues.Consumer,\n stateManagementType: StateManagementTypeValues.Auto,\n },\n} as const satisfies Record<KnownServiceType, ServiceSessionDurationPreset>;\n\n/**\n * Собирает согласованные параметры длительности по подтверждённому бизнес-типу услуги.\n * Опции дополняют preset, но не могут переопределить три поля, определяющие тип.\n */\nexport function createServiceSessionDurationProperties(\n type: KnownServiceType,\n options?: ServiceSessionDurationOptions,\n): SessionDurationProperties {\n const preset = serviceSessionDurationPresets[type];\n if (!preset) {\n throw new TypeError(`Unknown service type: ${String(type)}`);\n }\n\n return {\n ...options,\n sessionPrecisionType: options?.sessionPrecisionType ?? SessionPrecisionTypeValues.DateTime,\n ...preset,\n };\n}\n\n/** Определяет бизнес-тип по трём полям, которыми он представлен в REST-модели. */\nexport function getServiceTypeFromSessionDurationProperties(\n properties: SessionDurationProperties | null | undefined,\n): ServiceType {\n if (!properties) {\n return ServiceType.Custom;\n }\n for (const [type, preset] of Object.entries(serviceSessionDurationPresets) as Array<\n [KnownServiceType, ServiceSessionDurationPreset]\n >) {\n if (\n properties.sessionDurationType === preset.sessionDurationType &&\n properties.timeSelectionType === preset.timeSelectionType &&\n properties.stateManagementType === preset.stateManagementType\n ) {\n return type;\n }\n }\n return ServiceType.Custom;\n}\n\n/** Определяет бизнес-тип услуги без изменения исходных данных. */\nexport function getServiceType(\n service: { sessionDurationProperties?: SessionDurationProperties | null },\n): ServiceType {\n return getServiceTypeFromSessionDurationProperties(service.sessionDurationProperties);\n}\n","import type {\n ServiceItem,\n SessionDurationProperties,\n StepDescription,\n} from \"./types.js\";\n\n/**\n * Совпадает с `ServiceCheckInWizardStepType` в **torrow-apps** (`libs/domain-models`).\n * `stepType` в `StepDescription` приходит как **число** из API.\n */\nexport const ServiceCheckInWizardStepType = {\n Unknown: 0,\n Time: 1,\n Resource: 2,\n Payment: 3,\n} as const;\n\n/**\n * Имена параметров в `stepParameterList` шага типа «Ресурс».\n * Эталон: `libs/domain-models/.../service-check-in-wizard-step-parameter-name.enum.ts`.\n */\nexport const ServiceCheckInWizardStepParameterName = {\n HiddenStep: \"HiddenStep\",\n HideResourceDetail: \"HideResourceDetail\",\n ResourceGroupId: \"ResourceGroupId\",\n AutoChoiceResource: \"AutoChoiceResource\",\n} as const;\n\n/** Режимы UI выбора времени (как в `RegisterCheckInToTimeProcessHelper`, ветка Time). */\nexport const TimeStepUiModeValues = {\n SelectDate: \"selectDate\",\n SelectDateRange: \"selectDateRange\",\n SelectTimeBegin: \"selectTimeBegin\",\n SelectTime: \"selectTime\",\n} as const;\n\nexport type TimeStepUiMode =\n (typeof TimeStepUiModeValues)[keyof typeof TimeStepUiModeValues];\n\nexport function sortStepDescriptionsByOrder(\n list: ServiceItem[\"stepDescriptionList\"],\n): StepDescription[] {\n if (!list?.length) {\n return [];\n }\n return [...list].sort((a, b) => (a.stepOrder ?? 0) - (b.stepOrder ?? 0));\n}\n\nexport function getStepParameter(\n step: StepDescription,\n parameterName: string,\n): string | undefined {\n const p = step.stepParameterList?.find((x) => x.parameterName === parameterName);\n return p?.parameterValue ?? undefined;\n}\n\nexport function getResourceGroupIdFromStep(step: StepDescription): string | undefined {\n return getStepParameter(step, ServiceCheckInWizardStepParameterName.ResourceGroupId);\n}\n\nexport function isStepFlag(step: StepDescription, parameterName: string): boolean {\n return getStepParameter(step, parameterName) === \"true\";\n}\n\n/**\n * Определяет, какой виджет времени показывать для шага `Time`, по `sessionDurationProperties` услуги.\n * Логика выровнена с **torrow-apps** `register-check-in-to-time.process.helper.ts` (`getStepListByStepDescription`, case Time).\n */\nexport function getTimeStepUiMode(\n session: SessionDurationProperties | undefined,\n): TimeStepUiMode {\n const sessionDurationType = session?.sessionDurationType;\n const sessionPrecisionType = session?.sessionPrecisionType;\n\n const isSelectDate =\n sessionPrecisionType === \"Date\" &&\n sessionDurationType !== \"SessionDurationNone\" &&\n sessionDurationType !== \"Custom\";\n const isSelectDateRange =\n sessionPrecisionType === \"Date\" && sessionDurationType === \"Custom\";\n const isSelectDateAndTimeBegin =\n sessionPrecisionType === \"DateTime\" &&\n sessionDurationType !== \"SessionDurationNone\" &&\n sessionDurationType !== \"Custom\";\n const isSelectDateRangeAndTimeBeginAndTimeEnd =\n sessionPrecisionType === \"DateTime\" && sessionDurationType === \"Custom\";\n\n if (isSelectDate) {\n return TimeStepUiModeValues.SelectDate;\n }\n if (isSelectDateRange) {\n return TimeStepUiModeValues.SelectDateRange;\n }\n if (isSelectDateAndTimeBegin || isSelectDateRangeAndTimeBeginAndTimeEnd) {\n return TimeStepUiModeValues.SelectTimeBegin;\n }\n return TimeStepUiModeValues.SelectTime;\n}\n","import {\n createServiceSessionDurationProperties,\n ServiceType,\n type KnownServiceType,\n type ServiceSessionDurationOptions,\n} from \"./service-type-preset.js\";\nimport {\n ServiceCheckInWizardStepParameterName,\n ServiceCheckInWizardStepType,\n getResourceGroupIdFromStep,\n} from \"./booking-wizard-hints.js\";\nimport type {\n AddServicePaymentGroupInput,\n AddServiceResourceGroupInput,\n AddServiceResourceStepInput,\n ResourceGroup,\n ServiceBuildResult,\n ServiceItem,\n ServiceItemForCreateOrUpdate,\n SessionDurationProperties,\n StepDescription,\n} from \"./types.js\";\nimport {\n SessionDurationTypeValues,\n StateManagementTypeValues,\n TimeSelectionTypeValues,\n} from \"./types.js\";\n\nconst RESOURCE_USAGE_TYPES = new Set([\"Specification\", \"Rent\", \"Sale\"]);\nconst GROUP_ID_PATTERN = /^[0-9a-f]{24}$/i;\nconst SESSION_DURATION_TYPES = new Set(Object.values(SessionDurationTypeValues));\nconst TIME_SELECTION_TYPES = new Set(Object.values(TimeSelectionTypeValues));\nconst STATE_MANAGEMENT_TYPES = new Set(Object.values(StateManagementTypeValues));\n\nfunction cloneValue<T>(value: T): T {\n if (value instanceof Date) {\n return new Date(value.getTime()) as T;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneValue(item)) as T;\n }\n if (value && typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n result[key] = cloneValue(item);\n }\n return result as T;\n }\n return value;\n}\n\n/** Генерирует 24-символьный hex id ресурсной группы без Node-only API. */\nexport function generateServiceResourceGroupId(): string {\n const bytes = new Uint8Array(12);\n const cryptoObject = globalThis.crypto;\n if (cryptoObject?.getRandomValues) {\n cryptoObject.getRandomValues(bytes);\n } else {\n for (let index = 0; index < bytes.length; index += 1) {\n bytes[index] = Math.floor(Math.random() * 256);\n }\n }\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction normalizeSteps(steps: StepDescription[]): StepDescription[] {\n return steps\n .map((step, index) => ({ step, index }))\n .sort((a, b) => {\n const aOrder = a.step.stepOrder;\n const bOrder = b.step.stepOrder;\n if (aOrder == null && bOrder == null) return a.index - b.index;\n if (aOrder == null) return 1;\n if (bOrder == null) return -1;\n return aOrder - bOrder || a.index - b.index;\n })\n .map(({ step }, index) => ({ ...step, stepOrder: index + 1 }));\n}\n\nfunction assertStepPosition(position: number | undefined, length: number): number {\n if (position === undefined) return length + 1;\n if (!Number.isInteger(position) || position < 1 || position > length + 1) {\n throw new RangeError(`stepOrder must be an integer from 1 to ${length + 1}`);\n }\n return position;\n}\n\n/**\n * Локально собирает тело услуги. Builder не выполняет HTTP и не сохраняет серверное состояние;\n * несколько изменений следует передать одним вызовом `services.create` или `services.update`.\n */\nexport class ServiceBuilder {\n private draft: ServiceItemForCreateOrUpdate;\n private readonly addedGroups = new Map<string, ResourceGroup & { groupId: string }>();\n\n private constructor(body: ServiceItemForCreateOrUpdate) {\n this.draft = cloneValue(body);\n this.normalizeAndSyncOrders();\n }\n\n static create(body: ServiceItemForCreateOrUpdate): ServiceBuilder {\n return new ServiceBuilder(body);\n }\n\n static from(service: ServiceItem): ServiceBuilder {\n return new ServiceBuilder(service);\n }\n\n withType(type: KnownServiceType, options?: ServiceSessionDurationOptions): this {\n if ((type as ServiceType) === ServiceType.Custom) {\n throw new TypeError(\"ServiceType.Custom requires explicit sessionDurationProperties\");\n }\n this.draft.sessionDurationProperties = createServiceSessionDurationProperties(type, options);\n return this;\n }\n\n withSessionDurationProperties(properties: SessionDurationProperties): this {\n if (\n !properties.sessionDurationType ||\n !SESSION_DURATION_TYPES.has(properties.sessionDurationType) ||\n !properties.timeSelectionType ||\n !TIME_SELECTION_TYPES.has(properties.timeSelectionType) ||\n !properties.stateManagementType ||\n !STATE_MANAGEMENT_TYPES.has(properties.stateManagementType)\n ) {\n throw new TypeError(\n \"sessionDurationProperties must include sessionDurationType, timeSelectionType, and stateManagementType\",\n );\n }\n this.draft.sessionDurationProperties = cloneValue(properties);\n return this;\n }\n\n addResourceStep(input: AddServiceResourceStepInput): this {\n if (!RESOURCE_USAGE_TYPES.has(input.usageType)) {\n throw new TypeError(`Unsupported resource group usageType: ${String(input.usageType)}`);\n }\n const minResources = input.minResources ?? 1;\n const maxResources = input.maxResources ?? 1;\n if (input.autoChoiceResource === true && (minResources !== 1 || maxResources !== 1)) {\n throw new RangeError(\"autoChoiceResource requires exactly one resource\");\n }\n const group = this.addResourceGroup(input, input.usageType);\n const groupId = group.groupId;\n\n const step: StepDescription = {\n stepType: ServiceCheckInWizardStepType.Resource,\n description: input.description,\n stepParameterList: [\n {\n parameterName: ServiceCheckInWizardStepParameterName.ResourceGroupId,\n parameterValue: groupId,\n },\n {\n parameterName: ServiceCheckInWizardStepParameterName.AutoChoiceResource,\n parameterValue: String(input.autoChoiceResource ?? false),\n },\n {\n parameterName: ServiceCheckInWizardStepParameterName.HiddenStep,\n parameterValue: String(input.hiddenStep ?? false),\n },\n {\n parameterName: ServiceCheckInWizardStepParameterName.HideResourceDetail,\n parameterValue: String(input.hideResourceDetail ?? false),\n },\n ],\n };\n this.insertStep(step, input.stepOrder);\n return this;\n }\n\n /** Добавляет платёжную группу без ресурсного шага; шаг оплаты добавляется отдельно. */\n addPaymentGroup(input: AddServicePaymentGroupInput): this {\n this.addResourceGroup(input, \"Payment\");\n return this;\n }\n\n /** Заменяет список ресурсов существующей группы, например после создания платёжного ресурса. */\n setResourceGroupResourceIds(resourceGroupId: string, resourceIds: readonly string[]): this {\n const normalizedGroupId = resourceGroupId.trim();\n if (!normalizedGroupId) throw new TypeError(\"resourceGroupId must not be empty\");\n const normalizedResourceIds = resourceIds.map((resourceId) => resourceId.trim());\n if (normalizedResourceIds.some((resourceId) => !resourceId)) {\n throw new TypeError(\"resourceIds must not contain empty ids\");\n }\n if (new Set(normalizedResourceIds).size !== normalizedResourceIds.length) {\n throw new TypeError(\"resourceIds must not contain duplicates\");\n }\n const groups = this.draft.resourceGroupList ?? [];\n if (!groups.some((group) => group.groupId === normalizedGroupId)) {\n throw new TypeError(`Service resource group not found: ${normalizedGroupId}`);\n }\n this.draft.resourceGroupList = groups.map((group) =>\n group.groupId === normalizedGroupId\n ? { ...group, resourceIdList: [...normalizedResourceIds] }\n : group,\n );\n return this;\n }\n\n addTimeStep(options?: { stepOrder?: number }): this {\n return this.addSingletonStep(ServiceCheckInWizardStepType.Time, options?.stepOrder);\n }\n\n addPaymentStep(options?: { stepOrder?: number }): this {\n return this.addSingletonStep(ServiceCheckInWizardStepType.Payment, options?.stepOrder);\n }\n\n build(): ServiceBuildResult {\n this.normalizeAndSyncOrders();\n this.validateConfiguration();\n const resourceGroupIds = Object.create(null) as Record<string, string>;\n for (const [key, group] of this.addedGroups) {\n const current = this.draft.resourceGroupList?.find((item) => item.groupId === group.groupId);\n Object.defineProperty(resourceGroupIds, key, {\n value: current?.groupId ?? group.groupId,\n enumerable: true,\n configurable: true,\n });\n }\n return { body: cloneValue(this.draft), resourceGroupIds };\n }\n\n private addSingletonStep(stepType: number, stepOrder?: number): this {\n if (this.draft.stepDescriptionList?.some((step) => step.stepType === stepType)) {\n throw new TypeError(`Service already contains step type ${stepType}`);\n }\n this.insertStep({ stepType }, stepOrder);\n return this;\n }\n\n private addResourceGroup(\n input: AddServiceResourceGroupInput,\n usageType: NonNullable<ResourceGroup[\"usageType\"]>,\n ): ResourceGroup & { groupId: string } {\n const key = input.key.trim();\n const groupName = input.groupName.trim();\n if (!key) throw new TypeError(\"Resource group key must not be empty\");\n if (!groupName) throw new TypeError(\"Resource group name must not be empty\");\n if (this.addedGroups.has(key)) throw new TypeError(`Duplicate resource group key: ${key}`);\n\n const groupId = input.groupId ?? generateServiceResourceGroupId();\n if (!GROUP_ID_PATTERN.test(groupId)) {\n throw new TypeError(\"Resource group id must be a 24-character hexadecimal string\");\n }\n const groups = [...(this.draft.resourceGroupList ?? [])];\n if (groups.some((group) => group.groupId === groupId)) {\n throw new TypeError(`Duplicate resource group id: ${groupId}`);\n }\n\n const minResources = input.minResources ?? 1;\n const maxResources = input.maxResources ?? 1;\n for (const [name, value] of [\n [\"minResources\", minResources],\n [\"maxResources\", maxResources],\n [\"maxTotalAmount\", input.maxTotalAmount],\n ] as const) {\n if (value != null && (!Number.isInteger(value) || value < 0)) {\n throw new RangeError(`${name} must be a non-negative integer`);\n }\n }\n if (minResources > maxResources) {\n throw new RangeError(\"minResources must not exceed maxResources\");\n }\n\n const group: ResourceGroup & { groupId: string } = {\n groupId,\n groupName,\n usageType,\n minResources,\n maxResources,\n maxTotalAmount: input.maxTotalAmount,\n quickFilterTags: cloneValue(input.quickFilterTags),\n bookingProperties: cloneValue(input.bookingProperties ?? undefined),\n };\n this.draft.resourceGroupList = [...groups, group];\n this.addedGroups.set(key, cloneValue(group));\n return group;\n }\n\n private insertStep(step: StepDescription, stepOrder?: number): void {\n const steps = normalizeSteps([...(this.draft.stepDescriptionList ?? [])]);\n const position = assertStepPosition(stepOrder, steps.length);\n steps.splice(position - 1, 0, step);\n this.draft.stepDescriptionList = steps.map((item, index) => ({\n ...item,\n stepOrder: index + 1,\n }));\n this.normalizeAndSyncOrders();\n }\n\n private normalizeAndSyncOrders(): void {\n const hasSteps = this.draft.stepDescriptionList != null;\n const steps = normalizeSteps([...(this.draft.stepDescriptionList ?? [])]);\n if (hasSteps) this.draft.stepDescriptionList = steps;\n const orders = new Map<string, number>();\n for (const step of steps) {\n if (step.stepType === ServiceCheckInWizardStepType.Resource) {\n const groupId = getResourceGroupIdFromStep(step);\n if (groupId && step.stepOrder != null) orders.set(groupId, step.stepOrder);\n }\n }\n if (this.draft.resourceGroupList != null) {\n this.draft.resourceGroupList = this.draft.resourceGroupList.map((group) => ({\n ...group,\n order: group.groupId ? (orders.get(group.groupId) ?? group.order) : group.order,\n }));\n }\n }\n\n private validateConfiguration(): void {\n const groups = this.draft.resourceGroupList ?? [];\n const ids = new Set<string>();\n for (const group of groups) {\n if (!group.groupId || !GROUP_ID_PATTERN.test(group.groupId)) {\n throw new TypeError(\"Every resource group must have a valid 24-character hexadecimal id\");\n }\n if (ids.has(group.groupId)) throw new TypeError(`Duplicate resource group id: ${group.groupId}`);\n ids.add(group.groupId);\n }\n const usedIds = new Set<string>();\n for (const step of this.draft.stepDescriptionList ?? []) {\n if (step.stepType !== ServiceCheckInWizardStepType.Resource) continue;\n const groupId = getResourceGroupIdFromStep(step);\n if (!groupId || !ids.has(groupId)) {\n throw new TypeError(`Resource step references an unknown resource group: ${groupId ?? \"\"}`);\n }\n if (usedIds.has(groupId)) {\n throw new TypeError(`Resource group is used by more than one step: ${groupId}`);\n }\n usedIds.add(groupId);\n }\n }\n}\n","import {\n ServiceCheckInWizardStepParameterName,\n ServiceCheckInWizardStepType,\n getResourceGroupIdFromStep,\n getTimeStepUiMode,\n isStepFlag,\n sortStepDescriptionsByOrder,\n type TimeStepUiMode,\n} from \"./booking-wizard-hints.js\";\nimport type { ServiceItem } from \"./types.js\";\n\nfunction isExistsStrict(n: number | undefined): n is number {\n return n !== undefined && n !== null;\n}\n\n/**\n * Как в **torrow-apps** `RegisterCheckInToTimeProcessHelper.getSkipConditionForResourceStep`:\n * шаг выбора ресурса не показывается при вырожденных лимитах группы.\n */\nexport function shouldSkipResourceStep(min: number | undefined, max: number | undefined): boolean {\n const maxIsNull = max === 0;\n const maxIsOne = max === 1;\n const minMoreThenOne = isExistsStrict(min) && min > 1;\n const minIsNegative = isExistsStrict(min) && min < 0;\n const maxIsNegative = isExistsStrict(max) && max < 0;\n return maxIsNull || (maxIsOne && minMoreThenOne) || minIsNegative || maxIsNegative;\n}\n\nexport type BookingWizardExpandedStep =\n | {\n kind: \"time\";\n /** Порядок среди развёрнутых шагов (1-based). */\n sequence: number;\n stepOrder: number;\n /** Совпадает с именами ветки Time в `getStepListByStepDescription` (WizardStepTypeEnum). */\n wizardStepType: TimeStepUiMode;\n }\n | {\n kind: \"resource\";\n sequence: number;\n stepOrder: number;\n resourceGroupId: string;\n resourceGroupName?: string | null;\n isStepHidden: boolean;\n isResourceDetailHidden: boolean;\n autoChoiceResource: boolean;\n }\n | {\n kind: \"payment\";\n sequence: number;\n stepOrder: number;\n };\n\n/**\n * Разворачивает `service.stepDescriptionList` в шаги UI (время / ресурс / оплата) по правилам\n * **`RegisterCheckInToTimeProcessHelper.getStepListByStepDescription`** без NGXS и без `anyResourceSelected`.\n * Пропуски: нет `ResourceGroupId`, неизвестная группа, `shouldSkipResourceStep`.\n *\n * Шаг **Payment** в мобильном FSM обрабатывается отдельно (`choosePaymentMethod`); здесь он отражает\n * порядок в `stepDescriptionList` для headless-сценариев и агентов.\n */\nexport function expandBookingWizardSteps(service: ServiceItem): BookingWizardExpandedStep[] {\n const ordered = sortStepDescriptionsByOrder(service.stepDescriptionList);\n const out: BookingWizardExpandedStep[] = [];\n let seq = 0;\n for (const step of ordered) {\n const st = step.stepType ?? ServiceCheckInWizardStepType.Unknown;\n if (st === ServiceCheckInWizardStepType.Time) {\n const wizardStepType = getTimeStepUiMode(service.sessionDurationProperties);\n out.push({\n kind: \"time\",\n sequence: ++seq,\n stepOrder: step.stepOrder ?? seq,\n wizardStepType,\n });\n continue;\n }\n if (st === ServiceCheckInWizardStepType.Resource) {\n const resourceGroupId = getResourceGroupIdFromStep(step);\n if (!resourceGroupId) continue;\n const rg = service.resourceGroupList?.find((g) => g.groupId === resourceGroupId);\n if (!rg) continue;\n if (shouldSkipResourceStep(rg.minResources ?? undefined, rg.maxResources ?? undefined)) continue;\n out.push({\n kind: \"resource\",\n sequence: ++seq,\n stepOrder: step.stepOrder ?? seq,\n resourceGroupId,\n resourceGroupName: rg.groupName,\n isStepHidden: isStepFlag(step, ServiceCheckInWizardStepParameterName.HiddenStep),\n isResourceDetailHidden: isStepFlag(step, ServiceCheckInWizardStepParameterName.HideResourceDetail),\n autoChoiceResource: isStepFlag(step, ServiceCheckInWizardStepParameterName.AutoChoiceResource),\n });\n continue;\n }\n if (st === ServiceCheckInWizardStepType.Payment) {\n out.push({ kind: \"payment\", sequence: ++seq, stepOrder: step.stepOrder ?? seq });\n }\n }\n return out;\n}\n","import type { WorkloadPeriod } from \"../resources/types.js\";\nimport type { GetCheckInScheduleResp } from \"./types.js\";\n\nexport type FreeCheckInSlot = WorkloadPeriod & {\n from: Date;\n to: Date;\n};\n\n/** Проверяет, что период из ответа `FreeTimeSlots` пригоден для выбора пользователем. */\nexport function isFreeCheckInSlot(period: WorkloadPeriod): period is FreeCheckInSlot {\n return (\n period.from != null &&\n period.to != null &&\n (period.status == null || period.status === \"FreeTime\")\n );\n}\n\n/** Возвращает полные свободные интервалы без изменения ответа сервера. */\nexport function getFreeCheckInSlots(\n response: GetCheckInScheduleResp | null | undefined,\n): FreeCheckInSlot[] {\n return (response?.checkInSchedule ?? []).filter(isFreeCheckInSlot);\n}\n","import { TorrowHttpError } from \"../../http/TorrowHttpError.js\";\n\nexport const ServiceOrderConflictErrorNameValues = {\n ResourceUnavailable: \"REQUESTED_RESOURCE_IS_NOT_AVAILABLE\",\n QuantityUnavailable: \"REQUESTED_RESOURCE_QUANTITY_IS_NOT_AVAILABLE\",\n ServiceUnavailableAtTime: \"SERVICE_IS_NOT_AVAILABLE_AT_TIME\",\n} as const;\n\nexport type ServiceOrderConflictReason =\n | \"resource-unavailable\"\n | \"quantity-unavailable\"\n | \"service-unavailable-at-time\";\n\n/** Преобразует серверное имя business-конфликта заказа в стабильную причину для приложения. */\nexport function getServiceOrderConflictReason(\n error: unknown,\n): ServiceOrderConflictReason | undefined {\n if (!(error instanceof TorrowHttpError)) return undefined;\n switch (error.apiErrorName) {\n case ServiceOrderConflictErrorNameValues.ResourceUnavailable:\n return \"resource-unavailable\";\n case ServiceOrderConflictErrorNameValues.QuantityUnavailable:\n return \"quantity-unavailable\";\n case ServiceOrderConflictErrorNameValues.ServiceUnavailableAtTime:\n return \"service-unavailable-at-time\";\n default:\n return undefined;\n }\n}\n\n/** Отличает известный конфликт доступности заказа от остальных HTTP-ошибок. */\nexport function isServiceOrderConflictError(error: unknown): error is TorrowHttpError {\n return getServiceOrderConflictReason(error) !== undefined;\n}\n","import type { CaseItem } from \"./types.js\";\n\n/**\n * Как в **torrow-apps** `PaymentProcessState.normalizePaymentUrl`: если в ответе нет схемы,\n * подставить `https://` (частые относительные/безсхемные URL от провайдера).\n */\nexport function normalizePaymentUrl(url: string | null | undefined): string | undefined {\n if (url == null || url.trim() === \"\") return undefined;\n const u = url.trim();\n if (u.startsWith(\"http://\") || u.startsWith(\"https://\")) return u;\n return `https://${u}`;\n}\n\n/** Сырое значение из DTO без нормализации. */\nexport function getTicketPaymentUrlRaw(caseItem: CaseItem | undefined | null): string | undefined {\n const raw = caseItem?.personalInfo?.ticketResource?.ticketProperties?.paymentUrl;\n return raw == null || raw === \"\" ? undefined : raw;\n}\n\n/**\n * URL оплаты из **`CaseItem.personalInfo.ticketResource.ticketProperties.paymentUrl`**\n * (вид владельца/участника после `createOrder` + загрузка кейса).\n * Для гостя с токеном — тот же путь после `GET .../cases/{id}` с `securityToken` / `caseParticipantId`.\n */\nexport function getTicketPaymentUrl(caseItem: CaseItem | undefined | null): string | undefined {\n return normalizePaymentUrl(getTicketPaymentUrlRaw(caseItem));\n}\n","import type { ServiceItem } from \"../services/types.js\";\nimport type {\n ResourceItem,\n ResourceBuildResult,\n ResourceItemForCreateOrUpdate,\n ResourceServiceBindingOptions,\n ResourceUsageConditionType,\n ServiceDescription,\n} from \"./types.js\";\nimport { UsageConditionTypeValues } from \"./types.js\";\n\nfunction cloneValue<T>(value: T): T {\n if (value instanceof Date) return new Date(value.getTime()) as T;\n if (Array.isArray(value)) return value.map((item) => cloneValue(item)) as T;\n if (value && typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) result[key] = cloneValue(item);\n return result as T;\n }\n return value;\n}\n\nfunction isSameBinding(\n description: ServiceDescription,\n serviceId: string,\n resourceGroupId: string,\n): boolean {\n return description.id === serviceId && description.resourceGroupId === resourceGroupId;\n}\n\n/**\n * Локально собирает тело ресурса и его связи с услугами.\n * Builder не выполняет HTTP; результат сохраняется обычным `resourceItems.create` или `update`.\n */\nexport class ResourceBuilder {\n private draft: ResourceItemForCreateOrUpdate;\n\n private constructor(body: ResourceItemForCreateOrUpdate) {\n this.draft = cloneValue(body);\n }\n\n static create(body: ResourceItemForCreateOrUpdate): ResourceBuilder {\n return new ResourceBuilder(body);\n }\n\n static from(resource: ResourceItem): ResourceBuilder {\n return new ResourceBuilder(resource);\n }\n\n attachToService(\n service: ServiceItem,\n resourceGroupId: string,\n options?: ResourceServiceBindingOptions,\n ): this {\n const serviceId = service.id?.trim();\n if (!serviceId) throw new TypeError(\"Service must have a non-empty id\");\n const normalizedGroupId = resourceGroupId.trim();\n if (!normalizedGroupId) throw new TypeError(\"resourceGroupId must not be empty\");\n\n const group = service.resourceGroupList?.find((item) => item.groupId === normalizedGroupId);\n if (!group) throw new TypeError(`Service resource group not found: ${normalizedGroupId}`);\n if (!group.usageType) throw new TypeError(\"Service resource group has no usageType\");\n if (this.draft.usageType != null && this.draft.usageType !== group.usageType) {\n throw new TypeError(\"Resource usageType does not match the service resource group\");\n }\n\n const descriptions = [...(this.draft.serviceDescriptions ?? [])];\n const matching = descriptions.filter((item) =>\n isSameBinding(item, serviceId, normalizedGroupId),\n );\n const current = matching[0];\n const next: ServiceDescription = {\n ...current,\n id: serviceId,\n serviceName: service.name,\n resourceGroupId: normalizedGroupId,\n resourceGroupName: group.groupName,\n usageAmount: options?.usageAmount === undefined ? current?.usageAmount : options.usageAmount,\n sortIndex: options?.sortIndex === undefined ? current?.sortIndex : options.sortIndex,\n laterBinding: group.bookingProperties != null,\n };\n const firstIndex = descriptions.findIndex((item) =>\n isSameBinding(item, serviceId, normalizedGroupId),\n );\n const withoutBinding = descriptions.filter((item) =>\n !isSameBinding(item, serviceId, normalizedGroupId),\n );\n if (firstIndex < 0) withoutBinding.push(next);\n else withoutBinding.splice(firstIndex, 0, next);\n\n this.draft = {\n ...this.draft,\n usageType: this.draft.usageType ?? group.usageType,\n serviceDescriptions: withoutBinding,\n };\n return this;\n }\n\n detachFromService(serviceId: string, resourceGroupId: string): this {\n const normalizedServiceId = serviceId.trim();\n const normalizedGroupId = resourceGroupId.trim();\n if (!normalizedServiceId) throw new TypeError(\"serviceId must not be empty\");\n if (!normalizedGroupId) throw new TypeError(\"resourceGroupId must not be empty\");\n this.draft = {\n ...this.draft,\n serviceDescriptions: (this.draft.serviceDescriptions ?? []).filter(\n (item) => !isSameBinding(item, normalizedServiceId, normalizedGroupId),\n ),\n };\n return this;\n }\n\n /** Задаёт зависимость или исключение ресурса по id ранее выбранных ресурсов. */\n setUsageCondition(type: ResourceUsageConditionType, conditionIds: readonly string[]): this {\n if (\n type !== UsageConditionTypeValues.Additional &&\n type !== UsageConditionTypeValues.Exclusion\n ) {\n throw new TypeError(`Unsupported usage condition type: ${String(type)}`);\n }\n const normalizedIds = conditionIds.map((conditionId) => conditionId.trim());\n if (normalizedIds.length === 0) {\n throw new TypeError(\"conditionIds must not be empty\");\n }\n if (normalizedIds.some((conditionId) => !conditionId)) {\n throw new TypeError(\"conditionIds must not contain empty ids\");\n }\n if (new Set(normalizedIds).size !== normalizedIds.length) {\n throw new TypeError(\"conditionIds must not contain duplicates\");\n }\n this.draft = {\n ...this.draft,\n usageCondition: {\n usageConditionType: type,\n conditionIdList: normalizedIds,\n },\n };\n return this;\n }\n\n clearUsageCondition(): this {\n this.draft = {\n ...this.draft,\n usageCondition: {\n usageConditionType: UsageConditionTypeValues.None,\n conditionIdList: [],\n },\n };\n return this;\n }\n\n build(): ResourceBuildResult {\n return { body: cloneValue(this.draft) };\n }\n}\n","import type { components } from \"../../schema/generated.js\";\n\n/** OpenAPI `DeviceType` — wire-строки для `DeviceInfo.deviceType`. */\nexport type DeviceType = components[\"schemas\"][\"DeviceType\"];\n\n/**\n * Значения OpenAPI enum **`DeviceType`** для приложений\n * (`deviceInfo.deviceType` в `requestToken` / `refresh`, фильтры устройств и т.п.).\n *\n * @example\n * ```ts\n * import { DeviceTypeValues } from \"@torrow/sdk-client\";\n * deviceInfo: { deviceId, deviceType: DeviceTypeValues.Desktop }\n * ```\n */\nexport const DeviceTypeValues = {\n Unknown: \"Unknown\",\n Mobile: \"Mobile\",\n Tablet: \"Tablet\",\n Desktop: \"Desktop\",\n} as const satisfies Record<string, DeviceType>;\n\n/** Все допустимые wire-значения (стабильный порядок). */\nexport const DeviceTypeValueList: readonly DeviceType[] = [\n DeviceTypeValues.Unknown,\n DeviceTypeValues.Mobile,\n DeviceTypeValues.Tablet,\n DeviceTypeValues.Desktop,\n];\n\nexport function isDeviceType(value: string): value is DeviceType {\n return (DeviceTypeValueList as readonly string[]).includes(value);\n}\n\n/**\n * Разбор строки в `DeviceType` (без учёта регистра).\n * Пустая / неизвестная → `undefined`.\n */\nexport function parseDeviceType(raw: string | undefined | null): DeviceType | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return DeviceTypeValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n","import type {\n ItemViewSortConditionDto as ItemViewSortCondition,\n ParticipantStateDto as ParticipantState,\n ParticipantTypeDto as ParticipantType,\n} from \"../../schema/openapi-dto-aliases.js\";\n\nexport type { ItemViewSortCondition, ParticipantState, ParticipantType };\n\n/** Wire-значения OpenAPI `ItemViewSortCondition` для списков и views. */\nexport const ItemViewSortConditionValues = {\n OrderAsc: \"OrderAsc\",\n OrderDesc: \"OrderDesc\",\n LastModifiedAsc: \"LastModifiedAsc\",\n LastModifiedDesc: \"LastModifiedDesc\",\n OrderAscLastModifiedAsc: \"OrderAscLastModifiedAsc\",\n OrderDescLastModifiedAsc: \"OrderDescLastModifiedAsc\",\n OrderAscLastModifiedDesc: \"OrderAscLastModifiedDesc\",\n OrderDescLastModifiedDesc: \"OrderDescLastModifiedDesc\",\n LastModifiedAscOrderAsc: \"LastModifiedAscOrderAsc\",\n LastModifiedAscOrderDesc: \"LastModifiedAscOrderDesc\",\n LastModifiedDescOrderAsc: \"LastModifiedDescOrderAsc\",\n LastModifiedDescOrderDesc: \"LastModifiedDescOrderDesc\",\n} as const satisfies { [Value in ItemViewSortCondition]: Value };\n\n/** Все допустимые условия сортировки представлений в стабильном порядке. */\nexport const ItemViewSortConditionValueList: readonly ItemViewSortCondition[] = Object.values(\n ItemViewSortConditionValues,\n);\n\nexport function isItemViewSortCondition(value: string): value is ItemViewSortCondition {\n return (ItemViewSortConditionValueList as readonly string[]).includes(value);\n}\n\n/** Shared query for personallist endpoints (contacts, notes, services, cases). */\nexport type PersonalListQuery = {\n take?: number | null;\n skip?: number | null;\n lmfrom?: Date | null;\n lmto?: Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemViewSortCondition | null;\n profileId?: string | null;\n onlyWithEmptyProfile?: boolean | null;\n participantStateList?: ParticipantState[] | null;\n participantTypeList?: ParticipantType[] | null;\n};\n"],"mappings":"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","names":["Discriminator","BASE","BASE","BASE","BASE","BASE","prefix","BASE","ServiceBehaviorSettingsErrorCategory","ServiceBehaviorSettingsIssueReason","BASE","BASE","BASE","BASE","trimNonEmptyString","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","VerificationMethodValues","TokenStatusValues","group","cloneValue"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/TorrowClientConfig.ts","../../../src/http/auth.ts","../../../src/http/TorrowSdkError.ts","../../../src/http/transport-errors.ts","../../../src/util/json.ts","../../../src/schema/response-dates.generated.ts","../../../src/util/response-dates.ts","../../../src/util/query-string.ts","../../../src/util/url.ts","../../../src/http/HttpClient.ts","../../../src/raw/RawClient.ts","../../../src/resources/common/facade-response-unwrap.ts","../../../src/util/path.ts","../../../src/resources/common/item-update-id.ts","../../../src/resources/common/discriminator.ts","../../../src/resources/common/item-create-defaults.ts","../../../src/util/torrow-id.ts","../../../src/resources/common/item-social-facet-base.ts","../../../src/resources/common/timetable-query.ts","../../../src/resources/calendars/CalendarsFacade.ts","../../../src/resources/cases/types.ts","../../../src/resources/cases/case-requests.ts","../../../src/resources/cases/CasesFacade.ts","../../../src/resources/contacts/contact-communications-write-defaults.ts","../../../src/resources/contacts/contact-structured-array-rids.ts","../../../src/resources/contacts/contact-visit-card-fields.ts","../../../src/resources/contacts/ContactsFacade.ts","../../../src/resources/contexts/ContextsFacade.ts","../../../src/resources/notes/types.ts","../../../src/resources/notes/NotesFacade.ts","../../../src/resources/common/item-type.ts","../../../src/resources/common/item-type-resolver.ts","../../../src/resources/relations/RelationsFacade.ts","../../../src/resources/common/behavior-settings-errors.ts","../../../src/resources/common/implicit-tag-params.ts","../../../src/resources/resources/types.ts","../../../src/resources/resources/ResourcesFacade.ts","../../../src/resources/services/behavior-settings.ts","../../../src/resources/services/service-requests.ts","../../../src/resources/services/ServicesFacade.ts","../../../src/util/base64.ts","../../../src/resources/auth/AuthFacade.ts","../../../src/resources/user-profiles/user-profile-write-defaults.ts","../../../src/resources/user-profiles/ProfilesFacade.ts","../../../src/resources/views/view-domain-resolver.ts","../../../src/resources/views/view-paths.ts","../../../src/resources/views/PinnedViewsFacade.ts","../../../src/resources/views/UserViewsFacade.ts","../../../src/resources/views/ViewsFacade.ts","../../../src/resources/search/SearchFacade.ts","../../../src/resources/action-history/ActionHistoryFacade.ts","../../../src/resources/accounting-transactions/AccountingTransactionsFacade.ts","../../../src/resources/announcements/AnnouncementsFacade.ts","../../../src/resources/export-import/ExportImportFacade.ts","../../../src/resources/reports/ReportsFacade.ts","../../../src/resources/loyalty-systems/LoyaltySystemsFacade.ts","../../../src/resources/loyalty-cards/LoyaltyCardsFacade.ts","../../../src/util/opaque-json-settings.ts","../../../src/resources/user-settings/UserSettingsFacade.ts","../../../src/resources/user/UserFacade.ts","../../../src/resources/api-keys/ApiKeysFacade.ts","../../../src/resources/block-reason/BlockReasonsFacade.ts","../../../src/resources/external-auths/ExternalAuthsFacade.ts","../../../src/resources/id-generator/IdGeneratorFacade.ts","../../../src/resources/integrations/IntegrationsFacade.ts","../../../src/resources/item/ItemFacade.ts","../../../src/resources/short-url/ShortUrlFacade.ts","../../../src/resources/thesaurus/ThesaurusFacade.ts","../../../src/TorrowClient.ts","../../../src/resources/auth/auth-enum-values.ts","../../../src/resources/common/solution-data.ts","../../../src/resources/common/timetable-view-type.ts","../../../src/resources/contexts/context-icon-preset-paths.ts","../../../src/resources/contexts/context-icon-preset.ts","../../../src/resources/common/anyone-access.ts","../../../src/resources/common/participation-field.ts","../../../src/resources/common/user-access-level.ts","../../../src/resources/contacts/types.ts","../../../src/resources/contacts/communication-links.ts","../../../src/resources/reports/types.ts","../../../src/resources/loyalty-systems/types.ts","../../../src/resources/services/types.ts","../../../src/resources/services/service-type-preset.ts","../../../src/resources/services/booking-wizard-hints.ts","../../../src/resources/services/service-builder.ts","../../../src/resources/services/booking-wizard-expand.ts","../../../src/resources/services/check-in-schedule-hints.ts","../../../src/resources/services/service-order-errors.ts","../../../src/resources/cases/payment-hints.ts","../../../src/resources/resources/resource-builder.ts","../../../src/resources/common/device-type.ts","../../../src/resources/common/personal-list.ts"],"sourcesContent":["/**\n * Публичный продакшен-шлюз Torrow (только origin, без `/api/v1`).\n * Переопредели {@link TorrowClientConfig.baseUrl}, если бьёшься в другой стенд или мок.\n */\nexport const DEFAULT_TORROW_API_BASE_URL = \"https://torrow.net\";\n\n/**\n * HTTP **Basic** для **`/api/v1/auth/*`** на шлюзе (`Authorization: Basic …`).\n *\n * Это **креды приложения / типа клиента**, не логин пользователя:\n * - `username` ≈ `clientId` (torrow-apps: `CLIENT_SECRET` / InterceptorAuth)\n * - `password` ≈ `clientSecret`\n *\n * **Где:** поле {@link TorrowClientConfig.authIdentityBasic}; читает {@link AuthFacade}.\n * **Пара в auth-пакете:** `AppCredentials` (`clientId`/`clientSecret`) — маппинг внутри\n * `TokenSession`; приложениям на `@torrow/sdk-auth` достаточно `appCredentials`.\n * Low-level `new TorrowClient({ authIdentityBasic })` — задавай сам.\n */\nexport type AuthIdentityBasic = {\n username: string;\n password: string;\n};\n\n/**\n * Входной конфиг **`new TorrowClient(…)`** (`@torrow/sdk-client`).\n *\n * Содержит HTTP-транспорт + способ авторизации запросов:\n * - `getAccessToken` → Bearer на обычные API-вызовы\n * - `authIdentityBasic` → Basic на `/api/v1/auth/*` ({@link AuthFacade})\n *\n * **Не путать с:**\n * - {@link ResolvedTorrowClientConfig} — то же после default `baseUrl` (`client.config`)\n * - `TokenSessionOptions` / `TorrowAuth*` (`@torrow/sdk-auth`) — опции сессии; отсюда\n * берут только `baseUrl`/`fetch`/`defaultHeaders`/`userAgent`, а Bearer/Basic\n * сессия выставляет сама (`getAccessToken` + маппинг `appCredentials`)\n *\n * **Где используется:** конструктор {@link TorrowClient}, {@link HttpClient}.\n */\nexport interface TorrowClientConfig {\n /**\n * Origin API, например `https://torrow.net` (слэш в конце не нужен; пути `/api/v1/...` добавляет клиент).\n * Если не задан — используется {@link DEFAULT_TORROW_API_BASE_URL} (единый интернет-сервис Torrow).\n */\n baseUrl?: string;\n /**\n * Bearer для `Authorization`. Не задавай или возвращай `undefined` — заголовок не ставится\n * (подходит для публичных GET и гостевых сценариев; конкретные эндпоинты — по контракту API).\n *\n * Обновление access по **refresh** и хранение токенов — в приложении: удобно вызывать\n * **`client.auth.refresh`** (внутренний HTTP **без** этого колбэка) или\n * отдельный {@link HttpClient} без `getAccessToken`, чтобы избежать рекурсии. См. **`docs/sdk-development-plan.md`** §8,\n * пример **`examples/node/auth/auth-connect.ts`** / **`TorrowAuth.connect`** (`@torrow/sdk-auth`). Смысл полей ответа **`TokenResp`** —\n * **`@torrow/sdk-docs`** (`mcpAuthFieldCatalog.TokenResp`, **`tokenRespFieldDocEntries`**).\n *\n * С сессией (`@torrow/sdk-auth`) колбэк ставит `TokenSession` — снаружи не передавай.\n */\n getAccessToken?: () => Promise<string | undefined>;\n /**\n * HTTP **Basic** для вызовов **`/api/v1/auth/*`** через {@link AuthFacade}.\n * Без этого шлюз может вернуть **`AUTH_HEADER_MISSING`** / **`REQUEST_IS_INVALID`** на части эндпоинтов.\n * Не путай с пользовательским Bearer из **`getAccessToken`** — он на **`AuthFacade`** не передаётся.\n *\n * App/widget с сессией: обычно **`TorrowAuth`** + опциональный **`appCredentials`**\n * (дефолт SDK — `DEFAULT_APP_CREDENTIALS` в `@torrow/sdk-auth`; здесь Basic **не** дефолтится).\n * Low-level / одноразовый `sendCode`: задай {@link AuthIdentityBasic} явно.\n */\n authIdentityBasic?: AuthIdentityBasic;\n /** Inject `fetch` (tests, proxies, undici in older Node). Defaults to global `fetch`. */\n fetch?: typeof fetch;\n /** Merged into every request after defaults. */\n defaultHeaders?: Record<string, string>;\n /** e.g. `torrow-sdk-js/0.1.0` for server diagnostics. */\n userAgent?: string;\n}\n\n/**\n * Конфиг **после** применения дефолтов: `baseUrl` всегда `string`\n * (из входа или {@link DEFAULT_TORROW_API_BASE_URL}).\n *\n * **Где:** `TorrowClient.config`; конструкторы фасадов, которым нужен гарантированный origin\n * (`AuthFacade`, `ShortUrlFacade`, …). Снаружи в `new TorrowClient` передавай\n * {@link TorrowClientConfig} — `Resolved*` сам не собирай.\n */\nexport type ResolvedTorrowClientConfig = Omit<TorrowClientConfig, \"baseUrl\"> & {\n baseUrl: string;\n};\n","import type { TorrowClientConfig } from \"../TorrowClientConfig.js\";\n\n/**\n * Собирает заголовки авторизации из колбэка **`getAccessToken`** в {@link TorrowClientConfig}.\n * При непустом токене: `Authorization: Bearer <accessToken>`; иначе пустой объект (запрос без Bearer).\n *\n * Не вызывает **`/api/v1/auth/refresh`** — только то, что вернул колбэк. Для refresh используй **`TorrowClient.auth`** (см. **`src/resources/auth/AuthFacade.ts`**). Смыслы полей — **`mcpAuthFieldCatalog`** в **`@torrow/sdk-docs`**.\n */\nexport async function buildAuthHeaders(\n config: TorrowClientConfig,\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n const token = await config.getAccessToken?.();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n}\n","/** Причина отказа SDK; сама по себе не определяет результат записи. */\nexport enum TorrowSdkErrorCategory {\n /** Неверные параметры операции. */ InvalidInput = \"InvalidInput\",\n /** Операция недопустима в текущем состоянии. */ InvalidState = \"InvalidState\",\n /** Подтверждённый отказ доступа. */ AccessDenied = \"AccessDenied\",\n /** Недостаточно данных для безопасного выполнения. */ InsufficientData = \"InsufficientData\",\n /** Ответ не соответствует ожидаемой структуре. */ InvalidResponse = \"InvalidResponse\",\n /** Доказанное несовпадение версии. */ VersionConflict = \"VersionConflict\",\n /** Требуется аутентификация. */ AuthenticationRequired = \"AuthenticationRequired\",\n /** Способ выполнения не поддерживается. */ UnsupportedOperation = \"UnsupportedOperation\",\n /** Сервер ограничил частоту запросов. */ RateLimited = \"RateLimited\",\n /** Прочий HTTP-отказ. */ HttpFailure = \"HttpFailure\",\n /** Распознанный сбой транспорта. */ TransportFailure = \"TransportFailure\",\n /** Сбой сохранения или загрузки состояния. */ StorageFailure = \"StorageFailure\",\n /** Запрос отменён. */ Cancelled = \"Cancelled\",\n /** Причина зависимости не распознана. */ Unknown = \"Unknown\",\n}\n/** Начало вызова fetch конкретного запроса, без гарантии доставки. */\nexport enum TorrowSdkRequestState {\n /** fetch ещё не вызван. */ NotStarted = \"NotStarted\",\n /** Начат вызов fetch. */ Started = \"Started\",\n}\n/** Область описанного предметного изменения. */\nexport enum TorrowSdkEffectArea {\n /** Изменение на сервере. */ Remote = \"Remote\",\n /** Изменение памяти текущей сессии. */ SessionMemory = \"SessionMemory\",\n /** Изменение постоянного хранилища. */ Storage = \"Storage\",\n}\n/** Доказанность отдельного изменения. */\nexport enum TorrowSdkEffectState {\n /** Доказано отсутствие изменения. */ NotApplied = \"NotApplied\",\n /** Выполнение изменения подтверждено. */ Applied = \"Applied\",\n /** Результат изменения неизвестен. */ Unknown = \"Unknown\",\n}\n/** Домен предметного уточнения ошибки. */\nexport enum TorrowSdkErrorDomain {\n /** Настройки поведения услуг и ресурсов. */ BehaviorSettings = \"BehaviorSettings\",\n /** Пошаговый OTP. */ Otp = \"Otp\",\n /** Сессия токенов и составной вход. */ AuthSession = \"AuthSession\",\n}\n/** Причина отказа OTP. */\nexport enum OtpErrorReason {\n /** Неверное продолжение. */ InvalidChallenge = \"InvalidChallenge\",\n /** Метод не поддержан приложением. */ UnsupportedMethod = \"UnsupportedMethod\",\n /** Отсутствует заголовок авторизации. */ AuthHeaderMissing = \"AuthHeaderMissing\",\n /** Исчерпан лимит отправки. */ CodeRequestLimitExceeded = \"CodeRequestLimitExceeded\",\n}\n/** Причина отказа сессии. */\nexport enum AuthSessionErrorReason {\n /** Сессия ещё не готова к выдаче токенов. */ SessionNotReady = \"SessionNotReady\",\n /** Ошибка пользовательского callback. */ CallbackFailed = \"CallbackFailed\",\n}\n/** Шаги изменения настроек. */\nexport enum BehaviorSettingsEffectStep {\n /** Целевая запись настроек. */ Write = \"Write\",\n}\n/** Шаги изменения сессии. */\nexport enum AuthSessionEffectStep {\n /** Создание серверного продолжения входа по ссылке. */ CreateAuthSession = \"CreateAuthSession\",\n /** Закрытие локальной сессии. */ CloseSession = \"CloseSession\",\n /** Выдача токенов. */ IssueTokens = \"IssueTokens\",\n /** Обновление токенов. */ RefreshTokens = \"RefreshTokens\",\n /** Отзыв токенов. */ RevokeTokens = \"RevokeTokens\",\n /** Отправка кода или ссылки. */ SendCode = \"SendCode\",\n /** Замена токенов в памяти. */ SetTokens = \"SetTokens\",\n /** Очистка токенов в памяти. */ ClearTokens = \"ClearTokens\",\n /** Сохранение токенов. */ SaveTokens = \"SaveTokens\",\n /** Очистка хранилища. */ ClearStorage = \"ClearStorage\",\n}\n/** Безопасное описание отдельного изменения; не журнал всех вызовов. */\nexport interface TorrowSdkEffect {\n /** Область изменения. */ readonly area: TorrowSdkEffectArea;\n /** Предметный шаг выбранного метода. */ readonly step: BehaviorSettingsEffectStep | AuthSessionEffectStep;\n /** Доказанность результата шага. */ readonly state: TorrowSdkEffectState;\n}\n/** Предметное уточнение настроек. */\nexport interface BehaviorSettingsErrorDetail {\n /** Дискриминатор настроек. */ readonly domain: TorrowSdkErrorDomain.BehaviorSettings;\n /** У настроек нет дополнительной причины; доступ к общему optional reason остаётся типизированным. */ readonly reason?: never;\n}\n/** Предметное уточнение OTP; секреты здесь не размещаются. */\nexport interface OtpErrorDetail {\n /** Дискриминатор OTP. */ readonly domain: TorrowSdkErrorDomain.Otp;\n /** Дополнительное уточнение; отсутствие означает, что достаточно category. */ readonly reason?: OtpErrorReason;\n /** Проверенное время следующей отправки, Unix milliseconds; отсутствует без подсказки. */ readonly nextSendAtMs?: number;\n /** Проверенная длительность ожидания в секундах. */ readonly retryAfterSeconds?: number;\n}\n/** Предметное уточнение сессии. */\nexport interface AuthSessionErrorDetail {\n /** Дискриминатор сессии. */ readonly domain: TorrowSdkErrorDomain.AuthSession;\n /** Дополнительное уточнение; отсутствие означает, что достаточно category. */ readonly reason?: AuthSessionErrorReason;\n}\n/** Поддержанные предметные детали ошибки. */\nexport type TorrowSdkErrorDetail = BehaviorSettingsErrorDetail | OtpErrorDetail | AuthSessionErrorDetail;\n/** Безопасные HTTP-метаданные без тела и URL. */\nexport interface TorrowSdkHttpDetails {\n /** Статус полученного ответа. */ readonly status: number;\n /** Код API; числовой wire-код приводится к строке. */ readonly apiCode?: string;\n /** Известное SDK кодовое имя; произвольные серверные строки исключены. */ readonly apiErrorName?: string;\n /** Идентификатор запроса для поддержки. */ readonly requestId?: string;\n /** Идентификатор трассировки сервера. */ readonly traceIdentifier?: string;\n}\n/** Чувствительная диагностика; доступна только по явному запросу. */\nexport interface TorrowSdkSensitiveDetails {\n /** Исходное исключение зависимости, включая его исходный стек. */ readonly cause?: unknown;\n /** Исходное тело ответа. */ readonly body?: unknown;\n /** Полный URL запроса, который может содержать токены. */ readonly url?: string;\n /** Данные явного отзыва OTP-токенов. */ readonly cleanup?: { /** Секрет отзыва; не логировать. */ readonly refreshToken: string };\n}\n/** Безопасный снимок ошибки. Отсутствие effects не доказывает отсутствие изменений. */\nexport interface TorrowSdkErrorInfo {\n /** Общая причина отказа. */ readonly category: TorrowSdkErrorCategory;\n /** Метаданные HTTP, если они известны. */ readonly http?: TorrowSdkHttpDetails;\n /** Предметное уточнение выбранного домена. */ readonly detail?: TorrowSdkErrorDetail;\n /** Начало fetch соответствующего запроса. */ readonly request?: TorrowSdkRequestState;\n /** Стабильное имя выбранной составной операции, без аргументов. */ readonly operation?: string;\n /** Локальная стадия сбоя, без пользовательских данных. */ readonly failureAt?: string;\n /** Только описанные изменения данной операции; отсутствие означает отсутствие сведений. */ readonly effects?: readonly TorrowSdkEffect[];\n}\n/** Параметры создания ошибки; безопасные поля унаследованы из TorrowSdkErrorInfo. */\nexport interface TorrowSdkErrorInit extends TorrowSdkErrorInfo {\n /** Исходные данные, исключённые из стандартной диагностики. */ readonly sensitive?: TorrowSdkSensitiveDetails;\n}\n/** Единая ошибка сетевых и выбранных предметных операций SDK. */\nexport class TorrowSdkError extends Error implements TorrowSdkErrorInfo {\n /** Общая причина отказа. */ readonly category: TorrowSdkErrorCategory;\n /** Безопасные метаданные ответа. */ readonly http?: TorrowSdkHttpDetails;\n /** Неизменяемое предметное уточнение. */ readonly detail?: TorrowSdkErrorDetail;\n /** Начало fetch; не доставка. */ readonly request?: TorrowSdkRequestState;\n /** Имя составной операции без пользовательских значений. */ readonly operation?: string;\n /** Стадия отказа без аргументов. */ readonly failureAt?: string;\n /** Неизменяемые сведения об описанных изменениях. */ readonly effects?: readonly TorrowSdkEffect[];\n #sensitive: TorrowSdkSensitiveDetails;\n\n constructor(init: TorrowSdkErrorInit) {\n // Не передавать cause в Error: console.inspect выводит его автоматически.\n super(`Torrow SDK: ${init.category}`);\n this.name = \"TorrowSdkError\";\n this.category = init.category;\n this.http = init.http && Object.freeze({ ...init.http });\n this.detail = init.detail && Object.freeze({ ...init.detail });\n this.request = init.request;\n this.operation = init.operation;\n this.failureAt = init.failureAt;\n this.effects = init.effects && Object.freeze(init.effects.map(effect => Object.freeze({ ...effect })));\n this.#sensitive = Object.freeze({ ...init.sensitive, cleanup: init.sensitive?.cleanup && Object.freeze({ ...init.sensitive.cleanup }) });\n Object.freeze(this);\n }\n /** Безопасный снимок для обычной сериализации и диагностики. */\n toJSON(): TorrowSdkErrorInfo {\n return { category: this.category, http: this.http, detail: this.detail, request: this.request,\n operation: this.operation, failureAt: this.failureAt, effects: this.effects };\n }\n /** Явный доступ к секретной диагностике; вызывающий код отвечает за её защиту. */\n getSensitiveDetails(): TorrowSdkSensitiveDetails { return this.#sensitive; }\n /** Новый снимок для составной операции; исходная ошибка не изменяется. */\n withContext(context: Partial<TorrowSdkErrorInfo>): TorrowSdkError {\n return new TorrowSdkError({ ...this.toJSON(), ...context, sensitive: this.#sensitive });\n }\n}\n","import { TorrowSdkError, TorrowSdkErrorCategory, TorrowSdkRequestState, type TorrowSdkHttpDetails } from \"./TorrowSdkError.js\";\n\n/** Известные предметные кодовые имена; произвольные title/message не публикуются. */\nenum KnownApiErrorName {\n ResourceUnavailable = \"REQUESTED_RESOURCE_IS_NOT_AVAILABLE\",\n QuantityUnavailable = \"REQUESTED_RESOURCE_QUANTITY_IS_NOT_AVAILABLE\",\n ServiceUnavailableAtTime = \"SERVICE_IS_NOT_AVAILABLE_AT_TIME\",\n WrongVersion = \"OBJECT_HAS_WRONG_VERSION\",\n CodeRequestLimit = \"CODE_REQUEST_LIMIT_EXCEEDED\",\n AccessDenied = \"ACCESS_DENIED\",\n /** Серверный отказ прав на элементы. */ UserNoRights = \"USER_HAVE_NO_RIGHTS_TO_ELEMENTS\",\n /** Отсутствуют учётные данные приложения. */ AuthHeaderMissing = \"AUTH_HEADER_MISSING\",\n WrongSessionCode = \"WRONG_SESSION_ACCESS_CODE\",\n AttemptsExceeded = \"EXCEEDED_ATTEMPTS_COUNT\",\n}\n/** HTTP-отказ с безопасной метаинформацией и приватным исходным ответом. */\nexport function createHttpError(init: {\n /** Статус ответа. */ status: number;\n /** Исходный ответ для явной диагностики. */ body: unknown;\n /** Секретный полный URL. */ url: string;\n /** Идентификатор запроса. */ requestId?: string;\n /** Заголовок трассировки, приоритетнее тела. */ traceIdentifier?: string;\n /** Исходная причина для сценарных внедрений. */ cause?: unknown;\n}): TorrowSdkError {\n const body = record(init.body);\n const code = body?.code;\n const apiCode = typeof code === \"string\" ? code : typeof code === \"number\" && Number.isFinite(code) ? String(code) : undefined;\n const apiName = [body?.error, body?.name].find(value => typeof value === \"string\" && Object.values(KnownApiErrorName).includes(value as KnownApiErrorName));\n const nested = record(body?.torrowError) ?? record(body?.torrowErrorClient) ?? record(body?.innerError);\n const trace = body?.traceIdentifier ?? nested?.traceIdentifier;\n const http: TorrowSdkHttpDetails = {\n status: init.status, apiCode, apiErrorName: typeof apiName === \"string\" ? apiName : undefined,\n requestId: init.requestId, traceIdentifier: init.traceIdentifier || (typeof trace === \"string\" ? trace : undefined),\n };\n const category = init.status === 401 ? TorrowSdkErrorCategory.AuthenticationRequired\n : init.status === 403 ? TorrowSdkErrorCategory.AccessDenied\n : init.status === 429 ? TorrowSdkErrorCategory.RateLimited : TorrowSdkErrorCategory.HttpFailure;\n return new TorrowSdkError({ category, http, request: TorrowSdkRequestState.Started, sensitive: init });\n}\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" ? value as Record<string, unknown> : undefined;\n}\n/** Нормализация реально возникшего исключения транспорта без эвристик по тексту. */\nexport function normalizeTransportError(cause: unknown, request: TorrowSdkRequestState, signal?: AbortSignal, url?: string, parsing = false): TorrowSdkError {\n // Вложенный отказ auth сохраняет собственный request и диагностику. Маркер не описывает внешний вызов.\n if (cause instanceof TorrowSdkError) return cause;\n const cancelled = signal?.aborted || record(cause)?.name === \"AbortError\";\n const category = cancelled ? TorrowSdkErrorCategory.Cancelled\n : parsing ? TorrowSdkErrorCategory.InvalidResponse\n : request === TorrowSdkRequestState.Started && cause instanceof TypeError ? TorrowSdkErrorCategory.TransportFailure\n : TorrowSdkErrorCategory.Unknown;\n return new TorrowSdkError({ category, request, sensitive: { cause, url } });\n}\n","/** Legacy NSwag-compatible parsing for operations not migrated to OpenAPI response-date descriptors. */\nconst ISO_DATE_REGEX =\n /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)(Z|([+-])(\\d{2}):(\\d{2}))$/;\n\n/** JSON-примитив (`JSON.parse` / `JSON.stringify`). */\nexport type JsonPrimitive = string | number | boolean | null;\n\n/** JSON-массив. */\nexport type JsonArray = JsonValue[];\n\n/** JSON-объект (не `Date`, не `undefined`, не функции). */\nexport type JsonObject = { [key: string]: JsonValue };\n\n/**\n * Значение, допустимое в JSON.\n * Для opaque `settings` (device/user): публичный тип вместо wire-`string`.\n */\nexport type JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\nexport function parseJsonWithIsoDates(json: string): unknown {\n if (json === \"\") {\n return undefined;\n }\n return JSON.parse(json, function (this: Record<string, unknown>, key: string, value: unknown) {\n if (typeof value !== \"string\") {\n return value;\n }\n // Note source is text even when its entire content happens to be an ISO date.\n if (key === \"data\" && (this.noteType === \"Html\" || this.noteType === \"Markdown\")) {\n return value;\n }\n return ISO_DATE_REGEX.exec(value) ? new Date(value) : value;\n });\n}\n\nexport function stringifyJsonBody(body: unknown): string {\n return JSON.stringify(body, (_key: string, value: unknown) => {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n });\n}\n","// Generated by npm run codegen. Do not edit.\nimport type { DateNode, DateRoute } from \"../util/response-dates.js\";\n\nexport const responseDateNodes: readonly DateNode[] = [\n {},\n {\n \"ref\": 2\n },\n {\n \"properties\": {\n \"files\": 3,\n \"image\": 7,\n \"rating\": 8,\n \"personalInfo\": 11,\n \"blockInfo\": 33,\n \"meta\": 36\n }\n },\n {\n \"items\": 4\n },\n {\n \"ref\": 5\n },\n {\n \"properties\": {\n \"urlExpiration\": 6\n }\n },\n {\n \"date\": true\n },\n {\n \"ref\": 5\n },\n {\n \"ref\": 9\n },\n {\n \"properties\": {\n \"date\": 10\n }\n },\n {\n \"date\": true\n },\n {\n \"ref\": 12\n },\n {\n \"properties\": {\n \"meta\": 13,\n \"lastUsageTime\": 17,\n \"personalReminders\": 18,\n \"subscriptionList\": 27\n }\n },\n {\n \"ref\": 14\n },\n {\n \"properties\": {\n \"lastModified\": 15,\n \"createDate\": 16\n }\n },\n {\n \"date\": true\n },\n {\n \"date\": true\n },\n {\n \"date\": true\n },\n {\n \"items\": 19\n },\n {\n \"ref\": 20\n },\n {\n \"properties\": {\n \"date\": 21,\n \"recurringConditions\": 22\n }\n },\n {\n \"date\": true\n },\n {\n \"ref\": 23\n },\n {\n \"properties\": {\n \"endDate\": 24,\n \"beginDate\": 25,\n \"firstWeekDate\": 26\n }\n },\n {\n \"date\": true\n },\n {\n \"date\": true\n },\n {\n \"date\": true\n },\n {\n \"items\": 28\n },\n {\n \"ref\": 29\n },\n {\n \"properties\": {\n \"openDate\": 30,\n \"closeDate\": 31,\n \"recurringConditions\": 32\n }\n },\n {\n \"date\": true\n },\n {\n \"date\": true\n },\n {\n \"ref\": 23\n },\n {\n \"ref\": 34\n },\n {\n \"properties\": {\n \"blockDate\": 35\n }\n },\n {\n \"date\": true\n },\n {\n \"ref\": 14\n },\n {\n \"ref\": 2\n },\n {\n \"ref\": 2\n },\n {\n \"ref\": 40\n },\n {\n \"properties\": {\n \"meta\": 41\n }\n },\n {\n \"ref\": 14\n },\n {\n \"ref\": 40\n },\n {\n \"ref\": 44\n },\n {\n \"properties\": {\n \"image\": 45,\n \"rating\": 46,\n \"personalInfo\": 47,\n \"blockInfo\": 48,\n \"meta\": 49\n }\n },\n {\n \"ref\": 5\n },\n {\n \"ref\": 9\n },\n {\n \"ref\": 12\n },\n {\n \"ref\": 34\n },\n {\n \"ref\": 14\n },\n {\n \"ref\": 51\n },\n {\n \"properties\": {\n \"includeResp\": 52\n }\n },\n {\n \"ref\": 53\n },\n {\n \"properties\": {\n \"linkMetaList\": 54\n }\n },\n {\n \"items\": 55\n },\n {\n \"ref\": 56\n },\n {\n \"properties\": {\n \"info\": 57\n }\n },\n {\n \"ref\": 14\n },\n {\n \"ref\": 59\n },\n {\n \"properties\": {\n \"meta\": 60,\n \"subscriptionList\": 61\n }\n },\n {\n \"ref\": 14\n },\n {\n \"items\": 62\n },\n {\n \"ref\": 29\n },\n {\n \"items\": 64\n },\n {\n \"ref\": 65\n },\n {\n \"properties\": {\n \"file\": 66,\n \"files\": 67,\n \"itemObject\": 69,\n \"itemLink\": 70,\n \"personalViewInfo\": 73,\n \"image\": 79\n }\n },\n {\n \"ref\": 5\n },\n {\n \"items\": 68\n },\n {\n \"ref\": 5\n },\n {\n \"ref\": 40\n },\n {\n \"ref\": 71\n },\n {\n \"properties\": {\n \"meta\": 72\n }\n },\n {\n \"ref\": 14\n },\n {\n \"ref\": 74\n },\n {\n \"properties\": {\n \"meta\": 75,\n \"lastUsageTime\": 76,\n \"personalReminders\": 77\n }\n },\n {\n \"ref\": 14\n },\n {\n \"date\": true\n },\n {\n \"items\": 78\n },\n {\n \"ref\": 20\n },\n {\n \"ref\": 5\n },\n {\n \"items\": 81\n },\n {\n \"ref\": 65\n },\n {\n \"items\": 83\n },\n {\n \"ref\": 65\n },\n {\n \"ref\": 85\n },\n {\n \"properties\": {\n \"image\": 86,\n \"rating\": 87,\n \"personalInfo\": 88,\n \"blockInfo\": 89,\n \"meta\": 90\n }\n },\n {\n \"ref\": 5\n },\n {\n \"ref\": 9\n },\n {\n \"ref\": 12\n },\n {\n \"ref\": 34\n },\n {\n \"ref\": 14\n },\n {\n \"items\": 92\n },\n {\n \"ref\": 85\n }\n];\n\nexport const responseDateRoutes: readonly DateRoute[] = [\n {\n \"method\": \"POST\",\n \"path\": \"/api/v1/notes\",\n \"responses\": {\n \"200\": 1\n }\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/search/notes\",\n \"responses\": {\n \"200\": 82\n }\n },\n {\n \"method\": \"POST\",\n \"path\": \"/api/v1/contexts\",\n \"responses\": {\n \"200\": 84\n }\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/contexts/personallist\",\n \"responses\": {\n \"200\": 91\n }\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/notes/personallist\",\n \"responses\": {},\n \"legacy\": true\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/notes/{torrowId}\",\n \"responses\": {\n \"200\": 37\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}\",\n \"responses\": {\n \"200\": 38\n }\n },\n {\n \"method\": \"DELETE\",\n \"path\": \"/api/v1/notes/{torrowId}\",\n \"responses\": {\n \"200\": 0\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}/tags\",\n \"responses\": {\n \"200\": 39\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}/solutiondata\",\n \"responses\": {\n \"200\": 42\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}/group/set\",\n \"responses\": {\n \"200\": 43\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}/updategroups\",\n \"responses\": {\n \"200\": 50\n }\n },\n {\n \"method\": \"PUT\",\n \"path\": \"/api/v1/notes/{torrowId}/savetomindmap\",\n \"responses\": {\n \"200\": 58\n }\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/notes/{parentId}/views/user\",\n \"responses\": {\n \"200\": 63\n }\n },\n {\n \"method\": \"GET\",\n \"path\": \"/api/v1/notes/{parentId}/views/pinned\",\n \"responses\": {\n \"200\": 80\n }\n }\n];\n","import { responseDateNodes, responseDateRoutes } from \"../schema/response-dates.generated.js\";\nimport { parseJsonWithIsoDates } from \"./json.js\";\n\nexport interface DateNode {\n date?: boolean;\n ref?: number;\n properties?: Record<string, number>;\n items?: number;\n all?: number[];\n unions?: number[][];\n}\n\nexport interface DateRoute {\n method: string;\n path: string;\n responses: Record<string, number>;\n legacy?: boolean;\n}\n\nconst routes = responseDateRoutes.map((route) => ({\n ...route,\n segments: route.path.split(\"/\"),\n}));\n\n/** An unlisted operation retains legacy parsing; an unlisted status on a migrated route stays plain JSON. */\nexport function parseOperationResponse(json: string, method: string, path: string, status: number): unknown {\n const segments = path.split(\"?\")[0].split(\"/\");\n const route = routes.find((candidate) => candidate.method === method &&\n candidate.segments.length === segments.length &&\n candidate.segments.every((segment, i) => segment.startsWith(\"{\") ? segments[i] !== \"\" : segment === segments[i]));\n if (!route || route.legacy) return parseJsonWithIsoDates(json);\n if (json === \"\") return undefined;\n return reviveDeclaredDates(JSON.parse(json), responseDateNodes, route.responses[String(status)] ?? route.responses[\"2XX\"] ?? 0);\n}\n\n/** Collect before mutating so allOf/union branches inspect the same original JSON. */\nexport function reviveDeclaredDates(value: unknown, nodes: readonly DateNode[], root: number): unknown {\n type Candidate = { parent: Record<string, unknown>; key: string; date: Date };\n const holder: Record<string, unknown> = { value };\n function collect(parent: Record<string, unknown>, key: string, id: number, path: string, active: Set<number>): Map<string, Candidate> {\n const result = new Map<string, Candidate>();\n const current = parent[key];\n const node = nodes[id];\n if (!node || active.has(id) || current == null) return result;\n const next = new Set(active).add(id);\n const merge = (entries: Map<string, Candidate>) => entries.forEach((entry, name) => result.set(name, entry));\n if (node.date && typeof current === \"string\") {\n const date = new Date(current);\n if (!Number.isNaN(date.getTime())) result.set(path, { parent, key, date });\n }\n if (node.ref !== undefined) merge(collect(parent, key, node.ref, path, next));\n for (const child of node.all ?? []) merge(collect(parent, key, child, path, next));\n for (const union of node.unions ?? []) {\n const branches = union.map((child) => collect(parent, key, child, path, next));\n for (const [name, candidate] of branches[0] ?? []) {\n if (branches.every((branch) => branch.has(name))) result.set(name, candidate);\n }\n }\n if (Array.isArray(current) && node.items !== undefined) {\n current.forEach((_entry, i) => merge(collect(current as unknown as Record<string, unknown>, String(i), node.items!, `${path}/${i}`, new Set())));\n } else if (typeof current === \"object\" && !Array.isArray(current)) {\n for (const [property, child] of Object.entries(node.properties ?? {})) {\n if (Object.hasOwn(current, property)) merge(collect(current as Record<string, unknown>, property, child,\n `${path}/${property.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")}`, new Set()));\n }\n }\n return result;\n }\n for (const { parent, key, date } of collect(holder, \"value\", root, \"\", new Set()).values()) parent[key] = date;\n return holder.value;\n}\n","/** Mirrors NSwag `ClientBase.mapToQueryString` (torrow-apps `libs/api`). */\nexport function buildQueryString(queryStringParams: Record<string, unknown>): string {\n const queryString: string[] = [];\n for (const prop of Object.keys(queryStringParams)) {\n const value = queryStringParams[prop];\n if (value === undefined) {\n continue;\n }\n if (value === null) {\n continue;\n }\n if (value instanceof Date) {\n queryString.push(`${prop}=${encodeURIComponent(value.toISOString())}`);\n } else if (Array.isArray(value)) {\n for (const val of value) {\n queryString.push(buildQueryString({ [prop]: val }));\n }\n } else {\n queryString.push(`${prop}=${encodeURIComponent(String(value))}`);\n }\n }\n return queryString.join(\"&\");\n}\n","export function joinBaseUrlAndPath(baseUrl: string, path: string): string {\n const base = baseUrl.replace(/\\/+$/, \"\");\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n return `${base}${p}`;\n}\n","import { DEFAULT_TORROW_API_BASE_URL, type TorrowClientConfig } from \"../TorrowClientConfig.js\";\nimport { buildAuthHeaders } from \"./auth.js\";\nimport { TorrowSdkRequestState } from \"./TorrowSdkError.js\";\nimport { createHttpError, normalizeTransportError } from \"./transport-errors.js\";\nimport { stringifyJsonBody } from \"../util/json.js\";\nimport { parseOperationResponse } from \"../util/response-dates.js\";\nimport { buildQueryString } from \"../util/query-string.js\";\nimport { joinBaseUrlAndPath } from \"../util/url.js\";\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\n/** Параметры одного JSON-запроса. */\nexport interface HttpRequestInit {\n /** HTTP-метод операции. */\n method: HttpMethod;\n /** API-путь от корня шлюза, например `/api/v1/contacts`. */\n path: string;\n /** Query-параметры; отсутствие означает пустой query. */\n query?: Record<string, unknown>;\n /** Дополнительные заголовки, переопределяющие настройки клиента. */\n headers?: Record<string, string>;\n /** JSON-тело; отсутствует для GET/DELETE и при undefined. */\n body?: unknown;\n /** Отмена запроса; передаётся в fetch. */\n signal?: AbortSignal;\n}\n\nconst JSON_MIME = \"application/json\";\n\n/**\n * JSON поверх `fetch`: query, **`Authorization`** из **`getAccessToken`** (см. {@link buildAuthHeaders}).\n * Не выполняет refresh и не разбирает 401.\n */\nexport class HttpClient {\n constructor(private readonly config: TorrowClientConfig) {}\n\n /** Выполняет запрос; сетевые и подготовительные отказы возвращает как TorrowSdkError. */\n async requestJson<T = unknown>(init: HttpRequestInit, /** @internal Маркер начала отправки, без logging/telemetry. */ onDispatch?: () => void): Promise<T> {\n let request = TorrowSdkRequestState.NotStarted;\n let url: string | undefined;\n let parsing = false;\n try {\n const { fetch: fetchFn = globalThis.fetch } = this.config;\n url = this.buildUrl(init.path, init.query);\n const authHeaders = await buildAuthHeaders(this.config);\n const headers: Record<string, string> = {\n Accept: JSON_MIME,\n ...authHeaders,\n ...this.config.defaultHeaders,\n ...init.headers,\n };\n if (this.config.userAgent) {\n headers[\"User-Agent\"] = this.config.userAgent;\n }\n\n const needsBody =\n init.body !== undefined && init.method !== \"GET\" && init.method !== \"DELETE\";\n if (needsBody) {\n headers[\"Content-Type\"] = JSON_MIME;\n }\n\n // Подготовка тела может завершиться ошибкой до отправки запроса.\n const requestInit: RequestInit = {\n method: init.method,\n headers,\n body: needsBody ? stringifyJsonBody(init.body) : undefined,\n signal: init.signal,\n };\n init.signal?.throwIfAborted();\n onDispatch?.();\n request = TorrowSdkRequestState.Started;\n const res = await fetchFn(url, requestInit);\n\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const traceIdentifier = res.headers.get(\"trace-identifier\") ?? undefined;\n const text = await res.text();\n\n if (!res.ok) {\n const errBody = tryParseErrorBody(text, res.headers.get(\"content-type\"));\n throw createHttpError({\n status: res.status,\n body: errBody,\n url,\n requestId,\n traceIdentifier,\n });\n }\n\n if (text === \"\") {\n return undefined as T;\n }\n parsing = true;\n return parseOperationResponse(text, init.method, init.path, res.status) as T;\n } catch (cause) {\n throw normalizeTransportError(cause, request, init.signal, url, parsing);\n }\n }\n\n private buildUrl(path: string, query?: Record<string, unknown>): string {\n const origin = this.config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL;\n const basePath = joinBaseUrlAndPath(origin, path);\n const q: Record<string, unknown> = { ...query };\n const qs = buildQueryString(q);\n if (!qs) {\n return basePath;\n }\n const joiner = basePath.includes(\"?\") ? \"&\" : \"?\";\n return `${basePath}${joiner}${qs}`;\n }\n}\n\nfunction tryParseErrorBody(text: string, contentType: string | null): unknown {\n const ct = contentType ?? \"\";\n if (ct.includes(JSON_MIME) || (text.startsWith(\"{\") && text.endsWith(\"}\"))) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n}\n","import type { HttpClient, HttpMethod, HttpRequestInit } from \"../http/HttpClient.js\";\n\nexport type RawRequestOptions = Omit<HttpRequestInit, \"method\" | \"path\">;\n\n/**\n * Low-level REST calls (1:1 with paths). Prefer `TorrowClient` / `resources/*` when available.\n */\nexport class RawClient {\n constructor(private readonly http: HttpClient) {}\n\n request<T = unknown>(\n method: HttpMethod,\n path: string,\n options?: RawRequestOptions,\n ): Promise<T> {\n return this.http.requestJson<T>({ method, path, ...options });\n }\n\n get<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"GET\", path, options);\n }\n\n post<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"POST\", path, options);\n }\n\n put<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"PUT\", path, options);\n }\n\n patch<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"PATCH\", path, options);\n }\n\n delete<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"DELETE\", path, options);\n }\n}\n","import type { OpenApiSchemas as Schemas } from \"../../schema/openapi-schemas.js\";\n\nexport function unwrapDeleteCount(resp: Schemas[\"DeleteResponse\"] | null | undefined): number {\n if (resp == null || typeof resp !== \"object\") return 0;\n const n = resp.deleteCount;\n return typeof n === \"number\" && Number.isFinite(n) ? n : 0;\n}\n\nexport function unwrapDeletedUserAccountCount(\n resp: Schemas[\"DeleteUserAccountResp\"] | null | undefined,\n): number {\n if (resp == null || typeof resp !== \"object\") return 0;\n const n = resp.deletedCount;\n return typeof n === \"number\" && Number.isFinite(n) ? n : 0;\n}\n\nexport function unwrapAddProfileContact(resp: Schemas[\"AddProfileResp\"] | null | undefined): Schemas[\"ContactItem\"] {\n if (resp == null || typeof resp !== \"object\") {\n throw new Error(\"Add profile: expected JSON object response\");\n }\n const p = resp.profile;\n if (!p || typeof p !== \"object\") {\n throw new Error(\"Add profile: response missing profile\");\n }\n return p;\n}\n\nexport function unwrapRemoveProfileList(\n resp: Schemas[\"RemoveProfileResp\"] | null | undefined,\n): Schemas[\"ContactItem\"][] {\n if (resp == null || typeof resp !== \"object\") return [];\n const pl = resp.personalContactList;\n if (pl === undefined || pl === null) return [];\n if (!Array.isArray(pl)) {\n throw new Error(\"Remove profile: personalContactList must be an array when present\");\n }\n return pl;\n}\n\nexport function unwrapTorrowObjectFromProfilePropertiesUpdate(\n resp: Schemas[\"UpdateProfilePropertiesResp\"] | null | undefined,\n): Schemas[\"TorrowObject\"] | undefined {\n if (resp == null || typeof resp !== \"object\") return undefined;\n return resp.torrowObject ?? undefined;\n}\n\nexport function unwrapTorrowObjectFromContactPropertiesUpdate(\n resp: Schemas[\"UpdateContactPropertiesResp\"] | null | undefined,\n): Schemas[\"TorrowObject\"] | undefined {\n if (resp == null || typeof resp !== \"object\") return undefined;\n return resp.torrowObject ?? undefined;\n}\n\nexport function unwrapTorrowId(resp: Schemas[\"GetTorrowIdResp\"] | null | undefined): string {\n if (resp == null || typeof resp !== \"object\") {\n throw new Error(\"getNextId: expected JSON object response\");\n }\n const id = resp.torrowId?.trim();\n if (!id) {\n throw new Error(\"getNextId: response missing torrowId\");\n }\n return id;\n}\n\nexport function unwrapTimetableStatisticsList(\n resp: Schemas[\"GetTimetableStatisticsResponse\"] | null | undefined,\n): Schemas[\"TimetableStatisticsResp\"][] {\n if (resp == null || typeof resp !== \"object\") return [];\n const list = resp.timetableStatisticsRespList;\n if (list === undefined || list === null) return [];\n if (!Array.isArray(list)) {\n throw new Error(\"getTimetableStatistics: timetableStatisticsRespList must be an array when present\");\n }\n return list;\n}\n\nexport function unwrapCreatedViewInfoList(\n resp: Schemas[\"CreateViewListResp\"] | null | undefined,\n): Schemas[\"ViewInfo\"][] {\n if (resp == null || typeof resp !== \"object\") return [];\n const list = resp.createdViewInfoList;\n if (list === undefined || list === null) return [];\n if (!Array.isArray(list)) {\n throw new Error(\"create views: createdViewInfoList must be an array when present\");\n }\n return list;\n}\n\nexport function unwrapUpdatedViewInfoList(\n resp: Schemas[\"UpdateViewListOrderResp\"] | null | undefined,\n): Schemas[\"ViewInfo\"][] {\n if (resp == null || typeof resp !== \"object\") return [];\n const list = resp.updatedViewInfoList;\n if (list === undefined || list === null) return [];\n if (!Array.isArray(list)) {\n throw new Error(\"update view order: updatedViewInfoList must be an array when present\");\n }\n return list;\n}\n\nexport function unwrapLoyaltySystemsStatisticsList(\n resp: Schemas[\"GetLoyaltySystemsStatisticsResp\"] | null | undefined,\n): Schemas[\"LoyaltySystemsStatisticsResp\"][] {\n if (resp == null || typeof resp !== \"object\") return [];\n const list = resp.loyaltySystemsStatisticsRespList;\n if (list === undefined || list === null) return [];\n if (!Array.isArray(list)) {\n throw new Error(\"loyaltysystems statistics: loyaltySystemsStatisticsRespList must be an array when present\");\n }\n return list;\n}\n\nexport function unwrapSendCommunicationSessionId(\n resp: Schemas[\"SendCommunicationCodeResp\"] | null | undefined,\n): string {\n if (resp == null || typeof resp !== \"object\") {\n throw new Error(\"sendCommunicationCode: expected JSON object response\");\n }\n const sid = resp.sessionId?.trim();\n if (!sid) {\n throw new Error(\"sendCommunicationCode: response missing sessionId\");\n }\n return sid;\n}\n\nexport function unwrapFilePutUrl(\n resp: Schemas[\"PutUrlResp\"] | null | undefined,\n): { url: string; urlExpiration: string } {\n if (resp == null || typeof resp !== \"object\") {\n throw new Error(\"getFilePutUrl: expected JSON object response\");\n }\n const url = resp.url?.trim();\n if (!url) {\n throw new Error(\"getFilePutUrl: response missing url\");\n }\n const exp = resp.urlExpiration;\n const urlExpiration = exp == null ? \"\" : exp.toISOString();\n if (!urlExpiration) {\n throw new Error(\"getFilePutUrl: response missing urlExpiration\");\n }\n return { url, urlExpiration };\n}\n","/** Path segment for `{torrowId}` / `{itemId}` style parameters. */\nexport function encodePathSegment(id: string): string {\n return encodeURIComponent(id);\n}\n","/** Возвращает id для PUT item или отклоняет create-only payload. */\nexport function requireItemUpdateId(\n body: { id?: string | null },\n itemName: string,\n): string {\n const id = body.id;\n if (!id?.trim() || id !== id.trim()) {\n throw new TypeError(`${itemName} update requires a non-empty, normalized body.id`);\n }\n return id;\n}\n","export enum Discriminator {\n ActionHistoryInfo = \"ActionHistoryInfo\",\n AnnouncementInfo = \"AnnouncementInfo\",\n CalendarItem = \"CalendarItem\",\n TorrowItem = \"TorrowItem\",\n TorrowView = \"TorrowView\",\n CaseItem = \"CaseItem\",\n ResourceItem = \"ResourceItem\",\n ContactItem = \"ContactItem\",\n ContextItem = \"ContextItem\",\n NoteItem = \"NoteItem\",\n ServiceResourceItem = \"ServiceResourceItem\",\n ServiceItem = \"ServiceItem\",\n User = \"User\",\n TextNoteItem = \"TextNoteItem\",\n ItemView = \"ItemView\",\n ContactView = \"ContactView\",\n ContextView = \"ContextView\",\n NoteView = \"NoteView\",\n CaseView = \"CaseView\",\n CalendarView = \"CalendarView\",\n ServiceView = \"ServiceView\",\n ResourceView = \"ResourceView\",\n ParticipantView = \"ParticipantView\",\n CaseParticipantView = \"CaseParticipantView\",\n TimetableCase = \"TimetableCase\",\n PersonalInfo = \"PersonalInfo\",\n ContactPersonalInfo = \"ContactPersonalInfo\",\n CasePersonalInfo = \"CasePersonalInfo\",\n CustomLinkPaymentParameters = \"CustomLinkPaymentParameters\",\n RoboKassaPaymentParameters = \"RoboKassaPaymentParameters\",\n PaykeeperPaymentParameters = \"PaykeeperPaymentParameters\",\n ProdamusPaymentParameters = \"ProdamusPaymentParameters\",\n YooMoneyPaymentParameters = \"YooMoneyPaymentParameters\",\n YooKassaPaymentParameters = \"YooKassaPaymentParameters\",\n SberbankPaymentParameters = \"SberbankPaymentParameters\",\n UralsibPaymentParameters = \"UralsibPaymentParameters\",\n AlfabankPaymentParameters = \"AlfabankPaymentParameters\",\n MockPaymentProviderParameters = \"MockPaymentProviderParameters\",\n QiwiP2PPaymentParameters = \"QiwiP2PPaymentParameters\",\n TinkoffPaymentParameters = \"TinkoffPaymentParameters\",\n CashPaymentParameters = \"CashPaymentParameters\",\n CaseReportProperties = \"CaseReportProperties\",\n ServiceReportProperties = \"ServiceReportProperties\",\n ReportProperties = \"ReportProperties\",\n ServicesResourcesReportProperties = \"ServicesResourcesReportProperties\",\n ResourcesRentReportProperties = \"ResourcesRentReportProperties\",\n ResourceReportProperties = \"ResourceReportProperties\",\n LoyaltyCardItem = \"LoyaltyCardItem\",\n LoyaltySystemItem = \"LoyaltySystemItem\",\n LoyaltyCardView = \"LoyaltyCardView\",\n LoyaltySystemView = \"LoyaltySystemView\",\n VideoTelephonyIntegration = \"VideoTelephonyIntegration\",\n ExternalCalendarIntegration = \"ExternalCalendarIntegration\",\n WebHookIntegration = \"WebHookIntegration\",\n}\n\nexport type DiscriminatorType = `${Discriminator}`;\n","import type { DiscriminatorType } from \"./discriminator.js\";\n\ntype ItemCreateDefaultsInput = {\n discriminator?: string;\n};\n\n/**\n * Проставляет минимальные backend-safe дефолты для create item body.\n * `personalInfo` намеренно не заполняется на уровне SDK.\n */\nexport function applyItemCreateDefaults<TBody extends object>(\n body: TBody,\n discriminator: DiscriminatorType,\n): TBody {\n const payload: ItemCreateDefaultsInput & TBody = { ...body };\n payload.discriminator = discriminator;\n const withPublicity = payload as TBody & { publicityType?: string | null };\n withPublicity.publicityType = withPublicity.publicityType ?? \"Personal\";\n return payload;\n}\n","import type { TorrowObjectType } from \"../schema/sdk-shared-public-types.js\";\n\n/** Распакованный Torrow id (как в torrow-apps `unpackTorrowId`). */\nexport type UnpackedTorrowId = {\n shard: number;\n objectType: number;\n objectId: string;\n};\n\n/** Длина `objectId` в Torrow id и `rid` во вложенных структурах (MongoDB ObjectId hex). */\nexport const TORROW_OBJECT_ID_HEX_LENGTH = 24;\n\nconst OBJECT_ID_HEX_LENGTH = TORROW_OBJECT_ID_HEX_LENGTH;\n\nconst RID_HEX_PATTERN = /^[0-9a-fA-F]{24}$/;\nconst TORROW_ID_HEX_PATTERN = /^[0-9a-fA-F]+$/;\n\n/** Случайный `rid` / objectId: 24 hex-символа (как `ObjectID().toHexString()` в torrow-apps). */\nexport function generateRid(): string {\n const bytes = new Uint8Array(12);\n globalThis.crypto.getRandomValues(bytes);\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i]!.toString(16).padStart(2, \"0\");\n }\n return hex;\n}\n\n/** Проверка формата `rid` (24 hex). */\nexport function isValidRid(value: unknown): value is string {\n return typeof value === \"string\" && RID_HEX_PATTERN.test(value);\n}\nconst OBJECT_TYPE_HEX_LENGTH = 4;\nconst HEX_RADIX = 16;\n\n/** Разбирает строковый Torrow id на shard, числовой тип объекта и objectId (24 hex). */\nexport function unpackTorrowId(torrowId: string): UnpackedTorrowId {\n const objectId = torrowId.substring(torrowId.length - OBJECT_ID_HEX_LENGTH);\n const objectTypeString = torrowId.substring(\n torrowId.length - (OBJECT_ID_HEX_LENGTH + OBJECT_TYPE_HEX_LENGTH),\n torrowId.length - OBJECT_ID_HEX_LENGTH,\n );\n const objectType = Number.parseInt(objectTypeString, HEX_RADIX);\n const shardStartIndex = torrowId.length - (OBJECT_ID_HEX_LENGTH + objectTypeString.length);\n const shard =\n shardStartIndex === 0 ? 0 : Number.parseInt(torrowId.substring(0, shardStartIndex), HEX_RADIX);\n return { shard, objectType, objectId };\n}\n\n/** Собирает Torrow id из частей (как в torrow-apps `packTorrowId`). */\nexport function packTorrowId(parts: UnpackedTorrowId): string {\n const objectType = parts.objectType.toString(HEX_RADIX).padStart(OBJECT_TYPE_HEX_LENGTH, \"0\");\n const shard = parts.shard.toString(HEX_RADIX);\n return `${shard}${objectType}${parts.objectId}`.replace(/^0+/, \"\");\n}\n\n/** Shard из любого Torrow id того же пользователя (profileId, userId, …). */\nexport function getShardFromTorrowId(torrowId: string): number {\n return unpackTorrowId(torrowId).shard;\n}\n\n/**\n * Числовые коды типов в строковом Torrow id (как `OBJECT_TYPES` в torrow-apps + `File` для вложений).\n * Серверная выдача id — {@link IdGeneratorFacade.getNextId} (`TorrowObjectType` в path).\n */\nexport const TorrowObjectTypeCode = {\n User: 2,\n File: 10,\n Context: 1001,\n Contact: 1002,\n Note: 1003,\n Case: 1004,\n Service: 1005,\n Resource: 1009,\n Calendar: 1010,\n LoyaltySystem: 1019,\n LoyaltyCard: 1020,\n} as const;\n\nexport type TorrowObjectTypeCodeValue =\n (typeof TorrowObjectTypeCode)[keyof typeof TorrowObjectTypeCode];\n\nconst STRING_TYPE_TO_CODE: Readonly<\n Partial<Record<TorrowObjectType, TorrowObjectTypeCodeValue>>\n> = {\n User: TorrowObjectTypeCode.User,\n File: TorrowObjectTypeCode.File,\n Context: TorrowObjectTypeCode.Context,\n Contact: TorrowObjectTypeCode.Contact,\n Note: TorrowObjectTypeCode.Note,\n Case: TorrowObjectTypeCode.Case,\n Service: TorrowObjectTypeCode.Service,\n Resource: TorrowObjectTypeCode.Resource,\n Calendar: TorrowObjectTypeCode.Calendar,\n LoyaltySystem: TorrowObjectTypeCode.LoyaltySystem,\n LoyaltyCard: TorrowObjectTypeCode.LoyaltyCard,\n};\n\nconst CODE_TO_STRING_TYPE = new Map<number, TorrowObjectType>();\n\nfor (const [objectType, code] of Object.entries(STRING_TYPE_TO_CODE) as Array<\n [TorrowObjectType, TorrowObjectTypeCodeValue]\n>) {\n if (CODE_TO_STRING_TYPE.has(code)) {\n throw new Error(`Duplicate Torrow object type code: ${code}`);\n }\n CODE_TO_STRING_TYPE.set(code, objectType);\n}\n\nexport type TorrowIdErrorReason =\n | \"invalid-id\"\n | \"unknown-object-type-code\"\n | \"unsupported-item-type\"\n | \"empty-id-list\"\n | \"mixed-item-types\";\n\n/** Локальная ошибка разбора Torrow ID или проверки закодированного в нём типа. */\nexport class TorrowIdError extends TypeError {\n readonly reason: TorrowIdErrorReason;\n readonly objectTypeCode?: number;\n\n constructor(reason: TorrowIdErrorReason, message: string, objectTypeCode?: number) {\n super(message);\n this.name = \"TorrowIdError\";\n this.reason = reason;\n this.objectTypeCode = objectTypeCode;\n }\n}\n\nfunction unpackCanonicalTorrowId(torrowId: string): UnpackedTorrowId {\n if (\n typeof torrowId !== \"string\" ||\n torrowId.length <= OBJECT_ID_HEX_LENGTH ||\n !TORROW_ID_HEX_PATTERN.test(torrowId) ||\n !RID_HEX_PATTERN.test(torrowId.slice(-OBJECT_ID_HEX_LENGTH))\n ) {\n throw new TorrowIdError(\"invalid-id\", \"Invalid Torrow ID format\");\n }\n\n const unpacked = unpackTorrowId(torrowId);\n if (\n !Number.isSafeInteger(unpacked.shard) ||\n unpacked.shard < 0 ||\n !Number.isSafeInteger(unpacked.objectType) ||\n unpacked.objectType < 0 ||\n packTorrowId(unpacked).toLowerCase() !== torrowId.toLowerCase()\n ) {\n throw new TorrowIdError(\"invalid-id\", \"Non-canonical Torrow ID\");\n }\n\n return unpacked;\n}\n\n/** Возвращает известный SDK `TorrowObjectType`, закодированный в каноническом Torrow ID. */\nexport function getTorrowObjectTypeFromTorrowId(torrowId: string): TorrowObjectType {\n const { objectType } = unpackCanonicalTorrowId(torrowId);\n const result = CODE_TO_STRING_TYPE.get(objectType);\n if (result === undefined) {\n throw new TorrowIdError(\n \"unknown-object-type-code\",\n `Unknown Torrow object type code: ${objectType}`,\n objectType,\n );\n }\n return result;\n}\n\n/** Числовой код для {@link packTorrowId} по имени OpenAPI `TorrowObjectType`. */\nexport function torrowObjectTypeToCode(objectType: TorrowObjectType): TorrowObjectTypeCodeValue {\n const code = STRING_TYPE_TO_CODE[objectType];\n if (code === undefined) {\n throw new Error(`torrowObjectTypeToCode: unsupported object type \"${objectType}\"`);\n }\n return code;\n}\n\n/**\n * Генерация Torrow id на клиенте (как `TorrowIdGeneratorService` в torrow-apps).\n * Предпочтительнее методы фасадов: `client.notes.generateNoteId`, `generateFileId`, …\n */\nexport function generateTorrowId(\n objectTypeCode: TorrowObjectTypeCodeValue,\n shard: number,\n): string {\n return packTorrowId({\n shard,\n objectType: objectTypeCode,\n objectId: generateRid(),\n });\n}\n\n/**\n * Shard как у `ownerTorrowId` — обычно `profileId` / `userId` владельца до `create`.\n * Порядок аргументов: тип объекта, затем id владельца.\n */\nexport function generateTorrowIdForOwner(\n objectTypeCode: TorrowObjectTypeCodeValue,\n ownerTorrowId: string,\n): string {\n return generateTorrowId(objectTypeCode, getShardFromTorrowId(ownerTorrowId));\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { type PutUrlRespDto } from \"../../schema/openapi-dto-aliases.js\";\nimport { unwrapFilePutUrl } from \"./facade-response-unwrap.js\";\nimport type { ContactCaseParticipantsListQuery, ItemTagsListQuery } from \"./contact-case-participants-query.js\";\nimport type {\n FeedbackOptions,\n GroupStatus,\n IncludeExcludeResp,\n ExcludeResp,\n NotificationWay,\n ObjectInfo,\n PersonalReminder,\n PersonalSolutionData,\n PublicityType,\n SolutionData,\n UpdateItemAccountsReq,\n UpdateItemGroupsReq,\n UpdateMasterInfoReq,\n UpdatePersonalListOrderReq,\n UpdatePersonalListOrderResp,\n} from \"../contacts/types.js\";\nimport type {\n GenerateSecurityTokenReq,\n GenerateSecurityTokenResp,\n GetParticipationCountResp,\n GetShareItemSessionReq,\n LoyaltyGroupListQuery,\n ParticipantType,\n ParticipantView,\n Participation,\n ParticipationResp,\n SaveItemToMindMapReq,\n SendLinkOfItemReq,\n SendLinkOfItemResp,\n SetGroupItemReq,\n ShareItemReq,\n UnsetGroupItemReq,\n} from \"../loyalty-systems/types.js\";\nimport type { FileInfo, UpdateFileIdResp } from \"../notes/types.js\";\nimport type {\n ExcludeFromGroupsReq,\n IncludeToGroupsReq,\n BaseItemProperties,\n ItemProperties,\n} from \"../relations/types.js\";\nimport {\n generateTorrowIdForOwner,\n TorrowObjectTypeCode,\n type TorrowObjectTypeCodeValue,\n} from \"../../util/torrow-id.js\";\nimport type { TorrowItem, TorrowObject } from \"./torrow-entities.js\";\n\n/** Поведение «социального» слоя элемента: image puturl, опционально фото (только contacts). */\nexport type TorrowItemFacadeOptions = {\n /** Добавить `securityToken` в query `GET .../image/puturl` (contacts). */\n imagePutUrlSecurityToken?: boolean;\n /** `GET .../photo/info`, `GET .../photo/puturl` — только contacts. */\n withPhotoEndpoints?: boolean;\n /**\n * `GET .../group/list` есть не у всех доменов (например, есть у **loyaltysystems**, нет у **loyaltycards**).\n * Если `false`, {@link TorrowItemCoreFacade.listGroups} бросает ошибку. По умолчанию метод доступен.\n *\n * Важно: этот эндпоинт — список **групп родительского элемента, доступных для\n * включения дочерних элементов**, не членов группы.\n * Члены группы: `client.search.*(…, { groupIds })` (как в torrow-apps).\n */\n withGroupListEndpoint?: boolean;\n};\n\n/**\n * Общий HTTP-слой для item-доменов без эндпоинтов, отсутствующих у **loyaltysystems**\n * (например `GET .../participants/anonymous`, `GET .../tags`, `PUT .../updateaccounts`, block/unblock).\n * Полный набор — {@link TorrowItemFacade}.\n *\n * @typeParam TParticipantsQuery — query для `GET .../participants` (у **loyaltysystems** — `lmFrom`/`lmTo`, у contact/case — `lmfrom`/`lmto`).\n */\nexport abstract class TorrowItemCoreFacade<\n TItem,\n TParticipantsQuery = ContactCaseParticipantsListQuery,\n> {\n /** Числовой тип item этого фасада (`TorrowObjectTypeCode.Note`, …). */\n protected abstract readonly itemObjectTypeCode: TorrowObjectTypeCodeValue;\n\n protected constructor(\n protected readonly http: HttpClient,\n protected readonly basePath: string,\n protected readonly socialOpts: TorrowItemFacadeOptions = {},\n ) {}\n\n /**\n * Id вложения (presigned image/file) — тип **File**.\n * `ownerTorrowId`: profileId, userId или id item того же пользователя (shard).\n */\n generateFileId(ownerTorrowId: string): string {\n return generateTorrowIdForOwner(TorrowObjectTypeCode.File, ownerTorrowId);\n }\n\n /** Id item этого домена до `create` / upload (клиентская генерация, без запроса к API). */\n protected generateItemId(ownerTorrowId: string): string {\n return generateTorrowIdForOwner(this.itemObjectTypeCode, ownerTorrowId);\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/publicity` */\n updatePublicity(\n torrowId: string,\n body: PublicityType,\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/publicity`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/image/id` — тело: JSON-string **`fileId`**. */\n updateImageId(\n torrowId: string,\n fileId: string,\n options?: TorrowOptions,\n ): Promise<UpdateFileIdResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/image/id`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: fileId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/torrowaccount/id` — тело: JSON-string account id. */\n updateTorrowAccountId(\n torrowId: string,\n accountId: string,\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/torrowaccount/id`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: accountId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/masterinfo` */\n updateMasterInfo(\n torrowId: string,\n body: UpdateMasterInfoReq,\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/masterinfo`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/integrations` */\n updateIntegrations(\n torrowId: string,\n integrationIds: string[],\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/integrations`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: integrationIds,\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/{domain}/{torrowId}/participants` — список участников.\n * Фильтры: **`participantStateList`** (`Offered` / `Requested` / `Accepted` / …), **`participantTypeList`**.\n * Query-тип: {@link TorrowItemCoreFacade TParticipantsQuery}. Флоу: `docs/agents/participation-flow.md`.\n */\n listParticipants(\n torrowId: string,\n query?: TParticipantsQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ParticipantView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participants`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `POST /api/v1/{domain}/{torrowId}/generatesecuritytoken` — токен для внешней ссылки.\n * **`participantType: Reader`** — обычная ссылка; **`Owner`** — ссылка управления (apps: `ShareWithRightsService`).\n * Получатель сохраняет через {@link saveToMindMap} с `securityToken` в теле. Сам по себе Offered не создаёт.\n */\n generateSecurityToken(\n torrowId: string,\n body: GenerateSecurityTokenReq,\n options?: { signal?: AbortSignal },\n ): Promise<GenerateSecurityTokenResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/generatesecuritytoken`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/{participantProfileId}/type` */\n updateParticipationType(\n torrowId: string,\n participantProfileId: string,\n participantType: ParticipantType,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/${encodePathSegment(participantProfileId)}/type`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: participantType,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/requestaccess` — запрос доступа (не-владелец).\n * Body: **`profileId`**. Новый участник → **`Requested`**; некоторые существующие состояния → **`Accepted`**.\n * Проверять возвращённый participantState; после Accepted заново прочитать элемент и проверить полноту содержимого.\n * Владелец своего item вызвать не может. Дальше: {@link grantAccess} / {@link declineAccess} / {@link revokeAccessRequest}.\n */\n requestAccess(\n torrowId: string,\n profileId: string,\n options?: { userMessage?: string | null; signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/requestaccess`,\n query: { userMessage: options?.userMessage },\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/revokerequest` — requester отменяет свой запрос.\n * **`Requested`** → **`Revoked`**.\n */\n revokeAccessRequest(torrowId: string, options?: { signal?: AbortSignal }): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/revokerequest`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/group/set` */\n setGroup(\n torrowId: string,\n body: SetGroupItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/group/set`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/group/unset` */\n unsetGroup(\n torrowId: string,\n body: UnsetGroupItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/group/unset`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/tags` */\n updateTags(\n torrowId: string,\n tags: string[],\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/tags`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: tags,\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/{domain}/{parentId}/group/list` — список **групп родительского\n * элемента, доступных для включения дочерних элементов**\n * (torrow-apps: `getGroups(parentId)`).\n *\n * Контекст (иерархия + группы):\n * - `parentId` — родительский элемент, к которому крепятся дочерние.\n * - Ответ — каталог групп этого родителя, в которые UI/API предлагает включать\n * дочерние items (часть дочерних items сама может быть группами через `setGroup`).\n * - Часто в выборку входит и сам parent, если он группа; в apps при пустом\n * `group/list` UI fallback → `[parent]`.\n * - Членство child ↔ group в контексте родителя: {@link listItemGroups}\n * (`…/{itemId}/groups?parentId=`) и мутации `includeToGroups` / `updateGroups`\n * (там тоже передаётся `parentId`).\n *\n * **Не** список членов группы. Члены группы → `client.search.*(…, { groupIds })`.\n *\n * @param parentId родитель, чьи группы доступны для include дочерних\n */\n listGroups(\n parentId: string,\n query?: LoyaltyGroupListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem[]> {\n if (this.socialOpts.withGroupListEndpoint === false) {\n throw new Error(\n \"listGroups is not supported for this API domain (withGroupListEndpoint: false)\",\n );\n }\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/group/list`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{itemId}/updategroups` — включить/исключить **этот** item из групп\n * (в torrow-apps основной путь «включить в группу»: `updateItemGroups` с `parentId`).\n * Массовый вариант: {@link includeToGroups} / {@link excludeFromGroups}.\n */\n updateGroups(\n torrowId: string,\n body: UpdateItemGroupsReq[],\n options?: {\n parentId?: string | null;\n tags?: string[] | null;\n alias?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/updategroups`,\n query: {\n parentId: options?.parentId,\n tags: options?.tags,\n alias: options?.alias,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/include/togroups` — включить items в указанные группы.\n * Проверка членства после include — через search с `groupIds` (индекс асинхронный),\n * не через {@link listGroups}.\n */\n includeToGroups(body: IncludeToGroupsReq, options?: { signal?: AbortSignal }): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/include/togroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/exclude/fromgroups` */\n excludeFromGroups(body: ExcludeFromGroupsReq, options?: { signal?: AbortSignal }): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/exclude/fromgroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/include/items` */\n includeToParent(\n parentId: string,\n itemPropertiesList: readonly ItemProperties[],\n options?: TorrowOptions,\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/include/items`,\n body: {\n itemPropertiesList: [...itemPropertiesList],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/exclude/items` — removes the specified child items from the parent. */\n excludeFromParent(\n parentId: string,\n childIds: readonly string[],\n options?: TorrowOptions,\n ): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/exclude/items`,\n body: {\n itemIds: [...childIds],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/include/foruser` */\n includeForUser(\n parentId: string,\n itemPropertiesList: readonly BaseItemProperties[],\n options?: TorrowOptions,\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/include/foruser`,\n body: {\n itemPropertiesList: [...itemPropertiesList],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/exclude/fromuser` — removes the specified child items from the user's mind map. */\n excludeFromUser(\n parentId: string,\n childIds: readonly string[],\n options?: TorrowOptions,\n ): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/exclude/fromuser`,\n body: {\n itemIds: [...childIds],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/rejectoffer` — invitee отклоняет приглашение.\n * **`Offered`** → **`Rejected`**. Body: **`profileId`**. В UI часто только Hide announcement без этого вызова.\n */\n rejectOffer(\n torrowId: string,\n profileId: string,\n options?: { userMessage?: string | null; signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/rejectoffer`,\n query: { userMessage: options?.userMessage },\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/reject` — body: **`profileId`**. */\n reject(\n torrowId: string,\n profileId: string,\n options?: { signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/reject`,\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/share` — владелец приглашает профили.\n * Создаёт **`Offered`** (+ тип из body); invitee — announcement **`ShareItem`**.\n * Принять = {@link saveToMindMap} (отдельного `acceptOffer` нет). Отозвать = {@link revokeOffer}.\n * Флоу: `docs/agents/participation-flow.md`.\n */\n share(\n torrowId: string,\n body: ShareItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/share`,\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/revokeoffer` — владелец отзывает приглашение.\n * **`Offered`** → **`Revoked`**. Body: `profileIds[]`.\n */\n revokeOffer(\n torrowId: string,\n profileIds: string[],\n options?: { signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/revokeoffer`,\n body: profileIds,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/grantaccess` — владелец принимает запрос доступа.\n * **`Requested`** → **`Accepted`**. Body: `profileIds[]`. Не путать с {@link share}.\n */\n grantAccess(\n torrowId: string,\n profileIds: string[],\n options?: { signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/grantaccess`,\n body: profileIds,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/participation/declineaccess` — владелец отклоняет запрос доступа.\n * **`Requested`** → **`Declined`**. Body: `profileIds[]`; query **`userMessage`**.\n */\n declineAccess(\n torrowId: string,\n profileIds: string[],\n options?: { userMessage?: string | null; signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/declineaccess`,\n query: { userMessage: options?.userMessage },\n body: profileIds,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/personallist/updateorder` */\n updatePersonalListOrder(\n body: UpdatePersonalListOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<UpdatePersonalListOrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/personallist/updateorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/alias` */\n updateAlias(\n itemId: string,\n alias: string,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/alias`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: alias,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/lastusagetime` — тело ISO date-time string. */\n updateLastUsageTime(\n itemId: string,\n lastUsageTime: string,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/lastusagetime`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: lastUsageTime,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/participation/profile` */\n updateParticipationProfile(\n itemId: string,\n profileId: string,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/participation/profile`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{itemId}/sendlink` — in-app «вот ссылка» другому профилю.\n * Announcement **`SendLinkOfItem`**. **Не** создаёт `Offered` и не меняет participation (не путать с {@link share}).\n */\n sendLink(\n itemId: string,\n body: SendLinkOfItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<SendLinkOfItemResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/sendlink`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{torrowId}/shorturl` → короткая URL элемента (`string`), без смены participation. */\n getShortUrl(torrowId: string, options?: { signal?: AbortSignal }): Promise<string> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/shorturl`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/uniquename` */\n updateUniqueName(\n itemId: string,\n uniqueName: string,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/uniquename`,\n body: uniqueName,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/uniquename/{uniqueName}` */\n getByUniqueName(uniqueName: string, options?: { signal?: AbortSignal }): Promise<TItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/uniquename/${encodePathSegment(uniqueName)}`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/image/info` */\n getImageInfo(torrowId: string, options?: { signal?: AbortSignal }): Promise<FileInfo> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/image/info`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/image/puturl` */\n async getImagePutUrl(\n torrowId: string,\n fileId: string,\n fileName?: string | null,\n fileSize?: number | null,\n options?: {\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<{ url: string; urlExpiration: string }> {\n const query: Record<string, unknown> = {\n fileId,\n fileName,\n fileSize,\n };\n if (this.socialOpts.imagePutUrlSecurityToken) {\n query.securityToken = options?.securityToken;\n }\n const resp = await this.http.requestJson<PutUrlRespDto>({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/image/puturl`,\n query,\n signal: options?.signal,\n });\n return unwrapFilePutUrl(resp);\n }\n\n /**\n * `PUT /api/v1/{domain}/{torrowId}/savetomindmap` — сохранить в личный список / mind map.\n * Это же **accept** приглашения (`Offered` → `Accepted`); отдельного `acceptOffer` нет.\n * Также: open/link save без одобрения; save по **`securityToken`** (Reader / Owner link).\n * Флоу: `docs/agents/participation-flow.md`.\n * Placement User link (канон apps): `client.relations.saveToMindMap` + `offlinable` / `parentItemId` / `userProfileId` — см. `relations-flow.md` (этот item-метод — accept / open-link / `securityToken`).\n */\n saveToMindMap(\n torrowId: string,\n body: SaveItemToMindMapReq,\n options?: { signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/savetomindmap`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/solutiondata` */\n updateSolutionData(\n torrowId: string,\n body: SolutionData,\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/solutiondata`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/personalsolutiondata` */\n updatePersonalSolutionData(\n itemId: string,\n body: PersonalSolutionData,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/personalsolutiondata`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/photo/info` — только при {@link TorrowItemFacadeOptions.withPhotoEndpoints}. */\n getPhotoInfo(\n torrowId: string,\n options?: { photoId?: string | null; signal?: AbortSignal },\n ): Promise<FileInfo> {\n if (!this.socialOpts.withPhotoEndpoints) {\n throw new Error(\"getPhotoInfo is only supported when withPhotoEndpoints is true (contacts)\");\n }\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/photo/info`,\n query: { photoId: options?.photoId },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/photo/puturl` — только при {@link TorrowItemFacadeOptions.withPhotoEndpoints}. */\n async getPhotoPutUrl(\n torrowId: string,\n fileId: string,\n fileName?: string | null,\n fileSize?: number | null,\n options?: {\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<{ url: string; urlExpiration: string }> {\n if (!this.socialOpts.withPhotoEndpoints) {\n throw new Error(\"getPhotoPutUrl is only supported when withPhotoEndpoints is true (contacts)\");\n }\n const resp = await this.http.requestJson<PutUrlRespDto>({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/photo/puturl`,\n query: {\n fileId,\n fileName,\n fileSize,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n return unwrapFilePutUrl(resp);\n }\n}\n\n/**\n * Полный item-фасад для доменов с расширенным OpenAPI (contacts, cases, services, notes, …).\n * **LoyaltySystem** использует только {@link TorrowItemCoreFacade}.\n */\nexport abstract class TorrowItemFacade<TItem> extends TorrowItemCoreFacade<\n TItem,\n ContactCaseParticipantsListQuery\n> {\n protected constructor(\n http: HttpClient,\n basePath: string,\n socialOpts: TorrowItemFacadeOptions = {},\n ) {\n super(http, basePath, socialOpts);\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/feedbacks/options` */\n updateFeedbackOptions(\n torrowId: string,\n body: FeedbackOptions,\n options?: TorrowOptions,\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/feedbacks/options`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/participants/anonymous` */\n getParticipantsAnonymousCount(\n torrowId: string,\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participants/anonymous`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/participants/nonanonymous` */\n getParticipantsNonAnonymousCount(\n torrowId: string,\n query?: Pick<ContactCaseParticipantsListQuery, \"participantStateList\" | \"participantTypeList\">,\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participants/nonanonymous`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/tags` */\n listTags(\n torrowId: string,\n query?: ItemTagsListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<string[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/tags`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/{domain}/{itemId}/groups` — **`GroupStatus[]`**: в каких группах состоит\n * `itemId` **в контексте родителя** `parentId` (torrow-apps: `getItemGroups(itemId, parentId)`).\n *\n * Контекст (иерархия + группы):\n * - Child крепится к `parentId` (иерархия / mind map).\n * - В этом же parent-scope есть набор групп, доступных для включения дочерних —\n * см. {@link listGroups} (`…/{parentId}/group/list`), плюс сам parent, если он группа.\n * - Этот метод для child отвечает: «в какие из этих групп он включён»\n * (`GroupStatus.include` + `GroupStatus.group`).\n *\n * Не путать с {@link listGroups} (группы родителя для include дочерних) и с поиском\n * членов группы (`search.*(groupIds)`).\n *\n * @param itemId child, чьё членство смотрим\n * @param query.parentId родительский scope (обязателен по смыслу API, как в apps)\n */\n listItemGroups(\n itemId: string,\n query?: LoyaltyGroupListQuery & { parentId?: string | null },\n options?: { signal?: AbortSignal },\n ): Promise<GroupStatus[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/groups`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/updateaccounts` */\n updateAccounts(\n torrowId: string,\n body: UpdateItemAccountsReq[],\n options?: TorrowOptions,\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/updateaccounts`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * **WIP / do not use in product.** `POST .../{torrowId}/participation/shareitemlink` —\n * invite-session URL (`GetShareItemSessionReq` → `string`).\n * Gateway stub → `\"\"` (HTTP 200). Apps: InvitationLink menu on ContactItem copies that response.\n * Activate: `client.item.activateShareItemSession` (also stub; unused in apps UI).\n * Product alternative: `generateSecurityToken` + client URI. Do not compose URL from `getShortUrl`.\n * Не путать с `sendLink` / `share`.\n */\n shareItemLink(\n torrowId: string,\n body: GetShareItemSessionReq,\n options?: { signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/shareitemlink`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/offlinable` */\n updateOfflinable(\n itemId: string,\n offlinable: boolean,\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/offlinable`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: offlinable,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/reminders` */\n updateReminders(\n itemId: string,\n reminders: PersonalReminder[],\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/reminders`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: reminders,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/notificationwaylist` */\n updateNotificationWayList(\n itemId: string,\n ways: NotificationWay[],\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/notificationwaylist`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: ways,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{itemId}/block` */\n block(\n itemId: string,\n options?: {\n reasonId?: number | null;\n reasonNote?: string | null;\n language?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/block`,\n query: {\n reasonId: options?.reasonId,\n reasonNote: options?.reasonNote,\n language: options?.language,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{itemId}/unblock` */\n unblock(\n itemId: string,\n options?: TorrowOptions,\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/unblock`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n}\n","import type { ItemViewSortCondition, TimetableDetailsVisibility } from \"../services/types.js\";\n\n/**\n * Query-параметры `PUT .../{id}/timetable` (услуга, ресурс, календарь, контакт, карта лояльности).\n * Для **services** (и **loyaltycards** в OpenAPI) дополнительно поддерживаются `createDateFrom` / `createDateTo`.\n * Поля дат — **`Date`** (в URL уходят как ISO через **`buildQueryString`** в `src/util/query-string.ts`).\n */\nexport type TimetableQueryOptions = {\n /**\n * Глубина деталей ответа: `View` — CaseView/CaseSummary; `Time` — в основном интервалы занятости.\n * MCP: `TimetableQueryOptions.visibility` / enum `TimetableDetailsVisibility`.\n */\n visibility?: TimetableDetailsVisibility | null;\n take?: number | null;\n skip?: number | null;\n lmfrom?: Date | null;\n lmto?: Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemViewSortCondition | null;\n /** Только `GET/PUT` расписания **услуги** (NSwag `ServiceClient.getTimetable`). */\n createDateFrom?: Date | null;\n createDateTo?: Date | null;\n};\n\n/** Собирает query для `HttpClient`; `undefined`/`null` отбрасываются в {@link buildQueryString}. */\nexport function buildTimetableQuery(options: TimetableQueryOptions | undefined): Record<string, unknown> {\n const o = options ?? {};\n return {\n visibility: o.visibility,\n take: o.take,\n skip: o.skip,\n lmfrom: o.lmfrom,\n lmto: o.lmto,\n includeDeleted: o.includeDeleted,\n sort: o.sort,\n createDateFrom: o.createDateFrom,\n createDateTo: o.createDateTo,\n };\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount, unwrapTimetableStatisticsList } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n TimetableCase,\n TimetableFilter,\n TimetableStatisticsResp,\n} from \"../services/types.js\";\nimport type { CalendarItem, CalendarItemForCreateOrUpdate, DeleteResponse } from \"./types.js\";\n\nconst BASE = \"/api/v1/calendars\";\n\n/** CRUD + personal list + социальный слой для календарей (`CalendarItem`). `getById` использует `includeChildItems`. */\nexport class CalendarsFacade extends TorrowItemFacade<CalendarItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Calendar;\n\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** Id календаря до `create` / presigned upload. */\n generateCalendarId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/calendars` */\n create(\n body: CalendarItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CalendarItem> {\n const payload = applyItemCreateDefaults(body, Discriminator.CalendarItem);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{body.id}` */\n update(\n body: CalendarItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CalendarItem> {\n const itemId = requireItemUpdateId(body, \"Calendar\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/calendars/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/calendars/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildItems?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CalendarItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildItems: options?.includeChildItems,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/calendars/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<CalendarItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** Расписание кейсов календаря — `PUT /api/v1/calendars/{id}/timetable`. */\n getTimetable(\n calendarId: string,\n body: TimetableFilter,\n options?: Omit<TimetableQueryOptions, \"createDateFrom\" | \"createDateTo\"> & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /** `POST /api/v1/calendars/timetable/statistics` */\n async getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableStatisticsResp[]> {\n const resp = await this.http.requestJson<GetTimetableStatisticsResponse>({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n return unwrapTimetableStatisticsList(resp);\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/includecase` — тело: массив id кейсов. */\n includeCase(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/includecase`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/includecasetocustomcalendar` */\n includeCaseToCustomCalendar(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/includecasetocustomcalendar`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/excludecasefromcustomcalendar` */\n excludeCaseFromCustomCalendar(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/excludecasefromcustomcalendar`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/excludecase` */\n excludeCase(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/excludecase`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n}\n","import type { CaseItemDto, CreateCaseReqDto, AvailabilityTimeDto, CaseParticipantTypeDto, CaseParticipantDto, CaseParticipantViewDto, CaseParticipantFieldsDto, CaseParticipantStateDto, GetCaseParticipationCountRespDto, CheckInReqDto, CheckInPropsDto, BookResourcesForMeReqDto, BookResourcesForOthersReqDto, ChangeMoneyReceiveReqDto, CancelCaseParticipationReqDto, ApproveCaseParticipationReqDto, PatchCaseReqDto } from \"./dto.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type { DeleteResponse, ObjectInfo, ResourceView } from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nexport type { PersonalSolutionData, SolutionData };\n\n\n\n\nexport type CaseItem = TorrowItemFromDto<CaseItemDto>;\nexport type CreateCaseReq = CreateCaseReqDto;\nexport type AvailabilityTime = AvailabilityTimeDto;\nexport type CaseParticipantType = CaseParticipantTypeDto;\n/**\n * Участник кейса. В сгенерированных типах только **`loyaltyCardId`**.\n * Legacy `loyalityCardId` остаётся в `docs/torrow-swagger.json` (wire для старых клиентов),\n * но вырезается обёрткой codegen (`scripts/openapi-codegen.mjs` → `stripLegacyWireAliases`).\n * Сервер игнорирует опечатку при записи; в JSON ответов поле ещё может прийти — не использовать.\n * Проверка против живого API — отдельно (integration / ручные тесты).\n */\nexport type CaseParticipant = CaseParticipantDto;\nexport type CaseParticipantView = CaseParticipantViewDto;\nexport type CaseParticipantFields = CaseParticipantFieldsDto;\nexport type CaseParticipantState = CaseParticipantStateDto;\nexport type GetCaseParticipationCountResp = GetCaseParticipationCountRespDto;\nexport type CheckInReq = CheckInReqDto;\nexport type CheckInProps = CheckInPropsDto;\nexport type BookResourcesForMeReq = BookResourcesForMeReqDto;\nexport type BookResourcesForOthersReq = BookResourcesForOthersReqDto;\nexport type ChangeMoneyReceiveReq = ChangeMoneyReceiveReqDto;\nexport type ApproveCaseParticipationReq = ApproveCaseParticipationReqDto;\nexport type CancelCaseParticipationReq = CancelCaseParticipationReqDto;\nexport type PatchCaseReq = PatchCaseReqDto;\nexport type CaseState = CaseItem[\"caseState\"];\nexport type CaseType = CaseItem[\"caseType\"];\nexport const CaseStateValues = {\n Unknown: \"UnknownCaseState\",\n Verifying: \"Verifying\",\n Waiting: \"Waiting\",\n Processing: \"Processing\",\n Preparing: \"Preparing\",\n Completed: \"Completed\",\n Closed: \"Closed\",\n Rejected: \"Rejected\",\n Canceled: \"Canceled\",\n TimeControlled: \"TimeControlled\",\n TaskNotCompleted: \"TaskNotCompleted\",\n TaskCompleted: \"TaskCompleted\",\n} as const satisfies Record<string, NonNullable<CaseState>>;\nexport const CaseTypeValues = {\n Unknown: \"UnknownTimeType\",\n Time: \"Time\",\n RepeatedTime: \"RepeatedTime\",\n Today: \"Today\",\n Week: \"Week\",\n Later: \"Later\",\n Date: \"Date\",\n State: \"State\",\n} as const satisfies Record<string, NonNullable<CaseType>>;\nexport type CaseItemForCreateOrUpdate = TorrowItemForCreateOrUpdate<CaseItem>;\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { CancelCaseParticipationReq, CaseItem, CaseParticipant } from \"./types.js\";\n\n/*\n * Запросы гостя к своей записи — функциями поверх `HttpClient`, без `CasesFacade`\n * (причина — как у `service-requests.ts`: методы класса не выкидываются из бандла).\n * `securityToken` гостя — только в параметрах вызова, не Bearer. `CasesFacade` вызывает эти же функции.\n */\n\nconst BASE = \"/api/v1/cases\";\n\n/** Опции `GET /api/v1/cases/{torrowId}` — у `getCase` и `CasesFacade.getById`. */\nexport interface GetCaseOptions {\n profileId?: string | null;\n caseParticipantProfileId?: string | null;\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n /** Гостевой доступ: `OrderResp.consumerSecurityToken`. */\n securityToken?: string | null;\n /** Без него гость не получит свою часть: `personalInfo.caseParticipant`, `ticketResource`. */\n caseParticipantId?: string | null;\n signal?: AbortSignal;\n}\n\n/** `GET /api/v1/cases/{torrowId}` — событие-заказ; гостю — с `securityToken` и `caseParticipantId`. */\nexport function getCase(http: HttpClient, torrowId: string, options?: GetCaseOptions): Promise<CaseItem> {\n return http.requestJson<CaseItem>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n profileId: options?.profileId,\n caseParticipantProfileId: options?.caseParticipantProfileId,\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n caseParticipantId: options?.caseParticipantId,\n },\n signal: options?.signal,\n });\n}\n\n/**\n * Отмена участия — `PUT /api/v1/cases/{torrowId}/caseparticipation/cancelcaseparticipation`.\n * Гость отменяет свою запись с `{ consumerIdList: [caseParticipantId], securityToken }` — как\n * «Отменить запись» в приложении. Сроки отмены (`registrationClose`, тег услуги\n * `<минуты>:DisableCancelMyParticipation`) для гостя сервер сейчас не проверяет (отмена идёт от имени\n * организатора) — проверяй их в приложении, как `torrow-apps` `CaseItemHelper.canCancelMyCaseParticipation`.\n */\nexport function cancelCaseParticipation(\n http: HttpClient,\n torrowId: string,\n body: CancelCaseParticipationReq,\n options?: { signal?: AbortSignal },\n): Promise<CaseParticipant[]> {\n return http.requestJson<CaseParticipant[]>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/cancelcaseparticipation`,\n body,\n signal: options?.signal,\n });\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type {\n CaseParticipantsCountQuery,\n CaseParticipantsListQuery,\n} from \"../common/contact-case-participants-query.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport type { ExcludeFromGroupsReq, IncludeToGroupsReq } from \"../relations/types.js\";\nimport type { ExcludeResp, IncludeExcludeResp } from \"../contacts/types.js\";\nimport { CaseStateValues, CaseTypeValues } from \"./types.js\";\nimport { cancelCaseParticipation, getCase, type GetCaseOptions } from \"./case-requests.js\";\nimport type {\n ApproveCaseParticipationReq,\n AvailabilityTime,\n BookResourcesForMeReq,\n BookResourcesForOthersReq,\n CancelCaseParticipationReq,\n CaseItem,\n CaseItemForCreateOrUpdate,\n CaseParticipant,\n CaseParticipantFields,\n CaseParticipantType,\n CaseParticipantView,\n ChangeMoneyReceiveReq,\n CheckInReq,\n CreateCaseReq,\n DeleteResponse,\n GetCaseParticipationCountResp,\n PatchCaseReq,\n ResourceView,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/cases\";\n\n/**\n * События в продуктовой терминологии (REST **`/api/v1/cases`**, DTO **`CaseItem`**). **Заказ** — событие после записи на услугу (`createOrder`); событие без услуги — **`createWithOptions`** (`PUT` + `CreateCaseReq`) или **`createCaseItem`** (`POST` + `CaseItem`). Для оплаты заказа чаще **`getById`** + токены гостя.\n */\nexport class CasesFacade extends TorrowItemFacade<CaseItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Case;\n\n constructor(http: HttpClient) {\n super(http, BASE);\n }\n\n /** Id события до `createWithOptions` / `createCaseItem` / presigned upload. */\n generateCaseId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /**\n * Основной create события — `PUT /api/v1/cases` + **`CreateCaseReq`**\n * (`caseItem`, опционально `reminders`, `calendarId`, check-in / road time / participant type, …).\n * NSwag: `createCaseWithReminder`. Для «голого» `CaseItem` без оболочки — **`createCaseItem`**.\n */\n createWithOptions(\n body: CreateCaseReq,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n const payload: CreateCaseReq = {\n ...body,\n caseItem: body.caseItem\n ? this.withCreateDefaults(body.caseItem as CaseItemForCreateOrUpdate)\n : body.caseItem,\n };\n return this.http.requestJson({\n method: \"PUT\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /**\n * `POST /api/v1/cases` — create из тела **`CaseItem`** (query: calendar / check-in / road / participant).\n * NSwag: `createCase`. Предпочтительный путь с оболочкой — **`createWithOptions`** (`CreateCaseReq`).\n */\n createCaseItem(\n body: CaseItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n isNeedToCheckInMySelf?: boolean;\n availabilityTime?: AvailabilityTime | null;\n roadTime?: number | null;\n calendarId?: string | null;\n caseParticipantType?: CaseParticipantType | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n const payload = this.withCreateDefaults(body);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n isNeedToCheckInMySelf: options?.isNeedToCheckInMySelf,\n availabilityTime: options?.availabilityTime,\n roadTime: options?.roadTime,\n calendarId: options?.calendarId,\n caseParticipantType: options?.caseParticipantType,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{body.id}` */\n update(\n body: CaseItemForCreateOrUpdate,\n options?: {\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n const itemId = requireItemUpdateId(body, \"Case\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n profileId: options?.profileId,\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body,\n signal: options?.signal,\n });\n }\n\n private withCreateDefaults(body: CaseItemForCreateOrUpdate): CaseItemForCreateOrUpdate {\n const payload = applyItemCreateDefaults(body, Discriminator.CaseItem);\n return {\n ...payload,\n caseState: payload.caseState ?? CaseStateValues.Verifying,\n caseType: payload.caseType ?? CaseTypeValues.Time,\n // Сервер отклоняет create без VisitCard («Parameter VisitCard cannot have value null»).\n visitCard: payload.visitCard ?? {\n fields: [\n { number: 0, value: payload.name ?? \"\", expression: '{\"type\":\"Name\"}' },\n { number: 1, value: \"\", expression: null },\n { number: 2, value: \"\", expression: null },\n ],\n },\n };\n }\n\n /** `DELETE /api/v1/cases/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/cases/{torrowId}` */\n getById(torrowId: string, options?: GetCaseOptions): Promise<CaseItem> {\n return getCase(this.http, torrowId, options);\n }\n\n /** `GET /api/v1/cases/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<CaseItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `PUT /api/v1/cases/include/togroups` */\n includeToGroups(body: IncludeToGroupsReq, options?: { signal?: AbortSignal }): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/include/togroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/exclude/fromgroups` */\n excludeFromGroups(body: ExcludeFromGroupsReq, options?: { signal?: AbortSignal }): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/exclude/fromgroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/uniquename/{uniqueName}` — query **`profileId`** (в отличие от базового `GET .../uniquename/...`). */\n override getByUniqueName(\n uniqueName: string,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/uniquename/${encodePathSegment(uniqueName)}`,\n query: { profileId: options?.profileId },\n signal: options?.signal,\n });\n }\n\n\n /** `GET /api/v1/cases/{torrowId}/resources` */\n listResources(\n torrowId: string,\n query?: {\n resourceGroupId?: string | null;\n take?: number | null;\n skip?: number | null;\n includeDeleted?: boolean | null;\n },\n options?: { signal?: AbortSignal },\n ): Promise<ResourceView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/resources`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants` */\n listCaseParticipants(\n torrowId: string,\n query?: CaseParticipantsListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipantView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants/{caseParticipantId}` */\n getCaseParticipantById(\n torrowId: string,\n caseParticipantId: string,\n options?: { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<CaseParticipantView> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/${encodePathSegment(caseParticipantId)}`,\n query: { securityToken: options?.securityToken },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants/count` */\n getCaseParticipantsCount(\n torrowId: string,\n query?: CaseParticipantsCountQuery,\n options?: { signal?: AbortSignal },\n ): Promise<GetCaseParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/count`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants/nonanonymous` */\n getCaseParticipantsNonAnonymousCount(\n torrowId: string,\n query?: CaseParticipantsCountQuery,\n options?: { signal?: AbortSignal },\n ): Promise<GetCaseParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/nonanonymous`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/cases/{torrowId}/caseparticipants/{caseParticipantId}/fields` */\n patchCaseParticipantFields(\n torrowId: string,\n caseParticipantId: string,\n body: CaseParticipantFields,\n options?: {\n userMessage?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseParticipant> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/${encodePathSegment(caseParticipantId)}/fields`,\n query: {\n userMessage: options?.userMessage,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/cases/{torrowId}/caseparticipants/{caseParticipantId}/confirmparticipation` */\n confirmCaseParticipantParticipation(\n torrowId: string,\n caseParticipantId: string,\n options?: {\n userMessage?: string | null;\n profileId?: string | null;\n isNeedAnnouncement?: boolean | null;\n versionToCheck?: number | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseParticipant> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/${encodePathSegment(caseParticipantId)}/confirmparticipation`,\n query: {\n userMessage: options?.userMessage,\n profileId: options?.profileId,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n versionToCheck: options?.versionToCheck,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/checkin` */\n caseParticipationCheckIn(\n torrowId: string,\n body: CheckInReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/checkin`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/bookresourcesforme` */\n bookResourcesForMe(\n torrowId: string,\n body: BookResourcesForMeReq,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/bookresourcesforme`,\n query: { profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/bookresourcesforother` */\n bookResourcesForOthers(\n torrowId: string,\n body: BookResourcesForOthersReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/bookresourcesforother`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipants/approvemoneyreceive` */\n approveMoneyReceive(\n torrowId: string,\n body: ChangeMoneyReceiveReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/approvemoneyreceive`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipants/rejectmoneyreceive` */\n rejectMoneyReceive(\n torrowId: string,\n body: ChangeMoneyReceiveReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/rejectmoneyreceive`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/approvecaseparticipation` */\n approveCaseParticipation(\n torrowId: string,\n body: ApproveCaseParticipationReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/approvecaseparticipation`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/cancelcaseparticipation` */\n cancelCaseParticipation(\n torrowId: string,\n body: CancelCaseParticipationReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return cancelCaseParticipation(this.http, torrowId, body, options);\n }\n\n /** `POST /api/v1/cases/{torrowId}/reject` */\n rejectCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/reject`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/declinework` */\n declineWork(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/declinework`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/plan` */\n planCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/plan`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/takeinwork` */\n takeInWork(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/takeinwork`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/complete` */\n completeCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/complete`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/accept` */\n acceptCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/accept`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/returntoverification` */\n returnToVerification(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/returntoverification`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/cancel` */\n cancelCase(\n torrowId: string,\n options?: {\n profileId?: string | null;\n userMessage?: string | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/cancel`,\n query: {\n profileId: options?.profileId,\n userMessage: options?.userMessage,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/patch` */\n patchCase(torrowId: string, body: PatchCaseReq, options?: { signal?: AbortSignal }): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/patch`,\n body,\n signal: options?.signal,\n });\n }\n\n}\n","import type { ContactItemForCreateOrUpdate } from \"./types.js\";\n\n/** Как в torrow-apps при сохранении канала связи (`CommunicationFormMapper`, `add-contact-form`). */\nexport const CONTACT_COMMUNICATION_DEFAULT_CHECK_STATE = \"Unchecked\" as const;\n\n/**\n * Для каждого элемента `communications`: если `checkState` не передан — `Unchecked`.\n * `checkDate` не заполняем (read-only, выставляет сервер).\n */\nexport function normalizeContactCommunicationsForWrite(body: ContactItemForCreateOrUpdate): void {\n const items = body.communications;\n if (!Array.isArray(items)) {\n return;\n }\n for (const item of items) {\n if (item === null || item === undefined || typeof item !== \"object\") {\n continue;\n }\n if (item.checkState === undefined || item.checkState === null) {\n item.checkState = CONTACT_COMMUNICATION_DEFAULT_CHECK_STATE;\n }\n }\n}\n","import { generateRid, isValidRid, TORROW_OBJECT_ID_HEX_LENGTH } from \"../../util/torrow-id.js\";\nimport type { ContactItemForCreateOrUpdate } from \"./types.js\";\n\ntype RidCarrier = { rid?: string | null };\n\nconst CONTACT_STRUCTURED_ARRAY_KEYS = [\"addresses\", \"communications\", \"dates\"] as const;\n\nfunction isMissingRid(rid: unknown): boolean {\n if (rid === null || rid === undefined) {\n return true;\n }\n return typeof rid === \"string\" && rid.trim() === \"\";\n}\n\nfunction ensureRidsOnArray(items: RidCarrier[] | null | undefined, arrayKey: string): void {\n if (!Array.isArray(items)) {\n return;\n }\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item === null || item === undefined || typeof item !== \"object\") {\n continue;\n }\n const rid = item.rid;\n if (isMissingRid(rid)) {\n item.rid = generateRid();\n continue;\n }\n if (!isValidRid(rid)) {\n throw new Error(\n `Invalid rid for contact.${arrayKey}[${i}]: expected ${TORROW_OBJECT_ID_HEX_LENGTH} hexadecimal characters`,\n );\n }\n }\n}\n\n/**\n * Для `addresses`, `communications`, `dates`: если `rid` не передан — генерируется;\n * если передан — проверяется формат (24 hex), иначе исключение.\n */\nexport function normalizeContactStructuredArrayRidsForWrite(body: ContactItemForCreateOrUpdate): void {\n for (const key of CONTACT_STRUCTURED_ARRAY_KEYS) {\n ensureRidsOnArray(body[key] as RidCarrier[] | null | undefined, key);\n }\n}\n","import type { ContactItemForCreateOrUpdate } from \"./types.js\";\n\n/** Бэкенд / схема tnContact ожидают ровно три слота визитки (number 0…2). */\nexport const CONTACT_VISIT_CARD_SLOT_COUNT = 3;\n\n/** Выражение слота 0 по умолчанию (как в продуктовом JSON визитки). */\nexport const CONTACT_VISIT_CARD_DEFAULT_SLOT_0_EXPRESSION = JSON.stringify({ type: \"LastNameFirstName\" });\n\nfunction trimNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\n/** Значение слота 0 по умолчанию: `name`; иначе полное ФИО; иначе `company` (организация). */\nexport function contactVisitCardDefaultSlot0Value(body: ContactItemForCreateOrUpdate): string {\n const name = trimNonEmptyString(body.name);\n if (name !== undefined) {\n return name;\n }\n\n const lastName = trimNonEmptyString(body.lastName);\n const firstName = trimNonEmptyString(body.firstName);\n const middleName = trimNonEmptyString(body.middleName);\n if (lastName !== undefined && firstName !== undefined && middleName !== undefined) {\n return `${lastName} ${firstName} ${middleName}`;\n }\n\n return trimNonEmptyString(body.company) ?? \"\";\n}\n\n/**\n * Приводит `visitCard.fields` к ровно трём элементам с `number` 0…2: недостающие\n * слоты заполняются `{ number, value: \"\" }`; для каждого номера сохраняется\n * последняя переданная запись (остальные с тем же `number` отбрасываются).\n * Записи с нецелым `number` вне 0…2 игнорируются.\n *\n * Если `visitCard` нет / не объект, либо `fields` отсутствует, не массив или пустой —\n * перед нормализацией подставляется один слот 0: `expression` как у\n * {@link CONTACT_VISIT_CARD_DEFAULT_SLOT_0_EXPRESSION}, `value` — {@link contactVisitCardDefaultSlot0Value}.\n */\nexport function normalizeContactVisitCardFieldsForWrite(body: ContactItemForCreateOrUpdate): void {\n let visitCard = body.visitCard;\n if (visitCard === undefined || visitCard === null || typeof visitCard !== \"object\" || Array.isArray(visitCard)) {\n visitCard = {};\n }\n\n // Что пришло в fields (или пусто — тогда один дефолтный слот 0 из name).\n let incoming = Array.isArray(visitCard.fields) ? visitCard.fields : [];\n if (incoming.length === 0) {\n incoming = [\n {\n expression: CONTACT_VISIT_CARD_DEFAULT_SLOT_0_EXPRESSION,\n number: 0,\n value: contactVisitCardDefaultSlot0Value(body),\n },\n ];\n }\n\n // Для каждого номера 0…2 оставляем последнюю запись из incoming.\n const picked: Array<(typeof incoming)[number] | undefined> = [];\n for (let i = 0; i < CONTACT_VISIT_CARD_SLOT_COUNT; i++) {\n picked.push(undefined);\n }\n for (const field of incoming) {\n if (field === undefined || field === null || typeof field !== \"object\") continue;\n const n = field.number;\n if (typeof n !== \"number\" || !Number.isInteger(n) || n < 0 || n >= CONTACT_VISIT_CARD_SLOT_COUNT) continue;\n picked[n] = { ...field, number: n };\n }\n\n // Ровно три элемента для API.\n const fields = [];\n for (let i = 0; i < CONTACT_VISIT_CARD_SLOT_COUNT; i++) {\n fields.push(picked[i] ?? { number: i, value: \"\" });\n }\n body.visitCard = { ...visitCard, fields };\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n unwrapDeleteCount,\n unwrapSendCommunicationSessionId,\n unwrapTimetableStatisticsList,\n unwrapTorrowObjectFromContactPropertiesUpdate,\n} from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport type { TorrowItemFacadeOptions } from \"../common/item-social-facet-base.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n TimetableCase,\n TimetableFilter,\n TimetableStatisticsResp,\n} from \"../services/types.js\";\nimport type {\n ActivityStatus,\n ContactItem,\n ContactItemForCreateOrUpdate,\n ContactProperties,\n DeleteResponse,\n SendCommunicationCodeReq,\n SendCommunicationCodeResp,\n UpdateContactPropertiesResp,\n VerifyCommunicationCodeReq,\n VerifyCommunicationCodeResp,\n} from \"./types.js\";\nimport type { TorrowObject } from \"../common/torrow-entities.js\";\nimport { normalizeContactCommunicationsForWrite } from \"./contact-communications-write-defaults.js\";\nimport { normalizeContactStructuredArrayRidsForWrite } from \"./contact-structured-array-rids.js\";\nimport { normalizeContactVisitCardFieldsForWrite } from \"./contact-visit-card-fields.js\";\n\ntype ContactItemWithDiscriminator = ContactItemForCreateOrUpdate & {\n discriminator?: string;\n};\n\nconst BASE = \"/api/v1/contacts\";\n\nconst CONTACT_SOCIAL_OPTS: TorrowItemFacadeOptions = {\n imagePutUrlSecurityToken: true,\n withPhotoEndpoints: true,\n};\n\n/**\n * CRUD and personal list for contact items (`ContactItem`).\n */\nexport class ContactsFacade extends TorrowItemFacade<ContactItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Contact;\n\n constructor(http: HttpClient) {\n super(http, BASE, CONTACT_SOCIAL_OPTS);\n }\n\n /** Id контакта до `create` / presigned upload. */\n generateContactId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/contacts` */\n create(\n body: ContactItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContactItem> {\n const payload = this.withCreateDefaults(body);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n private withCreateDefaults(body: ContactItemForCreateOrUpdate): ContactItem {\n const payload = applyItemCreateDefaults<ContactItem>(body as ContactItemWithDiscriminator, Discriminator.ContactItem);\n normalizeContactStructuredArrayRidsForWrite(payload);\n normalizeContactCommunicationsForWrite(payload);\n normalizeContactVisitCardFieldsForWrite(payload);\n return payload;\n }\n\n /** `PUT /api/v1/contacts/{body.id}` */\n update(\n body: ContactItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContactItem> {\n const itemId = requireItemUpdateId(body, \"Contact\");\n const payload: ContactItemForCreateOrUpdate = { ...body };\n normalizeContactStructuredArrayRidsForWrite(payload);\n normalizeContactCommunicationsForWrite(payload);\n normalizeContactVisitCardFieldsForWrite(payload);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/contacts/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContactItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `DELETE /api/v1/contacts/{torrowId}`\n * @param options.cascade / withPinnedItems — required by API (see Swagger).\n */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/contacts/personallist` */\n listPersonal(\n options?: PersonalListQuery & { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<ContactItem[]> {\n const { signal, securityToken, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest, securityToken },\n signal,\n });\n }\n\n /** Расписание по контакту (профиль/исполнитель) — `PUT /api/v1/contacts/{id}/timetable`. */\n getTimetable(\n contactId: string,\n body: TimetableFilter,\n options?: Omit<TimetableQueryOptions, \"createDateFrom\" | \"createDateTo\"> & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(contactId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /** `POST /api/v1/contacts/timetable/statistics` */\n async getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableStatisticsResp[]> {\n const resp = await this.http.requestJson<GetTimetableStatisticsResponse>({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n return unwrapTimetableStatisticsList(resp);\n }\n\n /** `POST /api/v1/contacts/communication/sendcode` */\n async sendCommunicationCode(body: SendCommunicationCodeReq, options?: { signal?: AbortSignal }): Promise<string> {\n const resp = await this.http.requestJson<SendCommunicationCodeResp>({\n method: \"POST\",\n path: `${BASE}/communication/sendcode`,\n body,\n signal: options?.signal,\n });\n return unwrapSendCommunicationSessionId(resp);\n }\n\n /** `POST /api/v1/contacts/communication/verify` */\n verifyCommunicationCode(\n body: VerifyCommunicationCodeReq,\n options?: { signal?: AbortSignal },\n ): Promise<VerifyCommunicationCodeResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/communication/verify`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/contacts/{torrowId}/invite` — тело JSON-string (идентификатор приглашения / профиля по контракту API). */\n invite(\n torrowId: string,\n body: string,\n options?: { communicationId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/invite`,\n query: { communicationId: options?.communicationId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/contacts/activitystatuslist` */\n listActivityStatuses(\n itemIds: string[],\n options?: { signal?: AbortSignal },\n ): Promise<ActivityStatus[]> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/activitystatuslist`,\n body: itemIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/contacts/{contactId}/contactproperties` */\n async updateContactProperties(\n contactId: string,\n body: ContactProperties,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject | undefined> {\n const resp = await this.http.requestJson<UpdateContactPropertiesResp>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(contactId)}/contactproperties`,\n body,\n signal: options?.signal,\n });\n return unwrapTorrowObjectFromContactPropertiesUpdate(resp) as TorrowObject | undefined;\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport type { ContextItem, ContextItemForCreateOrUpdate, DeleteResponse } from \"./types.js\";\n\nconst BASE = \"/api/v1/contexts\";\n\n/** CRUD + personal list + социальный слой для контекстов (`ContextItem`). `POST` принимает только опциональный `profileId`. */\nexport class ContextsFacade extends TorrowItemFacade<ContextItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Context;\n\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** Id контекста до `create` / presigned upload. */\n generateContextId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/contexts` */\n create(\n body: ContextItemForCreateOrUpdate,\n options?: {\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContextItem> {\n const payload = applyItemCreateDefaults(body, Discriminator.ContextItem);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { profileId: options?.profileId },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/contexts/{body.id}` */\n update(\n body: ContextItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<ContextItem> {\n const itemId = requireItemUpdateId(body, \"Context\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/contexts/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/contexts/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContextItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/contexts/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<ContextItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n}\n","import type { NoteItemDto, NoteTypeDto } from \"./dto.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type {\n DeleteResponse,\n FileInfo,\n ObjectInfo,\n PutUrlResp,\n UpdateFileIdResp,\n} from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nexport type { PersonalSolutionData, SolutionData };\n\nexport type NoteItem = TorrowItemFromDto<NoteItemDto>;\n/** Supported authoring scenarios: Html and Markdown. Other server values remain for compatibility. */\nexport type NoteType = NoteTypeDto;\nexport type ImagePreviewSize = NonNullable<NoteItem[\"imagePreviewSize\"]>;\nexport const NoteTypeValues = {\n Unknown: \"Unknown\",\n Text: \"Text\",\n Html: \"Html\",\n Markdown: \"Markdown\",\n Hlink: \"Hlink\",\n File: \"File\",\n Photo: \"Photo\",\n Voice: \"Voice\",\n Geolocation: \"Geolocation\",\n Qr: \"Qr\",\n ServiceSpecification: \"ServiceSpecification\",\n} as const satisfies Record<string, NoteType>;\n\nexport const ImagePreviewSizeValues = {\n Undefined: \"Undefined\",\n Hidden: \"Hidden\",\n Small: \"Small\",\n Medium: \"Medium\",\n Large: \"Large\",\n SmallSlider: \"SmallSlider\",\n MediumSlider: \"MediumSlider\",\n LargeSlider: \"LargeSlider\",\n} as const satisfies Record<string, ImagePreviewSize>;\n\n/** Explicit publicity on create; meta.version on update preserves optimistic concurrency. */\nexport type NoteItemForCreateOrUpdate = TorrowItemForCreateOrUpdate<NoteItem> &\n Pick<NoteItem, \"publicityType\" | \"meta\">;\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { unwrapDeleteCount, unwrapFilePutUrl } from \"../common/facade-response-unwrap.js\";\nimport {\n ImagePreviewSizeValues,\n type DeleteResponse,\n type FileInfo,\n type NoteItem,\n type NoteItemForCreateOrUpdate,\n} from \"./types.js\";\nimport type { PutUrlRespDto } from \"./dto.js\";\n\nconst BASE = \"/api/v1/notes\";\nconst DEFAULT_NOTE_NAME = \"Untitled note\";\n\ntype NoteItemWithDiscriminator = NoteItemForCreateOrUpdate & {\n discriminator?: string;\n};\n\n/** CRUD, personal list, файлы, изображения и социальный слой для заметок (`NoteItem`). */\nexport class NotesFacade extends TorrowItemFacade<NoteItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Note;\n\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** Id заметки до `create` / presigned upload (`ownerTorrowId` — profileId и т.п.). */\n generateNoteId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/notes` */\n create(\n body: NoteItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<NoteItem> {\n const payload = this.withCreateDefaults(body);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/notes/{body.id}` */\n update(\n body: NoteItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<NoteItem> {\n const itemId = requireItemUpdateId(body, \"Note\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `DELETE /api/v1/notes/{torrowId}`\n * @param options.cascade — каскад по вложенным дочерним элементам; `false` — только заметка.\n * @param options.withPinnedItems — удалять закреплённые дочерние представления; `false` — не трогать pinned.\n */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/notes/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<NoteItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/notes/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<NoteItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `GET /api/v1/notes/{torrowId}/file/info` */\n getFileInfo(\n torrowId: string,\n fileId: string,\n options?: { signal?: AbortSignal },\n ): Promise<FileInfo> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/file/info`,\n query: { fileId },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/notes/{torrowId}/file/puturl` — URL для загрузки файла (presigned). */\n async getFilePutUrl(\n torrowId: string,\n fileId: string,\n fileName?: string | null,\n fileSize?: number | null,\n options?: { signal?: AbortSignal },\n ): Promise<{ url: string; urlExpiration: string }> {\n const resp = await this.http.requestJson<PutUrlRespDto>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/file/puturl`,\n query: {\n fileId,\n fileName,\n fileSize,\n },\n signal: options?.signal,\n });\n return unwrapFilePutUrl(resp);\n }\n\n private withCreateDefaults(body: NoteItemForCreateOrUpdate): NoteItem {\n const payload = applyItemCreateDefaults<NoteItem>(body as NoteItemWithDiscriminator, Discriminator.NoteItem);\n\n if (!payload.name?.trim()) {\n payload.name = this.getDefaultName(payload.data);\n }\n\n payload.imagePreviewSize = payload.imagePreviewSize ?? ImagePreviewSizeValues.Small;\n\n return payload;\n }\n\n private getDefaultName(data: unknown): string {\n if (typeof data !== \"string\") {\n return DEFAULT_NOTE_NAME;\n }\n const normalized = data.trim();\n if (!normalized) {\n return DEFAULT_NOTE_NAME;\n }\n return normalized.slice(0, 20);\n }\n\n}\n","import type { TorrowObjectType } from \"../../schema/sdk-shared-public-types.js\";\nimport {\n TorrowObjectTypeCode,\n type TorrowObjectTypeCodeValue,\n} from \"../../util/torrow-id.js\";\n\ntype TorrowItemDefinition = Readonly<{\n domain: string;\n objectTypeCode: TorrowObjectTypeCodeValue;\n}>;\n\n/**\n * Ручная runtime-проекция OpenAPI object types на item REST-домены.\n * После codegen новые item-типы и числовые коды нужно сверять отдельно.\n * Экспорт предназначен только для внутренних модулей SDK.\n */\nexport const TorrowItemDefinitions = {\n Contact: { domain: \"contacts\", objectTypeCode: TorrowObjectTypeCode.Contact },\n Note: { domain: \"notes\", objectTypeCode: TorrowObjectTypeCode.Note },\n Context: { domain: \"contexts\", objectTypeCode: TorrowObjectTypeCode.Context },\n Resource: { domain: \"resources\", objectTypeCode: TorrowObjectTypeCode.Resource },\n Service: { domain: \"services\", objectTypeCode: TorrowObjectTypeCode.Service },\n Case: { domain: \"cases\", objectTypeCode: TorrowObjectTypeCode.Case },\n Calendar: { domain: \"calendars\", objectTypeCode: TorrowObjectTypeCode.Calendar },\n LoyaltyCard: {\n domain: \"loyaltycards\",\n objectTypeCode: TorrowObjectTypeCode.LoyaltyCard,\n },\n LoyaltySystem: {\n domain: \"loyaltysystems\",\n objectTypeCode: TorrowObjectTypeCode.LoyaltySystem,\n },\n} as const satisfies Partial<Record<TorrowObjectType, TorrowItemDefinition>>;\n\nexport type TorrowItemType = keyof typeof TorrowItemDefinitions;\n\n/** Внутренний REST-сегмент item API; не экспортируется из package entrypoint. */\nexport type TorrowItemDomain =\n (typeof TorrowItemDefinitions)[TorrowItemType][\"domain\"];\n\nexport const TorrowItemTypeValues = {\n Contact: \"Contact\",\n Note: \"Note\",\n Context: \"Context\",\n Resource: \"Resource\",\n Service: \"Service\",\n Case: \"Case\",\n Calendar: \"Calendar\",\n LoyaltyCard: \"LoyaltyCard\",\n LoyaltySystem: \"LoyaltySystem\",\n} as const satisfies Record<TorrowItemType, TorrowItemType>;\n\nexport const TorrowItemTypeValueList: readonly TorrowItemType[] = Object.values(\n TorrowItemTypeValues,\n);\n\nexport function isTorrowItemType(value: string): value is TorrowItemType {\n return (TorrowItemTypeValueList as readonly string[]).includes(value);\n}\n\n/** Внутреннее преобразование предметного item-типа в REST-сегмент. */\nexport function getTorrowItemDomain(itemType: TorrowItemType): TorrowItemDomain {\n return TorrowItemDefinitions[itemType].domain;\n}\n","import {\n getTorrowObjectTypeFromTorrowId,\n TorrowIdError,\n} from \"../../util/torrow-id.js\";\nimport {\n getTorrowItemDomain,\n isTorrowItemType,\n type TorrowItemDomain,\n type TorrowItemType,\n} from \"./item-type.js\";\n\nexport function getTorrowItemTypeFromTorrowId(torrowId: string): TorrowItemType {\n const objectType = getTorrowObjectTypeFromTorrowId(torrowId);\n if (!isTorrowItemType(objectType)) {\n throw new TorrowIdError(\n \"unsupported-item-type\",\n `Torrow object type ${objectType} is not an item type`,\n );\n }\n return objectType;\n}\n\nexport function getTorrowItemTypeFromTorrowIds(\n torrowIds: readonly string[],\n): TorrowItemType {\n const firstId = torrowIds[0];\n if (firstId === undefined) {\n throw new TorrowIdError(\"empty-id-list\", \"Torrow ID list must not be empty\");\n }\n\n const itemType = getTorrowItemTypeFromTorrowId(firstId);\n for (const torrowId of torrowIds.slice(1)) {\n if (getTorrowItemTypeFromTorrowId(torrowId) !== itemType) {\n throw new TorrowIdError(\n \"mixed-item-types\",\n \"All Torrow IDs must have the same item type\",\n );\n }\n }\n return itemType;\n}\n\nexport function getTorrowItemDomainFromTorrowId(torrowId: string): TorrowItemDomain {\n return getTorrowItemDomain(getTorrowItemTypeFromTorrowId(torrowId));\n}\n\nexport function getTorrowItemDomainFromTorrowIds(\n torrowIds: readonly string[],\n): TorrowItemDomain {\n return getTorrowItemDomain(getTorrowItemTypeFromTorrowIds(torrowIds));\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport {\n getTorrowItemDomainFromTorrowId,\n getTorrowItemDomainFromTorrowIds,\n} from \"../common/item-type-resolver.js\";\nimport type { TorrowItemDomain } from \"../common/item-type.js\";\nimport type {\n ExcludeFromGroupsReq,\n ExcludeResp,\n IncludeExcludeResp,\n IncludeToGroupsReq,\n Participation,\n SaveItemToMindMapReq,\n TorrowOptions,\n BaseItemProperties,\n ItemProperties,\n} from \"./types.js\";\n\n/**\n * Связи между элементами: User/Pinned links, группы, mind map placement.\n *\n * - **Pinned link:** {@link includeToParent} / {@link excludeFromParent} (`LinkType.Pinned`).\n * - **User link (канон apps):** {@link saveToMindMap} сохраняет один item в личную структуру (`offlinable`, опциональный `parentItemId`, `userProfileId`); {@link includeForUser} добавляет batch дочерних item'ов под указанным родителем.\n * - **Groups:** {@link includeToGroups} / {@link excludeFromGroups}; `setGroup` / `updateGroups` — на item-фасадах (`notes.setGroup`, …).\n * - **Pin/Unpin (User↔Pinned):** не здесь — `client.views.pin` / `unpin` (HTTP `/views/…`; contacts unpin quirk). См. `docs/agents/relations-flow.md`.\n * - **View delete** (`DELETE …/views/user|pinned/…`) — apps UI path; здесь — `exclude*`.\n * REST-домен не передаётся отдельно: SDK выводит его из route-defining ID каждого метода.\n * - JSDoc `exclude*`: HTTP-путь + однострочный указатель на LinkType / `relations-flow.md`; детали — в bullets выше.\n */\nexport class RelationsFacade {\n constructor(private readonly http: HttpClient) {}\n\n private base(domain: TorrowItemDomain): string {\n return `/api/v1/${domain}`;\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/include/items` — **Pinned link**: привязать дочерние к родителю (`LinkType.Pinned`). Передай массив `itemPropertiesList`; технические параметры — в options. */\n includeToParent(\n parentId: string,\n itemPropertiesList: readonly ItemProperties[],\n options?: TorrowOptions,\n ): Promise<IncludeExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowId(parentId);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/include/items`,\n body: {\n itemPropertiesList: [...itemPropertiesList],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{parentId}/include/foruser` — массово добавить несколько дочерних item'ов\n * в личную структуру пользователя под указанным родителем (`LinkType.User`).\n * Это batch-операция: `parentId` задаётся в path, а дочерние item'ы передаются\n * первым аргументом как `itemPropertiesList` (`itemId`, опционально `order`).\n * Канон torrow-apps для сохранения одного item — {@link saveToMindMap}, не этот метод.\n */\n includeForUser(\n parentId: string,\n itemPropertiesList: readonly BaseItemProperties[],\n options?: TorrowOptions,\n ): Promise<IncludeExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowId(parentId);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/include/foruser`,\n body: {\n itemPropertiesList: [...itemPropertiesList],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{parentId}/exclude/items` — убрать дочерние элементы из родителя.\n * `childIds` — явный список дочерних item ID; снимается **Pinned** link\n * (`LinkType.Pinned`). См. class bullets и `docs/agents/relations-flow.md`.\n */\n excludeFromParent(\n parentId: string,\n childIds: readonly string[],\n options?: TorrowOptions,\n ): Promise<ExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowId(parentId);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/exclude/items`,\n body: {\n itemIds: [...childIds],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{parentId}/exclude/fromuser` — убрать дочерние элементы\n * из персонального mind map пользователя. `childIds` — явный список дочерних\n * item ID; снимается **User** link (`LinkType.User`). См. class bullets и\n * `docs/agents/relations-flow.md`.\n */\n excludeFromUser(\n parentId: string,\n childIds: readonly string[],\n options?: TorrowOptions,\n ): Promise<ExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowId(parentId);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/exclude/fromuser`,\n body: {\n itemIds: [...childIds],\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/include/togroups` — включить элементы в несколько групп. */\n includeToGroups(\n body: IncludeToGroupsReq,\n options?: { signal?: AbortSignal },\n ): Promise<IncludeExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowIds(body.groupIds);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/include/togroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/exclude/fromgroups` — исключить элементы из групп. */\n excludeFromGroups(\n body: ExcludeFromGroupsReq,\n options?: { signal?: AbortSignal },\n ): Promise<ExcludeResp> {\n const domain = getTorrowItemDomainFromTorrowIds(body.itemIds);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/exclude/fromgroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/{domain}/{itemId}/savetomindmap` — сохранить **один item** в личную\n * структуру пользователя (`LinkType.User`), опционально вложив его в `body.parentItemId`.\n * `itemId` задаётся в path; это не batch-операция. Канон apps: `userProfileId`, `offlinable: true`.\n * Не путать с participation accept на item-фасаде — см. `docs/agents/relations-flow.md` vs `participation-flow.md`.\n */\n saveToMindMap(\n itemId: string,\n body: SaveItemToMindMapReq,\n options?: { signal?: AbortSignal },\n ): Promise<Participation> {\n const domain = getTorrowItemDomainFromTorrowId(itemId);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(itemId)}/savetomindmap`,\n body,\n signal: options?.signal,\n });\n }\n}\n","import {\n BehaviorSettingsEffectStep, TorrowSdkEffectArea,\n type TorrowSdkEffectState, TorrowSdkError, TorrowSdkErrorCategory, TorrowSdkErrorDomain,\n TorrowSdkRequestState,\n} from \"../../http/TorrowSdkError.js\";\n\n/** Стабильные имена только операций предметных настроек. */\nexport enum BehaviorSettingsOperation {\n /** Чтение настроек услуги. */ ServiceGet = \"ServicesFacade.getBehaviorSettings\",\n /** Частичное изменение услуги. */ ServiceUpdate = \"ServicesFacade.updateBehaviorSettings\",\n /** Замена настроек услуги. */ ServiceSet = \"ServicesFacade.setBehaviorSettings\",\n /** Частичное изменение ресурса. */ ResourceUpdate = \"ResourcesFacade.updateBehaviorSettings\",\n /** Замена настроек ресурса. */ ResourceSet = \"ResourcesFacade.setBehaviorSettings\",\n}\n/** Локальная стадия выбранного алгоритма, без аргументов вызова. */\nexport enum BehaviorSettingsFailureAt {\n /** Проверка входа. */ ValidateInput = \"ValidateInput\",\n /** Чтение исходного состояния. */ ReadCurrent = \"ReadCurrent\",\n /** Проверка версии, прав и подготовка изменения. */ PrepareWrite = \"PrepareWrite\",\n /** Отправка записи. */ WriteSettings = \"WriteSettings\",\n /** Проверка подтверждения услуги. */ ValidateWriteResponse = \"ValidateWriteResponse\",\n /** Существующее повторное чтение ресурса. */ ReadBack = \"ReadBack\",\n}\n\n/** Исследованные wire-значения отказа CAS у /tags. */\nenum BehaviorSettingsServerErrorName { VersionConflict = \"OBJECT_HAS_WRONG_VERSION\" }\n/** Корневой код отказа до записи. */\nenum BehaviorSettingsServerErrorCode { VersionConflict = 208213 }\n\n/** Создаёт предметный отказ, не раскрывая данные сущности. */\nexport function behaviorSettingsError(category: TorrowSdkErrorCategory): TorrowSdkError {\n return new TorrowSdkError({ category, detail: { domain: TorrowSdkErrorDomain.BehaviorSettings } });\n}\n\n/** Дополняет только текущую операцию; побочные эффекты авторизации здесь не описываются. */\nexport function contextualizeBehaviorError(\n cause: unknown, operation: BehaviorSettingsOperation, failureAt: BehaviorSettingsFailureAt,\n state?: TorrowSdkEffectState,\n): TorrowSdkError {\n const error = cause instanceof TorrowSdkError ? cause : new TorrowSdkError({\n category: TorrowSdkErrorCategory.Unknown, sensitive: { cause },\n });\n return error.withContext({ operation, failureAt,\n detail: error.detail ?? { domain: TorrowSdkErrorDomain.BehaviorSettings },\n effects: state === undefined ? undefined : [{ area: TorrowSdkEffectArea.Remote, step: BehaviorSettingsEffectStep.Write, state }],\n });\n}\n\n/** Только исследованный корневой ответ /tags доказывает отказ CAS до изменения. */\nexport function isBehaviorCasRefusal(cause: unknown): cause is TorrowSdkError {\n if (!(cause instanceof TorrowSdkError) || cause.request !== TorrowSdkRequestState.Started || cause.http?.status !== 500) return false;\n const body = cause.getSensitiveDetails().body;\n return body !== null && typeof body === \"object\" && \"name\" in body && body.name === BehaviorSettingsServerErrorName.VersionConflict &&\n \"code\" in body && (body.code === BehaviorSettingsServerErrorCode.VersionConflict || body.code === String(BehaviorSettingsServerErrorCode.VersionConflict));\n}\n","/**\n * Неявные параметры, кодируемые в `tags` элементов (в основном ServiceItem).\n *\n * Источник логики: поведение в клиентских потоках `torrow-apps` (time zone, order name,\n * ограничения по времени, тексты unavailable booking, автозапуск уведомлений, discount field tag).\n */\n\nexport const SERVICE_IMPLICIT_TAG_SUFFIX = {\n orderNameLegacy: \":ordername\",\n orderName: \":OrderName\",\n timeZoneLegacy: \":timeZone\",\n timeZone: \":timezone\",\n disableCancelMyParticipation: \":DisableCancelMyParticipation\",\n disableUpdateOrderTime: \":DisableUpdateOrderTime\",\n unavailableBookingMessage: \":UnavailableBookingMessage\",\n discountPercentage: \":DiscountPercentage\",\n agreementText: \":AgreementText\",\n agreementLink: \":AgreementLink\",\n marginTime: \":MarginTime\",\n lockId: \":lockId\",\n autoStartTelegramNotificationBot: \"AutoStartTelegramNotificationBot\",\n autoStartTelegramNotificationBotTypo: \"AutoStartTelegramNotifcationBot\",\n autoStartConnectNotifications: \"AutoStartConnectNotifications\",\n hideMessengerConnectUi: \"HideMessengerNotifications\",\n /**\n * Резерв под серверную договоренность. Формат в `tags`: `NNN:payment_redirect_timeout_sec`.\n * Непосредственно в текущем `torrow-apps` литерал пока не используется.\n */\n paymentRedirectTimeoutSec: \":payment_redirect_timeout_sec\",\n} as const;\n\ntype PrimitiveTagConfig = {\n field: keyof ServiceImplicitTagParams;\n kind: \"string\" | \"positiveInt\";\n suffixes: readonly string[];\n caseInsensitive?: boolean;\n};\n\ntype ExactTagConfig = {\n field: keyof ServiceImplicitTagParams;\n kind: \"exactFlag\";\n tokens: readonly string[];\n};\n\ntype AutoStartTagConfig = {\n field: \"autoStartNotificationDelaySeconds\";\n kind: \"autoStart\";\n suffixes: readonly string[];\n};\n\ntype AgreementTagConfig = {\n field: \"agreementItems\";\n kind: \"agreement\";\n textSuffix: string;\n linkSuffix: string;\n};\n\nexport type ServiceImplicitTagConfig = PrimitiveTagConfig | ExactTagConfig | AutoStartTagConfig | AgreementTagConfig;\n\n// Только очистка при записи: monolith продолжает скрывать UI по старому тегу.\nconst OBSOLETE_MESSENGER_CONNECT_UI_TAG = \"HideTelegramNotificationBot\";\n\n/**\n * Единый реестр тегов (registry-driven). Это источник правды для parse/build/isImplicit.\n */\nexport const SERVICE_IMPLICIT_TAG_REGISTRY = {\n orderName: {\n field: \"orderName\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.orderName, SERVICE_IMPLICIT_TAG_SUFFIX.orderNameLegacy],\n caseInsensitive: true,\n },\n timeZone: {\n field: \"timeZone\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.timeZone, SERVICE_IMPLICIT_TAG_SUFFIX.timeZoneLegacy],\n caseInsensitive: true,\n },\n disableCancelMyParticipationBeforeMinutes: {\n field: \"disableCancelMyParticipationBeforeMinutes\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.disableCancelMyParticipation],\n },\n disableUpdateOrderTimeBeforeMinutes: {\n field: \"disableUpdateOrderTimeBeforeMinutes\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.disableUpdateOrderTime],\n },\n unavailableBookingMessage: {\n field: \"unavailableBookingMessage\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.unavailableBookingMessage],\n },\n discountPercentageFieldName: {\n field: \"discountPercentageFieldName\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.discountPercentage],\n },\n marginTimeSec: {\n field: \"marginTimeSec\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.marginTime],\n },\n paymentRedirectTimeoutSec: {\n field: \"paymentRedirectTimeoutSec\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.paymentRedirectTimeoutSec],\n },\n hideMessengerConnectUi: {\n field: \"hideMessengerConnectUi\",\n kind: \"exactFlag\",\n tokens: [SERVICE_IMPLICIT_TAG_SUFFIX.hideMessengerConnectUi],\n },\n autoStartNotificationDelaySeconds: {\n field: \"autoStartNotificationDelaySeconds\",\n kind: \"autoStart\",\n suffixes: [\n SERVICE_IMPLICIT_TAG_SUFFIX.autoStartConnectNotifications,\n SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBot,\n SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBotTypo,\n ],\n },\n agreementItems: {\n field: \"agreementItems\",\n kind: \"agreement\",\n textSuffix: SERVICE_IMPLICIT_TAG_SUFFIX.agreementText,\n linkSuffix: SERVICE_IMPLICIT_TAG_SUFFIX.agreementLink,\n },\n} as const satisfies Record<string, ServiceImplicitTagConfig>;\n\n/** Предметные значения; версия услуги передаётся отдельно. */\nexport type ServiceImplicitTagParams = {\n /** Пользовательское название заказа для отображения в приложении; не меняет серверное имя создаваемого заказа. */\n orderName?: string;\n /** Часовой пояс отображения услуги, например Europe/Moscow. */\n timeZone?: string;\n /** За сколько минут до начала запрещена отмена участия. */\n disableCancelMyParticipationBeforeMinutes?: number;\n /** За сколько минут до начала запрещён перенос заказа. */\n disableUpdateOrderTimeBeforeMinutes?: number;\n /** Сообщение пользователю при недоступной записи. */\n unavailableBookingMessage?: string;\n /** Название поля со скидкой в процентах. */\n discountPercentageFieldName?: string;\n /** Интервал между событиями в секундах. */\n marginTimeSec?: number;\n /** Задержка автоматического подключения уведомлений в секундах. */\n autoStartNotificationDelaySeconds?: number;\n /**\n * Скрывает UI подключения уведомлений Telegram и Max через точный тег `HideMessengerNotifications`.\n * BehaviorSettings API также читает точный legacy alias; в его состоянии флаг всегда boolean.\n */\n hideMessengerConnectUi?: boolean;\n /** Полный набор соглашений; пустой массив очищает набор. */\n agreementItems?: {\n /** Положительный уникальный номер соглашения. */\n index: number;\n /** Текст соглашения; хотя бы text или link должны быть заданы. */\n text?: string;\n /** Ссылка соглашения; кодирование хранения выполняет SDK. */\n link?: string;\n }[];\n /** Таймаут перехода после оплаты в секундах. */\n paymentRedirectTimeoutSec?: number;\n};\n\n/** Минимальная структура поведения ресурса (сейчас: только margin between events). */\nexport type ResourceBehaviorSettings = {\n marginTimeSec?: number;\n /**\n * Идентификатор TTLock-замка в формате тега `<lockNumber>:lockId`.\n */\n lockId?: number;\n};\n\nfunction isPositiveInt(value: number | undefined): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0;\n}\n\nfunction splitBySuffix(tag: string, suffix: string, caseInsensitive = false): string | undefined {\n if (caseInsensitive) {\n const lowerTag = tag.toLowerCase();\n const lowerSuffix = suffix.toLowerCase();\n if (!lowerTag.endsWith(lowerSuffix)) return undefined;\n return tag.slice(0, tag.length - suffix.length);\n }\n if (!tag.endsWith(suffix)) return undefined;\n return tag.slice(0, tag.length - suffix.length);\n}\n\nfunction firstPrefixBySuffix(\n tags: readonly string[],\n suffix: string,\n options?: { caseInsensitive?: boolean },\n): string | undefined {\n for (const tag of tags) {\n const prefix = splitBySuffix(tag, suffix, options?.caseInsensitive ?? false);\n if (prefix !== undefined) return prefix;\n }\n return undefined;\n}\n\nfunction toPositiveInt(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const value = Number.parseInt(raw.trim(), 10);\n return Number.isFinite(value) && value > 0 ? value : undefined;\n}\n\nfunction parseAutoStartDelay(tag: string): number | undefined {\n const suffixes = SERVICE_IMPLICIT_TAG_REGISTRY.autoStartNotificationDelaySeconds.suffixes;\n for (const suffix of suffixes) {\n const match = tag.match(new RegExp(`^(\\\\d+):${suffix}$`));\n if (match?.[1]) {\n const sec = Number.parseInt(match[1], 10);\n if (Number.isFinite(sec) && sec > 0) return sec;\n }\n }\n return undefined;\n}\n\nfunction parseAgreementIndexedTag(tag: string, baseSuffix: string): { index: number; value: string } | undefined {\n const escaped = baseSuffix.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = tag.match(new RegExp(`^(.*)${escaped}(\\\\d+)$`));\n if (!match?.[1] || !match[2]) return undefined;\n const index = Number.parseInt(match[2], 10);\n if (!Number.isFinite(index) || index <= 0) return undefined;\n return { index, value: match[1] };\n}\n\nfunction decodeAgreementLink(linkRaw: string): string {\n const trimmed = linkRaw.trim();\n if (trimmed.startsWith(\"https//\")) return `https://${trimmed.slice(\"https//\".length)}`;\n if (trimmed.startsWith(\"http//\")) return `http://${trimmed.slice(\"http//\".length)}`;\n return trimmed;\n}\n\nfunction encodeAgreementLink(linkRaw: string): string {\n const trimmed = linkRaw.trim();\n if (trimmed.startsWith(\"https://\")) return `https//${trimmed.slice(\"https://\".length)}`;\n if (trimmed.startsWith(\"http://\")) return `http//${trimmed.slice(\"http://\".length)}`;\n return trimmed;\n}\n\n/**\n * Парсинг используемых в продукте неявных \"тег-параметров\" сервиса.\n */\nexport function parseServiceImplicitTagParams(tags: readonly string[] | undefined | null): ServiceImplicitTagParams {\n const safeTags = tags ?? [];\n const result: ServiceImplicitTagParams = {};\n const mutable = result as Record<string, unknown>;\n\n for (const config of Object.values(SERVICE_IMPLICIT_TAG_REGISTRY) as ServiceImplicitTagConfig[]) {\n if (config.kind === \"string\" || config.kind === \"positiveInt\") {\n const raw = config.suffixes\n .map((suffix) => firstPrefixBySuffix(safeTags, suffix, { caseInsensitive: config.caseInsensitive ?? false }))\n .find((x) => x !== undefined);\n if (config.kind === \"string\") {\n if (raw?.trim()) mutable[config.field] = raw.trim();\n } else {\n const value = toPositiveInt(raw);\n if (value !== undefined) mutable[config.field] = value;\n }\n }\n if (config.kind === \"exactFlag\") {\n const hasAny = safeTags.some((tag) => config.tokens.some((token) => tag === token));\n if (hasAny) mutable[config.field] = true;\n }\n }\n\n let autoStartNotificationDelaySeconds: number | undefined = result.autoStartNotificationDelaySeconds;\n if (autoStartNotificationDelaySeconds === undefined) {\n for (const tag of safeTags) {\n autoStartNotificationDelaySeconds = parseAutoStartDelay(tag);\n if (autoStartNotificationDelaySeconds !== undefined) break;\n }\n }\n if (autoStartNotificationDelaySeconds !== undefined) {\n mutable.autoStartNotificationDelaySeconds = autoStartNotificationDelaySeconds;\n }\n\n const agreementsMap = new Map<number, { index: number; text?: string; link?: string }>();\n const agreementConfig = SERVICE_IMPLICIT_TAG_REGISTRY.agreementItems;\n for (const tag of safeTags) {\n const textTag = parseAgreementIndexedTag(tag, agreementConfig.textSuffix);\n if (textTag) {\n agreementsMap.set(textTag.index, {\n index: textTag.index,\n ...(agreementsMap.get(textTag.index) ?? {}),\n text: textTag.value.trim() || undefined,\n });\n }\n const linkTag = parseAgreementIndexedTag(tag, agreementConfig.linkSuffix);\n if (linkTag) {\n agreementsMap.set(linkTag.index, {\n index: linkTag.index,\n ...(agreementsMap.get(linkTag.index) ?? {}),\n link: decodeAgreementLink(linkTag.value),\n });\n }\n }\n const agreementItems = [...agreementsMap.values()]\n .sort((a, b) => a.index - b.index)\n .filter((x) => x.text || x.link);\n if (agreementItems.length) mutable.agreementItems = agreementItems;\n return result;\n}\n\n/**\n * Генерация service-тегов из явной структуры параметров.\n * Удобно для create/update запросов и codegen-агентов.\n */\nexport function buildServiceImplicitTags(\n params: ServiceImplicitTagParams,\n options?: {\n /**\n * Какой suffix использовать для auto-start delay.\n * По умолчанию новый: `AutoStartConnectNotifications`.\n */\n autoStartNotificationSuffix?:\n | typeof SERVICE_IMPLICIT_TAG_SUFFIX.autoStartConnectNotifications\n | typeof SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBot\n | typeof SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBotTypo;\n },\n): string[] {\n const tags: string[] = [];\n const singleValueConfigs = (Object.values(SERVICE_IMPLICIT_TAG_REGISTRY) as ServiceImplicitTagConfig[]).filter(\n (x) => x.kind === \"string\" || x.kind === \"positiveInt\",\n ) as PrimitiveTagConfig[];\n for (const config of singleValueConfigs) {\n const value = params[config.field] as unknown;\n const writeSuffix = config.suffixes[0];\n if (config.kind === \"string\") {\n if (typeof value === \"string\" && value.trim()) {\n tags.push(`${value.trim()}${writeSuffix}`);\n }\n } else if (isPositiveInt(typeof value === \"number\" ? value : undefined)) {\n tags.push(`${value}${writeSuffix}`);\n }\n }\n\n for (const agreement of params.agreementItems ?? []) {\n if (!isPositiveInt(agreement.index)) continue;\n if (agreement.text?.trim()) {\n tags.push(\n `${agreement.text.trim()}${SERVICE_IMPLICIT_TAG_REGISTRY.agreementItems.textSuffix}${agreement.index}`,\n );\n }\n if (agreement.link?.trim()) {\n tags.push(\n `${encodeAgreementLink(agreement.link)}${SERVICE_IMPLICIT_TAG_REGISTRY.agreementItems.linkSuffix}${agreement.index}`,\n );\n }\n }\n if (isPositiveInt(params.autoStartNotificationDelaySeconds)) {\n tags.push(\n `${params.autoStartNotificationDelaySeconds}:${\n options?.autoStartNotificationSuffix ?? SERVICE_IMPLICIT_TAG_SUFFIX.autoStartConnectNotifications\n }`,\n );\n }\n if (params.hideMessengerConnectUi) {\n tags.push(SERVICE_IMPLICIT_TAG_REGISTRY.hideMessengerConnectUi.tokens[0]);\n }\n\n return tags;\n}\n\nfunction isImplicitServiceTag(tag: string): boolean {\n for (const config of Object.values(SERVICE_IMPLICIT_TAG_REGISTRY) as ServiceImplicitTagConfig[]) {\n if (config.kind === \"string\" || config.kind === \"positiveInt\") {\n const matched = config.suffixes.some(\n (suffix) => splitBySuffix(tag, suffix, config.caseInsensitive ?? false) !== undefined,\n );\n if (matched) return true;\n }\n if (config.kind === \"exactFlag\") {\n if (config.tokens.some((token) => tag === token)) return true;\n }\n if (config.kind === \"autoStart\") {\n const isAutoStart = config.suffixes.some((suffix) => tag.match(new RegExp(`^\\\\d+:${suffix}$`)) !== null);\n if (isAutoStart) return true;\n }\n if (config.kind === \"agreement\") {\n if (\n parseAgreementIndexedTag(tag, config.textSuffix) !== undefined ||\n parseAgreementIndexedTag(tag, config.linkSuffix) !== undefined\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Обновляет только implicit service tags, не трогая \"обычные\" пользовательские теги.\n * Полезно для patch/update сценариев поверх существующего массива tags.\n */\nexport function mergeServiceImplicitTags(\n baseTags: readonly string[] | undefined | null,\n params: ServiceImplicitTagParams,\n options?: Parameters<typeof buildServiceImplicitTags>[1],\n): string[] {\n const safeBase = baseTags ?? [];\n const preservedNonImplicit = safeBase.filter(\n (tag) => tag !== OBSOLETE_MESSENGER_CONNECT_UI_TAG && !isImplicitServiceTag(tag),\n );\n const nextImplicit = buildServiceImplicitTags(params, options);\n return [...preservedNonImplicit, ...nextImplicit];\n}\n\n/**\n * One-liner для частичного обновления implicit service params.\n * Сценарий: parse(existing) -> apply patch -> mergeServiceImplicitTags(baseTags, next).\n */\nexport function upsertServiceImplicitTagParams(\n baseTags: readonly string[] | undefined | null,\n patch: Partial<ServiceImplicitTagParams>,\n options?: Parameters<typeof buildServiceImplicitTags>[1],\n): string[] {\n const current = parseServiceImplicitTagParams(baseTags);\n const next: ServiceImplicitTagParams = {\n ...current,\n ...patch,\n };\n return mergeServiceImplicitTags(baseTags, next, options);\n}\n\n/**\n * Конвенция сервера по шагам услуги:\n * если название шага начинается с `*`, выбранный ресурс из этого шага считается \"первичным\".\n */\nexport function isPrimaryServiceStepName(stepName: string | undefined | null): boolean {\n return !!stepName && stepName.trimStart().startsWith(\"*\");\n}\n\n/**\n * Возвращает \"чистое\" название шага без префикса `*`.\n */\nexport function getServiceStepDisplayName(stepName: string | undefined | null): string {\n if (!stepName) return \"\";\n const normalized = stepName.trimStart();\n return normalized.startsWith(\"*\") ? normalized.slice(1).trimStart() : stepName;\n}\n\n/** Парсинг поведения ресурса из `resource.tags`. */\nexport function parseResourceBehaviorSettings(tags: readonly string[] | undefined | null): ResourceBehaviorSettings {\n // Resource сохраняет историческую семантику независимо от нового Service reader.\n const marginTimeSec = toPositiveInt(firstPrefixBySuffix(tags ?? [], SERVICE_IMPLICIT_TAG_SUFFIX.marginTime));\n const lockId = toPositiveInt(firstPrefixBySuffix(tags ?? [], SERVICE_IMPLICIT_TAG_SUFFIX.lockId));\n const result: ResourceBehaviorSettings = {};\n if (marginTimeSec !== undefined) result.marginTimeSec = marginTimeSec;\n if (lockId !== undefined) result.lockId = lockId;\n return result;\n}\n\n/** Сериализация/merge behavior параметров ресурса в `resource.tags`. */\nexport function mergeResourceBehaviorTags(\n baseTags: readonly string[] | undefined | null,\n settings: ResourceBehaviorSettings,\n): string[] {\n const safeBase = baseTags ?? [];\n const nonManaged = safeBase.filter(\n (tag) =>\n splitBySuffix(tag, SERVICE_IMPLICIT_TAG_SUFFIX.marginTime) === undefined &&\n splitBySuffix(tag, SERVICE_IMPLICIT_TAG_SUFFIX.lockId) === undefined,\n );\n const managed: string[] = [];\n if (isPositiveInt(settings.marginTimeSec)) {\n managed.push(`${settings.marginTimeSec}${SERVICE_IMPLICIT_TAG_SUFFIX.marginTime}`);\n }\n if (isPositiveInt(settings.lockId)) {\n managed.push(`${settings.lockId}${SERVICE_IMPLICIT_TAG_SUFFIX.lockId}`);\n }\n return [...nonManaged, ...managed];\n}\n\n","import type { ResourceBehaviorSettings } from \"../common/implicit-tag-params.js\";\nimport type {\n ResourceItemApiDto,\n WorkloadPeriodDto,\n PickOrderReqDto,\n PickOrderRespDto,\n ReturnOrderReqDto,\n ReturnOrderRespDto,\n} from \"./dto.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type { DeleteResponse, ObjectInfo } from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { ResourceBehaviorSettings } from \"../common/implicit-tag-params.js\";\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nexport type { PersonalSolutionData, SolutionData };\n\nexport type ResourceItemApi = ResourceItemApiDto;\nexport type ServiceDescription = NonNullable<ResourceItemApi[\"serviceDescriptions\"]>[number];\nexport type UsageCondition = NonNullable<ResourceItemApi[\"usageCondition\"]>;\nexport type UsageConditionType = NonNullable<UsageCondition[\"usageConditionType\"]>;\nexport type ResourceUsageConditionType = Exclude<\n UsageConditionType,\n \"UnknownUsageConditionType\" | \"None\"\n>;\nexport type WorkloadPeriod = WorkloadPeriodDto;\nexport type PickOrderReq = PickOrderReqDto;\nexport type PickOrderResp = PickOrderRespDto;\nexport type ReturnOrderReq = ReturnOrderReqDto;\nexport type ReturnOrderResp = ReturnOrderRespDto;\nexport type ResourceItem = TorrowItemFromDto<ResourceItemApi> & {\n behaviorSettings?: ResourceBehaviorSettings;\n};\nexport type UsageType = ResourceItemApi[\"usageType\"];\nexport const UsageTypeValues = {\n Unknown: \"UnknownUsageType\",\n Specification: \"Specification\",\n Rent: \"Rent\",\n Sale: \"Sale\",\n Payment: \"Payment\",\n Ticket: \"Ticket\",\n} as const satisfies Record<string, NonNullable<UsageType>>;\nexport const UsageConditionTypeValues = {\n None: \"None\",\n Exclusion: \"Exclusion\",\n Additional: \"Additional\",\n} as const satisfies Record<string, UsageConditionType>;\nexport type ResourceItemForCreateOrUpdate = TorrowItemForCreateOrUpdate<ResourceItem>;\n\nexport interface ResourceServiceBindingOptions {\n usageAmount?: number | null;\n sortIndex?: number | null;\n}\n\nexport interface ResourceBuildResult {\n body: ResourceItemForCreateOrUpdate;\n}\n\n","import { TorrowSdkEffectState, TorrowSdkErrorCategory, TorrowSdkErrorDomain, TorrowSdkRequestState } from \"../../http/TorrowSdkError.js\";\nimport type { TorrowObjectDto } from \"../../schema/openapi-dto-aliases.js\";\nimport { BehaviorSettingsFailureAt, BehaviorSettingsOperation, contextualizeBehaviorError, isBehaviorCasRefusal } from \"../common/behavior-settings-errors.js\";\nimport type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount, unwrapTimetableStatisticsList } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport {\n mergeResourceBehaviorTags,\n parseResourceBehaviorSettings,\n type ResourceBehaviorSettings,\n} from \"../common/implicit-tag-params.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n TimetableCase,\n TimetableFilter,\n TimetableStatisticsResp,\n} from \"../services/types.js\";\nimport { UsageTypeValues } from \"./types.js\";\nimport type {\n DeleteResponse,\n PickOrderReq,\n PickOrderResp,\n ResourceItem,\n ResourceItemApi,\n ResourceItemForCreateOrUpdate,\n ReturnOrderReq,\n ReturnOrderResp,\n WorkloadPeriod,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/resources\";\n\n/**\n * CRUD + personal list + социальный слой для **Resource** (`ResourceItem`, путь `/api/v1/resources`).\n * Свойство фасада — `client.resourceItems`.\n */\nexport class ResourcesFacade extends TorrowItemFacade<ResourceItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Resource;\n\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** Id ресурса до `create` / presigned upload. */\n generateResourceId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n private toSdkResourceItem(item: ResourceItemApi): ResourceItem {\n return {\n ...item,\n behaviorSettings: parseResourceBehaviorSettings(item.tags),\n };\n }\n\n private toApiResourceItem(item: ResourceItemForCreateOrUpdate): ResourceItemApi {\n const { behaviorSettings, ...rest } = item;\n const apiBase = rest as ResourceItemApi;\n const nextTags = behaviorSettings ? mergeResourceBehaviorTags(apiBase.tags, behaviorSettings) : apiBase.tags;\n return {\n ...apiBase,\n tags: nextTags,\n };\n }\n\n /** `POST /api/v1/resources` */\n create(\n body: ResourceItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n const payload = this.withCreateDefaults(body);\n return this.http\n .requestJson<ResourceItemApi>({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: this.toApiResourceItem(payload),\n signal: options?.signal,\n })\n .then((item) => this.toSdkResourceItem(item));\n }\n\n /** `PUT /api/v1/resources/{body.id}`. Требует непустой `id` в теле ресурса. */\n update(\n body: ResourceItemForCreateOrUpdate,\n options?: {\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n const resourceId = requireItemUpdateId(body, \"Resource\");\n return this.http\n .requestJson<ResourceItemApi>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(resourceId)}`,\n query: {\n profileId: options?.profileId,\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: this.toApiResourceItem(body),\n signal: options?.signal,\n })\n .then((item) => this.toSdkResourceItem(item));\n }\n\n private withCreateDefaults(body: ResourceItemForCreateOrUpdate): ResourceItemForCreateOrUpdate {\n const payload = applyItemCreateDefaults(body, Discriminator.ResourceItem);\n return {\n ...payload,\n usageType: payload.usageType ?? UsageTypeValues.Specification,\n };\n }\n\n /** `DELETE /api/v1/resources/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/resources/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n isNeedItem?: boolean | null;\n isNeedParentResource?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n return this.http\n .requestJson<ResourceItemApi>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n isNeedItem: options?.isNeedItem,\n isNeedParentResource: options?.isNeedParentResource,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n })\n .then((item) => this.toSdkResourceItem(item));\n }\n\n private getBehaviorSettingsFromResource(\n resource: Pick<ResourceItem, \"tags\"> & Partial<Pick<ResourceItem, \"behaviorSettings\">>,\n ): ResourceBehaviorSettings {\n return \"behaviorSettings\" in resource && resource.behaviorSettings\n ? resource.behaviorSettings\n : parseResourceBehaviorSettings(resource.tags);\n }\n\n async getBehaviorSettings(\n resourceId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n isNeedItem?: boolean | null;\n isNeedParentResource?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceBehaviorSettings> {\n const resource = await this.getById(resourceId, options);\n return this.getBehaviorSettingsFromResource(resource);\n }\n\n async updateBehaviorSettings(\n resourceId: string,\n settingsPatch: Partial<ResourceBehaviorSettings>,\n options?: {\n mergeParameters?: boolean;\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n includeDeleted?: boolean | null;\n isNeedItem?: boolean | null;\n isNeedParentResource?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n return this.writeBehaviorSettings(resourceId, settingsPatch, options, BehaviorSettingsOperation.ResourceUpdate);\n }\n\n /** Контекст локален вызову; алгоритм и число запросов двух публичных операций совпадают. */\n private async writeBehaviorSettings(\n resourceId: string, settingsPatch: Partial<ResourceBehaviorSettings>,\n options: Parameters<ResourcesFacade[\"updateBehaviorSettings\"]>[2], operation: BehaviorSettingsOperation,\n ): Promise<ResourceItem> {\n let failureAt = BehaviorSettingsFailureAt.ReadCurrent;\n let effect = TorrowSdkEffectState.NotApplied;\n try {\n const resource = await this.getById(resourceId, {\n includeDeleted: options?.includeDeleted,\n isNeedItem: options?.isNeedItem,\n isNeedParentResource: options?.isNeedParentResource,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n signal: options?.signal,\n });\n\n failureAt = BehaviorSettingsFailureAt.PrepareWrite;\n const mergeParameters = options?.mergeParameters ?? true;\n const nextSettings: ResourceBehaviorSettings = mergeParameters\n ? {\n ...this.getBehaviorSettingsFromResource(resource),\n ...settingsPatch,\n }\n : { ...settingsPatch };\n\n const nextTags = mergeResourceBehaviorTags(resource.tags, nextSettings);\n failureAt = BehaviorSettingsFailureAt.WriteSettings;\n let dispatched = false;\n let acknowledgement: TorrowObjectDto;\n try {\n // Локальный маркер именно этого PUT: request вложенного refresh не описывает запись настроек.\n acknowledgement = await this.http.requestJson<TorrowObjectDto>({\n method: \"PUT\", path: `${BASE}/${encodePathSegment(resourceId)}/tags`, body: nextTags,\n query: { versionToCheck: options?.checkVersion ? (resource.meta?.version ?? undefined) : undefined,\n isNeedAnnouncement: options?.isNeedAnnouncement }, signal: options?.signal,\n }, () => { dispatched = true; });\n } catch (cause) {\n effect = dispatched ? TorrowSdkEffectState.Unknown : TorrowSdkEffectState.NotApplied;\n const error = contextualizeBehaviorError(cause, operation, failureAt, effect).withContext({\n request: dispatched ? TorrowSdkRequestState.Started : TorrowSdkRequestState.NotStarted,\n });\n if (dispatched && isBehaviorCasRefusal(error)) {\n effect = TorrowSdkEffectState.NotApplied;\n throw error.withContext({ category: TorrowSdkErrorCategory.VersionConflict,\n detail: { domain: TorrowSdkErrorDomain.BehaviorSettings } });\n }\n throw error;\n }\n // Это диагностика, не новая валидация успеха: старый readback выполняется даже без корректного id.\n // meta.version прежде не требовалась. Усиление возможно только при отдельном изменении контракта.\n effect = acknowledgement?.id === resourceId ? TorrowSdkEffectState.Applied : TorrowSdkEffectState.Unknown;\n failureAt = BehaviorSettingsFailureAt.ReadBack;\n return await this.getById(resourceId, {\n includeDeleted: options?.includeDeleted,\n isNeedItem: options?.isNeedItem,\n isNeedParentResource: options?.isNeedParentResource,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n signal: options?.signal,\n });\n } catch (cause) {\n throw contextualizeBehaviorError(cause, operation, failureAt, effect);\n }\n }\n\n setBehaviorSettings(\n resourceId: string,\n settings: ResourceBehaviorSettings,\n options?: Omit<Parameters<ResourcesFacade[\"updateBehaviorSettings\"]>[2], \"mergeParameters\">,\n ): Promise<ResourceItem> {\n return this.writeBehaviorSettings(resourceId, settings, {\n ...options,\n mergeParameters: false,\n }, BehaviorSettingsOperation.ResourceSet);\n }\n\n /** `GET /api/v1/resources/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<ResourceItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http\n .requestJson<ResourceItemApi[]>({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n })\n .then((items) => items.map((item) => this.toSdkResourceItem(item)));\n }\n\n /**\n * Расписание заказов, привязанных к **ресурсу** — `PUT /api/v1/resources/{id}/timetable`.\n */\n getTimetable(\n resourceId: string,\n body: TimetableFilter,\n options?: Omit<TimetableQueryOptions, \"createDateFrom\" | \"createDateTo\"> & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(resourceId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /**\n * Полосы занятости ресурса — `GET /api/v1/resources/{id}/workload`.\n */\n getWorkload(\n resourceId: string,\n options: {\n from: Date;\n to: Date;\n serviceId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<WorkloadPeriod[]> {\n const { signal, from, to, serviceId } = options;\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(resourceId)}/workload`,\n query: {\n From: from,\n To: to,\n serviceId,\n },\n signal,\n });\n }\n\n /** `POST /api/v1/resources/{id}/pickorder`. */\n pickOrder(\n resourceId: string,\n body: PickOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<PickOrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(resourceId)}/pickorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/resources/{id}/returnorder`. */\n returnOrder(\n resourceId: string,\n body: ReturnOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<ReturnOrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(resourceId)}/returnorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/resources/timetable/statistics`. */\n async getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableStatisticsResp[]> {\n const resp = await this.http.requestJson<GetTimetableStatisticsResponse>({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n return unwrapTimetableStatisticsList(resp);\n }\n}\n\n","import { TorrowSdkErrorCategory } from \"../../http/TorrowSdkError.js\";\nimport { behaviorSettingsError } from \"../common/behavior-settings-errors.js\";\nimport { SERVICE_IMPLICIT_TAG_REGISTRY, type ServiceImplicitTagConfig } from \"../common/implicit-tag-params.js\";\nimport type { ServiceBehaviorSettings } from \"./types.js\";\n\n/** Причина неполного предметного чтения конкретной настройки. */\nexport enum ServiceBehaviorSettingsIssueReason {\n /** Есть некорректное значение; поле исключено из предметного снимка. */\n InvalidValue = \"InvalidValue\",\n /** Есть противоречивые значения; порядок не определяет результат. */\n AmbiguousValue = \"AmbiguousValue\",\n}\n/** Диагностика настройки без раскрытия внутреннего представления. */\nexport interface ServiceBehaviorSettingsIssue {\n /** Поле, значение которого не может быть достоверно прочитано. */\n field: keyof ServiceBehaviorSettings;\n /** Некорректное значение либо несколько противоречивых значений. */\n reason: ServiceBehaviorSettingsIssueReason;\n}\n/** Проверенное предметное состояние услуги. */\nexport interface ServiceBehaviorSettingsState {\n /** ID услуги, для которой выполнено чтение. */\n serviceId: string;\n /** Положительная int32 meta.version всей услуги, не отдельный счётчик настроек. */\n version: number;\n /** Прочитанные значения; поля с issues не являются полным снимком. */\n settings: ServiceBehaviorSettings;\n /** Проблемы предметного чтения; пустой массив означает полный снимок настроек. */\n issues: ServiceBehaviorSettingsIssue[];\n}\n/** Результат изменения; поля состояния имеют смысл из ServiceBehaviorSettingsState. */\nexport interface ServiceBehaviorSettingsUpdateResult extends ServiceBehaviorSettingsState {\n /** Был ли PUT; settings описывают ожидаемый результат, без автоматического readback. */\n changed: boolean;\n}\n/** Управление записью BehaviorSettings; проверку версии выбирает потребитель. */\nexport interface ServiceBehaviorSettingsUpdateOptions {\n /** Ожидаемая meta.version: 1..2147483647. При наличии включает проверку указанной версии. */\n versionToCheck?: number;\n /** true включает CAS по версии внутреннего GET, если versionToCheck не задан. По умолчанию CAS выключен. */\n checkVersion?: true;\n /** true (по умолчанию) сохраняет пропущенные поля; false полностью заменяет настройки. */\n mergeParameters?: boolean;\n /** Выбранный профиль только для внутреннего GET; не предоставляет право записи. */\n profileId?: string | null;\n /** Гостевой контекст только для GET; не Bearer и не право записи. */\n securityToken?: string | null;\n /** Создание объявления при PUT; отсутствие/null означает false. */\n isNeedAnnouncement?: boolean | null;\n /** Отмена чтения и записи; после отмены автоматических запросов нет. */\n signal?: AbortSignal;\n}\n/** Именованные виды реестра для сравнения в реализации. */\nenum BehaviorKind {\n String = \"string\", PositiveInt = \"positiveInt\", ExactFlag = \"exactFlag\", AutoStart = \"autoStart\", Agreement = \"agreement\",\n}\n/** Wire-полнота и разрешённая операция; не входят в предметные результаты. */\nenum BehaviorAccess { Full = \"Full\", NoRights = \"NoRights\", SubscriptionIsNotValid = \"SubscriptionIsNotValid\", SetItemTags = \"SetItemTags\" }\nenum BehaviorFlag { LegacyHide = \"HideTelegramNotificationBot\" }\nconst configs: readonly ServiceImplicitTagConfig[] = Object.values(SERVICE_IMPLICIT_TAG_REGISTRY);\n\n/** Проверяет положительную int32-версию независимо от TypeScript. */\nexport function isBehaviorVersion(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 1 && value <= 2147483647;\n}\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n/** Валидирует GET до проекции; отсутствие данных не превращается в пустое состояние. */\nexport function validateBehaviorResponse(value: unknown, serviceId: string): { tags: string[]; version: number; operations: unknown } {\n if (!record(value) || value.id !== serviceId) throw behaviorSettingsError(TorrowSdkErrorCategory.InvalidResponse);\n const personal = value.personalInfo;\n if (record(personal) && (personal.itemContentType === BehaviorAccess.NoRights || personal.itemContentType === BehaviorAccess.SubscriptionIsNotValid)) {\n throw behaviorSettingsError(TorrowSdkErrorCategory.AccessDenied);\n }\n if (!record(personal) || personal.itemContentType !== BehaviorAccess.Full || value.tags == null || !record(value.meta) || !isBehaviorVersion(value.meta.version)) {\n throw behaviorSettingsError(TorrowSdkErrorCategory.InsufficientData);\n }\n if (!Array.isArray(value.tags) || !value.tags.every((tag): tag is string => typeof tag === \"string\")) {\n throw behaviorSettingsError(TorrowSdkErrorCategory.InvalidResponse);\n }\n const operations = personal.operationList;\n if (operations != null && (!Array.isArray(operations) || !operations.every(operation => typeof operation === \"string\" || (typeof operation === \"number\" && Number.isSafeInteger(operation))))) {\n throw behaviorSettingsError(TorrowSdkErrorCategory.InvalidResponse);\n }\n return { tags: [...new Set(value.tags)], version: value.meta.version, operations };\n}\n/** Наличие данных или профиль не заменяют известное разрешение операции. */\nexport function assertBehaviorPermission(operations: unknown): void {\n if (!Array.isArray(operations)) throw behaviorSettingsError(TorrowSdkErrorCategory.InsufficientData);\n if (!operations.includes(BehaviorAccess.SetItemTags)) throw behaviorSettingsError(TorrowSdkErrorCategory.AccessDenied);\n}\n\nfunction suffixPrefix(tag: string, suffix: string, ignoreCase = false): string | undefined {\n const matches = ignoreCase ? tag.toLowerCase().endsWith(suffix.toLowerCase()) : tag.endsWith(suffix);\n return matches ? tag.slice(0, -suffix.length) : undefined;\n}\nfunction positive(raw: string): number | undefined {\n const value = Number(raw);\n return /^\\d+$/.test(raw) && Number.isSafeInteger(value) && value > 0 ? value : undefined;\n}\n/** Принадлежность семейству отделена от валидности значения: ошибочное выбранное поле можно заменить. */\nfunction prefix(tag: string, config: ServiceImplicitTagConfig): string | undefined {\n if (config.kind === BehaviorKind.String || config.kind === BehaviorKind.PositiveInt) {\n for (const suffix of config.suffixes) {\n const value = suffixPrefix(tag, suffix, config.caseInsensitive);\n if (value !== undefined) return value;\n }\n } else if (config.kind === BehaviorKind.ExactFlag) {\n if (config.tokens.includes(tag) || tag === BehaviorFlag.LegacyHide) return \"true\";\n } else if (config.kind === BehaviorKind.AutoStart) {\n for (const suffix of config.suffixes) {\n const value = suffixPrefix(tag, `:${suffix}`);\n if (value !== undefined) return value;\n }\n } else if (config.kind === BehaviorKind.Agreement) {\n for (const suffix of [config.textSuffix, config.linkSuffix]) {\n const position = tag.lastIndexOf(suffix);\n if (position >= 0 && /^\\d+$/.test(tag.slice(position + suffix.length))) return tag;\n }\n }\n return undefined;\n}\n/** Читает все семейства без зависимости от порядка или одинаковых дублей. */\nexport function readBehaviorSettings(tags: readonly string[]): Pick<ServiceBehaviorSettingsState, \"settings\" | \"issues\"> {\n const settings: ServiceBehaviorSettings = { hideMessengerConnectUi: false };\n const issues: ServiceBehaviorSettingsIssue[] = [];\n const target = settings as Record<string, unknown>;\n for (const config of configs) {\n // Собираем выбранное семейство без зависимости от порядка/дублей ответа.\n const matching = [...new Set(tags)].filter(tag => prefix(tag, config) !== undefined);\n if (!matching.length) continue;\n let invalid = false;\n let ambiguous = false;\n let result: unknown;\n if (config.kind === BehaviorKind.Agreement) {\n // Соглашения агрегируются по index, конфликт любого атрибута делает набор неполным.\n const entries = new Map<number, { index: number; text?: string; link?: string }>();\n for (const tag of matching) {\n for (const [attribute, suffix] of [[\"text\", config.textSuffix], [\"link\", config.linkSuffix]] as const) {\n const position = tag.lastIndexOf(suffix);\n if (position < 0 || !/^\\d+$/.test(tag.slice(position + suffix.length))) continue;\n const index = positive(tag.slice(position + suffix.length));\n let value = tag.slice(0, position).trim();\n if (attribute === \"link\") value = value.replace(/^(https?)\\/\\//, \"$1://\");\n if (!index || !value) { invalid = true; continue; }\n const entry = entries.get(index) ?? { index };\n if (entry[attribute] !== undefined && entry[attribute] !== value) ambiguous = true;\n entry[attribute] = value;\n entries.set(index, entry);\n }\n }\n result = [...entries.values()].sort((a, b) => a.index - b.index);\n } else {\n const values = new Set<string | number | boolean>();\n for (const tag of matching) {\n const raw = prefix(tag, config)!;\n const value = config.kind === BehaviorKind.ExactFlag ? true : config.kind === BehaviorKind.String ? raw.trim() || undefined : positive(raw);\n if (value === undefined) invalid = true;\n else values.add(value);\n }\n ambiguous = values.size > 1;\n result = [...values][0];\n }\n if (invalid || ambiguous) {\n // Неполное значение не выдаём за достоверное; другие семейства остаются читаемыми.\n issues.push({ field: config.field, reason: invalid ? ServiceBehaviorSettingsIssueReason.InvalidValue : ServiceBehaviorSettingsIssueReason.AmbiguousValue });\n } else target[config.field] = result;\n }\n return { settings, issues };\n}\n\n/** Нормализует и валидирует вход; undefined/null не служат неявной очисткой. */\nexport function normalizeBehaviorInput(input: ServiceBehaviorSettings): ServiceBehaviorSettings {\n function fail(): never { throw behaviorSettingsError(TorrowSdkErrorCategory.InvalidInput); }\n if (!record(input) || Object.keys(input).some(key => !Object.hasOwn(SERVICE_IMPLICIT_TAG_REGISTRY, key))) fail();\n const output: Record<string, unknown> = {};\n for (const config of configs) {\n if (!Object.hasOwn(input, config.field)) continue;\n const value: unknown = input[config.field];\n if (config.kind === BehaviorKind.String) {\n if (typeof value !== \"string\" || !value.trim()) fail();\n output[config.field] = value.trim();\n } else if (config.kind === BehaviorKind.PositiveInt || config.kind === BehaviorKind.AutoStart) {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value <= 0) fail();\n output[config.field] = value;\n } else if (config.kind === BehaviorKind.ExactFlag) {\n if (typeof value !== \"boolean\") fail();\n output[config.field] = value;\n } else {\n if (!Array.isArray(value)) fail();\n const seen = new Set<number>();\n output[config.field] = value.map((entry: unknown) => {\n if (!record(entry) || Object.keys(entry).some(key => ![\"index\", \"text\", \"link\"].includes(key)) || typeof entry.index !== \"number\" || !Number.isSafeInteger(entry.index) || entry.index <= 0 || seen.has(entry.index)) fail();\n seen.add(entry.index);\n const normalized: { index: number; text?: string; link?: string } = { index: entry.index };\n for (const attribute of [\"text\", \"link\"] as const) {\n if (Object.hasOwn(entry, attribute)) {\n if (typeof entry[attribute] !== \"string\" || !entry[attribute].trim()) fail();\n normalized[attribute] = entry[attribute].trim();\n }\n }\n if (!normalized.text && !normalized.link) fail();\n return normalized;\n }).sort((a, b) => a.index - b.index);\n }\n }\n return output as ServiceBehaviorSettings;\n}\n\n/** Формирует только выбранные семейства; порядок/кратность не входят в серверный контракт. */\nexport function mergeBehaviorSettings(tags: readonly string[], settings: ServiceBehaviorSettings, mergeParameters: boolean): string[] {\n const selected = configs.filter(config => !mergeParameters || Object.hasOwn(settings, config.field));\n const output = tags.filter(tag => !selected.some(config => prefix(tag, config) !== undefined));\n for (const config of selected) {\n const value = settings[config.field];\n if (value === undefined) continue;\n if (config.kind === BehaviorKind.String || config.kind === BehaviorKind.PositiveInt) output.push(`${value}${config.suffixes[0]}`);\n else if (config.kind === BehaviorKind.ExactFlag) { if (value) output.push(config.tokens[0]!); }\n else if (config.kind === BehaviorKind.AutoStart) output.push(`${value}:${config.suffixes[0]}`);\n else if (config.kind === BehaviorKind.Agreement) for (const entry of settings.agreementItems ?? []) {\n if (entry.text) output.push(`${entry.text}${config.textSuffix}${entry.index}`);\n if (entry.link) output.push(`${entry.link.replace(/^(https?):\\/\\//, \"$1//\")}${config.linkSuffix}${entry.index}`);\n }\n }\n return [...new Set(output)];\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { parseServiceImplicitTagParams } from \"../common/implicit-tag-params.js\";\nimport type {\n CreateOrderReq,\n GetCheckInScheduleReq,\n GetCheckInScheduleResp,\n OrderResp,\n ResourceView,\n SearchServiceResourcesReq,\n ServiceItem,\n ServiceItemApi,\n} from \"./types.js\";\n\n/*\n * Запросы записи на услугу — функциями поверх `HttpClient`, без `ServicesFacade`.\n * Фасад — класс со всеми методами услуги (CRUD, соцслой, отчёты), и сборщик не может выкинуть\n * неиспользуемые методы класса. Браузерному виджету записи нужно четыре запроса — функции\n * попадают в бандл поштучно. `ServicesFacade` вызывает эти же функции: поведение одно.\n */\n\nconst BASE = \"/api/v1/services\";\n\n/** Опции `GET /api/v1/services/{torrowId}` — у `getService` и `ServicesFacade.getById`. */\nexport interface GetServiceOptions {\n profileId?: string | null;\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n}\n\n/** Ответ API услуги → `ServiceItem` SDK: `behaviorSettings` из hash-tags. */\nexport function toSdkServiceItem(service: ServiceItemApi): ServiceItem {\n return {\n ...service,\n behaviorSettings: parseServiceImplicitTagParams(service.tags),\n };\n}\n\n/** `GET /api/v1/services/{torrowId}` — услуга с `behaviorSettings`, как `ServicesFacade.getById`. */\nexport async function getService(\n http: HttpClient,\n torrowId: string,\n options?: GetServiceOptions,\n): Promise<ServiceItem> {\n const item = await http.requestJson<ServiceItemApi>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n profileId: options?.profileId,\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n return toSdkServiceItem(item);\n}\n\n/** Доступные ресурсы группы для шага «Ресурс» — `POST /api/v1/services/{serviceId}/resources`. */\nexport function getServiceResources(\n http: HttpClient,\n serviceId: string,\n body: SearchServiceResourcesReq,\n options?: { signal?: AbortSignal },\n): Promise<ResourceView[]> {\n return http.requestJson<ResourceView[]>({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/resources`,\n body,\n signal: options?.signal,\n });\n}\n\n/**\n * Расчёт доступности записи — `POST /api/v1/services/{id}/checkinschedule`.\n * `type: \"FreeTimeSlots\"` возвращает выбираемые свободные слоты; `AsIs` — исходные периоды нагрузки.\n */\nexport function getCheckInSchedule(\n http: HttpClient,\n serviceId: string,\n body: GetCheckInScheduleReq,\n options?: { signal?: AbortSignal },\n): Promise<GetCheckInScheduleResp> {\n return http.requestJson<GetCheckInScheduleResp>({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/checkinschedule`,\n body,\n signal: options?.signal,\n });\n}\n\n/**\n * Заказ услуги (запись) — `POST /api/v1/services/{serviceId}/order`. Тело и отказы —\n * как у `ServicesFacade.createOrder`; гостю в ответе приходит `consumerSecurityToken`.\n */\nexport function createOrder(\n http: HttpClient,\n serviceId: string,\n body: CreateOrderReq,\n options?: { signal?: AbortSignal },\n): Promise<OrderResp> {\n return http.requestJson<OrderResp>({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/order`,\n body,\n signal: options?.signal,\n });\n}\n","import { TorrowSdkEffectState, TorrowSdkError, TorrowSdkErrorCategory, TorrowSdkErrorDomain, TorrowSdkRequestState } from \"../../http/TorrowSdkError.js\";\nimport { BehaviorSettingsFailureAt, BehaviorSettingsOperation, behaviorSettingsError, contextualizeBehaviorError, isBehaviorCasRefusal } from \"../common/behavior-settings-errors.js\";\nimport type { TorrowObjectDto } from \"../../schema/openapi-dto-aliases.js\";\nimport {\n assertBehaviorPermission, isBehaviorVersion,\n mergeBehaviorSettings, normalizeBehaviorInput, readBehaviorSettings,\n validateBehaviorResponse,\n type ServiceBehaviorSettingsState, type ServiceBehaviorSettingsUpdateOptions,\n type ServiceBehaviorSettingsUpdateResult,\n} from \"./behavior-settings.js\";\nimport type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount, unwrapTimetableStatisticsList } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type { CaseItem } from \"../cases/types.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport {\n mergeServiceImplicitTags,\n} from \"../common/implicit-tag-params.js\";\nimport {\n createOrder,\n getCheckInSchedule,\n getService,\n getServiceResources,\n toSdkServiceItem,\n type GetServiceOptions,\n} from \"./service-requests.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n ChangeOrderServiceReq,\n CreateOrderReq,\n DeleteResponse,\n GetCheckInScheduleReq,\n GetCheckInScheduleResp,\n GetReCheckInScheduleReq,\n GetServiceWorkloadInfoRequest,\n GetServiceWorkloadInfoResp,\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n OrderResp,\n ResourceView,\n SearchServiceResourcesReq,\n SearchServiceResourcesResp,\n ServiceBehaviorSettings,\n ServiceItem,\n ServiceItemApi,\n ServiceItemForCreateOrUpdate,\n TimetableCase,\n TimetableFilter,\n TimetableStatisticsResp,\n UpdateOrderInfoReq,\n UpdateOrderReq,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/services\";\n/** CRUD, personal list, booking, session/order, и социальный слой для `ServiceItem`. */\nexport class ServicesFacade extends TorrowItemFacade<ServiceItem> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.Service;\n\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** Id услуги до `create` / presigned upload. */\n generateServiceId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n private toApiServiceItem(service: ServiceItemForCreateOrUpdate): ServiceItemApi {\n const { behaviorSettings, ...rest } = service;\n const apiBase = rest as ServiceItemApi;\n const nextTags = behaviorSettings ? mergeServiceImplicitTags(apiBase.tags, behaviorSettings) : apiBase.tags;\n return {\n ...apiBase,\n tags: nextTags,\n };\n }\n\n /** `POST /api/v1/services` */\n create(\n body: ServiceItemForCreateOrUpdate,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ServiceItem> {\n const payload = applyItemCreateDefaults(body, Discriminator.ServiceItem);\n return this.http\n .requestJson<ServiceItemApi>({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: this.toApiServiceItem(payload),\n signal: options?.signal,\n })\n .then((item) => toSdkServiceItem(item));\n }\n\n /** `PUT /api/v1/services/{body.id}` */\n update(\n body: ServiceItemForCreateOrUpdate,\n options?: {\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<ServiceItem> {\n const itemId = requireItemUpdateId(body, \"Service\");\n return this.http\n .requestJson<ServiceItemApi>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n profileId: options?.profileId,\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: this.toApiServiceItem(body),\n signal: options?.signal,\n })\n .then((item) => toSdkServiceItem(item));\n }\n\n /** `DELETE /api/v1/services/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/services/{torrowId}` */\n getById(torrowId: string, options?: GetServiceOptions): Promise<ServiceItem> {\n return getService(this.http, torrowId, options);\n }\n\n /** Читает сырой OpenAPI DTO до проекции, чтобы malformed tags не маскировались парсером. */\n private async readBehaviorState(serviceId: string, options?: GetServiceOptions) {\n if (typeof serviceId !== \"string\" || !serviceId.trim()) {\n throw behaviorSettingsError(TorrowSdkErrorCategory.InvalidInput);\n }\n const value = await this.http.requestJson<ServiceItemApi>({\n method: \"GET\", path: `${BASE}/${encodePathSegment(serviceId)}`,\n query: {\n profileId: options?.profileId, versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted, includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n }, signal: options?.signal,\n });\n return validateBehaviorResponse(value, serviceId);\n }\n\n /** Один GET: версия всей услуги, предметные настройки и диагностика неполного снимка. */\n async getBehaviorSettings(serviceId: string, options?: GetServiceOptions): Promise<ServiceBehaviorSettingsState> {\n try {\n const state = await this.readBehaviorState(serviceId, options);\n return { serviceId, version: state.version, ...readBehaviorSettings(state.tags) };\n } catch (cause) {\n throw contextualizeBehaviorError(cause, BehaviorSettingsOperation.ServiceGet, BehaviorSettingsFailureAt.ReadCurrent);\n }\n }\n\n /**\n * GET → локальный patch → PUT /tags с необязательной проверкой версии; автоматического readback нет.\n * mergeParameters=true сохраняет пропущенные поля, false заменяет все настройки.\n * Порядок и одинаковые дубли сервер не сохраняет; no-op определяется множеством строк.\n */\n async updateBehaviorSettings(\n serviceId: string,\n settingsPatch: Partial<ServiceBehaviorSettings>,\n options: ServiceBehaviorSettingsUpdateOptions = {},\n ): Promise<ServiceBehaviorSettingsUpdateResult> {\n return this.writeBehaviorSettings(serviceId, settingsPatch, options, BehaviorSettingsOperation.ServiceUpdate);\n }\n\n /** Общий алгоритм двух публичных операций; контекст и эффект принадлежат только текущему вызову. */\n private async writeBehaviorSettings(\n serviceId: string, settingsPatch: Partial<ServiceBehaviorSettings>,\n options: ServiceBehaviorSettingsUpdateOptions, operation: BehaviorSettingsOperation,\n ): Promise<ServiceBehaviorSettingsUpdateResult> {\n let failureAt = BehaviorSettingsFailureAt.ValidateInput;\n let effect = TorrowSdkEffectState.NotApplied;\n try {\n // Вход проверяется до первого внешнего эффекта; указанная версия должна быть корректной.\n if (!options || (options.versionToCheck !== undefined && !isBehaviorVersion(options.versionToCheck)) ||\n (Object.hasOwn(options, \"checkVersion\") && options.checkVersion !== true) ||\n (Object.hasOwn(options, \"mergeParameters\") && typeof options.mergeParameters !== \"boolean\") ||\n (options.isNeedAnnouncement != null && typeof options.isNeedAnnouncement !== \"boolean\") ||\n Object.keys(options).some(key => ![\"versionToCheck\", \"checkVersion\", \"mergeParameters\", \"profileId\", \"securityToken\", \"isNeedAnnouncement\", \"signal\"].includes(key))) {\n throw behaviorSettingsError(TorrowSdkErrorCategory.InvalidInput);\n }\n const normalized = normalizeBehaviorInput(settingsPatch);\n // Фиксируем CAS и опции до await: изменение объекта вызывающим кодом не меняет условие PUT.\n options = { ...options };\n failureAt = BehaviorSettingsFailureAt.ReadCurrent;\n const state = await this.readBehaviorState(serviceId, {\n profileId: options.profileId, securityToken: options.securityToken, signal: options.signal,\n });\n failureAt = BehaviorSettingsFailureAt.PrepareWrite;\n assertBehaviorPermission(state.operations);\n if (options.versionToCheck !== undefined && state.version !== options.versionToCheck) {\n throw behaviorSettingsError(TorrowSdkErrorCategory.VersionConflict);\n }\n const tags = mergeBehaviorSettings(state.tags, normalized, options.mergeParameters ?? true);\n const projected = readBehaviorSettings(tags);\n const unchanged = tags.length === state.tags.length && tags.every(tag => state.tags.includes(tag));\n if (unchanged) return { serviceId, version: state.version, ...projected, changed: false };\n\n failureAt = BehaviorSettingsFailureAt.WriteSettings;\n let result: TorrowObjectDto;\n let dispatched = false;\n try {\n result = await this.http.requestJson<TorrowObjectDto>({\n method: \"PUT\", path: `${BASE}/${encodePathSegment(serviceId)}/tags`,\n query: { versionToCheck: options.versionToCheck ?? (options.checkVersion ? state.version : undefined), isNeedAnnouncement: options.isNeedAnnouncement ?? false },\n body: tags, signal: options.signal,\n }, () => { dispatched = true; });\n } catch (cause) {\n effect = dispatched ? TorrowSdkEffectState.Unknown : TorrowSdkEffectState.NotApplied;\n const error = contextualizeBehaviorError(cause, operation, failureAt, effect).withContext({\n request: dispatched ? TorrowSdkRequestState.Started : TorrowSdkRequestState.NotStarted,\n });\n if (dispatched && isBehaviorCasRefusal(error)) {\n effect = TorrowSdkEffectState.NotApplied;\n throw error.withContext({ category: TorrowSdkErrorCategory.VersionConflict,\n detail: { domain: TorrowSdkErrorDomain.BehaviorSettings } });\n }\n throw error;\n }\n effect = TorrowSdkEffectState.Unknown;\n failureAt = BehaviorSettingsFailureAt.ValidateWriteResponse;\n if (!result || result.id !== serviceId || !isBehaviorVersion(result.meta?.version)) {\n throw new TorrowSdkError({ category: TorrowSdkErrorCategory.InvalidResponse, request: TorrowSdkRequestState.Started,\n detail: { domain: TorrowSdkErrorDomain.BehaviorSettings },\n sensitive: { body: result } });\n }\n return { serviceId, version: result.meta.version, ...projected, changed: true };\n } catch (cause) {\n throw contextualizeBehaviorError(cause, operation, failureAt, effect);\n }\n }\n\n /** Полная замена: пропущенные поля очищаются, посторонние данные сохраняются. */\n setBehaviorSettings(\n serviceId: string,\n settings: ServiceBehaviorSettings,\n options: Omit<ServiceBehaviorSettingsUpdateOptions, \"mergeParameters\"> = {},\n ): Promise<ServiceBehaviorSettingsUpdateResult> {\n return this.writeBehaviorSettings(serviceId, settings, { ...options, mergeParameters: false }, BehaviorSettingsOperation.ServiceSet);\n }\n\n /**\n * Запись на услугу — `POST /api/v1/services/{serviceId}/order`.\n * Минимум в теле: непустой смысл в `checkInProperties` (слот, участник, контакты — по правилам услуги и OpenAPI).\n * Успех: `OrderResp` (часто интересен `order` как кейс и `consumerSecurityToken` для гостевого доступа).\n * Типичные отказы: нет слота, услуга недоступна по времени, подписка/баланс — разбирай тело `TorrowSdkError` (`name` / `code`); эталон UX — `torrow-apps` `CreateOrderTask`.\n */\n createOrder(\n serviceId: string,\n body: CreateOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<OrderResp> {\n return createOrder(this.http, serviceId, body, options);\n }\n\n /**\n * События/заказы и занятость услуги — `PUT /api/v1/services/{serviceId}/timetable`.\n * Не вычисляет свободные слоты записи: для них используй `getCheckInSchedule` с `type: \"FreeTimeSlots\"`.\n */\n getTimetable(\n serviceId: string,\n body: TimetableFilter,\n options?: TimetableQueryOptions & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /**\n * Нагрузка и расписание по ресурсам услуги — `PUT /api/v1/services/workloadinfo`.\n * Эталон: torrow-apps `ServiceItemService.getWorkloadInfo`, экран заказов по ресурсам (`service-resource-orders`).\n */\n getWorkloadInfo(\n body: GetServiceWorkloadInfoRequest,\n options?: { signal?: AbortSignal },\n ): Promise<GetServiceWorkloadInfoResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/workloadinfo`,\n body,\n signal: options?.signal,\n });\n }\n\n /** Агрегаты по расписанию услуги — `POST /api/v1/services/timetable/statistics`. */\n async getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableStatisticsResp[]> {\n const resp = await this.http.requestJson<GetTimetableStatisticsResponse>({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n return unwrapTimetableStatisticsList(resp);\n }\n\n /**\n * Расчёт доступности записи — `POST /api/v1/services/{id}/checkinschedule`.\n * `type: \"FreeTimeSlots\"` возвращает выбираемые свободные слоты; `AsIs` — исходные периоды нагрузки.\n */\n getCheckInSchedule(\n serviceId: string,\n body: GetCheckInScheduleReq,\n options?: { signal?: AbortSignal },\n ): Promise<GetCheckInScheduleResp> {\n return getCheckInSchedule(this.http, serviceId, body, options);\n }\n\n /** Пересчёт расписания чекина — `PUT /api/v1/services/{id}/recheckinschedule`. */\n getReCheckInSchedule(\n serviceId: string,\n body: GetReCheckInScheduleReq,\n options?: { signal?: AbortSignal },\n ): Promise<GetCheckInScheduleResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/recheckinschedule`,\n body,\n signal: options?.signal,\n });\n }\n\n /** Доступные ресурсы группы для шага «Ресурс» — `POST /api/v1/services/{serviceId}/resources`. */\n getServiceResources(\n serviceId: string,\n body: SearchServiceResourcesReq,\n options?: { signal?: AbortSignal },\n ): Promise<ResourceView[]> {\n return getServiceResources(this.http, serviceId, body, options);\n }\n\n /**\n * Ресурсы с детализацией (в т.ч. гарантированные количества) — `POST .../resourceswithdetalization`.\n * Удобно для виджетов с лимитами мест / «осталось N».\n */\n getServiceResourcesWithDetalization(\n serviceId: string,\n body: SearchServiceResourcesReq,\n options?: { signal?: AbortSignal },\n ): Promise<SearchServiceResourcesResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/resourceswithdetalization`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/services/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<ServiceItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http\n .requestJson<ServiceItemApi[]>({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n })\n .then((items) => items.map((item) => toSdkServiceItem(item)));\n }\n\n /** `POST /api/v1/services/{serviceId}/session` — создать сессию записи (тело `CaseItem`). */\n createSession(\n serviceId: string,\n body: CaseItem,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/session`,\n query: { profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/services/{serviceId}/session` — получить/обновить сессию по `caseId`. */\n refreshSession(\n serviceId: string,\n options?: { caseId?: string | null; profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/session`,\n query: { caseId: options?.caseId, profileId: options?.profileId },\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/services/{serviceId}/updateorder` */\n patchUpdateOrder(\n serviceId: string,\n body: UpdateOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(serviceId)}/updateorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/services/{serviceId}/updateorder2` */\n patchUpdateOrder2(\n serviceId: string,\n body: UpdateOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(serviceId)}/updateorder2`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/services/{serviceId}/changeorderservice` */\n changeOrderService(\n serviceId: string,\n body: ChangeOrderServiceReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/changeorderservice`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/services/{serviceId}/updateorderinfo` */\n patchUpdateOrderInfo(\n serviceId: string,\n body: UpdateOrderInfoReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(serviceId)}/updateorderinfo`,\n body,\n signal: options?.signal,\n });\n }\n}\n","/**\n * UTF-8 → Base64 без Node-only `Buffer` (браузер + Node 18+ `btoa`).\n */\nexport function utf8ToBase64(value: string): string {\n const bytes = new TextEncoder().encode(value);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n return btoa(binary);\n}\n","import { HttpClient } from \"../../http/HttpClient.js\";\nimport type { ResolvedTorrowClientConfig } from \"../../TorrowClientConfig.js\";\nimport { utf8ToBase64 } from \"../../util/base64.js\";\nimport type {\n CreateAuthSessionReq,\n CreateAuthSessionResp,\n RefreshReq,\n RevokeReq,\n SendCodeReq,\n SendCodeResp,\n TokenReq,\n TokenResp,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/auth\";\n\nfunction authFacadeDefaultHeaders(config: ResolvedTorrowClientConfig): Record<string, string> | undefined {\n const merged: Record<string, string> = { ...(config.defaultHeaders ?? {}) };\n const basic = config.authIdentityBasic;\n if (basic?.username && basic.password !== undefined && basic.password !== \"\") {\n merged.Authorization = `Basic ${utf8ToBase64(`${basic.username}:${basic.password}`)}`;\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\n/**\n * **AuthIdentity** (`/api/v1/auth/*`): выдача и обновление токенов, сессия, код.\n *\n * Все методы ходят через **отдельный** {@link HttpClient} **без** `getAccessToken`, чтобы вызовы вроде\n * **`refresh`** не зацикливались на Bearer основного **`TorrowClient`**. При необходимости шлюза\n * подставляется **HTTP Basic** из **`config.authIdentityBasic`** (`AuthIdentityBasic`;\n * см. {@link TorrowClientConfig.authIdentityBasic}).\n */\nexport class AuthFacade {\n private readonly anonHttp: HttpClient;\n\n constructor(config: ResolvedTorrowClientConfig) {\n this.anonHttp = new HttpClient({\n baseUrl: config.baseUrl,\n fetch: config.fetch,\n defaultHeaders: authFacadeDefaultHeaders(config),\n userAgent: config.userAgent,\n });\n }\n\n /** `POST /api/v1/auth/refresh` — новая пара токенов по `refreshToken`. */\n refresh(body: RefreshReq, options?: { signal?: AbortSignal }): Promise<TokenResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/refresh`,\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `POST /api/v1/auth/token` — обмен `sessionId` / `code` на `TokenResp` (смотри `status`).\n * `body.splitTokens: false` — полные токены в JSON (Node, MCP, интеграционные ключи).\n * `true` — сервер возвращает части токенов в JSON и HttpOnly cookies;\n * приложение обеспечивает передачу cookies, SDK не управляет ими и не восстанавливает токены.\n * Подробности и выбор режима — в README `@torrow/sdk-auth`, раздел «Когда использовать splitTokens».\n */\n requestToken(body: TokenReq, options?: { signal?: AbortSignal }): Promise<TokenResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/token`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/auth/revoke` — инвалидация refresh (тело `RevokeReq`). */\n revoke(body: RevokeReq, options?: { signal?: AbortSignal }): Promise<void> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/revoke`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/auth/sendcode` — отправка кода входа; ответ `SendCodeResp` (`usedMethod`, `codeLength`, …). */\n sendCode(body: SendCodeReq, options?: { signal?: AbortSignal }): Promise<SendCodeResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/sendcode`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/auth/session` — создание сессии аутентификации. */\n createSession(\n body: CreateAuthSessionReq,\n options?: { signal?: AbortSignal },\n ): Promise<CreateAuthSessionResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/session`,\n body,\n signal: options?.signal,\n });\n }\n}\n","/**\n * Field normalizations mirror `ContactsFacade.withCreateDefaults` / `update`, plus profile-only\n * `name` fill (server rejects null Name/VisitCard on profile POSTs). Not used by\n * `contacts.create`/`update` — those must not auto-fill `name`. Do not “DRY into contacts”\n * unless both domains need the same behavior change.\n */\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { normalizeContactCommunicationsForWrite } from \"../contacts/contact-communications-write-defaults.js\";\nimport { normalizeContactStructuredArrayRidsForWrite } from \"../contacts/contact-structured-array-rids.js\";\nimport { normalizeContactVisitCardFieldsForWrite } from \"../contacts/contact-visit-card-fields.js\";\nimport type { ContactItemForCreateOrUpdate } from \"../contacts/types.js\";\nimport type { UserProfileItemForAdd } from \"./types.js\";\n\ntype UserProfileItemForAddWithDiscriminator = UserProfileItemForAdd & {\n discriminator?: string;\n};\n\nfunction trimNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\n/** Empty/whitespace `name` → FIO parts → string `company` → `\"Profile\"`. */\nexport function ensureContactNameForProfileWrite(body: ContactItemForCreateOrUpdate): void {\n if (trimNonEmptyString(body.name) !== undefined) {\n return;\n }\n const fromParts = [body.lastName, body.firstName, body.middleName]\n .map((p) => (typeof p === \"string\" ? p.trim() : \"\"))\n .filter(Boolean)\n .join(\" \");\n body.name = fromParts || trimNonEmptyString(body.company) || \"Profile\";\n}\n\n/**\n * Prep for `POST /api/v1/user/profiles` and `POST /api/v1/user/defaultprofile`.\n * Order: create defaults → name fill → contact field normalizations (VisitCard last among them).\n *\n * Shallow-copies `body` (top-level keys like `name` / `discriminator` are not written back\n * onto the caller object). Nested arrays/objects (`communications`, `visitCard`, …) may still\n * be mutated in place by contact write normalizers — same pattern as `contacts.create`.\n */\nexport function prepareUserProfileItemForAdd(body: UserProfileItemForAdd): UserProfileItemForAdd {\n const payload = applyItemCreateDefaults<UserProfileItemForAdd>(\n body as UserProfileItemForAddWithDiscriminator,\n Discriminator.ContactItem,\n );\n ensureContactNameForProfileWrite(payload);\n normalizeContactStructuredArrayRidsForWrite(payload);\n normalizeContactCommunicationsForWrite(payload);\n normalizeContactVisitCardFieldsForWrite(payload);\n return payload;\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n unwrapAddProfileContact,\n unwrapRemoveProfileList,\n unwrapTorrowObjectFromProfilePropertiesUpdate,\n} from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type {\n AddProfileResp,\n ProfileListResp,\n ProfileProperties,\n RemoveProfileResp,\n UpdateProfilePropertiesResp,\n UserProfileItemForAdd,\n} from \"./types.js\";\nimport type { ContactItem } from \"../contacts/types.js\";\nimport type { TorrowObject } from \"../common/torrow-entities.js\";\nimport { prepareUserProfileItemForAdd } from \"./user-profile-write-defaults.js\";\n\nconst BASE = \"/api/v1/user/profiles\";\n\n/**\n * **Профили пользователя** Torrow: `ContactItem`, привязанные к учётной записи (`profileType`, напр. `MyProfile`).\n * REST раздел **User**, не домен `/api/v1/contacts`.\n */\nexport class ProfilesFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `GET /api/v1/user/profiles` — список Профилей текущего пользователя.\n * Возвращает **`profileList`** из ответа API (пустой массив, если поля нет или **`null`**).\n * @throws Если тело ответа не объект или **`profileList`** не массив при наличии поля.\n */\n async list(options?: { signal?: AbortSignal }): Promise<ContactItem[]> {\n const resp = await this.http.requestJson<ProfileListResp>({ method: \"GET\", path: BASE, signal: options?.signal });\n if (resp === null || typeof resp !== \"object\") {\n throw new Error(\"GET /api/v1/user/profiles: expected a JSON object body\");\n }\n const pl = resp.profileList;\n if (pl === undefined || pl === null) return [];\n if (!Array.isArray(pl)) {\n throw new Error(\"GET /api/v1/user/profiles: profileList must be an array when present\");\n }\n return pl as ContactItem[];\n }\n\n /**\n * `POST /api/v1/user/profiles` — создать Профиль по телу **`UserProfileItemForAdd`** (контакт для write + поля Профиля).\n * Тело перед POST проходит через {@link prepareUserProfileItemForAdd}.\n * Возвращает созданный **`ContactItem`** (`AddProfileResp.profile`).\n */\n async add(body: UserProfileItemForAdd, options?: { signal?: AbortSignal }): Promise<ContactItem> {\n const payload = prepareUserProfileItemForAdd(body);\n const resp = await this.http.requestJson<AddProfileResp>({\n method: \"POST\",\n path: BASE,\n body: payload,\n signal: options?.signal,\n });\n return unwrapAddProfileContact(resp) as ContactItem;\n }\n\n /**\n * `PUT /api/v1/user/profiles` — в OpenAPI тело **JSON-строка** (id существующего контакта), не объект.\n * Добавляет этот контакт как Профиль; возвращает **`ContactItem`** (`AddProfileResp.profile`).\n */\n async addByContactId(contactId: string, options?: { signal?: AbortSignal }): Promise<ContactItem> {\n const resp = await this.http.requestJson<AddProfileResp>({\n method: \"PUT\",\n path: BASE,\n body: contactId,\n signal: options?.signal,\n });\n return unwrapAddProfileContact(resp) as ContactItem;\n }\n\n /**\n * `PUT /api/v1/user/profiles/{profileId}/profileproperties` — обновить расширенные свойства Профиля\n * (цвет, доступность и т.д., см. тип `ProfileProperties`).\n * Возвращает **`torrowObject`** из ответа (если сервер его прислал).\n */\n async updateProfileProperties(\n profileId: string,\n body: ProfileProperties,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject | undefined> {\n const resp = await this.http.requestJson<UpdateProfilePropertiesResp>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(profileId)}/profileproperties`,\n body,\n signal: options?.signal,\n });\n return unwrapTorrowObjectFromProfilePropertiesUpdate(resp) as TorrowObject | undefined;\n }\n\n /** `DELETE /api/v1/user/profiles/{profileId}` — удалить Профиль; возвращает актуальный **`personalContactList`**. */\n async remove(profileId: string, options?: { signal?: AbortSignal }): Promise<ContactItem[]> {\n const resp = await this.http.requestJson<RemoveProfileResp>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(profileId)}`,\n signal: options?.signal,\n });\n return unwrapRemoveProfileList(resp) as ContactItem[];\n }\n}\n","import { getTorrowItemDomainFromTorrowIds } from \"../common/item-type-resolver.js\";\nimport type { TorrowItemDomain } from \"../common/item-type.js\";\nimport type { ViewOrderInput } from \"./types.js\";\n\nexport function getCreateViewDomain(childIds: readonly string[]): TorrowItemDomain {\n return getTorrowItemDomainFromTorrowIds(childIds);\n}\n\nexport function getUpdateViewOrderDomain(\n orderedViews: readonly ViewOrderInput[],\n): TorrowItemDomain {\n const childIds = orderedViews.flatMap(({ childId }) => childId ? [childId] : []);\n return getTorrowItemDomainFromTorrowIds(childIds);\n}\n","import { encodePathSegment } from \"../../util/path.js\";\nimport type { TorrowItemDomain } from \"../common/item-type.js\";\n\nexport function viewDomainPath(domain: TorrowItemDomain): string {\n return `/api/v1/${domain}`;\n}\n\n/** View domain задаёт тип дочернего view и не выводится из `parentId`. */\nexport function viewParentPath(domain: TorrowItemDomain, parentId: string): string {\n return `${viewDomainPath(domain)}/${encodePathSegment(parentId)}`;\n}\n\nexport function viewChildPath(\n domain: TorrowItemDomain,\n parentId: string,\n kind: \"user\" | \"pinned\",\n childId: string,\n): string {\n return `${viewParentPath(domain, parentId)}/views/${kind}/${encodePathSegment(childId)}`;\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n unwrapCreatedViewInfoList,\n unwrapDeleteCount,\n unwrapUpdatedViewInfoList,\n} from \"../common/facade-response-unwrap.js\";\nimport { getTorrowItemDomainFromTorrowId } from \"../common/item-type-resolver.js\";\nimport { getTorrowItemDomain } from \"../common/item-type.js\";\nimport type {\n CreateViewListReq,\n CreateViewListResp,\n DeleteResponse,\n TorrowItemType,\n TorrowItemView,\n TorrowItemViewByTypeMap,\n UpdateViewListOrderReq,\n UpdateViewListOrderResp,\n ViewInfo,\n ViewListQuery,\n ViewOrderInput,\n} from \"./types.js\";\nimport {\n getCreateViewDomain,\n getUpdateViewOrderDomain,\n} from \"./view-domain-resolver.js\";\nimport { viewChildPath, viewParentPath } from \"./view-paths.js\";\n\n/** Закреплённые представления (`views/pinned`). */\nexport class PinnedViewsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Возвращает закреплённые представления дочерних элементов одного типа под указанным родителем.\n *\n * `childItemType` задаёт `{domain}` и тип элементов в результате. Это тип дочернего\n * элемента, а не родителя: один `parentId` может содержать представления разных типов,\n * поэтому вывести этот параметр из `parentId` нельзя.\n *\n * @param childItemType Тип дочерних элементов, представления которых нужно получить.\n * @param parentId ID родительского объекта, под которым размещены элементы.\n */\n listForParent<T extends TorrowItemType>(\n childItemType: T,\n parentId: string,\n options?: ViewListQuery & { signal?: AbortSignal },\n ): Promise<TorrowItemViewByTypeMap[T][]> {\n const { signal, ...query } = options ?? {};\n const domain = getTorrowItemDomain(childItemType);\n return this.http.requestJson({\n method: \"GET\",\n path: `${viewParentPath(domain, parentId)}/views/pinned`,\n query: { ...query },\n signal,\n });\n }\n\n /**\n * Создаёт закреплённые представления дочерних элементов под родителем.\n * `{domain}` определяется по `childIds`; все ID должны относиться к одному типу элементов.\n */\n async create(\n parentId: string,\n childIds: readonly string[],\n options?: { signal?: AbortSignal },\n ): Promise<ViewInfo[]> {\n const domain = getCreateViewDomain(childIds);\n const body: CreateViewListReq = { childIdList: [...childIds] };\n const resp = await this.http.requestJson<CreateViewListResp>({\n method: \"POST\",\n path: `${viewParentPath(domain, parentId)}/views/pinned`,\n body,\n signal: options?.signal,\n });\n return unwrapCreatedViewInfoList(resp);\n }\n\n /**\n * Возвращает закреплённое представление дочернего элемента.\n * `{domain}` определяется по `childId`, а не по `parentId`.\n */\n get(\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItemView> {\n const domain = getTorrowItemDomainFromTorrowId(childId);\n return this.http.requestJson({\n method: \"GET\",\n path: viewChildPath(domain, parentId, \"pinned\", childId),\n signal: options?.signal,\n });\n }\n\n /**\n * Удаляет закреплённое представление дочернего элемента.\n * `{domain}` определяется по `childId`, а не по `parentId`.\n */\n async delete(\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<number> {\n const domain = getTorrowItemDomainFromTorrowId(childId);\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: viewChildPath(domain, parentId, \"pinned\", childId),\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /**\n * Изменяет порядок закреплённых представлений одного типа под родителем.\n * `{domain}` определяется по `orderedViews[].childId`; все ID должны иметь один тип.\n */\n async updateOrder(\n parentId: string,\n orderedViews: readonly ViewOrderInput[],\n options?: { signal?: AbortSignal },\n ): Promise<ViewInfo[]> {\n const domain = getUpdateViewOrderDomain(orderedViews);\n const body: UpdateViewListOrderReq = { orderedViewList: [...orderedViews] };\n const resp = await this.http.requestJson<UpdateViewListOrderResp>({\n method: \"POST\",\n path: `${viewParentPath(domain, parentId)}/views/pinned/updateorder`,\n body,\n signal: options?.signal,\n });\n return unwrapUpdatedViewInfoList(resp);\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n unwrapCreatedViewInfoList,\n unwrapDeleteCount,\n unwrapUpdatedViewInfoList,\n} from \"../common/facade-response-unwrap.js\";\nimport { getTorrowItemDomainFromTorrowId } from \"../common/item-type-resolver.js\";\nimport { getTorrowItemDomain } from \"../common/item-type.js\";\nimport type {\n CreateViewListReq,\n CreateViewListResp,\n DeleteResponse,\n TorrowItemType,\n TorrowItemView,\n TorrowItemViewByTypeMap,\n UpdateViewListOrderReq,\n UpdateViewListOrderResp,\n ViewInfo,\n ViewListQuery,\n ViewListRootQuery,\n ViewOrderInput,\n} from \"./types.js\";\nimport {\n getCreateViewDomain,\n getUpdateViewOrderDomain,\n} from \"./view-domain-resolver.js\";\nimport { viewChildPath, viewDomainPath, viewParentPath } from \"./view-paths.js\";\n\n/** Персональные представления текущего пользователя (`views/user`). */\nexport class UserViewsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Возвращает персональные представления дочерних элементов одного типа под родителем.\n *\n * `childItemType` задаёт `{domain}` и тип элементов в результате. Это тип дочернего\n * элемента, а не родителя: один `parentId` может содержать представления разных типов,\n * поэтому вывести этот параметр из `parentId` нельзя.\n *\n * @param childItemType Тип дочерних элементов, представления которых нужно получить.\n * @param parentId ID родительского объекта, под которым размещены элементы.\n */\n listForParent<T extends TorrowItemType>(\n childItemType: T,\n parentId: string,\n options?: ViewListQuery & { signal?: AbortSignal },\n ): Promise<TorrowItemViewByTypeMap[T][]> {\n const { signal, ...query } = options ?? {};\n const domain = getTorrowItemDomain(childItemType);\n return this.http.requestJson({\n method: \"GET\",\n path: `${viewParentPath(domain, parentId)}/views/user`,\n query: { ...query },\n signal,\n });\n }\n\n /**\n * Создаёт персональные представления дочерних элементов под родителем.\n * `{domain}` определяется по `childIds`; все ID должны относиться к одному типу элементов.\n */\n async create(\n parentId: string,\n childIds: readonly string[],\n options?: { signal?: AbortSignal },\n ): Promise<ViewInfo[]> {\n const domain = getCreateViewDomain(childIds);\n const body: CreateViewListReq = { childIdList: [...childIds] };\n const resp = await this.http.requestJson<CreateViewListResp>({\n method: \"POST\",\n path: `${viewParentPath(domain, parentId)}/views/user`,\n body,\n signal: options?.signal,\n });\n return unwrapCreatedViewInfoList(resp);\n }\n\n /**\n * Возвращает все персональные представления дочерних элементов указанного типа.\n * `viewItemType` задаёт `{domain}` и тип элементов в результате.\n */\n listAll<T extends TorrowItemType>(\n viewItemType: T,\n options?: ViewListRootQuery & { signal?: AbortSignal },\n ): Promise<TorrowItemViewByTypeMap[T][]> {\n const { signal, ...query } = options ?? {};\n const domain = getTorrowItemDomain(viewItemType);\n return this.http.requestJson({\n method: \"GET\",\n path: `${viewDomainPath(domain)}/views/user`,\n query: { ...query },\n signal,\n });\n }\n\n /**\n * Возвращает персональное представление дочернего элемента.\n * `{domain}` определяется по `childId`, а не по `parentId`.\n */\n get(\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItemView> {\n const domain = getTorrowItemDomainFromTorrowId(childId);\n return this.http.requestJson({\n method: \"GET\",\n path: viewChildPath(domain, parentId, \"user\", childId),\n signal: options?.signal,\n });\n }\n\n /**\n * Удаляет персональное представление дочернего элемента.\n * `{domain}` определяется по `childId`, а не по `parentId`.\n */\n async delete(\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<number> {\n const domain = getTorrowItemDomainFromTorrowId(childId);\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: viewChildPath(domain, parentId, \"user\", childId),\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /**\n * Изменяет порядок персональных представлений одного типа под родителем.\n * `{domain}` определяется по `orderedViews[].childId`; все ID должны иметь один тип.\n */\n async updateOrder(\n parentId: string,\n orderedViews: readonly ViewOrderInput[],\n options?: { signal?: AbortSignal },\n ): Promise<ViewInfo[]> {\n const domain = getUpdateViewOrderDomain(orderedViews);\n const body: UpdateViewListOrderReq = { orderedViewList: [...orderedViews] };\n const resp = await this.http.requestJson<UpdateViewListOrderResp>({\n method: \"POST\",\n path: `${viewParentPath(domain, parentId)}/views/user/updateorder`,\n body,\n signal: options?.signal,\n });\n return unwrapUpdatedViewInfoList(resp);\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n getTorrowItemDomainFromTorrowId,\n getTorrowItemTypeFromTorrowId,\n} from \"../common/item-type-resolver.js\";\nimport { getTorrowItemDomain } from \"../common/item-type.js\";\nimport type { ObjectInfo } from \"./types.js\";\nimport { PinnedViewsFacade } from \"./PinnedViewsFacade.js\";\nimport { UserViewsFacade } from \"./UserViewsFacade.js\";\nimport { viewChildPath } from \"./view-paths.js\";\n\n/**\n * Представления дочерних элементов под родителем.\n * CRUD разделён на {@link UserViewsFacade} и {@link PinnedViewsFacade}; здесь остаются переходы между ними.\n */\nexport class ViewsFacade {\n readonly user: UserViewsFacade;\n readonly pinned: PinnedViewsFacade;\n\n constructor(private readonly http: HttpClient) {\n this.user = new UserViewsFacade(http);\n this.pinned = new PinnedViewsFacade(http);\n }\n\n /**\n * `POST /api/v1/{domain}/{parentId}/views/user/{childId}/pin` — переход **User → Pinned**.\n * Создание исходной User view: `client.views.user.create` или `client.relations.saveToMindMap`.\n */\n pin(\n parentId: string,\n childId: string,\n options?: { alias?: string | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n const { signal, alias } = options ?? {};\n const domain = getTorrowItemDomainFromTorrowId(childId);\n return this.http.requestJson({\n method: \"POST\",\n path: `${viewChildPath(domain, parentId, \"user\", childId)}/pin`,\n query: { alias },\n signal,\n });\n }\n\n /**\n * Переход **Pinned → User**. Для `contacts` API использует сегмент `pinned`, для остальных доменов — `user`.\n */\n unpin(\n parentId: string,\n childId: string,\n options?: { alias?: string | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n const { signal, alias } = options ?? {};\n const itemType = getTorrowItemTypeFromTorrowId(childId);\n const domain = getTorrowItemDomain(itemType);\n const kind = itemType === \"Contact\" ? \"pinned\" : \"user\";\n return this.http.requestJson({\n method: \"POST\",\n path: `${viewChildPath(domain, parentId, kind, childId)}/unpin`,\n query: { alias },\n signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { TorrowItemDto } from \"../common/dto.js\";\nimport type { CaseView, CalendarView, ContactView, NoteView, ServiceView } from \"../views/types.js\";\nimport type { ResourceView } from \"../services/types.js\";\nimport type {\n AdvisedItemsSearchQuery,\n ContactSearchQuery,\n OrderFilter,\n OrderSearchQuery,\n ItemTextSearchQuery,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/search\";\n\n/**\n * Поиск по API (**OpenAPI** тег **Search**): рекомендации, текстовый поиск по типам элементов,\n * фильтруемый список заказов под родителем.\n *\n * Текстовые `contacts` / `notes` / `calendars` / `cases` / `resources` / `services` —\n * в выдаче только **`PublicAvailable`** / **`PublicWithRequest`**\n * (`Personal` / `Private` / `Link` — нет). Смена: **`updatePublicity`**.\n * Таблица: **`docs/agents/participation-flow.md`** §3.\n */\nexport class SearchFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/search/adviseditems` — `NearLocation` (гео) / `Recommendation`. */\n advisedItems(\n query?: AdvisedItemsSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItemDto[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/adviseditems`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/search/{torrowId}/orders` — заказы (события-заказы) под элементом с фильтром.\n * Тело **`OrderFilter`**; см. также **`examples/node/raw/search-orders-raw.ts`** (сырой `raw.put`).\n */\n orders(\n torrowId: string,\n body: OrderFilter,\n query?: OrderSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<CaseView[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/orders`,\n query: { ...(query ?? {}) },\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/contacts` — текстовый поиск контактов.\n * Индексируются только **`PublicAvailable`** / **`PublicWithRequest`** (см. class JSDoc).\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps —\n * «поиск в группе» / `SearchInGroup`). Канонический способ получить элементы группы;\n * не путать с `contacts.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` / смены publicity индекс асинхронный — в примерах нужна пауза перед вызовом.\n * Доп. фильтр: **`usersOnly`** (`ContactSearchQuery`).\n */\n contacts(\n query?: ContactSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ContactView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/contacts`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/notes` — текстовый поиск заметок.\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps так устроен\n * «поиск в группе» / `SearchInGroup`). Это канонический способ получить элементы группы;\n * не путать с `notes.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` индекс асинхронный — в примерах нужна пауза перед вызовом.\n */\n notes(query?: ItemTextSearchQuery, options?: { signal?: AbortSignal }): Promise<NoteView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/notes`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/calendars` — текстовый поиск календарей.\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps —\n * «поиск в группе» / `SearchInGroup`). Канонический способ получить элементы группы;\n * не путать с `calendars.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` индекс асинхронный — в примерах нужна пауза перед вызовом.\n */\n calendars(\n query?: ItemTextSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<CalendarView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/calendars`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/cases` — текстовый поиск дел/событий.\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps —\n * «поиск в группе» / `SearchInGroup`). Канонический способ получить элементы группы;\n * не путать с `cases.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` индекс асинхронный — в примерах нужна пауза перед вызовом.\n */\n cases(query?: ItemTextSearchQuery, options?: { signal?: AbortSignal }): Promise<CaseView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/cases`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/resources` — текстовый поиск ресурсов.\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps —\n * «поиск в группе» / `SearchInGroup`). Канонический способ получить элементы группы;\n * не путать с `resourceItems.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` индекс асинхронный — в примерах нужна пауза перед вызовом.\n */\n resources(\n query?: ItemTextSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ResourceView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/resources`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/search/services` — текстовый поиск услуг.\n * **`groupIds`**: ограничить выдачу членами указанных групп (в torrow-apps —\n * «поиск в группе» / `SearchInGroup`). Канонический способ получить элементы группы;\n * не путать с `services.listGroups` (`GET …/group/list` — группы родителя, доступные для включения дочерних).\n * После `includeToGroups` индекс асинхронный — в примерах нужна пауза перед вызовом.\n */\n services(\n query?: ItemTextSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ServiceView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/services`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type { ActionHistoryInfo, ActionHistoryListQuery } from \"./types.js\";\n\nconst BASE = \"/api/v1/actionhistory\";\n\n/** История действий пользователя/системы (OpenAPI tag `ActionHistory`). */\nexport class ActionHistoryFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `GET /api/v1/actionhistory`.\n * Query: {@link ActionHistoryListQuery} — на шлюзе нужен непустой `language`;\n * `itemIds` фильтрует по элементам (без него — лента пользователя).\n */\n list(\n query?: ActionHistoryListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ActionHistoryInfo[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: BASE,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { DeleteResponse } from \"../contacts/types.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type {\n AccountingTransaction,\n AccountingTransactionState,\n AccountingTransactionsListQuery,\n BalanceValue,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/accountingtransactions\";\n\n/**\n * Учётные транзакции (**OpenAPI** **AccountingTransaction**): CRUD, смена состояния, баланс, список транзакций.\n */\nexport class AccountingTransactionsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/accountingtransactions` */\n create(\n transaction: AccountingTransaction,\n options?: { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<AccountingTransaction> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { securityToken: options?.securityToken },\n body: transaction,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/accountingtransactions/{transaction.id}` */\n update(\n transaction: AccountingTransaction,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<AccountingTransaction> {\n const transactionId = requireItemUpdateId(transaction, \"Accounting transaction\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(transactionId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body: transaction,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/accountingtransactions/{torrowId}` */\n async delete(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /**\n * `PUT /api/v1/accountingtransactions/{torrowId}/state` — смена **`AccountingTransactionState`**\n * (в query **`state`**).\n */\n updateState(\n torrowId: string,\n state: AccountingTransactionState,\n options?: {\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<AccountingTransaction> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/state`,\n query: {\n state,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/accountingtransactions/{torrowId}/balance` */\n getBalance(\n torrowId: string,\n options?: { balanceDate?: string | null; securityToken?: string | null; signal?: AbortSignal },\n ): Promise<BalanceValue[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/balance`,\n query: {\n balanceDate: options?.balanceDate,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/accountingtransactions/{torrowId}/transactions` */\n listTransactions(\n torrowId: string,\n query?: AccountingTransactionsListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<AccountingTransaction[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/transactions`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type {\n AnnouncementInfo,\n AnnouncementsListQuery,\n TorrowObject,\n UpdateAnnouncementStateReq,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/announcements\";\n\n/**\n * Объявления (**OpenAPI** **Announcement**): список и массовое обновление состояния.\n */\nexport class AnnouncementsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `GET /api/v1/announcements`.\n * На шлюзе нужны **`language`** и **`state`/`stateList`** (иначе 500 или пустой список) —\n * см. **`AnnouncementsListQuery`** / MCP **`AnnouncementsListQuery`**.\n */\n list(query?: AnnouncementsListQuery, options?: { signal?: AbortSignal }): Promise<AnnouncementInfo[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: BASE,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/announcements/updatestate` */\n updateState(\n body: UpdateAnnouncementStateReq[],\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject[]> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/updatestate`,\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type {\n ExportGraph,\n ExportRequest,\n ImportByFileRequest,\n ImportByUniqueNameRequest,\n TorrowItem,\n} from \"./types.js\";\n\n/**\n * Экспорт / импорт графа элементов (**OpenAPI** **ExportImport**).\n */\nexport class ExportImportFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/export` */\n exportSubgraph(body: ExportRequest, options?: { signal?: AbortSignal }): Promise<ExportGraph> {\n return this.http.requestJson({\n method: \"POST\",\n path: \"/api/v1/export\",\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/import` */\n importFromFile(body: ImportByFileRequest, options?: { signal?: AbortSignal }): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: \"/api/v1/import\",\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/importbyuniquename` */\n importByUniqueName(\n body: ImportByUniqueNameRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: \"/api/v1/importbyuniquename\",\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { GenerateReportReq, GenerateReportResp } from \"./types.js\";\n\nconst BASE = \"/api/v1/reports\";\n\n/**\n * Отчёты (**OpenAPI** тег **Report**): генерация ссылки / доставка по **`GenerateReportReq`**.\n */\nexport class ReportsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `POST /api/v1/reports` — опционально **`profileId`** в query (как в Swagger).\n */\n generate(\n body: GenerateReportReq,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<GenerateReportResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/reports/{profileId}` */\n generateForProfile(\n profileId: string,\n body: GenerateReportReq,\n options?: { signal?: AbortSignal },\n ): Promise<GenerateReportResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(profileId)}`,\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type { DeleteResponse } from \"../contacts/types.js\";\nimport { unwrapDeleteCount, unwrapLoyaltySystemsStatisticsList } from \"../common/facade-response-unwrap.js\";\nimport { Discriminator } from \"../common/discriminator.js\";\nimport { applyItemCreateDefaults } from \"../common/item-create-defaults.js\";\nimport { TorrowItemCoreFacade } from \"../common/item-social-facet-base.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { LoyaltySystemPersonalListQuery } from \"../loyalty/loyalty-personal-list-query.js\";\nimport type { LoyaltyCardItem } from \"../loyalty-cards/types.js\";\nimport type {\n CreateLoyaltyCardReq,\n GetParticipationCountResp,\n GetLoyaltySystemsStatisticsReq,\n GetLoyaltySystemsStatisticsResp,\n LoyaltyParticipantsQuery,\n LoyaltySystemsStatisticsResp,\n LoyaltySystemItem,\n LoyaltySystemItemForCreateOrUpdate,\n SearchLoyaltyCardsReq,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/loyaltysystems\";\n\n/**\n * Программы лояльности (**OpenAPI** **LoyaltySystem**): CRUD, персональный список, выпуск карты, статистика.\n * Общий item-слой — {@link TorrowItemCoreFacade} (без эндпоинтов, которых нет в Swagger loyaltysystems).\n */\nexport class LoyaltySystemsFacade extends TorrowItemCoreFacade<LoyaltySystemItem, LoyaltyParticipantsQuery> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.LoyaltySystem;\n\n constructor(http: HttpClient) {\n super(http, BASE);\n }\n\n /** Id программы лояльности до `create` / presigned upload. */\n generateLoyaltySystemId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/loyaltysystems` */\n create(\n body: LoyaltySystemItemForCreateOrUpdate,\n options?: { parentId?: string | null; profileId?: string | null; signal?: AbortSignal },\n ): Promise<LoyaltySystemItem> {\n const payload = applyItemCreateDefaults(body, Discriminator.LoyaltySystemItem);\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { parentId: options?.parentId, profileId: options?.profileId },\n body: payload,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/loyaltysystems/{body.id}` */\n update(\n body: LoyaltySystemItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltySystemItem> {\n const itemId = requireItemUpdateId(body, \"Loyalty system\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltysystems/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/loyaltysystems/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildItems?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltySystemItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildItems: options?.includeChildItems,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltysystems/personallist` */\n listPersonal(\n options?: LoyaltySystemPersonalListQuery & { signal?: AbortSignal },\n ): Promise<LoyaltySystemItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltysystems/personallist/{torrowId}` */\n deleteFromPersonalList(torrowId: string, options?: { signal?: AbortSignal }): Promise<void> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/personallist/${encodePathSegment(torrowId)}`,\n signal: options?.signal,\n });\n }\n\n /**\n * `POST /api/v1/loyaltysystems/{loyaltySystemId}/loyaltycard` — выпуск **`LoyaltyCardItem`**.\n * Тело **`CreateLoyaltyCardReq`**: обязателен **`profileId`**; **`basisItemId`** — id элемента-основания\n * (напр. заказ), от которого создают карту и абонемент (MCP **`CreateLoyaltyCardReq`**).\n */\n createLoyaltyCard(\n loyaltySystemId: string,\n body: CreateLoyaltyCardReq,\n options?: { signal?: AbortSignal },\n ): Promise<LoyaltyCardItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(loyaltySystemId)}/loyaltycard`,\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `POST /api/v1/loyaltysystems/{torrowId}/loyaltycards` — поиск карт в программе\n * (**`SearchLoyaltyCardsReq`**: `text`, `filter`, `sort`, `take`/`skip`, …).\n * В torrow-apps: `LoyaltySystemItemService.searchLoyaltyCards` / `SearchLoyaltyCardsTask`.\n */\n searchLoyaltyCards(\n torrowId: string,\n body: SearchLoyaltyCardsReq,\n options?: { signal?: AbortSignal },\n ): Promise<LoyaltyCardItem[]> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/loyaltycards`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/loyaltysystems/statistics` */\n async postStatistics(\n body: GetLoyaltySystemsStatisticsReq,\n options?: { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<LoyaltySystemsStatisticsResp[]> {\n const resp = await this.http.requestJson<GetLoyaltySystemsStatisticsResp>({\n method: \"POST\",\n path: `${BASE}/statistics`,\n query: { securityToken: options?.securityToken },\n body,\n signal: options?.signal,\n });\n return unwrapLoyaltySystemsStatisticsList(resp);\n }\n\n /** `GET /api/v1/loyaltysystems/{torrowId}/participants/count` */\n getParticipantsCount(\n torrowId: string,\n query?: {\n participantStateList?: LoyaltyParticipantsQuery[\"participantStateList\"];\n participantTypeList?: LoyaltyParticipantsQuery[\"participantTypeList\"];\n },\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/participants/count`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapDeleteCount, unwrapTimetableStatisticsList } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport type { DeleteResponse, NotificationWay } from \"../contacts/types.js\";\nimport { TorrowItemCoreFacade } from \"../common/item-social-facet-base.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport { TorrowObjectTypeCode } from \"../../util/torrow-id.js\";\nimport type { LoyaltyPersonalListQuery } from \"../loyalty/loyalty-personal-list-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n TimetableCase,\n TimetableFilter,\n TimetableStatisticsResp,\n} from \"../services/types.js\";\nimport type {\n AccountingTransaction,\n BalanceValue,\n CreateLoyaltyCardSubscriptionReq,\n GetParticipationCountResp,\n LoyaltyCardItem,\n LoyaltyCardItemForCreateOrUpdate,\n LoyaltyCardSubscription,\n LoyaltyParticipantsQuery,\n LoyaltyTransactionsQuery,\n ObjectInfo,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/loyaltycards\";\n\nconst LOYALTY_CARD_SOCIAL_OPTS = { withGroupListEndpoint: false as const };\n\n/**\n * Карты лояльности (**OpenAPI** **LoyaltyCard**). Создание — через **`LoyaltySystems.createLoyaltyCard`**;\n * здесь CRUD-часть (без `POST` корня), персональный список, presigned image.\n * Общий item-слой — {@link TorrowItemCoreFacade} (`GET .../group/list` в OpenAPI нет → {@link TorrowItemFacadeOptions.withGroupListEndpoint}).\n */\nexport class LoyaltyCardsFacade extends TorrowItemCoreFacade<LoyaltyCardItem, LoyaltyParticipantsQuery> {\n protected override readonly itemObjectTypeCode = TorrowObjectTypeCode.LoyaltyCard;\n\n constructor(http: HttpClient) {\n super(http, BASE, LOYALTY_CARD_SOCIAL_OPTS);\n }\n\n /** Id карты лояльности до `create` / presigned upload. */\n generateLoyaltyCardId(ownerTorrowId: string): string {\n return this.generateItemId(ownerTorrowId);\n }\n\n /** `POST /api/v1/loyaltycards/{loyaltyCardId}/subscription` */\n createSubscription(\n loyaltyCardId: string,\n body: CreateLoyaltyCardSubscriptionReq,\n options?: { signal?: AbortSignal },\n ): Promise<LoyaltyCardSubscription> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(loyaltyCardId)}/subscription`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/participants/count` */\n getParticipantsCount(\n torrowId: string,\n query?: {\n participantStateList?: LoyaltyParticipantsQuery[\"participantStateList\"];\n participantTypeList?: LoyaltyParticipantsQuery[\"participantTypeList\"];\n },\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/participants/count`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/balance` */\n getBalance(\n torrowId: string,\n options?: { balanceDate?: Date | null; securityToken?: string | null; signal?: AbortSignal },\n ): Promise<BalanceValue[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/balance`,\n query: {\n balanceDate: options?.balanceDate,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/transactions` */\n listTransactions(\n torrowId: string,\n query?: LoyaltyTransactionsQuery,\n options?: { signal?: AbortSignal },\n ): Promise<AccountingTransaction[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/transactions`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/subscriptions/{subscriptionId}/balance` */\n getSubscriptionBalance(\n torrowId: string,\n subscriptionId: string,\n options?: { balanceDate?: Date | null; securityToken?: string | null; signal?: AbortSignal },\n ): Promise<BalanceValue[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/subscriptions/${encodePathSegment(subscriptionId)}/balance`,\n query: {\n balanceDate: options?.balanceDate,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/subscriptions/{subscriptionId}/transactions` */\n getSubscriptionTransactions(\n torrowId: string,\n subscriptionId: string,\n query?: LoyaltyTransactionsQuery,\n options?: { signal?: AbortSignal },\n ): Promise<AccountingTransaction[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/subscriptions/${encodePathSegment(subscriptionId)}/transactions`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/loyaltycards/{body.id}` */\n update(\n body: LoyaltyCardItemForCreateOrUpdate,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltyCardItem> {\n const itemId = requireItemUpdateId(body, \"Loyalty card\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltycards/{torrowId}` */\n async delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n } & TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildItems?: boolean | null;\n includeBalance?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltyCardItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildItems: options?.includeChildItems,\n includeBalance: options?.includeBalance,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/personallist` */\n listPersonal(\n options?: LoyaltyPersonalListQuery & { signal?: AbortSignal },\n ): Promise<LoyaltyCardItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltycards/personallist/{torrowId}` */\n deleteFromPersonalList(torrowId: string, options?: { signal?: AbortSignal }): Promise<void> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/personallist/${encodePathSegment(torrowId)}`,\n signal: options?.signal,\n });\n }\n\n /**\n * Расписание по карте — `PUT /api/v1/loyaltycards/{torrowId}/timetable`.\n * В torrow-apps: `LoyaltyCardClient.getTimetable`.\n */\n getTimetable(\n torrowId: string,\n body: TimetableFilter,\n options?: TimetableQueryOptions & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /** `POST /api/v1/loyaltycards/timetable/statistics` */\n async getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableStatisticsResp[]> {\n const resp = await this.http.requestJson<GetTimetableStatisticsResponse>({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n return unwrapTimetableStatisticsList(resp);\n }\n\n /**\n * `PUT /api/v1/loyaltycards/{itemId}/notificationwaylist` — в OpenAPI есть у **loyaltycards**, но не у **loyaltysystems**,\n * поэтому метод не вынесен в общий {@link TorrowItemCoreFacade}.\n */\n updateNotificationWayList(\n itemId: string,\n ways: NotificationWay[],\n options?: TorrowOptions,\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}/notificationwaylist`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: ways,\n signal: options?.signal,\n });\n }\n}\n","import type { JsonValue } from \"./json.js\";\n\n/**\n * OpenAPI хранит `DeviceSettingsInfo.settings` / `UserSettingsInfo.settings` как **string**;\n * публичный SDK API отдаёт/принимает {@link JsonValue} (`null`, если пусто/не JSON).\n */\n\n/** Wire-строка → JSON; пустая / невалидная → `null`. */\nexport function parseOpaqueJsonSettings(raw: string | null | undefined): JsonValue | null {\n if (raw == null) return null;\n const trimmed = String(raw).trim();\n if (trimmed === \"\") return null;\n try {\n return JSON.parse(trimmed) as JsonValue;\n } catch {\n return null;\n }\n}\n\n/**\n * JSON → wire-строка для query/body.\n * `null` / `undefined` → пустая строка (на чтении снова станет `null`).\n */\nexport function stringifyOpaqueJsonSettings(value: JsonValue | null | undefined): string {\n if (value === undefined || value === null) return \"\";\n return JSON.stringify(value);\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport {\n parseOpaqueJsonSettings,\n stringifyOpaqueJsonSettings,\n} from \"../../util/opaque-json-settings.js\";\nimport type { UserSettingsInfoDto } from \"./dto.js\";\nimport type { TorrowObject, UserSettingsInfo } from \"./types.js\";\n\nconst BASE = \"/api/v1/user/settings\";\n\n/**\n * Настройки пользователя (User API).\n * OpenAPI: `GET /api/v1/user/settings`, `PUT /api/v1/user/settings/update`.\n * Публично `settings` — JSON; на wire — string (`null`/невалидное → `null` при чтении).\n */\nexport class UserSettingsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/user/settings` — `settings` как JSON (`null` если пусто/не распарсилось). */\n async get(options?: { signal?: AbortSignal }): Promise<UserSettingsInfo> {\n const dto = await this.http.requestJson<UserSettingsInfoDto>({\n method: \"GET\",\n path: BASE,\n signal: options?.signal,\n });\n return { settings: parseOpaqueJsonSettings(dto.settings) };\n }\n\n /**\n * `PUT /api/v1/user/settings/update` — принимает JSON в `settings`, на wire уходит string.\n * `null`/`undefined` → `settings: null` в теле.\n */\n update(body: UserSettingsInfo, options?: { signal?: AbortSignal }): Promise<TorrowObject> {\n const wire: UserSettingsInfoDto = {\n settings:\n body.settings === undefined || body.settings === null\n ? null\n : stringifyOpaqueJsonSettings(body.settings),\n };\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/update`,\n body: wire,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport {\n parseOpaqueJsonSettings,\n stringifyOpaqueJsonSettings,\n} from \"../../util/opaque-json-settings.js\";\nimport {\n unwrapAddProfileContact,\n unwrapDeletedUserAccountCount,\n unwrapDeleteCount,\n} from \"../common/facade-response-unwrap.js\";\nimport type { DeviceSettingsInfoDto, LoyaltyCardItemDto } from \"./dto.js\";\nimport type { ContactItem } from \"../contacts/types.js\";\nimport type { UserProfileItemForAdd } from \"../user-profiles/types.js\";\nimport { prepareUserProfileItemForAdd } from \"../user-profiles/user-profile-write-defaults.js\";\nimport type {\n Account,\n AddProfileResp,\n CompleteAddingAccountReq,\n CompleteDeletingUserReq,\n CompleteDeletingUserResp,\n DeleteResponse,\n DeleteUserAccountReq,\n DeleteUserAccountResp,\n DeliveryChannel,\n DeviceInfo,\n DeviceSettingsInfo,\n DeviceType,\n InitAddingAccountReq,\n InitAddingAccountResp,\n InitDeletingUserResp,\n JsonValue,\n NotificationWay,\n RegisterUserForAccountResp,\n RegistrationUserInfo,\n TimetableCase,\n TimetableFilter,\n TorrowObject,\n UserAccountsQuery,\n UserCalendar,\n UserDeliveryWay,\n UserTimetableQuery,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/user\";\n\nexport class UserFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/user/loyaltycard` */\n getLoyaltyCard(options?: { signal?: AbortSignal }): Promise<LoyaltyCardItemDto> {\n return this.http.requestJson({ method: \"GET\", path: `${BASE}/loyaltycard`, signal: options?.signal });\n }\n\n /** `GET /api/v1/user/accounts` */\n listAccounts(query?: UserAccountsQuery, options?: { signal?: AbortSignal }): Promise<Account[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/accounts`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/user/accounts/add/init` */\n initAddAccount(body: InitAddingAccountReq, options?: { signal?: AbortSignal }): Promise<InitAddingAccountResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/accounts/add/init`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/user/accounts/add/complete` */\n completeAddAccount(body: CompleteAddingAccountReq, options?: { signal?: AbortSignal }): Promise<Account> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/accounts/add/complete`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/accounts/delete` */\n async deleteAccount(body: DeleteUserAccountReq, options?: { signal?: AbortSignal }): Promise<number> {\n const resp = await this.http.requestJson<DeleteUserAccountResp>({\n method: \"DELETE\",\n path: `${BASE}/accounts/delete`,\n body,\n signal: options?.signal,\n });\n return unwrapDeletedUserAccountCount(resp);\n }\n\n /** `GET /api/v1/user/devices` */\n listDevices(\n query?: { deviceTypes?: DeviceType[] },\n options?: { signal?: AbortSignal },\n ): Promise<DeviceInfo[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/devices`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/devices/{deviceId}` */\n async deleteDevice(deviceId: string, options?: { signal?: AbortSignal }): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/devices/${encodePathSegment(deviceId)}`,\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/user/devices/{deviceId}/settings` — `settings` как JSON (`null` если не распарсилось). */\n async getDeviceSettings(\n deviceId: string,\n options?: { signal?: AbortSignal },\n ): Promise<DeviceSettingsInfo> {\n const dto = await this.http.requestJson<DeviceSettingsInfoDto>({\n method: \"GET\",\n path: `${BASE}/devices/${encodePathSegment(deviceId)}/settings`,\n signal: options?.signal,\n });\n return {\n deviceId: dto.deviceId ?? null,\n settings: parseOpaqueJsonSettings(dto.settings),\n };\n }\n\n /**\n * `PUT /api/v1/user/devices/{deviceId}/settings` — принимает JSON, на wire уходит string в query.\n * `null`/`undefined` → `\"{}\"` (пустой query `settings=` шлюз отклоняет VALIDATION_FAILED).\n */\n updateDeviceSettings(\n deviceId: string,\n settings: JsonValue | null,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject> {\n // Пустая строка в query не проходит валидацию; «сброс» = пустой JSON-объект.\n const wire =\n settings === null || settings === undefined ? \"{}\" : stringifyOpaqueJsonSettings(settings);\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/devices/${encodePathSegment(deviceId)}/settings`,\n query: { settings: wire },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/defaultprofile` */\n getDefaultProfile(options?: { signal?: AbortSignal }): Promise<ContactItem> {\n return this.http.requestJson<ContactItem>({ method: \"GET\", path: `${BASE}/defaultprofile`, signal: options?.signal });\n }\n\n /** `PUT /api/v1/user/defaultprofile` */\n async setDefaultProfileByContactId(contactId: string, options?: { signal?: AbortSignal }): Promise<ContactItem> {\n const resp = await this.http.requestJson<AddProfileResp>({\n method: \"PUT\",\n path: `${BASE}/defaultprofile`,\n body: contactId,\n signal: options?.signal,\n });\n return unwrapAddProfileContact(resp) as ContactItem;\n }\n\n /**\n * `POST /api/v1/user/defaultprofile` — создать и назначить дефолтный профиль.\n * Тело перед POST проходит через {@link prepareUserProfileItemForAdd} (как у `profiles.add`).\n */\n async createDefaultProfile(\n body: UserProfileItemForAdd,\n options?: { signal?: AbortSignal },\n ): Promise<ContactItem> {\n const payload = prepareUserProfileItemForAdd(body);\n const resp = await this.http.requestJson<AddProfileResp>({\n method: \"POST\",\n path: `${BASE}/defaultprofile`,\n body: payload,\n signal: options?.signal,\n });\n return unwrapAddProfileContact(resp) as ContactItem;\n }\n\n /** `GET /api/v1/user/deliveryways` */\n listDeliveryWays(\n query?: { deliveryChannelList?: DeliveryChannel[] },\n options?: { signal?: AbortSignal },\n ): Promise<UserDeliveryWay[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/deliveryways`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/defaultnotificationways` */\n listDefaultNotificationWays(options?: { signal?: AbortSignal }): Promise<NotificationWay[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/defaultnotificationways`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/defaultnotificationways` */\n updateDefaultNotificationWays(\n body: NotificationWay[],\n options?: { versionToCheck?: number; isNeedAnnouncement?: boolean; signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/defaultnotificationways`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/place` */\n updatePlace(\n query: { profileId?: string; placeId?: number },\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/place`,\n query,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/user/register` */\n register(\n body: RegistrationUserInfo,\n options?: { signal?: AbortSignal },\n ): Promise<RegisterUserForAccountResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/register`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/timetable` */\n getTimetable(\n body: TimetableFilter,\n query?: UserTimetableQuery,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/timetable`,\n query: { ...(query ?? {}) },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/calendars` */\n listCalendars(options?: { signal?: AbortSignal }): Promise<UserCalendar[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/calendars`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/calendars/update` */\n updateCalendars(body: UserCalendar[], options?: { signal?: AbortSignal }): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/calendars/update`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/delete/init` */\n initDelete(options?: { signal?: AbortSignal }): Promise<InitDeletingUserResp> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/delete/init`,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/delete/complete` */\n completeDelete(\n body: CompleteDeletingUserReq,\n options?: { signal?: AbortSignal },\n ): Promise<CompleteDeletingUserResp> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/delete/complete`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/count` — публичный счётчик пользователей (без Bearer ок). */\n count(options?: { signal?: AbortSignal }): Promise<number> {\n return this.http.requestJson({ method: \"GET\", path: `${BASE}/count`, signal: options?.signal });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { ApiKeyInfo, CreateApiKeyRequest, CreateApiKeyResponse } from \"./types.js\";\n\nconst BASE = \"/api/v1/apikeys\";\n\n/** API keys (`/api/v1/apikeys`). */\nexport class ApiKeysFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/apikeys` */\n list(options?: { signal?: AbortSignal }): Promise<ApiKeyInfo[]> {\n return this.http.requestJson<ApiKeyInfo[]>({\n method: \"GET\",\n path: BASE,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/apikeys` */\n create(body: CreateApiKeyRequest, options?: { signal?: AbortSignal }): Promise<CreateApiKeyResponse> {\n return this.http.requestJson<CreateApiKeyResponse>({\n method: \"POST\",\n path: BASE,\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/apikeys/{keyId}` */\n delete(keyId: string, options?: { signal?: AbortSignal }): Promise<void> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(keyId)}`,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { BlockReason, BlockReasonListQuery } from \"./types.js\";\n\nconst BASE = \"/api/v1/blockreason\";\n\n/**\n * Справочник причин блокировки (**OpenAPI** `/api/v1/blockreason`).\n */\nexport class BlockReasonsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/blockreason` — создать; ответ: числовой id. */\n create(body: BlockReason, options?: { signal?: AbortSignal }): Promise<number> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/blockreason/{id}` */\n getById(\n id: number,\n options?: { lng?: string | null; signal?: AbortSignal },\n ): Promise<BlockReason> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(String(id))}`,\n query: { lng: options?.lng },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/blockreason/all` */\n listAll(query?: BlockReasonListQuery, options?: { signal?: AbortSignal }): Promise<BlockReason[]> {\n const { signal } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/all`,\n query: { ...(query ?? {}) },\n signal,\n });\n }\n\n /** `DELETE /api/v1/blockreason/{id}` — ответ: число (код/количество по контракту API). */\n delete(id: number, options?: { signal?: AbortSignal }): Promise<number> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(String(id))}`,\n signal: options?.signal,\n });\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport type { AddExternalAuthReq, AddExternalAuthResp, DeleteResponse, ExternalAuth } from \"./types.js\";\n\nconst BASE = \"/api/v1/externalauths\";\n\n/** Внешняя авторизация (`/api/v1/externalauths`). */\nexport class ExternalAuthsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/externalauths` */\n add(body: AddExternalAuthReq, options?: { signal?: AbortSignal }): Promise<AddExternalAuthResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/externalauths/{torrowId}` */\n getById(\n torrowId: string,\n options?: { includeDeleted?: boolean | null; signal?: AbortSignal },\n ): Promise<ExternalAuth> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: { includeDeleted: options?.includeDeleted },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/externalauths/all` */\n listAll(\n options?: PersonalListQuery & { includeDeleted?: boolean | null; signal?: AbortSignal },\n ): Promise<ExternalAuth[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/all`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `DELETE /api/v1/externalauths/{externalAuthId}` */\n async delete(\n externalAuthId: string,\n options?: TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(externalAuthId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { unwrapTorrowId } from \"../common/facade-response-unwrap.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { GetTorrowIdResp, TorrowObjectType } from \"./types.js\";\n\nconst BASE = \"/api/v1/idgenerator\";\n\n/** Выдача Torrow id по типу объекта — `GET /api/v1/idgenerator/{objectType}`. */\nexport class IdGeneratorFacade {\n constructor(private readonly http: HttpClient) {}\n\n async getNextId(objectType: TorrowObjectType, options?: { signal?: AbortSignal }): Promise<string> {\n const resp = await this.http.requestJson<GetTorrowIdResp>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(String(objectType))}`,\n signal: options?.signal,\n });\n return unwrapTorrowId(resp);\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { requireItemUpdateId } from \"../common/item-update-id.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport type { DeleteResponse, Integration } from \"./types.js\";\n\nconst BASE = \"/api/v1/integrations\";\n\n/** Интеграции (`/api/v1/integrations`). */\nexport class IntegrationsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/integrations` */\n create(body: Integration, options?: { signal?: AbortSignal }): Promise<Integration> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/integrations/{body.id}` */\n update(\n body: Integration,\n options?: { checkVersion?: boolean | null; signal?: AbortSignal },\n ): Promise<Integration> {\n const itemId = requireItemUpdateId(body, \"Integration\");\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}`,\n query: { checkVersion: options?.checkVersion },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/integrations/list` */\n list(\n options?: {\n integrationIds?: string[] | null;\n includeDeleted?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Integration[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/list`,\n query: {\n integrationIds: options?.integrationIds,\n includeDeleted: options?.includeDeleted,\n },\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/integrations/{integrationId}` */\n async delete(\n integrationId: string,\n options?: TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(integrationId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n}\n","import type { TorrowOptions } from \"../../types.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { unwrapDeleteCount } from \"../common/facade-response-unwrap.js\";\nimport type {\n DeleteResponse,\n Feedback,\n ItemFeedback,\n ItemViewSortCondition,\n ParticipationResp,\n UserFeedback,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/item\";\n\n/**\n * Кросс-доменные операции **Item** (отзывы, шаринг-сессия, uniquename).\n * Не путать с CRUD конкретных типов (`contacts`, `services`, …).\n */\nexport class ItemFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * **WIP / do not use in product.** `PUT /api/v1/item/activateshareitemsession/{shareItemSessionId}`.\n * Gateway stub (empty `ParticipationResp`). Unused in torrow-apps UI.\n * Pair with stub `shareItemLink` → empty URL. Fix in monolith, not SDK.\n */\n activateShareItemSession(\n shareItemSessionId: string,\n options?: { userProfileId?: string | null; code?: string | null; signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/activateshareitemsession/${encodePathSegment(shareItemSessionId)}`,\n query: { userProfileId: options?.userProfileId, code: options?.code },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/item/uniquename/{uniqueName}` — ответ: строка (часто id / url по контракту). */\n getByUniqueName(uniqueName: string, options?: { signal?: AbortSignal }): Promise<string> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/uniquename/${encodePathSegment(uniqueName)}`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/item/{torrowId}/userfeedback` */\n getUserFeedback(\n torrowId: string,\n options?: {\n throwExceptionIfNotFound?: boolean | null;\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<UserFeedback> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/userfeedback`,\n query: {\n throwExceptionIfNotFound: options?.throwExceptionIfNotFound,\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/item/{torrowId}/userfeedback` */\n putUserFeedback(\n torrowId: string,\n options?: {\n profileId?: string | null;\n score?: number | null;\n header?: string | null;\n text?: string | null;\n surveyResponse?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<UserFeedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/userfeedback`,\n query: { ...query },\n signal,\n });\n }\n\n /** `DELETE /api/v1/item/{torrowId}/userfeedback` */\n async deleteUserFeedback(\n torrowId: string,\n options?: {\n profileId?: string | null;\n messageId?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<number> {\n const { signal, ...query } = options ?? {};\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}/userfeedback`,\n query: { ...query },\n signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `GET /api/v1/item/{torrowId}/feedbacks` */\n listFeedbacks(\n torrowId: string,\n options?: {\n createDateFrom?: Date | null;\n createDateTo?: Date | null;\n scoreFrom?: number | null;\n scoreTo?: number | null;\n profileIdsFilter?: string[] | null;\n take?: number | null;\n skip?: number | null;\n lmfrom?: Date | null;\n lmto?: Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemViewSortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<ItemFeedback[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks`,\n query: { ...query },\n signal,\n });\n }\n\n /** `POST /api/v1/item/{torrowId}/feedbacks/newmessage` */\n postFeedbackNewMessage(\n torrowId: string,\n options?: {\n profileId?: string | null;\n header?: string | null;\n text?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Feedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/newmessage`,\n query: { ...query },\n signal,\n });\n }\n\n /** `GET /api/v1/item/{torrowId}/feedbacks/{messageId}` */\n getFeedback(\n torrowId: string,\n messageId: string,\n options?: { versionToCheck?: number | null; includeDeleted?: boolean | null; signal?: AbortSignal },\n ): Promise<Feedback> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/item/{torrowId}/feedbacks/{messageId}` */\n updateFeedback(\n torrowId: string,\n messageId: string,\n options?: {\n profileId?: string | null;\n header?: string | null;\n text?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Feedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}`,\n query: { ...query },\n signal,\n });\n }\n\n /** `DELETE /api/v1/item/{torrowId}/feedbacks/{messageId}` */\n async deleteFeedback(\n torrowId: string,\n messageId: string,\n options?: TorrowOptions,\n ): Promise<number> {\n const resp = await this.http.requestJson<DeleteResponse>({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n return unwrapDeleteCount(resp);\n }\n\n /** `POST /api/v1/item/{torrowId}/feedbacks/{messageId}/reply` */\n replyToFeedback(\n torrowId: string,\n messageId: string,\n options?: {\n profileId?: string | null;\n header?: string | null;\n text?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Feedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}/reply`,\n query: { ...query },\n signal,\n });\n }\n\n /** `GET /api/v1/item/{torrowId}/feedbacks/{messageId}/replies` — массив **`Feedback`** (не `ItemFeedback`). */\n listFeedbackReplies(\n torrowId: string,\n messageId: string,\n options?: {\n createDateFrom?: Date | null;\n createDateTo?: Date | null;\n profileIdsFilter?: string[] | null;\n take?: number | null;\n skip?: number | null;\n lmfrom?: Date | null;\n lmto?: Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemViewSortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<Feedback[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}/replies`,\n query: { ...query },\n signal,\n });\n }\n}\n","import { TorrowSdkRequestState } from \"../../http/TorrowSdkError.js\";\nimport { normalizeTransportError } from \"../../http/transport-errors.js\";\nimport { buildAuthHeaders } from \"../../http/auth.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { joinBaseUrlAndPath } from \"../../util/url.js\";\nimport type { ResolvedTorrowClientConfig } from \"../../TorrowClientConfig.js\";\nimport { DEFAULT_TORROW_API_BASE_URL } from \"../../TorrowClientConfig.js\";\n\nconst BASE = \"/api/v1/u\";\n\n/** Литерал для `scripts/gap-openapi-facades.mjs` (совпадение с `GET /api/v1/u/{shortUrl}`). */\nconst _GAP_SDK_PATH_REDIRECT = \"/api/v1/u/{p}\";\nvoid _GAP_SDK_PATH_REDIRECT;\n\n/**\n * Короткие ссылки (`/api/v1/u/*`).\n * `getFull` — JSON-строка цели; `getRedirectLocation` — `Location` при `redirect: manual` (302).\n */\nexport class ShortUrlFacade {\n constructor(\n private readonly http: HttpClient,\n private readonly config: ResolvedTorrowClientConfig,\n ) {}\n\n /** `GET /api/v1/u/{shortUrl}/full` */\n getFull(shortUrl: string, options?: { signal?: AbortSignal }): Promise<string> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(shortUrl)}/full`,\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/u/{shortUrl}` — обычно **302 Redirect**.\n * Возвращает заголовок `Location` без следования редиректу.\n */\n async getRedirectLocation(shortUrl: string, options?: { signal?: AbortSignal }): Promise<string | null> {\n let request = TorrowSdkRequestState.NotStarted;\n let url: string | undefined;\n try {\n const fetchFn = this.config.fetch ?? globalThis.fetch;\n const origin = this.config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL;\n url = joinBaseUrlAndPath(origin, `${BASE}/${encodePathSegment(shortUrl)}`);\n const authHeaders = await buildAuthHeaders(this.config);\n // Все заголовки подготавливаются до отметки начала fetch.\n const init: RequestInit = {\n method: \"GET\",\n redirect: \"manual\",\n headers: {\n Accept: \"*/*\",\n ...authHeaders,\n ...this.config.defaultHeaders,\n },\n signal: options?.signal,\n };\n options?.signal?.throwIfAborted();\n request = TorrowSdkRequestState.Started;\n const res = await fetchFn(url, init);\n return res.headers.get(\"Location\");\n } catch (cause) {\n throw normalizeTransportError(cause, request, options?.signal, url);\n }\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type { DictionarySortCondition, Hobby, Place } from \"./types.js\";\n\nconst BASE = \"/api/v1/thesaurus\";\n\n/** Справочники мест и хобби (`/api/v1/thesaurus/*`). */\nexport class ThesaurusFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/thesaurus/places` */\n listPlaces(\n options?: {\n lat?: number | null;\n lon?: number | null;\n r?: number | null;\n txt?: string | null;\n lng?: string | null;\n take?: number | null;\n skip?: number | null;\n includeDeleted?: boolean | null;\n sort?: DictionarySortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<Place[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/places`,\n query: { ...query },\n signal,\n });\n }\n\n /** `GET /api/v1/thesaurus/hobbies` */\n listHobbies(\n options?: {\n lng?: string | null;\n take?: number | null;\n skip?: number | null;\n includeDeleted?: boolean | null;\n sort?: DictionarySortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<Hobby[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/hobbies`,\n query: { ...query },\n signal,\n });\n }\n}\n","import { HttpClient } from \"./http/HttpClient.js\";\nimport { RawClient } from \"./raw/RawClient.js\";\nimport { CalendarsFacade } from \"./resources/calendars/CalendarsFacade.js\";\nimport { CasesFacade } from \"./resources/cases/CasesFacade.js\";\nimport { ContactsFacade } from \"./resources/contacts/ContactsFacade.js\";\nimport { ContextsFacade } from \"./resources/contexts/ContextsFacade.js\";\nimport { NotesFacade } from \"./resources/notes/NotesFacade.js\";\nimport { RelationsFacade } from \"./resources/relations/RelationsFacade.js\";\nimport { ResourcesFacade } from \"./resources/resources/ResourcesFacade.js\";\nimport { ServicesFacade } from \"./resources/services/ServicesFacade.js\";\nimport { AuthFacade } from \"./resources/auth/AuthFacade.js\";\nimport { ProfilesFacade } from \"./resources/user-profiles/ProfilesFacade.js\";\nimport { ViewsFacade } from \"./resources/views/ViewsFacade.js\";\nimport { SearchFacade } from \"./resources/search/SearchFacade.js\";\nimport { ActionHistoryFacade } from \"./resources/action-history/ActionHistoryFacade.js\";\nimport { AccountingTransactionsFacade } from \"./resources/accounting-transactions/AccountingTransactionsFacade.js\";\nimport { AnnouncementsFacade } from \"./resources/announcements/AnnouncementsFacade.js\";\nimport { ExportImportFacade } from \"./resources/export-import/ExportImportFacade.js\";\nimport { ReportsFacade } from \"./resources/reports/ReportsFacade.js\";\nimport { LoyaltySystemsFacade } from \"./resources/loyalty-systems/LoyaltySystemsFacade.js\";\nimport { LoyaltyCardsFacade } from \"./resources/loyalty-cards/LoyaltyCardsFacade.js\";\nimport { UserSettingsFacade } from \"./resources/user-settings/UserSettingsFacade.js\";\nimport { UserFacade } from \"./resources/user/UserFacade.js\";\nimport { ApiKeysFacade } from \"./resources/api-keys/ApiKeysFacade.js\";\nimport { BlockReasonsFacade } from \"./resources/block-reason/BlockReasonsFacade.js\";\nimport { ExternalAuthsFacade } from \"./resources/external-auths/ExternalAuthsFacade.js\";\nimport { IdGeneratorFacade } from \"./resources/id-generator/IdGeneratorFacade.js\";\nimport { IntegrationsFacade } from \"./resources/integrations/IntegrationsFacade.js\";\nimport { ItemFacade } from \"./resources/item/ItemFacade.js\";\nimport { ShortUrlFacade } from \"./resources/short-url/ShortUrlFacade.js\";\nimport { ThesaurusFacade } from \"./resources/thesaurus/ThesaurusFacade.js\";\nimport {\n DEFAULT_TORROW_API_BASE_URL,\n type ResolvedTorrowClientConfig,\n type TorrowClientConfig,\n} from \"./TorrowClientConfig.js\";\n\nexport type { AuthIdentityBasic, ResolvedTorrowClientConfig, TorrowClientConfig } from \"./TorrowClientConfig.js\";\nexport { DEFAULT_TORROW_API_BASE_URL } from \"./TorrowClientConfig.js\";\n\n/**\n * Main entry: config, `raw` REST, domain facades (item CRUD + `listPersonal`), {@link AuthFacade}, {@link RelationsFacade}, {@link ViewsFacade}, {@link ProfilesFacade}, {@link SearchFacade},\n * {@link ActionHistoryFacade}, {@link AccountingTransactionsFacade}, {@link AnnouncementsFacade}, {@link ExportImportFacade}, {@link ReportsFacade},\n * {@link LoyaltySystemsFacade}, {@link LoyaltyCardsFacade}, {@link UserSettingsFacade}, {@link BlockReasonsFacade},\n * {@link ExternalAuthsFacade}, {@link IntegrationsFacade}, {@link ApiKeysFacade}, {@link IdGeneratorFacade}, {@link ItemFacade}, {@link ThesaurusFacade}, {@link ShortUrlFacade}.\n */\nexport class TorrowClient {\n /**\n * Эффективный конфиг после default `baseUrl` ({@link ResolvedTorrowClientConfig}).\n * В конструктор передавай {@link TorrowClientConfig} (`baseUrl` опционален).\n */\n readonly config: ResolvedTorrowClientConfig;\n readonly http: HttpClient;\n readonly raw: RawClient;\n readonly contacts: ContactsFacade;\n readonly notes: NotesFacade;\n readonly contexts: ContextsFacade;\n /** API domain `Resource` (`/api/v1/resources`), не каталог `src/resources/`. */\n readonly resourceItems: ResourcesFacade;\n readonly services: ServicesFacade;\n readonly cases: CasesFacade;\n readonly calendars: CalendarsFacade;\n /** Поиск по API (тег OpenAPI **Search**): advised items, текстовый поиск по типам, заказы под родителем. */\n readonly search: SearchFacade;\n /** История действий (`/api/v1/actionhistory`). */\n readonly actionHistory: ActionHistoryFacade;\n /** Учётные транзакции (`/api/v1/accountingtransactions`). */\n readonly accountingTransactions: AccountingTransactionsFacade;\n /** Объявления (`/api/v1/announcements`). */\n readonly announcements: AnnouncementsFacade;\n /** Экспорт/импорт графа (`/api/v1/export`, `import`, `importbyuniquename`). */\n readonly exportImport: ExportImportFacade;\n /** Генерация отчётов (`/api/v1/reports`). */\n readonly reports: ReportsFacade;\n /** Программы лояльности (`/api/v1/loyaltysystems`). */\n readonly loyaltySystems: LoyaltySystemsFacade;\n /** Карты лояльности (`/api/v1/loyaltycards`); создание карты — **`loyaltySystems.createLoyaltyCard`**. */\n readonly loyaltyCards: LoyaltyCardsFacade;\n /** Настройки пользователя (`/api/v1/user/settings`). */\n readonly userSettings: UserSettingsFacade;\n /** User endpoints (`/api/v1/user/*`): accounts/devices/default profile/delivery/register/calendars/timetable. */\n readonly user: UserFacade;\n /** Include/exclude в иерархии и группах, mind map (`includeToParent`, `saveToMindMap`, …). */\n readonly relations: RelationsFacade;\n /** Представления под родителем: CRUD в `views.user` / `views.pinned`, переходы через `views.pin` / `views.unpin`. */\n readonly views: ViewsFacade;\n /** Профили пользователя Torrow (`/api/v1/user/profiles`), не CRUD `/api/v1/contacts`. `list` — **`ContactItem[]`**. */\n readonly profiles: ProfilesFacade;\n /** AuthIdentity: `refresh`, `requestToken`, `revoke`, `sendCode`, `createSession` — без Bearer основного клиента. */\n readonly auth: AuthFacade;\n /** Справочник причин блокировки (`/api/v1/blockreason`). */\n readonly blockReasons: BlockReasonsFacade;\n /** Внешняя авторизация (`/api/v1/externalauths`). */\n readonly externalAuths: ExternalAuthsFacade;\n /** Интеграции (`/api/v1/integrations`). */\n readonly integrations: IntegrationsFacade;\n /** API keys (`/api/v1/apikeys`). */\n readonly apiKeys: ApiKeysFacade;\n /** Генерация id (`/api/v1/idgenerator`). */\n readonly idGenerator: IdGeneratorFacade;\n /** Отзывы и шаринг-сессии (`/api/v1/item/...`). */\n readonly item: ItemFacade;\n /** Тезаурус мест/хобби (`/api/v1/thesaurus`). */\n readonly thesaurus: ThesaurusFacade;\n /** Короткие ссылки (`/api/v1/u`). */\n readonly shortUrl: ShortUrlFacade;\n\n constructor(config: TorrowClientConfig) {\n this.config = {\n ...config,\n baseUrl: config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL,\n };\n this.http = new HttpClient(this.config);\n this.raw = new RawClient(this.http);\n this.contacts = new ContactsFacade(this.http);\n this.notes = new NotesFacade(this.http);\n this.contexts = new ContextsFacade(this.http);\n this.resourceItems = new ResourcesFacade(this.http);\n this.services = new ServicesFacade(this.http);\n this.cases = new CasesFacade(this.http);\n this.calendars = new CalendarsFacade(this.http);\n this.search = new SearchFacade(this.http);\n this.actionHistory = new ActionHistoryFacade(this.http);\n this.accountingTransactions = new AccountingTransactionsFacade(this.http);\n this.announcements = new AnnouncementsFacade(this.http);\n this.exportImport = new ExportImportFacade(this.http);\n this.reports = new ReportsFacade(this.http);\n this.loyaltySystems = new LoyaltySystemsFacade(this.http);\n this.loyaltyCards = new LoyaltyCardsFacade(this.http);\n this.userSettings = new UserSettingsFacade(this.http);\n this.user = new UserFacade(this.http);\n this.relations = new RelationsFacade(this.http);\n this.views = new ViewsFacade(this.http);\n this.profiles = new ProfilesFacade(this.http);\n this.auth = new AuthFacade(this.config);\n this.blockReasons = new BlockReasonsFacade(this.http);\n this.externalAuths = new ExternalAuthsFacade(this.http);\n this.integrations = new IntegrationsFacade(this.http);\n this.apiKeys = new ApiKeysFacade(this.http);\n this.idGenerator = new IdGeneratorFacade(this.http);\n this.item = new ItemFacade(this.http);\n this.thesaurus = new ThesaurusFacade(this.http);\n this.shortUrl = new ShortUrlFacade(this.http, this.config);\n }\n}\n","import type { components } from \"../../schema/generated.js\";\n\n/** OpenAPI `AccountType` (`SendCodeReq.type`, `CreateAuthSessionReq.type`, …). */\nexport type AccountType = components[\"schemas\"][\"AccountType\"];\n\n/**\n * Значения OpenAPI enum **`AccountType`**.\n *\n * @example\n * ```ts\n * import { AccountTypeValues } from \"@torrow/sdk-client\";\n * await client.auth.sendCode({ type: AccountTypeValues.Email, accountName });\n * ```\n */\nexport const AccountTypeValues = {\n Undefined: \"Undefined\",\n Phone: \"Phone\",\n Email: \"Email\",\n Telegram: \"Telegram\",\n} as const satisfies Record<string, AccountType>;\n\nexport const AccountTypeValueList: readonly AccountType[] = [\n AccountTypeValues.Undefined,\n AccountTypeValues.Phone,\n AccountTypeValues.Email,\n AccountTypeValues.Telegram,\n];\n\nexport function isAccountType(value: string): value is AccountType {\n return (AccountTypeValueList as readonly string[]).includes(value);\n}\n\nexport function parseAccountType(raw: string | undefined | null): AccountType | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return AccountTypeValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n\n/**\n * Подмножество `AccountType` для OTP **`sendCode`** (не Telegram deep-link / не `Undefined`).\n * Telegram → `createSession`; Undefined Identity на sendCode отвергает.\n */\nexport type SendCodeAccountType = Extract<AccountType, \"Phone\" | \"Email\">;\n\nexport const SendCodeAccountTypeValues = {\n Phone: AccountTypeValues.Phone,\n Email: AccountTypeValues.Email,\n} as const satisfies Record<string, SendCodeAccountType>;\n\nexport const SendCodeAccountTypeValueList: readonly SendCodeAccountType[] = [\n SendCodeAccountTypeValues.Phone,\n SendCodeAccountTypeValues.Email,\n];\n\nexport function isSendCodeAccountType(value: string): value is SendCodeAccountType {\n return (SendCodeAccountTypeValueList as readonly string[]).includes(value);\n}\n\nexport function parseSendCodeAccountType(\n raw: string | undefined | null,\n): SendCodeAccountType | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return SendCodeAccountTypeValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n\n/** OpenAPI `VerificationMethod` (`preferredMethod` / `usedMethod` / `supportedMethods`). */\nexport type VerificationMethod = components[\"schemas\"][\"VerificationMethod\"];\n\n/** Именованные способы подтверждения с неизменными wire-значениями OpenAPI. */\nexport enum VerificationMethodValues {\n /** Неопределённый способ подтверждения; допустим в OTP-flow для Email. */\n UnknownMethod = \"UnknownMethod\",\n /** Подтверждение кодом из SMS. */\n Sms = \"Sms\",\n /** Доставка кода через Telegram Gateway. */\n TelegramGateway = \"TelegramGateway\",\n /** Подтверждение через Flash Call. */\n FlashCall = \"FlashCall\",\n /** Подтверждение через MTS Mobile ID, с возможным SMS fallback. */\n MtsMobileId = \"MtsMobileId\",\n}\n\n/** Все способы подтверждения; список формируется из enum без повторения его членов. */\nexport const VerificationMethodValueList: readonly VerificationMethodValues[] =\n Object.values(VerificationMethodValues);\n\n/** Строго проверяет wire-значение без изменения регистра и пробелов. */\nexport function isVerificationMethod(value: string): value is VerificationMethodValues {\n return VerificationMethodValueList.some((method) => method === value);\n}\n\n/** Разбирает пользовательский ввод, игнорируя регистр и крайние пробелы. */\nexport function parseVerificationMethod(\n raw: string | undefined | null,\n): VerificationMethodValues | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return VerificationMethodValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n\n/** OpenAPI `TokenStatus` (`TokenResp.status`). */\nexport type TokenStatus = components[\"schemas\"][\"TokenStatus\"];\n\n/** Именованные серверные статусы для типизации и проверки переходов аутентификации. */\nexport enum TokenStatusValues {\n /** Аутентификация завершена, сервер выдал токены. */\n TokenReady = \"TokenReady\",\n /** Ожидание завершения Mobile ID; возможен повторный Pending после отправки SMS-кода. */\n Pending = \"Pending\",\n /** Та же Mobile ID auth-сессия продолжается через SMS fallback: Mobile ID не удалось завершить, требуется SMS-код. */\n AwaitingSmsCode = \"AwaitingSmsCode\",\n /** Терминальный отказ текущей auth-сессии. */\n Failed = \"Failed\",\n}\n\nexport const TokenStatusValueList: readonly TokenStatusValues[] = [\n TokenStatusValues.TokenReady,\n TokenStatusValues.Pending,\n TokenStatusValues.AwaitingSmsCode,\n TokenStatusValues.Failed,\n];\n\nexport function isTokenStatus(value: string): value is TokenStatusValues {\n return (TokenStatusValueList as readonly string[]).includes(value);\n}\n\nexport function parseTokenStatus(raw: string | undefined | null): TokenStatus | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return TokenStatusValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n\n/**\n * Готовность токенов: `TokenReady` или отсутствие `status` (legacy).\n * `Pending` / `AwaitingSmsCode` / `Failed` → `false`.\n */\nexport function isTokenRespReadyStatus(\n status: TokenStatus | string | null | undefined,\n): boolean {\n return status == null || status === TokenStatusValues.TokenReady;\n}\n\n/**\n * Провайдер captcha для `SendCodeReq.captchaType` / `CreateAuthSessionReq.captchaType`.\n * В OpenAPI поле — `string`; здесь известные wire-значения Identity / torrow-apps.\n */\nexport type AuthCaptchaType = \"YandexSmartCaptcha\" | \"GoogleRecaptcha\";\n\nexport const AuthCaptchaTypeValues = {\n YandexSmartCaptcha: \"YandexSmartCaptcha\",\n GoogleRecaptcha: \"GoogleRecaptcha\",\n} as const satisfies Record<string, AuthCaptchaType>;\n\nexport const AuthCaptchaTypeValueList: readonly AuthCaptchaType[] = [\n AuthCaptchaTypeValues.YandexSmartCaptcha,\n AuthCaptchaTypeValues.GoogleRecaptcha,\n];\n\nexport function isAuthCaptchaType(value: string): value is AuthCaptchaType {\n return (AuthCaptchaTypeValueList as readonly string[]).includes(value);\n}\n\nexport function parseAuthCaptchaType(\n raw: string | undefined | null,\n): AuthCaptchaType | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return AuthCaptchaTypeValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n\n/**\n * OAuth/API scopes для `TokenReq.scopes` / `RefreshReq.scopes`.\n * В OpenAPI — `string[]`; здесь известные значения Identity (`user_api`, `admin_api`, `offline_access`).\n */\nexport type AuthScope = \"user_api\" | \"admin_api\" | \"offline_access\";\n\nexport const AuthScopeValues = {\n UserApi: \"user_api\",\n AdminApi: \"admin_api\",\n OfflineAccess: \"offline_access\",\n} as const satisfies Record<string, AuthScope>;\n\nexport const AuthScopeValueList: readonly AuthScope[] = [\n AuthScopeValues.UserApi,\n AuthScopeValues.AdminApi,\n AuthScopeValues.OfflineAccess,\n];\n\n/** Дефолт для OTP / LoginTask в SDK и примерах. */\nexport const DefaultAuthScopes: readonly AuthScope[] = [\n AuthScopeValues.UserApi,\n AuthScopeValues.OfflineAccess,\n];\n\nexport function isAuthScope(value: string): value is AuthScope {\n return (AuthScopeValueList as readonly string[]).includes(value);\n}\n\nexport function parseAuthScope(raw: string | undefined | null): AuthScope | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return AuthScopeValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n","import type { OpenApiSchemas as Schemas } from \"../../schema/openapi-schemas.js\";\n\nexport type SolutionData = Schemas[\"SolutionData\"];\nexport type PersonalSolutionData = Schemas[\"PersonalSolutionData\"];\nexport type Metrics = Schemas[\"Metrics\"];\nexport type ViewBlockSettings = Schemas[\"ViewBlockSettings\"];\nexport type BlockSettings = Schemas[\"BlockSettings\"];\nexport type Filter = Schemas[\"Filter\"];\n\n/**\n * Известные int-коды `SolutionData.layoutType` (torrow-apps `LayoutType` в\n * `libs/domain-models/.../layout-type.model.ts`).\n *\n * Не TypeScript-enum: в OpenAPI поле — `number | null`, UI appearance обычно\n * предлагает `NonImage`…`BigImagePanel`; `SmallSlider`/`BigSlider` тоже есть в модели.\n * Значения вне этого списка API не запрещает.\n *\n * Смысл кодов для MCP/ИИ: каталог **`LayoutTypeValues`** в `@torrow/sdk-docs`\n * (`layoutTypeValuesFieldDocEntries` / `mcpFullFieldCatalog.LayoutTypeValues`).\n */\nexport const LayoutTypeValues = {\n Unknown: 0,\n SideImage: 1,\n SmallImagePanel: 2,\n MediumImagePanel: 3,\n BigImagePanel: 4,\n SmallSlider: 5,\n BigSlider: 6,\n NonImage: 7,\n} as const;\n\n/** Union известных кодов {@link LayoutTypeValues}; `SolutionData.layoutType` шире (`number | null`). */\nexport type LayoutTypeValue = (typeof LayoutTypeValues)[keyof typeof LayoutTypeValues];\n\n/**\n * Поля `solutionData`, которые реально управляются UI и бизнес-процессами torrow-apps.\n * Используется как \"рабочий\" срез для codegen/интеграций, чтобы не терять важные аспекты поведения.\n */\nexport type ManagedSolutionData = Pick<\n SolutionData,\n \"layoutType\" | \"viewBlockSettings\" | \"homeItemIds\" | \"quickFilterTags\" | \"metrics\"\n>;\n","/**\n * Индексы «вида расписания по умолчанию» (`CalendarItem.calendarViewIndex`,\n * `ServiceItem.timetableView`). Совпадает с `TimetableViewTypeMapper` в torrow-apps\n * (`libs/domain-utils/.../timetable-view-type.mapper.ts`).\n *\n * В OpenAPI поля — `number | null`, не string-enum.\n */\nexport const TimetableViewTypeValues = {\n Day: 0,\n Month: 1,\n MonthEventList: 2,\n ConnectCalendar: 3,\n Poster: 4,\n Schedule: 5,\n} as const;\n\n/** Union известных индексов {@link TimetableViewTypeValues}. */\nexport type TimetableViewTypeValue =\n (typeof TimetableViewTypeValues)[keyof typeof TimetableViewTypeValues];\n","/** Path `d` for context icon presets — snapshot of torrow-apps `IconSetService.icons`. */\nexport const CONTEXT_ICON_PRESET_PATHS = {\n \"anchor\": \"M35.4783 29.6467C30.6084 24.7768 26.629 15.4085 26.586 15.307C26.585 15.3045 26.5825 15.3015 26.5825 15.3015C26.5594 15.2485 26.527 15.2036 26.4889 15.1626C26.4775 15.1501 26.4645 15.1401 26.4515 15.129C26.4195 15.1006 26.3845 15.0771 26.3465 15.058C26.331 15.0505 26.317 15.042 26.301 15.0361C26.2465 15.0155 26.19 15.0011 26.13 15.0005H26.1265H26.125L26.1215 15.001C25.9914 14.9915 25.8714 15.0495 25.78 15.141C25.776 15.145 25.772 15.148 25.768 15.152C25.7279 15.195 25.6924 15.2425 25.668 15.2975L25.6644 15.3055C25.561 15.536 21.6095 24.3088 16.7716 29.1467C16.6441 29.2742 16.5951 29.4602 16.6431 29.6337C16.6911 29.8072 16.8291 29.9417 17.0037 29.9852C20.5716 30.8772 20.6245 37.3121 20.6251 37.5006C20.6256 37.7765 20.8495 37.9995 21.125 37.9995C21.401 37.999 21.6251 37.7761 21.6251 37.5C21.6251 37.4495 21.5811 30.7692 18.0356 29.2767C21.4051 25.6693 24.22 20.5154 25.6249 17.707V27.0508C24.4854 27.2833 23.625 28.2928 23.625 29.5002C23.625 30.8787 24.7465 32.0002 26.125 32.0002C27.5035 32.0002 28.6249 30.8787 28.6249 29.5002C28.6249 28.2928 27.7644 27.2833 26.625 27.0508V17.8115C28.0315 20.7629 30.8454 26.1428 34.2113 29.7717C30.6684 31.2087 30.6249 37.4546 30.6249 37.5C30.6249 37.776 30.8483 37.999 31.1238 37.9995C31.3998 37.9995 31.6239 37.7765 31.6249 37.501C31.6253 37.3331 31.6814 31.3761 35.2463 30.4852C35.4208 30.4417 35.5588 30.3072 35.6068 30.1337C35.6547 29.9602 35.6058 29.7742 35.4783 29.6467ZM27.6249 29.5002C27.6249 30.3272 26.9519 31.0002 26.125 31.0002C25.298 31.0002 24.625 30.3272 24.625 29.5002C24.625 28.6733 25.298 28.0003 26.125 28.0003C26.9519 28.0003 27.6249 28.6733 27.6249 29.5002ZM32.1248 37.0001H20.1251C19.8491 37.0001 19.6251 37.2241 19.6251 37.5V38.5C19.6251 38.776 19.8491 39 20.1251 39C20.4011 39 20.6251 38.776 20.6251 38.5V38.0001H31.6248V38.5C31.6248 38.776 31.8488 39 32.1248 39C32.4007 39 32.6247 38.776 32.6247 38.5V37.5C32.6248 37.2241 32.4008 37.0001 32.1248 37.0001Z\",\n \"animals\": \"M38.1434 21.1127L38.2291 21.1445C38.3104 21.1763 38.4006 21.2127 38.4999 21.2582L38.5044 21.2627C38.6398 21.3309 38.7662 21.4263 38.87 21.5445C38.9693 21.6581 39.0551 21.7945 39.1137 21.9399L39.1182 21.9581C39.1769 22.1263 39.1995 22.2899 39.1905 22.4627C39.1814 22.6308 39.1363 22.799 39.0551 22.9763L39.046 22.9945C38.685 23.6717 38.2021 24.2262 37.6334 24.6353C37.0557 25.0535 36.3877 25.3216 35.6837 25.4126C35.5528 25.4262 35.4174 25.4398 35.2775 25.4444H35.2053C34.93 26.7125 34.6727 27.9897 34.3793 29.2488C34.2484 29.8351 34.1266 30.4033 33.6753 30.8805V35.4076C33.6753 35.7576 33.5308 36.0758 33.3052 36.3031C33.075 36.5349 32.7591 36.6758 32.4116 36.6758H31.9377C31.6308 36.6758 31.3419 36.5622 31.1208 36.3712C30.8996 36.1849 30.7417 35.9167 30.692 35.6076L30.024 31.3669L27.4605 30.9351L24.721 30.4624C24.1974 31.1396 23.3805 31.7169 22.6765 32.2169C22.4869 32.3487 22.3109 32.4714 22.1213 32.6123L20.6365 33.7259L20.9028 35.1804C20.9389 35.3667 20.9298 35.5531 20.8847 35.7304C20.8351 35.9122 20.7493 36.0804 20.6275 36.2258L20.6094 36.2485C20.483 36.3758 20.3567 36.4758 20.2032 36.5531C20.0407 36.6349 19.8692 36.6758 19.6616 36.6758H19.0884C18.7861 36.6758 18.5017 36.5667 18.2806 36.3849C18.0594 36.2031 17.9015 35.9394 17.8473 35.6395L17.2831 32.5941C17.1568 31.9032 17.8699 31.026 18.3663 30.4215L18.4972 30.2578C18.2264 29.6215 18.082 29.0261 18.0233 28.4943C17.933 27.7261 18.0233 27.0761 18.1632 26.5716C18.2219 26.3489 18.2986 26.1489 18.3753 25.9625L18.4115 25.8898C17.8247 25.6353 17.2786 25.2944 16.7957 24.8762C16.209 24.3717 15.7125 23.7535 15.3379 23.0445L15.3334 23.0399C15.1754 22.7263 15.1529 22.3808 15.2522 22.0763C15.347 21.7672 15.5591 21.4991 15.866 21.3354L15.8705 21.3309C16.1142 21.2036 16.385 21.1627 16.6377 21.1991C16.8995 21.24 17.1432 21.3582 17.3373 21.5491C17.4953 21.7036 17.6036 21.8036 17.7299 21.9172L18.0007 22.1581C18.6732 22.7808 19.9234 23.9399 21.1329 23.8672C23.7687 23.8672 26.6707 23.6081 29.3471 23.4853C29.5502 22.9399 29.7848 22.3263 30.024 21.7081C30.5656 20.2991 31.1253 18.8355 31.5179 17.5174L31.527 17.4901C31.6262 17.2401 31.7978 17.031 32.0099 16.8856C32.2265 16.7447 32.4838 16.6674 32.75 16.6765C33.4316 16.6992 33.7023 17.0401 33.8739 17.4765L33.9822 17.4401C34.2169 17.3765 34.4741 17.381 34.7133 17.4628C34.9525 17.5401 35.1556 17.6901 35.3046 17.881C35.4535 18.0674 35.5528 18.3037 35.5708 18.5537L35.6385 19.29C35.8732 19.4219 36.0944 19.5991 36.2839 19.8037C36.5322 20.0764 36.7353 20.3991 36.8526 20.7354C36.8932 20.8582 37.4799 20.8627 37.8591 21.0036L38.1434 21.1127ZM37.9493 21.8809L37.5883 21.7445C37.0828 21.5536 36.1891 21.2172 36.1124 20.9991C36.0312 20.7627 35.8913 20.5355 35.7107 20.3446C35.5392 20.1582 35.3316 20.0037 35.115 19.9128L34.8938 19.8218L34.79 18.6219C34.781 18.5264 34.7449 18.4401 34.6907 18.3674C34.6366 18.2946 34.5554 18.2401 34.4651 18.2083C34.3748 18.181 34.2755 18.1764 34.1853 18.2037C34.095 18.2264 34.0138 18.2764 33.9551 18.3446L33.4812 18.8946L33.2736 18.1719C33.1743 17.8219 33.075 17.4765 32.7275 17.4628C32.6237 17.4628 32.5244 17.4901 32.4431 17.5447C32.3664 17.5947 32.3032 17.6719 32.2626 17.7628C31.87 19.0901 31.3013 20.5673 30.7552 21.9899C30.4979 22.6581 30.2452 23.3126 29.9925 24.0035L29.9067 24.249L21.1826 24.6535C19.6391 24.7444 18.2264 23.4444 17.4727 22.7445L17.2064 22.499C17.062 22.3672 16.9356 22.249 16.7912 22.1127C16.719 22.0399 16.6242 21.9945 16.5249 21.9809C16.4301 21.9672 16.3263 21.9854 16.2361 22.0309L16.227 22.0354C16.1142 22.0945 16.033 22.199 15.9969 22.3127C15.9608 22.4263 15.9698 22.5581 16.0285 22.6717L16.033 22.6763C16.3579 23.299 16.7912 23.8353 17.3057 24.2808C17.8292 24.7308 18.434 25.0807 19.0839 25.308L19.5353 25.4671L19.296 25.8807C19.2283 25.9943 19.1607 26.1262 19.093 26.2807C19.0298 26.4262 18.9666 26.5943 18.9169 26.7852C18.7996 27.2034 18.7274 27.7534 18.7996 28.4034C18.8583 28.9215 19.0117 29.5033 19.3096 30.1487L19.4089 30.3624L19.269 30.5487L18.9711 30.9214C18.5694 31.4123 17.9917 32.1214 18.0504 32.4532L18.6145 35.494C18.6371 35.6076 18.6958 35.7031 18.7815 35.7758C18.8628 35.844 18.9711 35.8849 19.0884 35.8849H19.6616C19.7429 35.8849 19.806 35.8713 19.8557 35.8485C19.9144 35.8167 19.973 35.7667 20.0407 35.6985C20.0814 35.6485 20.1084 35.5895 20.1265 35.5304C20.1445 35.4622 20.1491 35.3895 20.1355 35.3213L19.779 33.385L21.6565 31.9805C21.8099 31.8669 22.013 31.7214 22.2251 31.5714C22.9473 31.0623 23.7958 30.4624 24.22 29.8169L24.3644 29.5988L27.5869 30.1578C28.643 30.3396 29.654 30.5078 30.4257 30.6351L30.7055 30.6805L31.4638 35.4804C31.4818 35.5985 31.5405 35.6985 31.6263 35.7713C31.712 35.844 31.8203 35.8849 31.9377 35.8849H32.4116C32.5424 35.8849 32.6643 35.8304 32.7546 35.744C32.8358 35.6622 32.89 35.5395 32.89 35.4076V30.5442L33.0208 30.426C33.3954 30.0851 33.5038 29.5897 33.6166 29.0761C33.8784 27.617 34.2665 26.0898 34.5824 24.6308L34.9164 24.6489C35.0338 24.658 35.1466 24.658 35.2504 24.658C35.3542 24.6535 35.467 24.6444 35.5844 24.6308C36.1576 24.558 36.7037 24.3353 37.1776 23.9944C37.6469 23.6581 38.0486 23.199 38.3465 22.6445C38.3826 22.5581 38.4052 22.4808 38.4097 22.4127C38.4142 22.3536 38.4052 22.2945 38.3871 22.2354C38.36 22.1718 38.3284 22.1127 38.2878 22.0718C38.2472 22.0263 38.2021 21.9899 38.1524 21.9672L37.9493 21.8809Z\",\n \"auto\": \"M42.598 27.613v2.053c0 1.427-1.174 2.567-2.612 2.567h-.889l-.037.14a3.335 3.335 0 0 1-2.38 2.38 3.347 3.347 0 0 1-4.08-2.38l-.037-.14H21.679l-.037.14a3.335 3.335 0 0 1-2.38 2.38 3.346 3.346 0 0 1-4.08-2.38l-.037-.14h-.533c-1.438 0-2.612-1.14-2.612-2.567v-1.801c0-1.171.785-2.194 1.916-2.502l4.791-1.306 2.857-3.751A3.308 3.308 0 0 1 24.195 19h9.31c1.142 0 2.198.585 2.803 1.551l2.22 3.547 2.54 1.15a2.598 2.598 0 0 1 1.53 2.365zm-24.183 6.355a2.416 2.416 0 1 0 0-4.832 2.416 2.416 0 0 0 0 4.832zm17.41 0a2.416 2.416 0 1 0 .002-4.832 2.416 2.416 0 0 0-.001 4.832zm4.161-2.657c.929 0 1.69-.733 1.69-1.645l.002-2.045a1.697 1.697 0 0 0-.992-1.528l-2.668-1.21a.414.414 0 0 1-.193-.168l-2.301-3.67a2.36 2.36 0 0 0-2.017-1.124h-9.312a2.39 2.39 0 0 0-1.898.943l-2.95 3.875a.48.48 0 0 1-.254.167l-4.933 1.347a1.686 1.686 0 0 0-1.24 1.609v1.805c0 .914.76 1.645 1.692 1.645h.465l.019-.167a3.33 3.33 0 0 1 2.939-2.938 3.34 3.34 0 0 1 3.693 2.94l.02.165h10.746l.019-.167a3.332 3.332 0 0 1 2.939-2.938 3.34 3.34 0 0 1 3.693 2.939l.02.166h.821z\",\n \"beauty\": \"M38.29 26.814c0 3.618-1.12 7.088-3.231 9.727-2.074 2.59-4.863 4.086-7.914 4.086-3.052 0-5.841-1.497-7.915-4.086-2.112-2.639-3.23-6.11-3.23-9.727 0-3.618 1.118-7.089 3.23-9.727C21.304 14.497 24.093 13 27.145 13c3.051 0 5.84 1.497 7.914 4.087 2.112 2.638 3.23 6.109 3.23 9.727zM27.144 39.699c.815 0 1.62-.12 2.395-.357 2.253-.687 4.204-2.302 5.599-4.514 1.458-2.311 2.222-5.123 2.222-8.014 0-2.895-.765-5.712-2.222-8.015-1.395-2.212-3.346-3.827-5.6-4.514a8.248 8.248 0 0 0-4.797 0c-2.247.687-4.198 2.304-5.592 4.514-1.457 2.303-2.222 5.12-2.222 8.015 0 2.891.764 5.703 2.222 8.014 1.394 2.21 3.345 3.827 5.592 4.514a8.249 8.249 0 0 0 2.403.357zm8.482-12.885c0 3.02-.91 5.897-2.649 8.062-1.556 1.945-3.604 3.09-5.833 3.09-2.23 0-4.278-1.145-5.834-3.09-1.739-2.165-2.649-5.042-2.649-8.062 0-3.02.91-5.897 2.649-8.07 1.553-1.941 3.602-3.082 5.834-3.082 2.231 0 4.28 1.14 5.833 3.082 1.74 2.173 2.649 5.05 2.649 8.07zM32.253 34.3c1.607-2.004 2.446-4.67 2.446-7.487 0-2.821-.84-5.491-2.446-7.487-1.377-1.727-3.176-2.744-5.108-2.744-1.933 0-3.732 1.017-5.11 2.745-1.605 1.995-2.445 4.665-2.445 7.486 0 2.818.839 5.483 2.446 7.487 1.374 1.723 3.173 2.736 5.109 2.736 1.935 0 3.734-1.013 5.108-2.736zm-1.037-13.304c1.074 1.618 1.663 3.742 1.663 5.817 0 .255-.213.46-.468.46a.46.46 0 0 1-.46-.46c0-1.841-.508-3.718-1.433-5.18-.89-1.4-2.093-2.296-3.373-2.296a.466.466 0 0 1-.461-.467.46.46 0 0 1 .46-.46c1.572 0 3.028 1.016 4.072 2.586z\",\n \"beauty2\": \"M19.9856 39.8118L16.3104 36.1366C14.9636 34.7897 14.9635 32.5999 16.3104 31.253L31.253 16.3104C32.5999 14.9635 34.7897 14.9635 36.1366 16.3104L39.8118 19.9856C40.5188 20.6926 40.5188 21.8388 39.8118 22.5457C39.224 23.1335 38.3326 23.2326 37.6425 22.843C38.0321 23.5331 37.933 24.4245 37.3452 25.0123C36.7575 25.6001 35.866 25.6991 35.1758 25.3095C35.5655 25.9996 35.4664 26.8911 34.8786 27.4789C34.2909 28.0667 33.3995 28.1657 32.7093 27.7761C33.0989 28.4663 32.9998 29.3577 32.4121 29.9455C31.8243 30.5332 30.9328 30.6323 30.2427 30.2427C30.6323 30.9328 30.5333 31.8243 29.9455 32.4121C29.3577 32.9998 28.4663 33.0989 27.7762 32.7093C28.1658 33.3995 28.0667 34.2909 27.4789 34.8786C26.8911 35.4664 25.9997 35.5655 25.3095 35.1758C25.6992 35.866 25.6001 36.7574 25.0123 37.3452C24.4245 37.933 23.5331 38.0321 22.843 37.6425C23.2326 38.3326 23.1335 39.224 22.5457 39.8118C21.8388 40.5187 20.6926 40.5187 19.9856 39.8118ZM20.5513 39.2461L16.8761 35.5709C15.8416 34.5364 15.8416 32.8532 16.8761 31.8187L31.8187 16.8761C32.8532 15.8416 34.5364 15.8416 35.5709 16.8761L39.2461 20.5513C39.6407 20.9458 39.6407 21.5855 39.2461 21.98C38.8516 22.3746 38.2119 22.3746 37.8174 21.98L34.1422 18.3048C33.8955 18.0581 33.4941 18.0581 33.2474 18.3048L32.657 18.8953L36.7796 23.0179C37.1741 23.4124 37.1741 24.0521 36.7796 24.4466C36.385 24.8411 35.7454 24.8411 35.3509 24.4466L31.2282 20.324L30.1903 21.3619L34.313 25.4845C34.7075 25.879 34.7075 26.5187 34.313 26.9132C33.9184 27.3077 33.2788 27.3077 32.8842 26.9132L28.7616 22.7906L27.7238 23.8284L31.8464 27.9511C32.2409 28.3456 32.2409 28.9852 31.8464 29.3798C31.4519 29.7743 30.8122 29.7743 30.4177 29.3798L26.2951 25.2572L25.2572 26.2951L29.3798 30.4177C29.7743 30.8122 29.7743 31.4518 29.3798 31.8464C28.9853 32.2409 28.3456 32.2409 27.9511 31.8464L23.8285 27.7238L22.7906 28.7616L26.9132 32.8842C27.3077 33.2788 27.3077 33.9184 26.9132 34.3129C26.5187 34.7075 25.879 34.7075 25.4845 34.3129L21.3619 30.1903L20.324 31.2282L24.4466 35.3508C24.8411 35.7454 24.8411 36.385 24.4466 36.7795C24.0521 37.1741 23.4124 37.1741 23.0179 36.7795L18.8953 32.6569L18.3048 33.2474C18.0581 33.4941 18.0581 33.8955 18.3048 34.1422L21.98 37.8174C22.3746 38.2119 22.3746 38.8516 21.98 39.2461C21.5855 39.6406 20.9459 39.6406 20.5513 39.2461Z\",\n \"botanical\": \"M40.8394 28.2455C40.6261 28.044 40.2816 28.045 40.0705 28.248C37.7819 30.4427 34.9907 30.998 32.1098 30.5256C31.558 29.0642 28.0498 21 17.9432 21C16.5136 21 14.9949 21.1628 13.4292 21.484C13.2701 21.5167 13.135 21.6152 13.0604 21.7527C12.9861 21.89 12.98 22.052 13.044 22.1943C16.6947 30.2986 22.8312 32 27.3356 32C27.3359 32 27.3356 32 27.3359 32C29.3661 32 30.923 31.6467 31.5476 31.4793C32.3494 31.6267 33.1352 31.7048 33.8979 31.7048C36.5478 31.7048 38.932 30.8093 40.8422 28.9776C41.0536 28.7748 41.0526 28.4469 40.8394 28.2455ZM27.3355 30.9647C23.2672 30.9647 17.7582 29.4552 14.3166 22.3702C15.5733 22.1478 16.7906 22.0353 17.9432 22.0353C26.4744 22.0353 29.877 28.0418 30.8414 30.255C27.1474 29.2852 23.405 26.7869 20.467 24.0093C20.2541 23.8076 19.9096 23.8091 19.6982 24.0118C19.4867 24.2148 19.4877 24.5426 19.7009 24.7441C22.8746 27.7443 26.1261 29.7934 29.2066 30.8552C28.6529 30.919 28.0245 30.9647 27.3355 30.9647Z\",\n \"children\": \"M32.871 34.797a3.051 3.051 0 0 1 1.956 2.84 3.056 3.056 0 0 1-3.052 3.052 3.056 3.056 0 0 1-3.052-3.052c0-.568.163-1.12.471-1.61l.423-.677-.79.1c-.485.062-.921.093-1.34.093-.415 0-.845-.032-1.34-.093l-.79-.098.423.674c.308.493.471 1.044.471 1.61a3.055 3.055 0 0 1-3.053 3.052 3.056 3.056 0 0 1-3.052-3.052 3.05 3.05 0 0 1 1.955-2.84l.739-.286-.688-.394a10.775 10.775 0 0 1-5.437-9.345V21.82H15.48a.479.479 0 1 1 0-.96l1.715.002c.266 0 .48.214.48.48v2.95h9.333V14.48c0-.266.214-.48.48-.48 5.939 0 10.77 4.833 10.77 10.772 0 3.863-2.075 7.418-5.437 9.345l-.687.394.738.286zM23.2 39.73a2.094 2.094 0 1 0-.004-4.188 2.094 2.094 0 0 0 .004 4.188zm10.67-2.093c0-1.155-.94-2.094-2.094-2.094a2.095 2.095 0 0 0-2.093 2.094c0 1.154.939 2.093 2.094 2.093a2.095 2.095 0 0 0 2.093-2.093zm-5.903-14.69l.013 2.304H17.677l.037.412c.456 5.04 4.708 8.921 9.773 8.921 5.065 0 9.317-3.88 9.772-8.92l.055-.602.001-.565-.056-.617a9.753 9.753 0 0 0-1.38-4.189c-.562-.927-1.516-1.996-2.375-2.665a9.775 9.775 0 0 0-5.126-2.027l-.412-.037v7.984z\",\n \"devices\": \"M35.309 17.1091C35.2563 16.5905 34.8183 16.1857 34.2857 16.1857H19.7143C19.1462 16.1857 18.6857 16.6462 18.6857 17.2143V20.8143H35.3143V17.2143C35.3143 17.1788 35.3125 17.1437 35.309 17.1091ZM35.3143 21.5H18.6857V37.1H35.3143V21.5ZM18 21.5V17.2143C18 16.2675 18.7675 15.5 19.7143 15.5H34.2857C35.1733 15.5 35.9034 16.1746 35.9911 17.039C35.997 17.0966 36 17.1551 36 17.2143V21.5V37.7857H18V21.5ZM27.1528 33.5031C29.3777 33.5031 31.1813 31.6995 31.1813 29.4745C31.1813 27.2496 29.3777 25.446 27.1528 25.446C24.9278 25.446 23.1242 27.2496 23.1242 29.4745C23.1242 31.6995 24.9278 33.5031 27.1528 33.5031ZM27.1528 34.1888C29.7564 34.1888 31.867 32.0782 31.867 29.4745C31.867 26.8709 29.7564 24.7603 27.1528 24.7603C24.5491 24.7603 22.4385 26.8709 22.4385 29.4745C22.4385 32.0782 24.5491 34.1888 27.1528 34.1888ZM32.5714 19.2714L27.4286 19.2714V18.5857L32.5714 18.5857V19.2714ZM21.4286 19.3572C21.6653 19.3572 21.8571 19.1653 21.8571 18.9286C21.8571 18.6919 21.6653 18.5 21.4286 18.5C21.1919 18.5 21 18.6919 21 18.9286C21 19.1653 21.1919 19.3572 21.4286 19.3572Z\",\n \"entertainment\": \"M16.013 20.395a1.896 1.896 0 0 1 1.266-.704l22.428-2.677a1.91 1.91 0 0 1 2.126 1.672l.385 3.219a.455.455 0 0 1-.39.504 2.554 2.554 0 0 0-2.177 2.816 2.558 2.558 0 0 0 2.778 2.225.456.456 0 0 1 .498.398l.384 3.218a1.906 1.906 0 0 1-.397 1.409 1.899 1.899 0 0 1-1.275.716l-4.226.505v1.149a1.915 1.915 0 0 1-1.913 1.913H12.913A1.915 1.915 0 0 1 11 34.845v-3.241c0-.248.198-.45.446-.454a2.55 2.55 0 0 0 2.496-2.539 2.55 2.55 0 0 0-2.496-2.538.455.455 0 0 1-.446-.455v-3.242c0-1.054.858-1.912 1.913-1.912h3.045l.055-.069zm-4.105 14.45c0 .553.451 1.003 1.005 1.003h22.585c.554 0 1.005-.45 1.005-1.003v-2.819l-.149-.028a3.42 3.42 0 0 1-1.803-.967 3.428 3.428 0 0 1-.99-2.419c0-.91.351-1.77.99-2.419a3.43 3.43 0 0 1 1.802-.967l.15-.029v-2.82c0-.553-.45-1.003-1.003-1.003h-3.96l-1.277-.001h-17.35c-.554 0-1.005.45-1.005 1.003v2.82l.15.028c.685.13 1.309.466 1.803.967.639.65.99 1.508.99 2.419s-.351 1.77-.99 2.419a3.43 3.43 0 0 1-1.803.968l-.15.028v2.82zm30.5-3.67l-.334-2.801-.152-.01a3.416 3.416 0 0 1-1.904-.747 3.427 3.427 0 0 1-1.27-2.284c-.108-.9.142-1.804.697-2.52a3.426 3.426 0 0 1 1.675-1.174l.145-.046-.334-2.8a1 1 0 0 0-1.115-.877l-18.641 2.225-3.958.362 3.983-.04h14.3c1.054 0 1.913.858 1.913 1.913v3.24c0 .25-.2.451-.448.455a2.55 2.55 0 0 0-2.495 2.539 2.55 2.55 0 0 0 2.495 2.54.455.455 0 0 1 .448.454v1.177l4.119-.491a1 1 0 0 0 .876-1.116zM28.782 27.14a.454.454 0 0 1 .253.777l-2.099 2.046.495 2.888a.455.455 0 0 1-.658.48l-2.595-1.365-2.595 1.365a.454.454 0 0 1-.659-.48l.496-2.89-2.1-2.044a.457.457 0 0 1 .252-.776l2.9-.422 1.299-2.63a.456.456 0 0 1 .814.002l1.297 2.628 2.9.421zM26 29.881a.454.454 0 0 1 .13-.402l1.612-1.57-2.227-.323a.453.453 0 0 1-.342-.248l-.995-2.017-.995 2.016a.457.457 0 0 1-.306.242c-.01.003-.01.003-.036.007l-2.225.324 1.608 1.568a.46.46 0 0 1 .132.403l-.38 2.217 1.991-1.047c.132-.07.29-.07.423 0l1.99 1.047-.38-2.217z\",\n \"evolution\": \"M33.962 25.089a2.694 2.694 0 1 1 .382 5.31l-4.056 6.744h1.731a.55.55 0 0 1 .535.552v.956h6.288a.542.542 0 0 1 0 1.085H14.389a.542.542 0 0 1 0-1.085H24.87v-.956c0-.3.24-.544.542-.552h3.61l4.253-7.07a2.69 2.69 0 0 1-1.391-2.36c0-.859.404-1.648 1.073-2.153l-6.246-8.125c.501 1.284.47 2.67-.1 4.058a7.312 7.312 0 0 1-1.348 2.137.544.544 0 0 1-.601.124 15.362 15.362 0 0 1-8.017-7.744l-.062-.13a.534.534 0 0 1 .105-.606 7.401 7.401 0 0 1 2.091-1.415c1.519-.678 3.06-.69 4.478-.036a2.31 2.31 0 0 1 1.88-.973c.598 0 1.175.235 1.607.653.443.437.694 1.034.694 1.655 0 .38-.094.756-.274 1.09l6.798 8.84zm.613 1.034a1.592 1.592 0 1 0 .001 3.183 1.592 1.592 0 0 0-.001-3.183zM31.473 38.65v-.426h-5.518v.426h5.518zm-6.151-21.57a.538.538 0 0 1 .265-.784 1.23 1.23 0 0 0-.45-2.365 1.22 1.22 0 0 0-1.147.805.541.541 0 0 1-.78.28c-1.257-.734-2.592-.791-3.986-.17a6.55 6.55 0 0 0-1.49.939 14.31 14.31 0 0 0 6.987 6.811c.367-.47.671-.99.899-1.537.57-1.41.47-2.743-.298-3.98z\",\n \"family\": \"M30.365 32.267a.407.407 0 0 1-.346-.203.453.453 0 0 1-.018-.418l2.098-4.405V25.27c0-1.38 1.068-2.502 2.382-2.502 1.311 0 2.38 1.122 2.38 2.502v1.972l2.097 4.405a.46.46 0 0 1-.018.418.406.406 0 0 1-.348.203h-2.366v6.167c0 .246-.295.556-.525.556L16.452 39a.398.398 0 0 1-.386-.406c0-.134-.005-.272-.005-.408v-7.454A2.553 2.553 0 0 1 15 28.64v-4.7c0-1.39 1.075-2.52 2.398-2.52h2.089c1.32 0 2.398 1.13 2.398 2.52v4.7a2.56 2.56 0 0 1-1.062 2.092v7.45h3.68v-3.855a2.551 2.551 0 0 1-1.06-2.091v-2.454c0-1.39 1.076-2.52 2.399-2.52l.802.003c1.32 0 2.398 1.13 2.398 2.519v2.454c0 .843-.4 1.622-1.062 2.09v3.853h4.769v-5.914h-2.384zm-13.49 5.914h3.132v-7.669l.002-.012a.43.43 0 0 1 .214-.389c.523-.291.846-.855.846-1.47v-4.702c0-.917-.71-1.664-1.582-1.664h-2.09c-.872 0-1.583.745-1.583 1.664v4.701c0 .616.325 1.18.845 1.471a.431.431 0 0 1 .216.38v7.69zm16.688 0h1.85v-6.344c0-.028.002-.057.007-.086l.01-.04a.412.412 0 0 1 .39-.301h2.116l-1.846-3.878a.426.426 0 0 1-.043-.19v-2.073c0-.907-.703-1.647-1.566-1.647-.866 0-1.568.74-1.568 1.647v2.072a.426.426 0 0 1-.044.191l-1.845 3.878h2.132c.182 0 .336.126.388.3l.012.041a.548.548 0 0 1 .007.086v6.344zm.916-16.653c-1.36 0-2.464-1.163-2.464-2.59 0-1.429 1.104-2.589 2.464-2.589 1.359 0 2.466 1.16 2.466 2.588 0 1.428-1.107 2.59-2.466 2.59zm0-4.324c-.91 0-1.65.778-1.65 1.736 0 .955.74 1.73 1.65 1.73.911 0 1.65-.775 1.65-1.73 0-.958-.739-1.736-1.65-1.736zm-9.16 20.977h1.848v-4.073-.01a.435.435 0 0 1 .216-.389c.52-.294.845-.857.845-1.473v-2.454c0-.917-.711-1.665-1.584-1.665h-.802c-.873 0-1.585.748-1.585 1.665v2.454c0 .616.323 1.18.844 1.47a.427.427 0 0 1 .216.38l.002.02v4.075zm.916-12.158c-1.36 0-2.464-1.162-2.464-2.59s1.105-2.588 2.464-2.588c1.357 0 2.464 1.16 2.464 2.588 0 1.428-1.107 2.59-2.464 2.59zm0-4.323c-.91 0-1.65.778-1.65 1.733 0 .957.74 1.733 1.65 1.733.909 0 1.65-.776 1.65-1.733 0-.955-.741-1.733-1.65-1.733zm-7.8-1.521c-1.36 0-2.467-1.163-2.467-2.588 0-1.428 1.107-2.591 2.466-2.591 1.357 0 2.464 1.163 2.464 2.59 0 1.426-1.107 2.589-2.464 2.589zm0-4.324c-.912 0-1.65.778-1.65 1.733 0 .958.738 1.734 1.65 1.734.908 0 1.65-.776 1.65-1.734 0-.955-.742-1.733-1.65-1.733z\",\n \"friends\": \"M26.125 29.568v6.248a.993.993 0 0 1-.992.993H14.55a1.55 1.55 0 0 1-1.55-1.55v-5.57a3.777 3.777 0 0 1 3.777-3.777H36.83a3.777 3.777 0 0 1 3.777 3.777v5.57a1.55 1.55 0 0 1-1.55 1.55H29.032a1.55 1.55 0 0 1-1.55-1.55v-5.691h-1.356zm-.992 0a.435.435 0 1 1 0-.871h9.746a.957.957 0 1 0 0-1.914H16.777a2.906 2.906 0 0 0-2.906 2.906v5.57c0 .375.304.679.679.679h1.235V31.36a.435.435 0 1 1 .872 0v4.578h8.596v-6.37h-.12zm3.22 5.691c0 .375.304.679.678.679h1.235V31.36a.435.435 0 1 1 .872 0v4.578h5.812V31.36a.435.435 0 1 1 .871 0v4.578h1.236a.678.678 0 0 0 .678-.679v-5.57a2.906 2.906 0 0 0-2.906-2.906h-.39l.086.174c.12.245.183.513.183.783a1.827 1.827 0 0 1-1.829 1.828h-6.526v5.691zm8.912-14.481a3.778 3.778 0 1 1-7.556 0 3.778 3.778 0 0 1 7.556 0zm-6.684 0a2.906 2.906 0 1 0 5.812 0 2.906 2.906 0 0 0-5.812 0zm-6.015 0a3.778 3.778 0 1 1-7.556 0 3.778 3.778 0 0 1 7.556 0zm-6.683 0a2.906 2.906 0 1 0 5.812 0 2.906 2.906 0 0 0-5.812 0z\",\n \"gamepad\": \"M23.72 24.983h-2.3v-2.278a.457.457 0 0 0-.456-.456.457.457 0 0 0-.456.456v2.278h-2.255a.457.457 0 0 0-.456.455c0 .251.205.456.456.456h2.255v2.278a.457.457 0 0 0 .911 0v-2.278h2.301c.25 0 .456-.205.456-.456a.457.457 0 0 0-.456-.455zm5.445-.456l-.16.16a.908.908 0 0 0 0 1.298c.183.16.41.25.639.25a.9.9 0 0 0 .637-.273l.16-.16a.908.908 0 0 0 0-1.298.88.88 0 0 0-1.276.023zm2.324-2.437l-.137.182a.908.908 0 0 0 0 1.298c.182.16.41.25.638.25a.9.9 0 0 0 .638-.273l.16-.159a.908.908 0 0 0 0-1.299.908.908 0 0 0-1.3 0zm.023 4.852l-.16.16a.908.908 0 0 0 0 1.298.9.9 0 0 0 .638.273.9.9 0 0 0 .638-.273l.16-.16a.908.908 0 0 0 0-1.298.88.88 0 0 0-1.276 0zm2.483-2.415l-.16.16a.908.908 0 0 0 0 1.298.9.9 0 0 0 .638.274.9.9 0 0 0 .638-.274l.16-.16a.908.908 0 0 0 0-1.298.88.88 0 0 0-1.276 0zM38.073 23.229l-.274-1.14v-.045c-.683-2.073-2.597-3.463-4.761-3.44h-.364c-.456 0-.912.068-1.413.205l-2.46.729a5.17 5.17 0 0 1-1.481.205h-1.663a5.169 5.169 0 0 1-1.481-.205l-2.46-.73a6.163 6.163 0 0 0-1.413-.181h-.342a5.022 5.022 0 0 0-4.761 3.44v.045l-.273 1.14a34.909 34.909 0 0 0-.912 8.998l.046 1.731c.023.684.341 1.345.866 1.8a2.45 2.45 0 0 0 1.64.615c.09 0 .16 0 .25-.022l.524-.046c1.299-.137 2.46-.911 3.053-2.073l.843-1.595a4.064 4.064 0 0 1 3.622-2.21h3.645c1.572 0 3.008.912 3.691 2.324l.66 1.39a3.837 3.837 0 0 0 3.099 2.164l.228.023a2.509 2.509 0 0 0 1.89-.615 2.527 2.527 0 0 0 .866-1.823l.046-1.708a34.255 34.255 0 0 0-.911-8.976zm0 8.976l-.046 1.708a1.609 1.609 0 0 1-.547 1.162 1.556 1.556 0 0 1-1.207.387l-.228-.022c-1.025-.092-1.913-.73-2.37-1.663l-.66-1.39c-.82-1.709-2.597-2.825-4.51-2.825h-3.646a5.013 5.013 0 0 0-4.442 2.71l-.843 1.596c-.456.865-1.344 1.48-2.324 1.572l-.524.045a1.583 1.583 0 0 1-1.207-.387 1.608 1.608 0 0 1-.547-1.162l-.045-1.731a34.245 34.245 0 0 1 .865-8.771l.274-1.117a4.1 4.1 0 0 1 3.895-2.78h.342c.364 0 .752.047 1.14.16l2.46.73a6.29 6.29 0 0 0 1.754.25h1.663c.615 0 1.207-.091 1.754-.25l2.46-.73c.388-.113.775-.16 1.162-.16h.41c1.709 0 3.28 1.14 3.85 2.803l.274 1.116c.638 2.848.934 5.81.843 8.749z\",\n \"health\": \"M41.47 26.874h-2.623c1.093-2.474.973-4.478.56-5.836C38.7 18.623 36.312 16 32.778 16c-.945 0-1.889.176-2.862.53-1.68.62-2.8 1.298-3.3 1.653-.5-.355-1.59-1.034-3.298-1.653a8.418 8.418 0 0 0-2.862-.53c-3.535 0-5.923 2.623-6.628 5.038-.414 1.444-.56 3.627.824 6.366H11.47a.467.467 0 0 0-.47.474c0 .265.205.47.47.47h3.743c.146.265.325.53.53.795 3.064 4.422 9.725 9.225 10.934 9.52v.03s.03 0 .06-.03h.086v-.03c1.033-.5 7.426-4.627 10.788-9.52.325-.44.59-.88.825-1.324h3.094c.265 0 .47-.206.47-.47 0-.27-.265-.445-.53-.445zm-4.713 1.74c-3.124 4.567-8.87 8.25-10.11 9.049-1.268-.799-6.985-4.512-10.139-9.05-.06-.086-.116-.175-.175-.265h4.332c.176 0 .355-.09.44-.265l1.978-3.888 3.094 7.926c.056.176.265.295.44.295h.03c.206 0 .385-.15.44-.355l2.714-9.284 1.444 4.687c.06.175.205.295.384.325.176.03.351-.06.47-.206l1.15-1.68.974 1.65a.469.469 0 0 0 .41.236h2.654c-.18.294-.355.56-.53.824zm1.06-1.74h-2.889l-1.209-2.063a.469.469 0 0 0-.41-.235c-.18 0-.325.06-.415.205l-1 1.474-1.623-5.273c-.06-.206-.265-.325-.47-.355-.206 0-.411.15-.47.355l-2.743 9.46-2.978-7.605a.438.438 0 0 0-.41-.295.463.463 0 0 0-.445.265l-2.325 4.57h-4.687c-1.179-2.152-1.504-4.216-.974-6.07.62-2.094 2.654-4.333 5.717-4.333.825 0 1.683.175 2.538.47 2.15.795 3.299 1.71 3.329 1.71a.452.452 0 0 0 .59 0s1.149-.915 3.328-1.71a7.116 7.116 0 0 1 2.537-.47c3.034 0 5.098 2.239 5.714 4.332.504 1.71.239 3.594-.705 5.568z\",\n \"hobbies\": \"M37.164 19.512A2.844 2.844 0 0 1 40 22.357v11.718a3 3 0 0 1-2.996 3.006H16.996A3 3 0 0 1 14 34.075V22.357a2.852 2.852 0 0 1 2.836-2.845h4.488l.146-.634A3.691 3.691 0 0 1 25.084 16h3.832a3.69 3.69 0 0 1 3.615 2.88l.14.632h4.493zm-15.5.853h-4.828a1.99 1.99 0 0 0-1.986 1.992v11.718c0 1.192.958 2.154 2.146 2.154h20.008c1.183 0 2.14-.963 2.14-2.154V22.357c0-1.1-.89-1.992-1.986-1.992l-4.821-.006a.413.413 0 0 1-.411-.324l-.223-.964a2.858 2.858 0 0 0-2.792-2.224l-3.827.006a2.842 2.842 0 0 0-2.787 2.218l-.223.964a.424.424 0 0 1-.41.33zm-2.776 3.071a.647.647 0 0 1-.645.653.647.647 0 0 1-.645-.653.646.646 0 1 1 1.29 0zM27 33.666c-2.932 0-5.318-2.391-5.318-5.335 0-2.94 2.388-5.336 5.318-5.336 2.93 0 5.318 2.396 5.318 5.336 0 2.94-2.388 5.336-5.318 5.336zm0-9.824c-2.463 0-4.474 2.017-4.474 4.489 0 2.475 2.009 4.489 4.474 4.489 2.465 0 4.474-2.014 4.474-4.489 0-2.472-2.01-4.489-4.474-4.489z\",\n \"home\": \"M36.863 40.113H18.167a.462.462 0 0 1-.46-.464V27.983h-3.243a.465.465 0 0 1-.43-.287.465.465 0 0 1 .103-.503L27.17 14.137a.456.456 0 0 1 .653 0l13.014 13.03a.462.462 0 0 1-.3.817l-3.21-.001v11.666a.462.462 0 0 1-.464.464zm-10.086-.924H36.4V27.52c0-.253.21-.46.463-.46h2.557L27.5 15.118 15.577 27.06h2.59c.257 0 .464.206.464.46v11.67h2.003v-9.974c0-.253.206-.463.463-.463h5.22c.253 0 .46.21.46.463v9.973zm-5.22 0h4.297v-9.51h-4.297v9.51zm12.346-5.066H29.46a.464.464 0 0 1-.463-.463v-4.444c0-.253.207-.463.463-.463h4.443c.254 0 .46.21.46.463v4.444a.464.464 0 0 1-.46.463zm-3.98-.927h3.517V29.68h-3.516v3.516z\",\n \"idea\": \"M30.86 31.2513L31.304 31.0307C34.1245 29.629 36.06 26.7198 36.06 23.36C36.06 18.6324 32.2276 14.8 27.5 14.8C22.7725 14.8 18.94 18.6324 18.94 23.36C18.94 26.7198 20.8755 29.629 23.696 31.0306L24.14 31.2513V33.84C24.14 34.5027 24.6773 35.04 25.34 35.04H29.66C30.3227 35.04 30.86 34.5027 30.86 33.84V31.2513ZM31.66 31.7471V33.84C31.66 34.9446 30.7646 35.84 29.66 35.84H25.34C24.2354 35.84 23.34 34.9446 23.34 33.84V31.7471C20.258 30.2154 18.14 27.0351 18.14 23.36C18.14 18.1906 22.3306 14 27.5 14C32.6694 14 36.86 18.1906 36.86 23.36C36.86 27.0351 34.742 30.2155 31.66 31.7471ZM29.82 35.8H25.18V38.2C25.18 38.8627 25.7173 39.4 26.38 39.4H28.62C29.2827 39.4 29.82 38.8627 29.82 38.2V35.8ZM24.38 35V38.2C24.38 39.3046 25.2754 40.2 26.38 40.2H28.62C29.7246 40.2 30.62 39.3046 30.62 38.2V35H24.38ZM27.9 25.44L27.9 35.8L27.1 35.8L27.1 25.44L27.9 25.44ZM26.98,22.84a0.52,0.52 0 1,0 1.04,0a0.52,0.52 0 1,0 -1.04,0z\",\n \"money\": \"M38.49 25.364h-.61v-4.132c0-.972-.764-1.736-1.687-1.736l-.46.003v-2.766c0-.969-.714-1.733-1.58-1.733h-.104l-17.466 4.49c-.006 0-.016.006-.021.006-.863.07-1.562.808-1.562 1.736v16.035c0 .972.764 1.736 1.684 1.736h19.51a1.72 1.72 0 0 0 1.735-1.736v-4.242h.562c.309 0 .509-.205.509-.509v-6.637a.511.511 0 0 0-.51-.515zm-4.24-9.395c.254.05.509.359.509.764v2.758H20.668l13.581-3.522zm2.66 21.298c0 .408-.309.764-.717.764H16.684c-.405 0-.715-.356-.715-.764V21.232c0-.408.31-.764.715-.764h19.457c.406 0 .715.356.715.764v4.132h-5.055a3.793 3.793 0 0 0-3.83 3.83 3.823 3.823 0 0 0 3.83 3.831h5.11v4.242zm1.066-5.211h-6.175c-1.533 0-2.806-1.279-2.806-2.807s1.278-2.806 2.806-2.806h6.175v5.613z\",\n \"music\": \"M16.0946 41C15.6758 40.9998 15.2613 40.9141 14.8763 40.7478C14.4913 40.5816 14.1438 40.3384 13.8549 40.033C13.5659 39.7275 13.3414 39.3662 13.1951 38.9708C13.0487 38.5754 12.9836 38.1542 13.0035 37.7327C13.0234 37.3112 13.1281 36.8982 13.3111 36.5186C13.494 36.1391 13.7516 35.8008 14.0681 35.5245C14.3846 35.2481 14.7535 35.0393 15.1524 34.9107C15.5513 34.7821 15.972 34.7364 16.389 34.7764L14.6146 26.5102C14.5938 26.4131 14.6087 26.3118 14.6566 26.225C14.7045 26.1383 14.782 26.072 14.8748 26.0386L25.8085 22.105C25.8629 22.0854 25.9208 22.0777 25.9784 22.0824C26.0359 22.0872 26.0918 22.1043 26.1423 22.1326C26.1928 22.1608 26.2368 22.1996 26.2712 22.2464C26.3056 22.2931 26.3297 22.3467 26.3419 22.4036L28.849 34.0823C28.8553 34.1122 28.8583 34.1427 28.8581 34.1732C28.953 34.8152 28.8469 35.4711 28.5543 36.0494C28.2617 36.6277 27.7974 37.0997 27.2259 37.3995C26.6545 37.6993 26.0044 37.812 25.3664 37.722C24.7283 37.6319 24.134 37.3436 23.6664 36.8971C23.1987 36.4506 22.8809 35.8683 22.7574 35.2313C22.6338 34.5942 22.7106 33.9342 22.977 33.3432C23.2435 32.7522 23.6863 32.2597 24.2438 31.9343C24.8012 31.6089 25.4456 31.4668 26.087 31.5278L24.7909 25.4897L17.1952 28.2221L19.1273 37.2215C19.2243 37.677 19.2189 38.1486 19.1115 38.6018C19.0041 39.055 18.7975 39.4782 18.5067 39.8404C18.2159 40.2027 17.8484 40.4949 17.4311 40.6955C17.0137 40.8961 16.5571 41.0002 16.0946 41V41ZM16.096 35.5802C15.9355 35.5801 15.7754 35.5974 15.6184 35.6316C15.1769 35.7276 14.7735 35.9533 14.4593 36.2803C14.1451 36.6072 13.9342 37.0207 13.8533 37.4684C13.7723 37.9162 13.825 38.378 14.0047 38.7956C14.1843 39.2131 14.4828 39.5676 14.8625 39.8142C15.2421 40.0609 15.6858 40.1885 16.1375 40.181C16.5892 40.1736 17.0285 40.0313 17.3999 39.7723C17.7713 39.5133 18.0581 39.1491 18.2241 38.7258C18.39 38.3026 18.4277 37.8392 18.3322 37.3944L16.3263 28.044C16.3056 27.947 16.3205 27.8457 16.3684 27.759C16.4163 27.6723 16.4938 27.6061 16.5866 27.5727L24.9535 24.563C25.0079 24.5433 25.0658 24.5356 25.1234 24.5404C25.181 24.5451 25.2369 24.5622 25.2874 24.5905C25.338 24.6187 25.3819 24.6575 25.4163 24.7043C25.4507 24.7511 25.4748 24.8047 25.487 24.8616L27.012 31.9653C27.0269 32.0353 27.0233 32.108 27.0016 32.1762C26.9799 32.2444 26.9408 32.3057 26.8882 32.3539C26.8356 32.402 26.7713 32.4355 26.7019 32.4508C26.6325 32.4662 26.5602 32.4629 26.4925 32.4413C26.0177 32.2882 25.5062 32.2958 25.0362 32.463C24.5661 32.6302 24.1632 32.9477 23.8891 33.3672C23.615 33.7867 23.4846 34.285 23.518 34.7861C23.5513 35.2872 23.7465 35.7635 24.0737 36.1424C24.4009 36.5212 24.8422 36.7818 25.3302 36.8843C25.8182 36.9869 26.3261 36.9257 26.7764 36.7101C27.2266 36.4946 27.5945 36.1365 27.8238 35.6906C28.0532 35.2447 28.1314 34.7354 28.0465 34.2405C28.0435 34.2233 28.0416 34.2059 28.0409 34.1884L25.6461 23.032L15.4835 26.6871L17.3135 35.2131C17.3285 35.2832 17.325 35.3561 17.3032 35.4244C17.2814 35.4927 17.2422 35.554 17.1895 35.6022C17.1367 35.6504 17.0723 35.6838 17.0028 35.699C16.9332 35.7142 16.8608 35.7107 16.793 35.6889C16.5676 35.6166 16.3325 35.5799 16.096 35.5802V35.5802ZM32.7424 25.1081C32.3884 25.1073 32.0356 25.0655 31.6912 24.9834C29.8486 24.5494 28.6167 23.0683 28.9448 21.6848C29.273 20.3014 31.0409 19.5302 32.8832 19.9647C33.2999 20.0622 33.7004 20.2187 34.0726 20.4294L35.7608 13.3246C35.787 13.2158 35.8552 13.1218 35.9506 13.0631C36.0461 13.0043 36.1609 12.9857 36.2701 13.0111L37.5591 13.3154C37.5742 13.3189 37.5891 13.3234 37.6036 13.3287C39.1526 13.7107 40.4602 14.865 40.8653 16.2137C41.2218 17.3992 40.8653 18.6375 39.86 19.7002C39.7944 19.7695 39.7073 19.8147 39.6127 19.8284C39.5181 19.842 39.4217 19.8234 39.3391 19.7754C39.2565 19.7275 39.1927 19.6531 39.1579 19.5643C39.1231 19.4756 39.1194 19.3777 39.1475 19.2866C39.2703 18.8908 39.3135 18.4747 39.2748 18.0622C39.236 17.6497 39.116 17.2489 38.9217 16.8827C38.5874 16.3177 38.0554 15.896 37.4281 15.6987L35.6302 23.2658C35.6143 23.3294 35.5946 23.392 35.5712 23.4534C35.2164 24.4809 34.0837 25.1081 32.7424 25.1081ZM31.8563 20.6882C30.8189 20.6882 29.9417 21.1531 29.7693 21.8792C29.5516 22.7941 30.5216 23.8397 31.8868 24.1621C33.2065 24.4732 34.4745 24.0415 34.771 23.1768C34.785 23.1422 34.7968 23.1067 34.8065 23.0707L36.7067 15.0719C36.7326 14.963 36.8008 14.8688 36.8963 14.81C36.9919 14.7512 37.107 14.7327 37.2162 14.7584C37.7197 14.8569 38.197 15.0593 38.6173 15.3529C39.0376 15.6464 39.3915 16.0244 39.6564 16.4626C39.871 16.8418 40.0159 17.2563 40.0839 17.6864C40.1869 17.2811 40.1768 16.8554 40.0547 16.4554C39.7345 15.3897 38.6278 14.4367 37.3635 14.1385C37.3487 14.1348 37.3347 14.1307 37.3209 14.1259L36.4871 13.9289L34.7548 21.2213C34.7383 21.291 34.7042 21.3553 34.6559 21.4083C34.6076 21.4612 34.5465 21.501 34.4785 21.524C34.4105 21.5469 34.3377 21.5522 34.2671 21.5394C34.1965 21.5266 34.1303 21.496 34.0747 21.4507C33.6687 21.128 33.1948 20.9008 32.6885 20.7861C32.4159 20.7214 32.1366 20.6886 31.8563 20.6882Z\",\n \"palm\": \"M17.6524 19.9464C19.3386 18.3308 21.0374 17.8884 22.5216 18.0699C24.0877 18.2615 25.3542 19.1402 26.0674 19.9216L26.6525 20.5627L25.785 20.591C23.9571 20.6506 22.6183 21.0316 21.6518 21.6025C20.6903 22.1703 20.0769 22.9376 19.7126 23.811C19.0201 25.4707 19.216 27.5461 19.752 29.3671C20.0706 27.5716 21.1593 26.164 22.409 25.1297C23.7269 24.0391 25.2551 23.3359 26.3578 23.0023L26.8417 22.8559L26.8729 23.3605C27.3722 31.4395 23.3709 36.4639 20.4761 38.6H27.3175C31.2763 32.8381 30.0426 26.5141 28.9068 23.5273L28.7006 22.9851H29.2807C31.1411 22.9851 32.4738 24.3418 33.3841 25.9639C34.2018 27.4208 34.7338 29.1822 35.0389 30.6669C36.5193 26.0858 35.7542 23.5235 34.336 22.1367C32.8301 20.6641 30.4456 20.3654 28.6276 20.5882L27.1558 20.7687L28.3372 19.8725C31.4012 17.5483 34.6599 18.9084 36.4431 20.2465C36.1571 18.7984 35.658 17.8412 35.062 17.23C34.4236 16.5754 33.6414 16.2841 32.7926 16.2385C31.0616 16.1454 29.0887 17.0798 27.7593 18.0322L27.5044 18.2148L27.2662 18.0109C23.932 15.1575 21.7129 15.0232 20.278 15.8259C18.9213 16.5848 18.0765 18.2689 17.6524 19.9464ZM27.5497 17.2035C24.2402 14.4533 21.7219 14.1016 19.8875 15.1277C18.0725 16.1429 17.1343 18.4114 16.7496 20.3095C16.6824 20.6407 16.8722 20.9073 17.1124 21.0153C17.3456 21.1201 17.6546 21.092 17.8696 20.8636C19.5218 19.1086 21.1158 18.7039 22.4245 18.864C23.3615 18.9786 24.1838 19.3869 24.8039 19.8537C23.3374 20.0005 22.1654 20.37 21.245 20.9136C20.1278 21.5735 19.4019 22.4779 18.9742 23.503C18.1278 25.5319 18.4618 27.9958 19.1 29.9665C19.1626 30.1598 19.3033 30.2893 19.4628 30.3527C19.6117 30.412 19.7665 30.4113 19.8956 30.3837C20.1306 30.3335 20.4528 30.1432 20.5002 29.7677C20.711 28.0964 21.6965 26.7578 22.9191 25.746C23.957 24.8871 25.1431 24.2835 26.1004 23.9322C26.4233 32.5112 21.4389 37.3163 18.9186 38.6462L19.1053 39.4H27.7335L27.853 39.2307C31.9135 33.4813 30.9859 27.1858 29.8698 23.8466C31.0131 24.0894 31.9448 25.0338 32.6865 26.3554C33.5441 27.8835 34.0808 29.8065 34.3534 31.3401C34.4121 31.6703 34.6819 31.8546 34.9397 31.8804C35.2 31.9065 35.5063 31.7752 35.6197 31.4499C37.3777 26.4068 36.687 23.3167 34.8954 21.5647C33.6086 20.3065 31.8257 19.8148 30.2067 19.7346C32.5514 18.8515 34.8696 19.9816 36.2156 21.0844C36.4471 21.274 36.7412 21.2695 36.9547 21.1577C37.1721 21.0439 37.3494 20.7933 37.2979 20.4791C37.0099 18.7229 36.4289 17.4858 35.6347 16.6715C34.8345 15.8509 33.8517 15.4942 32.8356 15.4396C30.9561 15.3386 28.9372 16.2662 27.5497 17.2035Z\",\n \"party\": \"M27.46 39.01h3.006c.472 0 .9.247 1.139.642l.169.28h-9.551l.17-.28a1.327 1.327 0 0 1 1.138-.642h3.006v-7.19L17.09 18.937a.461.461 0 0 1 .372-.735H30.25l4.197-5.037a.463.463 0 0 1 .71.592l-3.704 4.445h5.082a.463.463 0 0 1 .373.735 4729.84 4729.84 0 0 1-5.855 7.987l-.106.145c-1.661 2.263-2.457 3.347-3.408 4.645l-.079.107v7.189zm-9.087-19.885l8.625 11.763 8.626-11.763h-17.25z\",\n \"reparingService\": \"M17.6264 35.9866L14.9033 31.3082L17.2692 29.9535C17.0676 29.1684 16.9592 28.3465 16.9592 27.4998C16.9592 26.6532 17.0676 25.8313 17.2692 25.0463L14.9033 23.6915L17.6264 19.0133L19.9935 20.3688C21.1773 19.2228 22.6451 18.3639 24.2819 17.9066V15.2H29.7182V17.9068C31.3549 18.3641 32.8227 19.223 34.0065 20.3689L36.3736 19.0134L39.0967 23.6916L36.7309 25.0464C36.9326 25.8314 37.0409 26.6533 37.0409 27.5001C37.0409 28.3468 36.9326 29.1687 36.7309 29.9537L39.0967 31.3085L36.3736 35.9866L34.0066 34.6311C32.8228 35.777 31.355 36.636 29.7182 37.0933V39.8H24.2819V37.0933C22.6452 36.6359 21.1774 35.777 19.9935 34.6311L17.6264 35.9866ZM20.1352 33.6281C21.4188 35.0414 23.1385 36.0571 25.0819 36.4658V39H28.9182V36.4658C30.8617 36.0571 32.5813 35.0414 33.8649 33.6281L36.0818 34.8976L38 31.6024L35.7864 30.3347C36.08 29.4414 36.2409 28.4893 36.2409 27.5001C36.2409 26.5109 36.08 25.5587 35.7864 24.6654L38 23.3978L36.0819 20.1025L33.8649 21.3719C32.5812 19.9586 30.8616 18.9429 28.9182 18.5343V16H25.0819V18.5341C23.1384 18.9427 21.4188 19.9585 20.1352 21.3718L17.9182 20.1023L16 23.3976L18.2137 24.6653C17.9201 25.5584 17.7592 26.5107 17.7592 27.4998C17.7592 28.489 17.9201 29.4412 18.2137 30.3345L16 31.6021L17.9182 34.8976L20.1352 33.6281ZM27.0001 22.9394C24.4556 22.9394 22.3956 24.9921 22.3956 27.4999C22.3956 30.0078 24.4556 32.0605 27.0001 32.0605C29.5445 32.0605 31.6046 30.0078 31.6046 27.4999C31.6046 24.9921 29.5445 22.9394 27.0001 22.9394ZM27.0001 22.1394C24.02 22.1394 21.5956 24.5441 21.5956 27.4999C21.5956 30.4557 24.02 32.8605 27.0001 32.8605C29.9801 32.8605 32.4046 30.4557 32.4046 27.4999C32.4046 24.5441 29.9801 22.1394 27.0001 22.1394Z\",\n \"security\": \"M35.7582 19.8593L26.5878 15.0529C26.4517 14.9815 26.2887 14.9825 26.1536 15.0554L17.2369 19.8618C17.0907 19.9408 17 20.0916 17 20.2558V26.5343C17.0054 31.6953 20.1141 36.3644 24.9216 38.4321L26.1592 38.9626C26.2749 39.0122 26.4066 39.0125 26.5225 38.9631L27.9172 38.3707C32.8138 36.3479 35.9995 31.6337 36 26.4097V20.2558C36 20.0899 35.907 19.9373 35.7582 19.8593ZM35.0869 26.4097C35.0859 31.2736 32.1191 35.6623 27.5597 37.5445L27.5567 37.546L26.3422 38.0617L25.2869 37.6089C20.8119 35.6843 17.9179 31.3385 17.9128 26.5343V20.5217L26.3761 15.9593L35.0869 20.5249V26.4097ZM22.8092 26.0853C22.6443 25.8753 22.3543 25.8505 22.1612 26.0298C21.9681 26.2088 21.9453 26.5244 22.1102 26.7341L24.5376 29.8247C24.6997 30.031 24.9836 30.0592 25.1769 29.888L30.8304 24.8872C31.0274 24.7132 31.0571 24.3984 30.8968 24.1843C30.7368 23.9704 30.4473 23.9378 30.2503 24.1121L24.9451 28.8045L22.8092 26.0853Z\",\n \"smile\": \"M32.0437 29.7417C31.8288 29.5492 31.4985 29.568 31.307 29.7824C30.2187 30.9986 28.6493 31.6957 27.0001 31.6957C25.3514 31.6957 23.7815 30.9986 22.6931 29.7824C22.5006 29.568 22.1714 29.5492 21.9564 29.7417C21.7415 29.9337 21.7237 30.2635 21.9157 30.4784C23.2018 31.9153 25.055 32.7391 27.0001 32.7391C28.9456 32.7391 30.7989 31.9148 32.0844 30.4784C32.2764 30.2635 32.2582 29.9337 32.0437 29.7417ZM27 15C20.3833 15 15 20.3833 15 27C15 33.6167 20.3833 39 27 39C33.6167 39 39 33.6167 39 27C39 20.3833 33.6167 15 27 15ZM27 37.9565C20.9583 37.9565 16.0435 33.0417 16.0435 27C16.0435 20.9583 20.9583 16.0435 27 16.0435C33.0417 16.0435 37.9565 20.9583 37.9565 27C37.9565 33.0417 33.0417 37.9565 27 37.9565ZM31.1739 23.3478C29.7355 23.3478 28.5652 24.5181 28.5652 25.9565C28.5652 26.2445 28.799 26.4783 29.087 26.4783C29.375 26.4783 29.6087 26.2445 29.6087 25.9565C29.6087 25.0936 30.311 24.3913 31.1739 24.3913C32.0369 24.3913 32.7391 25.0936 32.7391 25.9565C32.7391 26.2445 32.9729 26.4783 33.2609 26.4783C33.5489 26.4783 33.7826 26.2445 33.7826 25.9565C33.7826 24.5181 32.6123 23.3478 31.1739 23.3478ZM24.3912 25.9565C24.3912 26.2445 24.625 26.4783 24.913 26.4783C25.201 26.4783 25.4347 26.2445 25.4347 25.9565C25.4347 24.5181 24.2644 23.3478 22.826 23.3478C21.3876 23.3478 20.2173 24.5181 20.2173 25.9565C20.2173 26.2445 20.4511 26.4783 20.7391 26.4783C21.0271 26.4783 21.2608 26.2445 21.2608 25.9565C21.2608 25.0936 21.9631 24.3913 22.826 24.3913C23.689 24.3913 24.3912 25.0936 24.3912 25.9565Z\",\n \"sport\": \"M19.565 26.508v1.901h15.597v-1.9H19.565zm0-.948v-4.943c0-.892-.715-1.617-1.595-1.617h-.75c-.879 0-1.594.725-1.594 1.617v2.567h-1.031c-.88 0-1.595.723-1.595 1.614v5.323c0 .892.715 1.615 1.595 1.615h1.031v2.567c0 .892.715 1.617 1.595 1.617h.75c.879 0 1.594-.725 1.594-1.617V29.36h15.597v4.943c0 .892.715 1.617 1.595 1.617h.75c.881 0 1.594-.725 1.594-1.617v-2.567h1.031c.882 0 1.595-.723 1.595-1.615v-5.323c0-.891-.713-1.614-1.595-1.614h-1.031v-2.567c0-.892-.713-1.617-1.595-1.617h-.75c-.879 0-1.594.725-1.594 1.617v4.943H19.565zm-3.939 5.225h-1.031a.66.66 0 0 1-.657-.664v-5.323a.66.66 0 0 1 .657-.664h1.031v6.651zm.938.95V20.618c0-.368.294-.667.657-.667h.75c.362 0 .656.3.656.667v13.686a.66.66 0 0 1-.657.664h-.75a.66.66 0 0 1-.656-.664v-2.567zm22.537-.95h1.031a.66.66 0 0 0 .657-.664v-5.323a.66.66 0 0 0-.657-.664h-1.031v6.651zm-.938.95V20.618a.662.662 0 0 0-.657-.667h-.75a.662.662 0 0 0-.656.667v13.686a.66.66 0 0 0 .657.664h.75a.66.66 0 0 0 .656-.664v-2.567z\",\n \"theater\": \"M28.7364 18.87C30.2876 18.87 31.5096 19.6791 31.5096 20.7169C31.5096 21.7492 30.2932 22.5639 28.7364 22.5639C27.1852 22.5639 25.9632 21.7548 25.9632 20.7169C25.9632 19.6791 27.1796 18.87 28.7364 18.87ZM28.7364 21.6432C29.791 21.6432 30.5833 21.1578 30.5833 20.7169C30.5833 20.2761 29.7966 19.7907 28.7364 19.7907C27.6818 19.7907 26.8895 20.2761 26.8895 20.7169C26.8895 21.1522 27.6818 21.6432 28.7364 21.6432ZM19.8701 26.9608C21.2985 26.3414 22.7381 26.6037 23.1454 27.5523C23.5584 28.5008 22.7604 29.734 21.3376 30.3478C19.9147 30.9616 18.4695 30.7049 18.0622 29.7563C17.6493 28.8077 18.4416 27.5802 19.8701 26.9608ZM18.9048 29.388C19.0777 29.7898 19.9984 29.9237 20.9693 29.4996C21.9402 29.0811 22.4703 28.3167 22.2973 27.915C22.1243 27.5132 21.2037 27.3793 20.2328 27.8034C19.2674 28.2274 18.7318 28.9919 18.9048 29.388ZM28.5634 25.5435C29.4227 26.8604 30.8679 27.6416 32.4358 27.6416C34.0038 27.6416 35.449 26.8548 36.3083 25.5435L37.0839 26.0457C36.0572 27.6248 34.3163 28.5678 32.4358 28.5678C30.5498 28.5678 28.8145 27.6248 27.7878 26.0457L28.5634 25.5435ZM36.1298 18.8644C37.681 18.8644 38.903 19.6735 38.903 20.7114C38.903 21.7492 37.6865 22.5583 36.1298 22.5583C34.573 22.5639 33.3566 21.7492 33.3566 20.7114C33.3566 19.6735 34.573 18.8644 36.1298 18.8644ZM36.1298 21.6376C37.1844 21.6376 37.9767 21.1522 37.9767 20.7114C37.9767 20.2761 37.1844 19.7851 36.1298 19.7851C35.0752 19.7851 34.2828 20.2706 34.2828 20.7114C34.2828 21.1466 35.0752 21.6376 36.1298 21.6376ZM23.6587 21.4814V13C23.6587 13 27.7878 15.4775 32.4359 15.4775C37.0783 15.4775 41.2074 13 41.2074 13V24.5949C41.2074 27.781 39.4776 30.7216 36.6933 32.2673C35.8396 32.7415 34.9077 33.0652 33.9536 33.2326C33.6467 34.2593 33.1668 35.2134 32.5196 36.0616C30.84 38.26 28.2677 39.7889 24.7078 39.4708C21.5384 39.1863 18.7764 37.1664 17.5042 34.2425L12.8617 23.6185C12.8617 23.6185 18.648 24.5894 23.6587 21.4814ZM36.2469 31.4582C38.7355 30.0744 40.2867 27.4463 40.2867 24.5949V14.5512C37.8539 15.762 35.1588 16.4037 32.4359 16.4037C29.7129 16.4037 27.0178 15.7676 24.585 14.5512V24.5949C24.585 27.4463 26.1306 30.0744 28.6248 31.4582C30.946 32.7527 33.9201 32.7527 36.2469 31.4582ZM18.3467 33.8798C19.485 36.4912 21.9569 38.2823 24.7915 38.5557C27.5144 38.8124 30.1258 37.6741 31.783 35.5091C32.2852 34.8563 32.6646 34.1309 32.938 33.3609C32.7707 33.3721 30.2095 33.5283 27.5702 31.9046C25.2044 31.9269 23.7536 34.1867 23.4969 35.7379L22.5874 35.5873C22.8999 33.7292 24.5292 31.447 26.5993 31.1569C24.7524 29.5108 23.6587 27.1394 23.6587 24.6061V22.5416C20.8186 24.0872 17.56 24.8405 14.3292 24.6786L18.3467 33.8798Z\",\n \"travel\": \"M42.158 34.859v-.04H26.766a5.54 5.54 0 0 1-.429-2.144 5.488 5.488 0 0 1 5.495-5.495 5.522 5.522 0 0 1 4.831 2.844c2.185-.35 4.365.899 5.185 3.042.232.585.31 1.208.31 1.793zm-14.732-.966h13.705a3.167 3.167 0 0 0-.15-.494c-.65-1.687-2.372-2.749-4.171-2.46l-.64.103-.316-.565a4.594 4.594 0 0 0-4.022-2.371 4.564 4.564 0 0 0-4.57 4.569c0 .418.055.823.164 1.218zm-6.22-15.035a.484.484 0 0 1 .276-.63.485.485 0 0 1 .63.276l.626 1.6a.491.491 0 0 1-.28.632.489.489 0 0 1-.629-.279l-.622-1.599zm-6.708 6.669a.489.489 0 0 1 .374-.902l1.868.78a.487.487 0 0 1 .265.635.493.493 0 0 1-.64.266l-1.867-.78zm22.676-.745a.487.487 0 0 1 .384.898l-1.636.7a.489.489 0 0 1-.64-.255.483.483 0 0 1 .255-.64l1.637-.703zm-6.887-6.516a.486.486 0 0 1 .633-.269c.252.1.371.381.273.633l-.701 1.752a.488.488 0 0 1-.905-.36l.7-1.756zm-14.633 1.531a.488.488 0 0 1 .708-.67l2.729 2.885a.485.485 0 0 1-.02.687.485.485 0 0 1-.688-.017l-2.729-2.885zM11.48 30.082a.487.487 0 1 1 .017-.973l4.014.078a.486.486 0 1 1-.02.974l-4.011-.079zm24.336-10.656c.19-.187.5-.187.687.007.191.19.188.5-.003.687l-2.844 2.807a.489.489 0 0 1-.688-.694l2.848-2.807zm-10.397-3.94a.487.487 0 0 1 .976 0v4.015a.487.487 0 1 1-.976 0v-4.014zm11.503 22.445a.49.49 0 0 1 .218.654.491.491 0 0 1-.654.217c-.017-.01-.04-.017-.102-.044-.085-.034-.122-.048-.187-.082-1.065-.581-2.718-.581-3.78 0-1.354.742-3.361.742-4.715 0-1.065-.581-2.719-.581-3.78 0-1.354.742-3.365.742-4.72 0-1.06-.581-2.714-.581-3.776 0a.487.487 0 1 1-.47-.854c1.355-.745 3.362-.745 4.716 0 1.062.582 2.719.582 3.78 0 1.354-.745 3.362-.745 4.716 0 1.061.582 2.718.582 3.78 0 1.354-.745 3.361-.745 4.698-.01.017.01.041.02.102.044.085.034.123.048.174.075zM18.645 33.86a8.206 8.206 0 0 1-1.017-3.95c0-4.57 3.698-8.285 8.28-8.285 2.447 0 4.747 1.096 6.332 2.94.174.2.154.51-.054.684a.482.482 0 0 1-.684-.051c-1.405-1.63-3.436-2.596-5.593-2.596a7.305 7.305 0 0 0-7.308 7.308c0 1.333.37 2.613 1.061 3.763a.63.63 0 0 1 .058.143 5.135 5.135 0 0 0 1.419-.371c.803-.381 1.81-.558 2.84-.514a.487.487 0 1 1-.04.973c-.881-.037-1.732.112-2.395.425-1.528.68-3.777.68-5.304 0-1.276-.568-3.24-.568-4.515 0a.487.487 0 1 1-.395-.891c1.528-.68 3.777-.68 5.304 0 .575.255 1.286.398 2.01.422z\",\n \"work\": \"M23.893 27.36v1.009c0 .146.105.258.248.258h.216v1.467c0 .552.43 1.027 1.003 1.027h2.538c.573 0 1.003-.475 1.003-1.027v-1.467h.216c.143 0 .248-.112.248-.258v-1.01h8.07v9.67c0 .042-.014.056-.052.056H15.84c-.038 0-.052-.014-.052-.056v-9.67h8.105zm-8.999-.004v9.673c0 .548.416.974.946.974h21.543c.53 0 .946-.426.946-.974v-9.673c.506-.028.894-.44.894-.97v-7.048c0-.544-.412-.97-.946-.97h-7.802v-.57c0-1.03-.904-1.798-2.004-1.798h-3.684c-1.1 0-2.005.768-2.005 1.798v.57h-7.836c-.53 0-.946.426-.946.97v7.047c0 .52.412.943.894.971zm8.964-8.988v-.57c0-.37.384-.698.929-.698h3.684c.545 0 .932.328.932.698v.57h-5.545zm-8.912 8.073c-.02 0-.052-.031-.052-.056v-7.047c0-.038.014-.055.052-.055h23.33c.04 0 .053.017.053.055v7.047c0 .042-.014.056-.052.056h-23.33zm13.193 1.233h-3.055v2.287c0 .21.153.395.37.395h2.315c.217 0 .37-.185.37-.395v-2.287z\",\n \"world\": \"M38.745 22.8998C36.9315 18.1411 32.3667 14.9974 27.2741 15C26.1415 14.9979 25.0141 15.154 23.9246 15.4637L23.9082 15.4686C20.8844 16.3235 18.3068 18.3118 16.7122 21.0195C16.684 21.0672 16.6657 21.1201 16.6585 21.175C16.4625 21.4365 16.2999 21.7215 16.1743 22.0231L16.1435 22.0896C14.3781 25.8923 14.6735 30.3327 16.9271 33.868C19.1808 37.4032 23.0816 39.5453 27.2741 39.5499C30.0925 39.5523 32.8251 38.5801 35.0088 36.7982C35.1857 36.8134 35.3519 36.7118 35.4191 36.5475C35.432 36.5096 35.4393 36.4701 35.4408 36.4301C39.2436 33.043 40.5585 27.6586 38.745 22.8998ZM23.8651 16.3381C24.4076 17.0035 25.207 17.4073 26.0645 17.4493C26.2989 17.4553 26.5335 17.4451 26.7666 17.4185C27.1435 17.333 27.5383 17.38 27.8847 17.5514C28.0786 17.6551 28.1856 17.8702 28.1514 18.0874C28.0624 18.2509 27.9402 18.3941 27.7928 18.508C27.4261 18.7567 27.2052 19.1699 27.2019 19.613C27.2297 19.8888 27.3774 20.1385 27.6057 20.2957C27.9433 20.5212 28.3594 20.5966 28.7546 20.5037C28.9736 20.4464 29.1869 20.3692 29.3918 20.2731C29.5782 20.1815 29.7753 20.1138 29.9786 20.0716C30.4981 19.9986 31.0315 20.342 31.576 20.7327C31.8489 20.9301 32.2933 21.303 32.2014 21.5861C32.1308 21.8032 31.8657 21.96 31.5859 22.1265C31.4726 22.1934 31.3619 22.259 31.2338 22.3481C30.7805 22.6913 30.2838 22.9729 29.7566 23.1856C29.5574 23.2519 29.3545 23.3067 29.1489 23.3497C28.7209 23.4246 28.3095 23.5748 27.9339 23.7933C27.1802 24.28 27.2721 25.0588 27.3299 25.5269C27.3164 25.5224 27.3016 25.5171 27.2856 25.5101C27.2154 25.4814 27.1465 25.4485 27.078 25.4165C26.6537 25.1303 26.104 25.1083 25.6582 25.3597C25.2124 25.6111 24.9468 26.0928 24.9722 26.604C24.9722 27.5778 25.6952 28.1457 26.2762 28.6015L26.4781 28.7615C26.6063 28.8793 26.7217 29.0104 26.8223 29.1526C25.9975 28.9449 25.1722 28.7407 24.3464 28.54C23.6521 28.3721 22.9513 28.1653 22.664 27.6516C22.5542 27.4188 22.4802 27.1708 22.4445 26.9159C22.3925 26.5114 22.2503 26.1239 22.0284 25.7817C21.6073 25.3117 21.0398 24.9977 20.4179 24.8905L20.3428 24.8692C19.7273 24.6862 19.39 24.4658 19.2801 24.1774C19.2115 23.803 19.2726 23.4164 19.4532 23.0814C19.6852 22.5988 19.7625 22.0564 19.6748 21.5282C19.5827 21.1232 19.312 20.7817 18.9386 20.5997C18.7168 20.4964 18.4747 20.4444 18.23 20.4474C18.1779 20.4474 18.1249 20.4499 18.0716 20.454C19.5129 18.4978 21.5434 17.0552 23.8651 16.3381ZM25.5499 38.596L25.5536 38.5997C25.3926 38.5104 25.2364 38.4126 25.0858 38.3067C24.7541 38.1 24.5274 37.7607 24.4634 37.3752C24.4863 37.1277 24.5663 36.8889 24.6973 36.6776C24.789 36.4823 24.8568 36.2766 24.8991 36.065C24.9252 35.8729 24.9954 35.6895 25.1043 35.5291C25.2256 35.4185 25.3662 35.3312 25.5191 35.2714C25.6904 35.1956 25.8532 35.1021 26.0049 34.9924C26.3324 34.7316 26.6039 34.4076 26.8035 34.0396C26.8999 33.8706 26.9832 33.6863 27.0636 33.5062C27.1727 33.2206 27.3249 32.9534 27.515 32.7139C27.9253 32.2818 28.7336 32.6026 29.0611 32.7594C29.6859 33.04 30.2604 33.4213 30.7615 33.8882L30.8087 33.9366C31.3396 34.4978 31.9046 35.0259 32.5005 35.5176C32.9934 35.8984 33.5335 36.2139 34.1073 36.4561C31.6555 38.2845 28.5737 39.0551 25.5499 38.596ZM34.8324 35.8722C34.1816 35.6314 33.5696 35.2967 33.0158 34.8788C32.4463 34.4074 31.906 33.9018 31.3979 33.3647L31.3507 33.3167C30.785 32.7806 30.133 32.3437 29.4222 32.0241C28.3841 31.526 27.474 31.5727 26.9237 32.1529C26.6672 32.4567 26.4629 32.801 26.3193 33.1718C26.2459 33.3334 26.1744 33.4931 26.0952 33.6326C25.9493 33.9054 25.7505 34.1464 25.5105 34.3416C25.4027 34.4168 25.2877 34.481 25.1671 34.5333C24.9171 34.6359 24.6901 34.7874 24.4995 34.9789C24.2917 35.2384 24.1549 35.5475 24.1027 35.8759C24.0741 36.0226 24.0294 36.1657 23.9693 36.3026C23.7738 36.629 23.6619 36.9985 23.6436 37.3785C23.6496 37.6766 23.7367 37.9673 23.8955 38.2196C20.735 37.2398 18.1516 34.9429 16.8088 31.9188C15.4661 28.8946 15.4947 25.4379 16.8874 22.4364L16.9186 22.3687C17.03 22.0745 17.1963 21.8043 17.4086 21.5722C17.484 21.497 17.573 21.4365 17.6708 21.3942C17.8477 21.315 18.0391 21.2731 18.2329 21.2711C18.3528 21.2683 18.4718 21.2921 18.5813 21.3409C18.7363 21.419 18.8462 21.5645 18.8792 21.7348C18.9152 22.1019 18.8468 22.4717 18.6819 22.8016C18.4199 23.318 18.3596 23.9133 18.5124 24.4717C18.7878 25.191 19.5551 25.493 20.1127 25.6588L20.1948 25.6818C20.6382 25.7528 21.0489 25.9587 21.3712 26.2714C21.5168 26.5186 21.6092 26.7935 21.6424 27.0785C21.6929 27.4178 21.7967 27.747 21.9502 28.0539C22.3982 28.8569 23.3244 29.1388 24.1565 29.3398C25.0494 29.5567 25.9431 29.7781 26.8376 30.0037C27.0175 30.0624 27.2116 30.0599 27.3899 29.9968C27.5979 29.916 27.7468 29.7302 27.7806 29.5097C27.8742 28.888 27.0153 28.1404 27.001 28.1297L26.7851 27.9582C26.2759 27.5586 25.795 27.1811 25.795 26.6041C25.7901 26.3618 25.9298 26.1397 26.1504 26.0391C26.3034 25.9755 26.4314 26.0219 26.7297 26.1622C26.8118 26.2008 26.8939 26.2394 26.969 26.2698C27.2878 26.4407 27.6799 26.3914 27.9463 26.1467C28.1197 25.9532 28.1928 25.6899 28.1441 25.4347C28.0768 24.8878 28.1031 24.6617 28.3788 24.4832C28.6766 24.3196 28.9998 24.2073 29.3349 24.1512C29.571 24.1007 29.8039 24.0364 30.0325 23.9588C30.6378 23.7172 31.208 23.3957 31.728 23.0027C31.8101 22.9448 31.9048 22.8898 32 22.8336C32.4392 22.6368 32.7887 22.2825 32.9795 21.8406C33.1728 21.2473 32.8613 20.6506 32.053 20.0676C31.5339 19.6954 30.7469 19.1328 29.8581 19.2604C29.5824 19.3111 29.3147 19.3989 29.0625 19.5214C28.9018 19.5972 28.7348 19.659 28.5635 19.7061C28.399 19.744 28.2263 19.7168 28.0814 19.6301C28.0211 19.5866 28.0178 19.5526 28.0165 19.5399C28.0075 19.4332 28.1396 19.3015 28.3448 19.1123C28.5976 18.9137 28.7966 18.655 28.9238 18.3598C29.0926 17.7794 28.8435 17.1588 28.3202 16.8563C27.8233 16.583 27.2462 16.4928 26.6896 16.6015C26.4943 16.6245 26.2977 16.6338 26.1012 16.6294C25.6106 16.6028 25.1425 16.4153 24.7692 16.096C29.8767 14.9455 35.1138 17.4063 37.4882 22.0723C39.8623 26.7384 38.7689 32.4206 34.8324 35.8722Z\",\n \"register_order\": \"M33.7842 18.4074C33.7842 16.0611 32.9999 11 28.4999 11C26 11 23 13 23.3607 18.4074M22.3757 18.3749H18.2507C17.3963 18.3749 17.3571 17.4289 18.2507 17.4289C18.2507 17.4289 19.9064 17.4398 22.3413 17.453M22.3757 18.3749C22.3502 18.0945 22.3376 17.7842 22.3413 17.453M22.3757 18.3749C22.3757 18.3749 29.9051 18.3638 34.7251 18.3562M22.3757 18.3749H23.8756M22.3413 17.453C22.3733 14.5363 23.6647 10 28.5 10C33.0233 10 34.5595 14.5881 34.7187 17.499M22.3413 17.453C25.7428 17.4716 30.6651 17.4947 34.7187 17.499M34.7251 18.3562C35.5107 18.3757 37.8004 18.0621 39.2507 19.8749C40.7507 21.7499 40.5 22.9997 40.5 25.9997V36.9997C40.5 37.9997 39.5823 39.9997 37.5 39.9997H19.5C18.5 39.9997 17.5 39.5 17 39C16.5 38.5 16 37.4997 16 36.4997C16 35.4997 15 35.5 15 36.4997C15.5 40 17.5 41 19 41C20.5 41 29.9834 40.9997 37.5 40.9997C40.3355 40.9997 41.5 38.4997 41.5 36.9997C41.5 32.9997 41.3863 29.4997 41.3863 22.9997C41.3863 19.874 39.0063 17.4997 36 17.4997C35.5851 17.4997 35.157 17.4995 34.7187 17.499M34.7251 18.3562C34.737 18.094 34.7355 17.8058 34.7187 17.499M36.0015 25.0068H34.6554C34.3189 25.0068 33.9824 25.309 33.9824 25.6818V27.0318C33.9824 27.4046 34.2837 27.7068 34.6554 27.7068H36.0015C36.3732 27.7068 36.6745 27.4046 36.6745 27.0318V25.6818C36.6745 25.2599 36.338 25.0068 36.0015 25.0068ZM36.0117 24H34.5117C34.0117 24 33.0832 24.3318 33.0117 25.5C32.9854 25.9315 33.0116 26.482 33.0116 26.9318C33.0116 27.3046 32.9778 28.6238 34.4778 28.6238C35.3867 28.6238 35.4727 28.6212 36.5117 28.5867C37.5508 28.5522 37.6754 27.4818 37.6754 27.0068V25.4818C37.6754 24.659 36.9302 24 36.0117 24ZM29.0015 25.0068H27.6554C27.3189 25.0068 26.9824 25.309 26.9824 25.6818V27.0318C26.9824 27.4046 27.2837 27.7068 27.6554 27.7068H29.0015C29.3732 27.7068 29.6745 27.4046 29.6745 27.0318V25.6818C29.6745 25.2599 29.338 25.0068 29.0015 25.0068ZM29.0117 24H27.5117C27.0117 24 26.0832 24.3318 26.0117 25.5C25.9854 25.9315 26.0116 26.482 26.0116 26.9318C26.0116 27.3046 25.9778 28.6238 27.4778 28.6238C28.3867 28.6238 28.4727 28.6212 29.5117 28.5867C30.5508 28.5522 30.6754 27.4818 30.6754 27.0068V25.4818C30.6754 24.659 29.9302 24 29.0117 24ZM16.7508 29.9998C14.8758 28.4998 14.5006 28.4998 12.6258 26.2498C10.751 23.9998 9.69068 20.4322 10.7507 17.2499C11.1255 16.1249 11.5004 16.4999 11.5006 17.9999C11.5008 19.1249 12 20.5 12.5 21.5C13 22.5 13.7815 23.5899 14.7501 24.3749C15.7187 25.1598 16.8744 26 18.5001 26.9998C18.5464 27.0284 20.1256 24.7499 20.8756 23.9999C21.2278 23.6477 21.7127 23.9727 21.907 24.7499L23.6882 31.8748C23.7837 32.2568 23.5179 32.6779 23.1256 32.7114C19.7506 32.9998 18.25 33.2548 16 33.5C15.1192 33.596 14.5545 33.1365 15 32.5C16.0499 31 16.768 30.0136 16.7508 29.9998ZM12.5 24.5C11.948 23.3953 11.5 21.5 11.5 21.5L12.7269 23.5899C13.3006 24.3749 14.7226 25.6589 16 26.5C17.8985 27.7502 16.7507 26.9998 18.5 28C18.934 28.2482 19.5 27.5 20.5 26C21.0914 25.1129 21.1167 24.966 21.5001 26.5C22 28.5 22.0001 28.5 22.5001 30.5C22.8425 31.8697 22.7897 31.8748 21.5145 31.9986L21.5001 32C21.2354 32.0257 18.5179 32.3266 17 32.5C16.2698 32.5834 15.7821 32.7724 16 32.5C18 30 17.8898 29.7541 17.6709 29.5899C15.5341 27.9873 13.3119 26.1249 12.5 24.5ZM23.8894 18.4008C24.226 18.4008 24.6747 18.4005 24.6747 18.4005V19.1941C24.6747 19.5669 24.3716 20.0001 23.9999 20.0001H22.6538C22.2821 20.0001 21.9413 19.5979 21.9413 19.2251V18.3955C22.4413 18.3955 23.5529 18.4008 23.8894 18.4008ZM22 18.3955C21.5002 18.3955 22.0752 18.3956 21.0752 18.3956C21.0752 18.8279 21.0752 18.9458 21.0752 19.3956C21.0752 19.8454 21.5312 20.8169 22.4779 20.8478C23.3864 20.8775 23.5185 20.8437 24.324 20.8169C25.1296 20.7901 25.4999 19.9134 25.4999 19.2967C25.4999 18.68 25.4999 19.5116 25.4999 18.4008C24.3247 18.4188 24.5002 18.3954 22 18.3955ZM34.8142 18.4008C35.1508 18.4008 35.5995 18.4005 35.5995 18.4005V19.1941C35.5995 19.5669 35.2964 20.0001 34.9247 20.0001H33.5786C33.2069 20.0001 32.8661 19.5979 32.8661 19.2251V18.3955C33.3661 18.3955 34.4777 18.4008 34.8142 18.4008ZM32.9248 18.3955C32.425 18.3955 33 18.3956 32 18.3956C32 18.8279 32 18.9458 32 19.3956C32 19.8454 32.456 20.8169 33.4027 20.8478C34.3112 20.8775 34.4433 20.8437 35.2488 20.8169C36.0544 20.7901 36.4247 19.9134 36.4247 19.2967C36.4247 18.68 36.4247 18.3796 36.4247 18.4008C36.4247 18.4219 35.5995 18.4005 32.9248 18.3955ZM29.0015 32.0068H27.6554C27.3189 32.0068 26.9824 32.309 26.9824 32.6818V34.0318C26.9824 34.4046 27.2837 34.7068 27.6554 34.7068H29.0015C29.3732 34.7068 29.6745 34.4046 29.6745 34.0318V32.6818C29.6745 32.2599 29.338 32.0068 29.0015 32.0068ZM29.0117 31H27.5117C27.0117 31 26.0832 31.3318 26.0117 32.5C25.9854 32.9315 26.0116 33.482 26.0116 33.9318C26.0116 34.3046 25.9778 35.6238 27.4778 35.6238C28.3867 35.6238 28.4727 35.6212 29.5117 35.5867C30.5508 35.5522 30.6754 34.4818 30.6754 34.0068V32.4818C30.6754 31.659 29.9302 31 29.0117 31ZM36.0015 32.0068H34.6554C34.3189 32.0068 33.9824 32.309 33.9824 32.6818V34.0318C33.9824 34.4046 34.2837 34.7068 34.6554 34.7068H36.0015C36.3732 34.7068 36.6745 34.4046 36.6745 34.0318V32.6818C36.6745 32.2599 36.338 32.0068 36.0015 32.0068ZM36.0117 31H34.5117C34.0117 31 33.0832 31.3318 33.0117 32.5C32.9854 32.9315 33.0116 33.482 33.0116 33.9318C33.0116 34.3046 32.9778 35.6238 34.4778 35.6238C35.3867 35.6238 35.4727 35.6212 36.5117 35.5867C37.5508 35.5522 37.6754 34.4818 37.6754 34.0068V32.4818C37.6754 31.659 36.9302 31 36.0117 31Z\",\n} as const;\n\nexport type ContextIconPresetPathKey = keyof typeof CONTEXT_ICON_PRESET_PATHS;\n","/**\n * Пресеты иконок контекста (torrow-apps `IconSetService` + `ContextFormMapper`).\n *\n * На wire нет поля `iconName`: пресет = SVG-файл в `ContextItem.image`\n * с `fileName` вида `{preset}.svg` (и заливка из `color`). Произвольные\n * JPEG/PNG/прочие SVG тоже допустимы через обычный upload `image`.\n */\nimport {\n CONTEXT_ICON_PRESET_PATHS,\n type ContextIconPresetPathKey,\n} from \"./context-icon-preset-paths.js\";\n\n/** Ключи пресетов — значения совпадают с `IconSetService.icons` / basename `*.svg`. */\nexport const ContextIconPresetValues = {\n Anchor: \"anchor\",\n Animals: \"animals\",\n Auto: \"auto\",\n Beauty: \"beauty\",\n Beauty2: \"beauty2\",\n Botanical: \"botanical\",\n Children: \"children\",\n Devices: \"devices\",\n Entertainment: \"entertainment\",\n Evolution: \"evolution\",\n Family: \"family\",\n Friends: \"friends\",\n Gamepad: \"gamepad\",\n Health: \"health\",\n Hobbies: \"hobbies\",\n Home: \"home\",\n Idea: \"idea\",\n Money: \"money\",\n Music: \"music\",\n Palm: \"palm\",\n Party: \"party\",\n ReparingService: \"reparingService\",\n Security: \"security\",\n Smile: \"smile\",\n Sport: \"sport\",\n Theater: \"theater\",\n Travel: \"travel\",\n Work: \"work\",\n World: \"world\",\n RegisterOrder: \"register_order\",\n} as const satisfies Record<string, ContextIconPresetPathKey>;\n\nexport type ContextIconPresetValue =\n (typeof ContextIconPresetValues)[keyof typeof ContextIconPresetValues];\n\nconst PRESET_SET = new Set<string>(Object.values(ContextIconPresetValues));\n\nlet nextSvgId = 0;\n\nexport function isContextIconPreset(value: string | null | undefined): value is ContextIconPresetValue {\n return typeof value === \"string\" && PRESET_SET.has(value);\n}\n\n/** Имя файла image для пресета — как в `ContextFormMapper` (`iconName + \".svg\"`). */\nexport function getContextIconPresetFileName(preset: ContextIconPresetValue): string {\n return `${preset}.svg`;\n}\n\n/**\n * Восстановить ключ пресета из `image.fileName` (basename без `.svg`).\n * Для кастомных картинок / неизвестных имён — `undefined`.\n */\nexport function parseContextIconPresetFromImage(\n image: { fileName?: string | null } | null | undefined,\n): ContextIconPresetValue | undefined {\n const fileName = image?.fileName;\n if (!fileName) {\n return undefined;\n }\n const base = fileName.split(/[/\\\\]/).pop() ?? fileName;\n const withoutExt = base.replace(/\\.svg$/i, \"\");\n return isContextIconPreset(withoutExt) ? withoutExt : undefined;\n}\n\nexport type BuildContextIconSvgOptions = {\n /** Заливка path; в apps обычно `ContextItem.color`. */\n color?: string;\n backgroundColor?: string;\n /** Атрибут `inversed` на path — как в `IconSetService.createSvg`. */\n inversed?: boolean;\n};\n\n/**\n * SVG-разметка пресета (без DOM) — эквивалент `IconSetService.getIcon` / blob из `getIconUrl`.\n * Готово к upload как `image/svg+xml` с именем {@link getContextIconPresetFileName}.\n */\nexport function buildContextIconSvg(\n preset: ContextIconPresetValue,\n options?: BuildContextIconSvgOptions,\n): string {\n const d = CONTEXT_ICON_PRESET_PATHS[preset];\n const id = `iconSet${(nextSvgId += 1)}`;\n const colorAttr = options?.color ? ` fill=\"${escapeXmlAttr(options.color)}\"` : \"\";\n const inversedAttr =\n options?.inversed !== undefined ? ` inversed=\"${options.inversed ? \"true\" : \"false\"}\"` : \"\";\n const styleAttr = options?.backgroundColor\n ? ` style=\"background-color: ${escapeXmlAttr(options.backgroundColor)};\"`\n : \"\";\n\n return (\n `<svg viewBox=\"7 7 40 40\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"${styleAttr}>` +\n `<defs><path d=\"${escapeXmlAttr(d)}\" id=\"${id}\"${colorAttr}${inversedAttr}/></defs>` +\n `<use xlink:href=\"#${id}\" stroke=\"none\" stroke-width=\"1\" fill-rule=\"evenodd\"/>` +\n `</svg>`\n );\n}\n\n/** UTF-8 bytes SVG для `uploadBytes` / `getImagePutUrl`. */\nexport function buildContextIconSvgBytes(\n preset: ContextIconPresetValue,\n options?: BuildContextIconSvgOptions,\n): Uint8Array {\n return new TextEncoder().encode(buildContextIconSvg(preset, options));\n}\n\nfunction escapeXmlAttr(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n","import type { OpenApiSchemas as Schemas } from \"../../schema/openapi-schemas.js\";\n\n/** OpenAPI `AnyoneAccess` — публичность «для любого» у item / карт лояльности. */\nexport type AnyoneAccess = Schemas[\"AnyoneAccess\"];\n\nexport const AnyoneAccessValues = {\n Unknown: \"UnknownAnyoneAccess\",\n None: \"NoneAnyoneAccess\",\n Read: \"Read\",\n ReadWrite: \"ReadWrite\",\n Denied: \"Denied\",\n} as const satisfies Record<string, AnyoneAccess>;\n","import type { OpenApiSchemas as Schemas } from \"../../schema/openapi-schemas.js\";\n\n/** OpenAPI `ParticipationFieldType` — тип поля контакта при записи. */\nexport type ParticipationFieldType = Schemas[\"ParticipationFieldType\"];\n\nexport const ParticipationFieldTypeValues = {\n Unknown: \"UnknownParticipationField\",\n FullName: \"FullName\",\n LastName: \"LastName\",\n FirstName: \"FirstName\",\n MiddleName: \"MiddleName\",\n Company: \"Company\",\n Position: \"Position\",\n MainPhone: \"MainPhone\",\n VerifiedMainPhone: \"VerifiedMainPhone\",\n AdditionalPhone: \"AdditionalPhone\",\n MainEmail: \"MainEmail\",\n VerifiedMainEmail: \"VerifiedMainEmail\",\n AdditionalEmail: \"AdditionalEmail\",\n Address: \"Address\",\n AddressLocation: \"AddressLocation\",\n PaymentAccount: \"PaymentAccount\",\n CustomString: \"CustomString\",\n CustomBoolean: \"CustomBoolean\",\n CustomInt32: \"CustomInt32\",\n CustomDouble: \"CustomDouble\",\n CustomMoney: \"CustomMoney\",\n CustomDate: \"CustomDate\",\n CustomTime: \"CustomTime\",\n CustomDateTime: \"CustomDateTime\",\n} as const satisfies Record<string, ParticipationFieldType>;\n\n/** OpenAPI `ParticipationFieldRequirementType` — обязательность поля. */\nexport type ParticipationFieldRequirementType = Schemas[\"ParticipationFieldRequirementType\"];\n\nexport const ParticipationFieldRequirementTypeValues = {\n Unknown: \"UnknownParticipationFieldRequirement\",\n None: \"NoneRequirement\",\n Optional: \"OptionalField\",\n Required: \"RequiredField\",\n} as const satisfies Record<string, ParticipationFieldRequirementType>;\n","import type { OpenApiSchemas as Schemas } from \"../../schema/openapi-schemas.js\";\n\n/** OpenAPI `UserAccessLevel` — кто может check-in / запись. */\nexport type UserAccessLevel = Schemas[\"UserAccessLevel\"];\n\nexport const UserAccessLevelValues = {\n Unknown: \"UnknownUserAccessLevel\",\n Authenticated: \"Authenticated\",\n Unauthenticated: \"Unauthenticated\",\n} as const satisfies Record<string, UserAccessLevel>;\n","import type { ContactItemDto, SendCommunicationCodeReqDto, SendCommunicationCodeRespDto, VerifyCommunicationCodeReqDto, VerifyCommunicationCodeRespDto, ActivityStatusDto, ContactPropertiesDto, UpdateContactPropertiesRespDto, UpdateMasterInfoReqDto, FeedbackOptionsDto, PersonalReminderDto, PublicityTypeDto, GroupStatusDto, UpdateItemAccountsReqDto, UpdateItemGroupsReqDto, UpdatePersonalListOrderReqDto, UpdatePersonalListOrderRespDto } from \"./dto.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\n\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type {\n DeleteResponse,\n ExcludeResp,\n IncludeExcludeResp,\n NotificationWay,\n ObjectInfo,\n} from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { PersonalSolutionData, SolutionData };\n\nexport type ContactItem = TorrowItemFromDto<ContactItemDto>;\n\n/** Элемент `ContactItem.addresses` (ответ GET). */\nexport type Address = NonNullable<ContactItem[\"addresses\"]>[number];\n\n/** Элемент `ContactItem.communications` (ответ GET, полная модель). */\nexport type Communication = NonNullable<ContactItem[\"communications\"]>[number];\n\n/** `communications[]` в теле `POST`/`PUT` контакта: без read-only `checkDate`; `checkState` опционален (SDK подставляет `Unchecked`). */\nexport type CommunicationForCreateOrUpdate = Omit<Communication, \"checkDate\">;\n\n/** Элемент `ContactItem.dates`. */\nexport type MemorableDate = NonNullable<ContactItem[\"dates\"]>[number];\n\n/** `ContactItem.rating`. */\nexport type Rating = NonNullable<ContactItem[\"rating\"]>;\n\n/** `ContactItem.visitCard` (3 слота отображения). */\nexport type ContactVisitCard = NonNullable<ContactItem[\"visitCard\"]>;\n\n/** Элемент `ContactVisitCard.fields`. */\nexport type ContactVisitCardField = NonNullable<NonNullable<ContactVisitCard[\"fields\"]>[number]>;\n\n/** `ContactItem.personalInfo`. */\nexport type ContactPersonalInfo = NonNullable<ContactItem[\"personalInfo\"]>;\n\n/** `ContactItem.profileType`. */\nexport type ProfileType = NonNullable<ContactItem[\"profileType\"]>;\n\n/** `ContactItem.registerInfo`. */\nexport type RegisterInfo = NonNullable<ContactItem[\"registerInfo\"]>;\n\nexport type Gender = NonNullable<ContactItem[\"gender\"]>;\nexport type CommunicationType = NonNullable<Communication[\"type\"]>;\n\nexport const GenderValues = {\n Unknown: \"UnknownGender\",\n Male: \"Male\",\n Female: \"Female\",\n Other: \"OtherGender\",\n} as const satisfies Record<string, Gender>;\n\nexport const CommunicationTypeValues = {\n Unknown: \"UnknownCommunicationType\",\n Phone: \"Phone\",\n Sms: \"Sms\",\n Email: \"Email\",\n WebSite: \"WebSite\",\n Telegram: \"Telegram\",\n WhatsApp: \"WhatsApp\",\n Viber: \"Viber\",\n Facebook: \"Facebook\",\n Instagram: \"Instagram\",\n Vkontakte: \"Vkontakte\",\n Odnoklassniki: \"Odnoklassniki\",\n Skype: \"Skype\",\n Youtube: \"Youtube\",\n Twitter: \"Twitter\",\n LinkedIn: \"LinkedIn\",\n Max: \"Max\",\n Other: \"Other\",\n} as const satisfies Record<string, CommunicationType>;\n\nexport const ProfileTypeValues = {\n Unknown: \"UnknownProfile\",\n None: \"None\",\n MyProfile: \"MyProfile\",\n AnyProfile: \"AnyProfile\",\n CopyProfile: \"CopyProfile\",\n} as const satisfies Record<string, ProfileType>;\nexport type SendCommunicationCodeReq = SendCommunicationCodeReqDto;\nexport type SendCommunicationCodeResp = SendCommunicationCodeRespDto;\nexport type VerifyCommunicationCodeReq = VerifyCommunicationCodeReqDto;\nexport type VerifyCommunicationCodeResp = VerifyCommunicationCodeRespDto;\nexport type ActivityStatus = ActivityStatusDto;\nexport type ContactProperties = ContactPropertiesDto;\nexport type UpdateContactPropertiesResp = UpdateContactPropertiesRespDto;\nexport type UpdateMasterInfoReq = UpdateMasterInfoReqDto;\nexport type FeedbackOptions = FeedbackOptionsDto;\nexport type PersonalReminder = PersonalReminderDto;\nexport type PublicityType = PublicityTypeDto;\nexport type GroupStatus = GroupStatusDto;\nexport type UpdateItemAccountsReq = UpdateItemAccountsReqDto;\nexport type UpdateItemGroupsReq = UpdateItemGroupsReqDto;\nexport type UpdatePersonalListOrderReq = UpdatePersonalListOrderReqDto;\nexport type UpdatePersonalListOrderResp = UpdatePersonalListOrderRespDto;\n/**\n * Тело `POST`/`PUT` **`/api/v1/contacts`** (обычный контакт).\n * `communications` — {@link CommunicationForCreateOrUpdate} (без read-only `checkDate`).\n */\nexport type ContactItemForCreateOrUpdate = Omit<TorrowItemForCreateOrUpdate<ContactItem>, \"communications\"> & {\n communications?: CommunicationForCreateOrUpdate[] | null;\n};","import type { Communication } from \"./types.js\";\n\n/**\n * Brand id for messenger / known-website icons.\n * SVG map: optional package `@torrow/sdk-brand-assets` (`brandIconUrl`).\n * Revisit only if a dedicated UI-kit package appears.\n */\nexport type CommunicationBrandId =\n | \"telegram\"\n | \"whatsapp\"\n | \"viber\"\n | \"skype\"\n | \"max\"\n | \"youtube\"\n | \"vkontakte\"\n | \"facebook\"\n | \"odnoklassniki\"\n | \"twitter\"\n | \"linkedin\"\n | \"instagram\"\n | \"zoom\";\n\nfunction digitsOnly(value: string): string {\n return value.replace(/\\D+/g, \"\");\n}\n\nfunction looksLikeUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value) || value.includes(\".\");\n}\n\nfunction removeFirstAt(value: string): string {\n return value.replace(/^@/, \"\");\n}\n\nfunction ensureHttpUrl(value: string): string {\n return /^[a-z][a-z0-9+.-]*:/i.test(value) ? value : `https://${value}`;\n}\n\nfunction getDomain(url?: string): string | undefined {\n if (!url?.trim()) {\n return undefined;\n }\n const withScheme = /^[a-z][a-z0-9+.-]*:/i.test(url) ? url : `https://${url}`;\n const match = withScheme.match(/:\\/\\/(www[0-9]?\\.)?([^/:]+)/i);\n const hostName = match?.[2];\n if (!hostName) {\n return undefined;\n }\n const parts = hostName.split(\".\").reverse();\n if (parts.length > 1) {\n let domain = `${parts[1]}.${parts[0]}`;\n if (hostName.toLowerCase().includes(\".co.uk\") && parts.length > 2) {\n domain = `${parts[2]}.${domain}`;\n }\n return domain;\n }\n return hostName;\n}\n\nfunction websiteBrandFromDomain(domain: string | undefined): CommunicationBrandId | null {\n switch ((domain ?? \"\").toLowerCase()) {\n case \"youtube.com\":\n case \"youtu.be\":\n return \"youtube\";\n case \"vk.com\":\n return \"vkontakte\";\n case \"ok.ru\":\n return \"odnoklassniki\";\n case \"facebook.com\":\n case \"fb.com\":\n case \"fb.me\":\n return \"facebook\";\n case \"twitter.com\":\n case \"x.com\":\n return \"twitter\";\n case \"instagram.com\":\n case \"instagr.am\":\n case \"instagr.com\":\n return \"instagram\";\n case \"linkedin.com\":\n case \"linked.in\":\n case \"lnkd.in\":\n return \"linkedin\";\n case \"zoom.us\":\n return \"zoom\";\n default:\n return null;\n }\n}\n\n/** Canonical deep-link / mailto / tel URL for a communication channel. */\nexport function communicationHref(\n comm: Pick<Communication, \"type\" | \"value\" | \"valueForSearch\">,\n): string | null {\n const value = comm.value?.trim() ?? \"\";\n if (!value) {\n return null;\n }\n const digits = digitsOnly(comm.valueForSearch?.trim() || value);\n switch (comm.type) {\n case \"Phone\":\n return digits ? `tel:${digits}` : `tel:${value}`;\n case \"Sms\":\n return digits ? `sms:${digits}` : `sms:${value}`;\n case \"Email\":\n return `mailto:${value}`;\n case \"WebSite\":\n return ensureHttpUrl(value);\n case \"Telegram\":\n if (/^https?:\\/\\//i.test(value) || /^tg:/i.test(value)) {\n return value;\n }\n return `https://telegram.me/${removeFirstAt(value)}`;\n case \"WhatsApp\":\n return digits ? `https://wa.me/${digits}` : null;\n case \"Viber\":\n return digits ? `viber://add?number=${digits}` : null;\n case \"Skype\":\n return `skype:${removeFirstAt(value)}?call`;\n case \"Max\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://max.ru/${removeFirstAt(value)}`;\n case \"Vkontakte\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://vk.com/${removeFirstAt(value)}`;\n case \"Facebook\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://www.facebook.com/${removeFirstAt(value)}`;\n case \"Instagram\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://www.instagram.com/${removeFirstAt(value)}`;\n case \"Odnoklassniki\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://ok.ru/${removeFirstAt(value)}`;\n case \"Twitter\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://twitter.com/${removeFirstAt(value)}`;\n case \"LinkedIn\":\n if (/^https?:\\/\\//i.test(value)) {\n return value;\n }\n return `https://www.linkedin.com/in/${removeFirstAt(value)}`;\n case \"Youtube\":\n return ensureHttpUrl(value);\n default:\n return looksLikeUrl(value) ? ensureHttpUrl(value) : null;\n }\n}\n\n/** Brand for messenger / known-website icons; `null` → generic UI icon. */\nexport function resolveCommunicationBrand(\n comm: Pick<Communication, \"type\" | \"value\">,\n): CommunicationBrandId | null {\n switch (comm.type) {\n case \"Telegram\":\n return \"telegram\";\n case \"WhatsApp\":\n return \"whatsapp\";\n case \"Viber\":\n return \"viber\";\n case \"Skype\":\n return \"skype\";\n case \"Max\":\n return \"max\";\n case \"Youtube\":\n return \"youtube\";\n case \"Vkontakte\":\n return \"vkontakte\";\n case \"Facebook\":\n return \"facebook\";\n case \"Odnoklassniki\":\n return \"odnoklassniki\";\n case \"Twitter\":\n return \"twitter\";\n case \"LinkedIn\":\n return \"linkedin\";\n case \"Instagram\":\n return \"instagram\";\n case \"WebSite\":\n return websiteBrandFromDomain(getDomain(comm.value?.trim()));\n default:\n return websiteBrandFromDomain(getDomain(comm.value?.trim()));\n }\n}\n","import type { GenerateReportReqDto, GenerateReportRespDto } from \"./dto.js\";\nimport type { CaseState } from \"../cases/types.js\";\nimport { type Discriminator } from \"../common/discriminator.js\";\n\n/** Опции доставки/локали — из OpenAPI **`ReportOptions`**. */\nexport type ReportOptions = GenerateReportReqDto[\"options\"];\n\n/**\n * База полиморфного **`ReportProperties`**.\n * В Swagger subtypes не описаны (только `fakeForTsGeneratorDoNotRemove`);\n * реальный контракт — NSwag / `torrow-apps` (`CaseReportProperties`, …).\n */\nexport type ReportPropertiesBase = {\n fakeForTsGeneratorDoNotRemove?: number | null;\n discriminator: string;\n};\n\nexport type TimePeriod = {\n from?: Date | null;\n to?: Date | null;\n};\n\nexport const TimeSplitTypeValues = {\n UnknownTimeSplitType: \"UnknownTimeSplitType\",\n None: \"None\",\n Monthly: \"Monthly\",\n Daily: \"Daily\",\n Hourly: \"Hourly\",\n} as const satisfies Record<string, string>;\nexport type TimeSplitType = (typeof TimeSplitTypeValues)[keyof typeof TimeSplitTypeValues];\n\nexport const CellValueTypeValues = {\n UnknownCellValueType: \"UnknownCellValueType\",\n Time: \"Time\",\n Items: \"Items\",\n ItemsPerPeriod: \"ItemsPerPeriod\",\n} as const satisfies Record<string, string>;\nexport type CellValueType = (typeof CellValueTypeValues)[keyof typeof CellValueTypeValues];\n\nexport const ColumnTypeValues = {\n UnknownColumnType: \"UnknownColumnType\",\n Busy: \"Busy\",\n Balance: \"Balance\",\n Total: \"Total\",\n} as const satisfies Record<string, string>;\nexport type ColumnType = (typeof ColumnTypeValues)[keyof typeof ColumnTypeValues];\n\nexport type ResourcesFilterOptions = {\n resourceGroupIds?: string[] | null;\n text?: string | null;\n};\n\nexport type CaseReportProperties = {\n discriminator: typeof Discriminator.CaseReportProperties;\n caseId: string;\n includeParticipants?: boolean | null;\n includeParticipantAddress?: boolean | null;\n includeCaseDescription?: boolean | null;\n includeAvatars?: boolean | null;\n};\n\nexport type ServiceReportProperties = {\n discriminator: typeof Discriminator.ServiceReportProperties;\n serviceId: string;\n timePeriod: TimePeriod;\n caseStateList?: CaseState[] | null;\n includeOrders?: boolean | null;\n includeUniqueResources?: boolean | null;\n includeParticipants?: boolean | null;\n includeAvatars?: boolean | null;\n};\n\nexport type ServicesResourcesReportProperties = {\n discriminator: typeof Discriminator.ServicesResourcesReportProperties;\n serviceIds: string[];\n timePeriod: TimePeriod;\n timeSplitType: TimeSplitType;\n};\n\nexport type ResourcesRentReportProperties = {\n discriminator: typeof Discriminator.ResourcesRentReportProperties;\n serviceIds: string[];\n timePeriod: TimePeriod;\n timeSplitType: TimeSplitType;\n cellValueType: CellValueType;\n columns?: ColumnType[] | null;\n needToDetailResources?: boolean | null;\n includeOrderCount?: boolean | null;\n hideEmptyData?: boolean | null;\n resourcesFilterOptions?: ResourcesFilterOptions | null;\n};\n\nexport type ResourceReportProperties = {\n discriminator: typeof Discriminator.ResourceReportProperties;\n resourceIds: string[];\n timePeriod: TimePeriod;\n timeSplitType: TimeSplitType;\n serviceIds?: string[] | null;\n};\n\n/** Полиморфные свойства отчёта (discriminator + payload subtype). */\nexport type ReportProperties =\n | CaseReportProperties\n | ServiceReportProperties\n | ServicesResourcesReportProperties\n | ResourcesRentReportProperties\n | ResourceReportProperties\n | ReportPropertiesBase;\n\nexport type GenerateReportReq = {\n options: ReportOptions;\n properties: ReportProperties;\n};\n\nexport type GenerateReportResp = GenerateReportRespDto;\n","import type {\n LoyaltySystemItemDto,\n CreateLoyaltyCardReqDto,\n GetLoyaltySystemsStatisticsReqDto,\n GetLoyaltySystemsStatisticsRespDto,\n LoyaltyCardFilterConditionDto,\n LoyaltyCardSortConditionDto,\n LoyaltySystemsStatisticsRespDto,\n OperationTypeDto,\n ItemSortConditionDto,\n SearchLoyaltyCardsReqDto,\n} from \"./dto.js\";\nimport type { ParticipantType, TorrowObjectType } from \"../../schema/sdk-shared-public-types.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\n\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type {\n GenerateSecurityTokenReq,\n GenerateSecurityTokenResp,\n GetParticipationCountResp,\n GetShareItemSessionReq,\n ObjectInfo,\n ObjectSortCondition,\n ParticipantState,\n ParticipantType,\n ParticipantView,\n Participation,\n ParticipationResp,\n SaveItemToMindMapReq,\n SendLinkOfItemReq,\n SendLinkOfItemResp,\n SetGroupItemReq,\n ShareItemReq,\n TorrowObjectType,\n UnsetGroupItemReq,\n} from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { PersonalSolutionData, SolutionData };\n\nexport type LoyaltySystemItem = TorrowItemFromDto<LoyaltySystemItemDto>;\nexport type CreateLoyaltyCardReq = CreateLoyaltyCardReqDto;\nexport type SearchLoyaltyCardsReq = SearchLoyaltyCardsReqDto;\nexport type LoyaltyCardFilterCondition = LoyaltyCardFilterConditionDto;\nexport type LoyaltyCardSortCondition = LoyaltyCardSortConditionDto;\nexport type GetLoyaltySystemsStatisticsReq = GetLoyaltySystemsStatisticsReqDto;\nexport type GetLoyaltySystemsStatisticsResp = GetLoyaltySystemsStatisticsRespDto;\nexport type LoyaltySystemsStatisticsResp = LoyaltySystemsStatisticsRespDto;\nexport type OperationType = OperationTypeDto;\nexport type ItemSortCondition = ItemSortConditionDto;\nexport type LoyaltySystemItemForCreateOrUpdate = TorrowItemForCreateOrUpdate<LoyaltySystemItem>;\nexport type { LoyaltyParticipantsQuery } from \"../loyalty/loyalty-participants-query.js\";\n\nexport type LoyaltyCardIssueType = NonNullable<LoyaltySystemItem[\"loyaltyCardIssueType\"]>;\nexport type LoyaltyCardUpdateKeyInformation = NonNullable<\n LoyaltySystemItem[\"loyaltyCardUpdateKeyInformation\"]\n>;\nexport type LoyaltyCardUpdateNonKeyInformation = NonNullable<\n LoyaltySystemItem[\"loyaltyCardUpdateNonKeyInformation\"]\n>;\n\nexport const LoyaltyCardIssueTypeValues = {\n Unknown: \"UnknownLoyaltyCardIssueType\",\n Manual: \"Manual\",\n AutoActive: \"AutoActive\",\n AutoIssued: \"AutoIssued\",\n} as const satisfies Record<string, LoyaltyCardIssueType>;\n\nexport const LoyaltyCardUpdateKeyInformationValues = {\n Unknown: \"UnknownLoyaltyCardUpdateKeyInformation\",\n NonKeyDisallowed: \"NonKeyDisallowed\",\n NonKeyAllowed: \"NonKeyAllowed\",\n} as const satisfies Record<string, LoyaltyCardUpdateKeyInformation>;\n\nexport const LoyaltyCardUpdateNonKeyInformationValues = {\n Unknown: \"UnknownLoyaltyCardUpdateNonKeyInformation\",\n KeyDisallowed: \"KeyDisallowed\",\n KeyAllowed: \"KeyAllowed\",\n} as const satisfies Record<string, LoyaltyCardUpdateNonKeyInformation>;\n\n/** OpenAPI `LoyaltyCardSortCondition` — сортировка поиска карт в программе. */\nexport const LoyaltyCardSortConditionValues = {\n SequenceCardNumberAsc: \"SequenceCardNumberAsc\",\n SequenceCardNumberDesc: \"SequenceCardNumberDesc\",\n LoyaltyCardStateAsc: \"LoyaltyCardStateAsc\",\n LoyaltyCardStateDesc: \"LoyaltyCardStateDesc\",\n SequenceCardNumberAscLoyaltyCardStateAsc: \"SequenceCardNumberAscLoyaltyCardStateAsc\",\n SequenceCardNumberDescLoyaltyCardStateAsc: \"SequenceCardNumberDescLoyaltyCardStateAsc\",\n SequenceCardNumberAscLoyaltyCardStateDesc: \"SequenceCardNumberAscLoyaltyCardStateDesc\",\n SequenceCardNumberDescLoyaltyCardStateDesc: \"SequenceCardNumberDescLoyaltyCardStateDesc\",\n LoyaltyCardStateAscSequenceCardNumberAsc: \"LoyaltyCardStateAscSequenceCardNumberAsc\",\n LoyaltyCardStateAscSequenceCardNumberDesc: \"LoyaltyCardStateAscSequenceCardNumberDesc\",\n LoyaltyCardStateDescSequenceCardNumberAsc: \"LoyaltyCardStateDescSequenceCardNumberAsc\",\n LoyaltyCardStateDescSequenceCardNumberDesc: \"LoyaltyCardStateDescSequenceCardNumberDesc\",\n} as const satisfies Record<string, LoyaltyCardSortCondition>;\n\nexport type LoyaltyGroupListQuery = {\n itemType?: TorrowObjectType | null;\n minParticipantType?: ParticipantType | null;\n operationType?: OperationType | null;\n recursionDepth?: number | null;\n take?: number | null;\n skip?: number | null;\n lmfrom?: Date | null;\n lmto?: Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemSortCondition | null;\n};\n","import type { ServiceImplicitTagParams } from \"../common/implicit-tag-params.js\";\nimport type { ServiceItemApiDto, CreateOrderReqDto, OrderRespDto, SearchServiceResourcesReqDto, SearchServiceResourcesRespDto, StepDescriptionDto, SessionDurationPropertiesDto, GetServiceWorkloadInfoRequestDto, GetServiceWorkloadInfoRespDto, GetTimetableStatisticsRequestDto, GetTimetableStatisticsResponseDto, TimetableStatisticsRespDto, GetCheckInScheduleReqDto, GetCheckInScheduleRespDto, GetReCheckInScheduleReqDto, UpdateOrderReqDto, UpdateOrderInfoReqDto, ChangeOrderServiceReqDto } from \"./dto.js\";\nimport type { PersonalSolutionData, SolutionData } from \"../common/solution-data.js\";\nimport type { TorrowItemForCreateOrUpdate, TorrowItemFromDto } from \"../common/torrow-entities.js\";\nexport type {\n DeleteResponse,\n ItemViewSortCondition,\n ObjectInfo,\n ResourceView,\n TimetableCase,\n TimetableDetailsVisibility,\n TimetableFilter,\n} from \"../../schema/sdk-shared-public-types.js\";\n\nexport type { TorrowItem, TorrowObject } from \"../common/torrow-entities.js\";\nexport type { PersonalSolutionData, SolutionData };\n\nexport type ServiceItemApi = ServiceItemApiDto;\nexport type ResourceGroup = NonNullable<ServiceItemApi[\"resourceGroupList\"]>[number];\nexport type BookingProperties = NonNullable<ResourceGroup[\"bookingProperties\"]>;\nexport type CreateOrderReq = CreateOrderReqDto;\nexport type OrderResp = OrderRespDto;\nexport type SearchServiceResourcesReq = SearchServiceResourcesReqDto;\nexport type SearchServiceResourcesResp = SearchServiceResourcesRespDto;\nexport type StepDescription = StepDescriptionDto;\nexport type SessionDurationProperties = SessionDurationPropertiesDto;\nexport type GetServiceWorkloadInfoRequest = GetServiceWorkloadInfoRequestDto;\nexport type GetServiceWorkloadInfoResp = GetServiceWorkloadInfoRespDto;\nexport type GetTimetableStatisticsRequest = GetTimetableStatisticsRequestDto;\nexport type GetTimetableStatisticsResponse = GetTimetableStatisticsResponseDto;\nexport type TimetableStatisticsResp = TimetableStatisticsRespDto;\nexport type GetCheckInScheduleReq = GetCheckInScheduleReqDto;\nexport type GetCheckInScheduleResp = GetCheckInScheduleRespDto;\nexport type GetReCheckInScheduleReq = GetReCheckInScheduleReqDto;\nexport type UpdateOrderReq = UpdateOrderReqDto;\nexport type UpdateOrderInfoReq = UpdateOrderInfoReqDto;\nexport type ChangeOrderServiceReq = ChangeOrderServiceReqDto;\n/**\n * Публичная доменная структура для настройки поведения услуги.\n * Внутри SDK маппится в `service.tags`.\n * orderName задаёт название для отображения в приложении, не серверное имя создаваемого заказа.\n */\nexport type ServiceBehaviorSettings = ServiceImplicitTagParams;\nexport type {\n ServiceBehaviorSettingsIssue,\n ServiceBehaviorSettingsState,\n ServiceBehaviorSettingsUpdateOptions,\n ServiceBehaviorSettingsUpdateResult,\n} from \"./behavior-settings.js\";\n\n/**\n * SDK-тип услуги: OpenAPI `ServiceItem` + удобный доменный слой.\n * `behaviorSettings` сериализуется/десериализуется через `tags` внутри SDK.\n */\nexport type ServiceItem = TorrowItemFromDto<ServiceItemApi> & {\n behaviorSettings?: ServiceBehaviorSettings;\n};\nexport type ServiceItemForCreateOrUpdate = TorrowItemForCreateOrUpdate<ServiceItem>;\n\nexport type ServiceResourceStepUsageType = Extract<\n NonNullable<ResourceGroup[\"usageType\"]>,\n \"Specification\" | \"Rent\" | \"Sale\"\n>;\n\nexport interface AddServiceResourceGroupInput {\n key: string;\n groupId?: string;\n groupName: string;\n minResources?: number | null;\n maxResources?: number | null;\n maxTotalAmount?: number | null;\n quickFilterTags?: string[] | null;\n bookingProperties?: BookingProperties | null;\n}\n\nexport interface AddServiceResourceStepInput extends AddServiceResourceGroupInput {\n usageType: ServiceResourceStepUsageType;\n stepOrder?: number;\n description?: string | null;\n autoChoiceResource?: boolean;\n hiddenStep?: boolean;\n hideResourceDetail?: boolean;\n}\n\nexport type AddServicePaymentGroupInput = AddServiceResourceGroupInput;\n\nexport interface ServiceBuildResult {\n body: ServiceItemForCreateOrUpdate;\n resourceGroupIds: Record<string, string>;\n}\n\nexport type SessionDurationType = NonNullable<SessionDurationProperties[\"sessionDurationType\"]>;\nexport type TimeSelectionType = NonNullable<SessionDurationProperties[\"timeSelectionType\"]>;\nexport type StateManagementType = NonNullable<SessionDurationProperties[\"stateManagementType\"]>;\nexport type SessionPrecisionType = NonNullable<SessionDurationProperties[\"sessionPrecisionType\"]>;\n\nexport const SessionDurationTypeValues = {\n Unknown: \"UnknownSessionDurationType\",\n None: \"SessionDurationNone\",\n Custom: \"Custom\",\n Constant: \"Constant\",\n Sum: \"Sum\",\n} as const satisfies Record<string, SessionDurationType>;\n\nexport const TimeSelectionTypeValues = {\n Unknown: \"UnknownTimeSelectionType\",\n None: \"TimeSelectionNone\",\n Consumer: \"Consumer\",\n Executor: \"Executor\",\n} as const satisfies Record<string, TimeSelectionType>;\n\nexport const StateManagementTypeValues = {\n Unknown: \"UnknownStateManagementType\",\n Auto: \"Auto\",\n Manual: \"Manual\",\n} as const satisfies Record<string, StateManagementType>;\n\nexport const SessionPrecisionTypeValues = {\n Unknown: \"UnknownSessionPrecisionType\",\n None: \"SessionPrecisionNone\",\n DateTime: \"DateTime\",\n Date: \"Date\",\n} as const satisfies Record<string, SessionPrecisionType>;\n\n\n","import {\n SessionDurationTypeValues,\n SessionPrecisionTypeValues,\n StateManagementTypeValues,\n TimeSelectionTypeValues,\n type SessionDurationProperties,\n} from \"./types.js\";\n\nexport const ServiceType = {\n Appeal: \"Appeal\",\n RegisterOnTime: \"RegisterOnTime\",\n OrderOnTime: \"OrderOnTime\",\n Rent: \"Rent\",\n AutoRent: \"AutoRent\",\n Custom: \"Custom\",\n} as const;\n\nexport type ServiceType = (typeof ServiceType)[keyof typeof ServiceType];\nexport type KnownServiceType = Exclude<ServiceType, typeof ServiceType.Custom>;\n\n/** @deprecated Используйте `ServiceType`; этот объект сохранён для совместимости. */\nexport const ServiceTypePresetValues = {\n Appeal: ServiceType.Appeal,\n RegisterOnTime: ServiceType.RegisterOnTime,\n OrderOnTime: ServiceType.OrderOnTime,\n Rent: ServiceType.Rent,\n AutoRent: ServiceType.AutoRent,\n} as const;\n\n/** @deprecated Используйте `KnownServiceType`. */\nexport type ServiceTypePreset = KnownServiceType;\n\nexport type ServiceSessionDurationOptions = Omit<\n SessionDurationProperties,\n \"sessionDurationType\" | \"timeSelectionType\" | \"stateManagementType\"\n>;\n\ntype ServiceSessionDurationPreset = Pick<\n SessionDurationProperties,\n \"sessionDurationType\" | \"timeSelectionType\" | \"stateManagementType\"\n>;\n\nconst serviceSessionDurationPresets = {\n [ServiceType.Appeal]: {\n sessionDurationType: SessionDurationTypeValues.None,\n timeSelectionType: TimeSelectionTypeValues.None,\n stateManagementType: StateManagementTypeValues.Manual,\n },\n [ServiceType.RegisterOnTime]: {\n sessionDurationType: SessionDurationTypeValues.Sum,\n timeSelectionType: TimeSelectionTypeValues.Consumer,\n stateManagementType: StateManagementTypeValues.Auto,\n },\n [ServiceType.OrderOnTime]: {\n sessionDurationType: SessionDurationTypeValues.Sum,\n timeSelectionType: TimeSelectionTypeValues.Consumer,\n stateManagementType: StateManagementTypeValues.Manual,\n },\n [ServiceType.Rent]: {\n sessionDurationType: SessionDurationTypeValues.Custom,\n timeSelectionType: TimeSelectionTypeValues.Consumer,\n stateManagementType: StateManagementTypeValues.Manual,\n },\n [ServiceType.AutoRent]: {\n sessionDurationType: SessionDurationTypeValues.Custom,\n timeSelectionType: TimeSelectionTypeValues.Consumer,\n stateManagementType: StateManagementTypeValues.Auto,\n },\n} as const satisfies Record<KnownServiceType, ServiceSessionDurationPreset>;\n\n/**\n * Собирает согласованные параметры длительности по подтверждённому бизнес-типу услуги.\n * Опции дополняют preset, но не могут переопределить три поля, определяющие тип.\n */\nexport function createServiceSessionDurationProperties(\n type: KnownServiceType,\n options?: ServiceSessionDurationOptions,\n): SessionDurationProperties {\n const preset = serviceSessionDurationPresets[type];\n if (!preset) {\n throw new TypeError(`Unknown service type: ${String(type)}`);\n }\n\n return {\n ...options,\n sessionPrecisionType: options?.sessionPrecisionType ?? SessionPrecisionTypeValues.DateTime,\n ...preset,\n };\n}\n\n/** Определяет бизнес-тип по трём полям, которыми он представлен в REST-модели. */\nexport function getServiceTypeFromSessionDurationProperties(\n properties: SessionDurationProperties | null | undefined,\n): ServiceType {\n if (!properties) {\n return ServiceType.Custom;\n }\n for (const [type, preset] of Object.entries(serviceSessionDurationPresets) as Array<\n [KnownServiceType, ServiceSessionDurationPreset]\n >) {\n if (\n properties.sessionDurationType === preset.sessionDurationType &&\n properties.timeSelectionType === preset.timeSelectionType &&\n properties.stateManagementType === preset.stateManagementType\n ) {\n return type;\n }\n }\n return ServiceType.Custom;\n}\n\n/** Определяет бизнес-тип услуги без изменения исходных данных. */\nexport function getServiceType(\n service: { sessionDurationProperties?: SessionDurationProperties | null },\n): ServiceType {\n return getServiceTypeFromSessionDurationProperties(service.sessionDurationProperties);\n}\n","import type {\n ServiceItem,\n SessionDurationProperties,\n StepDescription,\n} from \"./types.js\";\n\n/**\n * Совпадает с `ServiceCheckInWizardStepType` в **torrow-apps** (`libs/domain-models`).\n * `stepType` в `StepDescription` приходит как **число** из API.\n */\nexport const ServiceCheckInWizardStepType = {\n Unknown: 0,\n Time: 1,\n Resource: 2,\n Payment: 3,\n} as const;\n\n/**\n * Имена параметров в `stepParameterList` шага типа «Ресурс».\n * Эталон: `libs/domain-models/.../service-check-in-wizard-step-parameter-name.enum.ts`.\n */\nexport const ServiceCheckInWizardStepParameterName = {\n HiddenStep: \"HiddenStep\",\n HideResourceDetail: \"HideResourceDetail\",\n ResourceGroupId: \"ResourceGroupId\",\n AutoChoiceResource: \"AutoChoiceResource\",\n} as const;\n\n/** Режимы UI выбора времени (как в `RegisterCheckInToTimeProcessHelper`, ветка Time). */\nexport const TimeStepUiModeValues = {\n SelectDate: \"selectDate\",\n SelectDateRange: \"selectDateRange\",\n SelectTimeBegin: \"selectTimeBegin\",\n SelectTime: \"selectTime\",\n} as const;\n\nexport type TimeStepUiMode =\n (typeof TimeStepUiModeValues)[keyof typeof TimeStepUiModeValues];\n\nexport function sortStepDescriptionsByOrder(\n list: ServiceItem[\"stepDescriptionList\"],\n): StepDescription[] {\n if (!list?.length) {\n return [];\n }\n return [...list].sort((a, b) => (a.stepOrder ?? 0) - (b.stepOrder ?? 0));\n}\n\nexport function getStepParameter(\n step: StepDescription,\n parameterName: string,\n): string | undefined {\n const p = step.stepParameterList?.find((x) => x.parameterName === parameterName);\n return p?.parameterValue ?? undefined;\n}\n\nexport function getResourceGroupIdFromStep(step: StepDescription): string | undefined {\n return getStepParameter(step, ServiceCheckInWizardStepParameterName.ResourceGroupId);\n}\n\nexport function isStepFlag(step: StepDescription, parameterName: string): boolean {\n return getStepParameter(step, parameterName) === \"true\";\n}\n\n/**\n * Определяет, какой виджет времени показывать для шага `Time`, по `sessionDurationProperties` услуги.\n * Логика выровнена с **torrow-apps** `register-check-in-to-time.process.helper.ts` (`getStepListByStepDescription`, case Time).\n */\nexport function getTimeStepUiMode(\n session: SessionDurationProperties | undefined,\n): TimeStepUiMode {\n const sessionDurationType = session?.sessionDurationType;\n const sessionPrecisionType = session?.sessionPrecisionType;\n\n const isSelectDate =\n sessionPrecisionType === \"Date\" &&\n sessionDurationType !== \"SessionDurationNone\" &&\n sessionDurationType !== \"Custom\";\n const isSelectDateRange =\n sessionPrecisionType === \"Date\" && sessionDurationType === \"Custom\";\n const isSelectDateAndTimeBegin =\n sessionPrecisionType === \"DateTime\" &&\n sessionDurationType !== \"SessionDurationNone\" &&\n sessionDurationType !== \"Custom\";\n const isSelectDateRangeAndTimeBeginAndTimeEnd =\n sessionPrecisionType === \"DateTime\" && sessionDurationType === \"Custom\";\n\n if (isSelectDate) {\n return TimeStepUiModeValues.SelectDate;\n }\n if (isSelectDateRange) {\n return TimeStepUiModeValues.SelectDateRange;\n }\n if (isSelectDateAndTimeBegin || isSelectDateRangeAndTimeBeginAndTimeEnd) {\n return TimeStepUiModeValues.SelectTimeBegin;\n }\n return TimeStepUiModeValues.SelectTime;\n}\n","import {\n createServiceSessionDurationProperties,\n ServiceType,\n type KnownServiceType,\n type ServiceSessionDurationOptions,\n} from \"./service-type-preset.js\";\nimport {\n ServiceCheckInWizardStepParameterName,\n ServiceCheckInWizardStepType,\n getResourceGroupIdFromStep,\n} from \"./booking-wizard-hints.js\";\nimport type {\n AddServicePaymentGroupInput,\n AddServiceResourceGroupInput,\n AddServiceResourceStepInput,\n ResourceGroup,\n ServiceBuildResult,\n ServiceItem,\n ServiceItemForCreateOrUpdate,\n SessionDurationProperties,\n StepDescription,\n} from \"./types.js\";\nimport {\n SessionDurationTypeValues,\n StateManagementTypeValues,\n TimeSelectionTypeValues,\n} from \"./types.js\";\n\nconst RESOURCE_USAGE_TYPES = new Set([\"Specification\", \"Rent\", \"Sale\"]);\nconst GROUP_ID_PATTERN = /^[0-9a-f]{24}$/i;\nconst SESSION_DURATION_TYPES = new Set(Object.values(SessionDurationTypeValues));\nconst TIME_SELECTION_TYPES = new Set(Object.values(TimeSelectionTypeValues));\nconst STATE_MANAGEMENT_TYPES = new Set(Object.values(StateManagementTypeValues));\n\nfunction cloneValue<T>(value: T): T {\n if (value instanceof Date) {\n return new Date(value.getTime()) as T;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneValue(item)) as T;\n }\n if (value && typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n result[key] = cloneValue(item);\n }\n return result as T;\n }\n return value;\n}\n\n/** Генерирует 24-символьный hex id ресурсной группы без Node-only API. */\nexport function generateServiceResourceGroupId(): string {\n const bytes = new Uint8Array(12);\n const cryptoObject = globalThis.crypto;\n if (cryptoObject?.getRandomValues) {\n cryptoObject.getRandomValues(bytes);\n } else {\n for (let index = 0; index < bytes.length; index += 1) {\n bytes[index] = Math.floor(Math.random() * 256);\n }\n }\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction normalizeSteps(steps: StepDescription[]): StepDescription[] {\n return steps\n .map((step, index) => ({ step, index }))\n .sort((a, b) => {\n const aOrder = a.step.stepOrder;\n const bOrder = b.step.stepOrder;\n if (aOrder == null && bOrder == null) return a.index - b.index;\n if (aOrder == null) return 1;\n if (bOrder == null) return -1;\n return aOrder - bOrder || a.index - b.index;\n })\n .map(({ step }, index) => ({ ...step, stepOrder: index + 1 }));\n}\n\nfunction assertStepPosition(position: number | undefined, length: number): number {\n if (position === undefined) return length + 1;\n if (!Number.isInteger(position) || position < 1 || position > length + 1) {\n throw new RangeError(`stepOrder must be an integer from 1 to ${length + 1}`);\n }\n return position;\n}\n\n/**\n * Локально собирает тело услуги. Builder не выполняет HTTP и не сохраняет серверное состояние;\n * несколько изменений следует передать одним вызовом `services.create` или `services.update`.\n */\nexport class ServiceBuilder {\n private draft: ServiceItemForCreateOrUpdate;\n private readonly addedGroups = new Map<string, ResourceGroup & { groupId: string }>();\n\n private constructor(body: ServiceItemForCreateOrUpdate) {\n this.draft = cloneValue(body);\n this.normalizeAndSyncOrders();\n }\n\n static create(body: ServiceItemForCreateOrUpdate): ServiceBuilder {\n return new ServiceBuilder(body);\n }\n\n static from(service: ServiceItem): ServiceBuilder {\n return new ServiceBuilder(service);\n }\n\n withType(type: KnownServiceType, options?: ServiceSessionDurationOptions): this {\n if ((type as ServiceType) === ServiceType.Custom) {\n throw new TypeError(\"ServiceType.Custom requires explicit sessionDurationProperties\");\n }\n this.draft.sessionDurationProperties = createServiceSessionDurationProperties(type, options);\n return this;\n }\n\n withSessionDurationProperties(properties: SessionDurationProperties): this {\n if (\n !properties.sessionDurationType ||\n !SESSION_DURATION_TYPES.has(properties.sessionDurationType) ||\n !properties.timeSelectionType ||\n !TIME_SELECTION_TYPES.has(properties.timeSelectionType) ||\n !properties.stateManagementType ||\n !STATE_MANAGEMENT_TYPES.has(properties.stateManagementType)\n ) {\n throw new TypeError(\n \"sessionDurationProperties must include sessionDurationType, timeSelectionType, and stateManagementType\",\n );\n }\n this.draft.sessionDurationProperties = cloneValue(properties);\n return this;\n }\n\n addResourceStep(input: AddServiceResourceStepInput): this {\n if (!RESOURCE_USAGE_TYPES.has(input.usageType)) {\n throw new TypeError(`Unsupported resource group usageType: ${String(input.usageType)}`);\n }\n const minResources = input.minResources ?? 1;\n const maxResources = input.maxResources ?? 1;\n if (input.autoChoiceResource === true && (minResources !== 1 || maxResources !== 1)) {\n throw new RangeError(\"autoChoiceResource requires exactly one resource\");\n }\n const group = this.addResourceGroup(input, input.usageType);\n const groupId = group.groupId;\n\n const step: StepDescription = {\n stepType: ServiceCheckInWizardStepType.Resource,\n description: input.description,\n stepParameterList: [\n {\n parameterName: ServiceCheckInWizardStepParameterName.ResourceGroupId,\n parameterValue: groupId,\n },\n {\n parameterName: ServiceCheckInWizardStepParameterName.AutoChoiceResource,\n parameterValue: String(input.autoChoiceResource ?? false),\n },\n {\n parameterName: ServiceCheckInWizardStepParameterName.HiddenStep,\n parameterValue: String(input.hiddenStep ?? false),\n },\n {\n parameterName: ServiceCheckInWizardStepParameterName.HideResourceDetail,\n parameterValue: String(input.hideResourceDetail ?? false),\n },\n ],\n };\n this.insertStep(step, input.stepOrder);\n return this;\n }\n\n /** Добавляет платёжную группу без ресурсного шага; шаг оплаты добавляется отдельно. */\n addPaymentGroup(input: AddServicePaymentGroupInput): this {\n this.addResourceGroup(input, \"Payment\");\n return this;\n }\n\n /** Заменяет список ресурсов существующей группы, например после создания платёжного ресурса. */\n setResourceGroupResourceIds(resourceGroupId: string, resourceIds: readonly string[]): this {\n const normalizedGroupId = resourceGroupId.trim();\n if (!normalizedGroupId) throw new TypeError(\"resourceGroupId must not be empty\");\n const normalizedResourceIds = resourceIds.map((resourceId) => resourceId.trim());\n if (normalizedResourceIds.some((resourceId) => !resourceId)) {\n throw new TypeError(\"resourceIds must not contain empty ids\");\n }\n if (new Set(normalizedResourceIds).size !== normalizedResourceIds.length) {\n throw new TypeError(\"resourceIds must not contain duplicates\");\n }\n const groups = this.draft.resourceGroupList ?? [];\n if (!groups.some((group) => group.groupId === normalizedGroupId)) {\n throw new TypeError(`Service resource group not found: ${normalizedGroupId}`);\n }\n this.draft.resourceGroupList = groups.map((group) =>\n group.groupId === normalizedGroupId\n ? { ...group, resourceIdList: [...normalizedResourceIds] }\n : group,\n );\n return this;\n }\n\n addTimeStep(options?: { stepOrder?: number }): this {\n return this.addSingletonStep(ServiceCheckInWizardStepType.Time, options?.stepOrder);\n }\n\n addPaymentStep(options?: { stepOrder?: number }): this {\n return this.addSingletonStep(ServiceCheckInWizardStepType.Payment, options?.stepOrder);\n }\n\n build(): ServiceBuildResult {\n this.normalizeAndSyncOrders();\n this.validateConfiguration();\n const resourceGroupIds = Object.create(null) as Record<string, string>;\n for (const [key, group] of this.addedGroups) {\n const current = this.draft.resourceGroupList?.find((item) => item.groupId === group.groupId);\n Object.defineProperty(resourceGroupIds, key, {\n value: current?.groupId ?? group.groupId,\n enumerable: true,\n configurable: true,\n });\n }\n return { body: cloneValue(this.draft), resourceGroupIds };\n }\n\n private addSingletonStep(stepType: number, stepOrder?: number): this {\n if (this.draft.stepDescriptionList?.some((step) => step.stepType === stepType)) {\n throw new TypeError(`Service already contains step type ${stepType}`);\n }\n this.insertStep({ stepType }, stepOrder);\n return this;\n }\n\n private addResourceGroup(\n input: AddServiceResourceGroupInput,\n usageType: NonNullable<ResourceGroup[\"usageType\"]>,\n ): ResourceGroup & { groupId: string } {\n const key = input.key.trim();\n const groupName = input.groupName.trim();\n if (!key) throw new TypeError(\"Resource group key must not be empty\");\n if (!groupName) throw new TypeError(\"Resource group name must not be empty\");\n if (this.addedGroups.has(key)) throw new TypeError(`Duplicate resource group key: ${key}`);\n\n const groupId = input.groupId ?? generateServiceResourceGroupId();\n if (!GROUP_ID_PATTERN.test(groupId)) {\n throw new TypeError(\"Resource group id must be a 24-character hexadecimal string\");\n }\n const groups = [...(this.draft.resourceGroupList ?? [])];\n if (groups.some((group) => group.groupId === groupId)) {\n throw new TypeError(`Duplicate resource group id: ${groupId}`);\n }\n\n const minResources = input.minResources ?? 1;\n const maxResources = input.maxResources ?? 1;\n for (const [name, value] of [\n [\"minResources\", minResources],\n [\"maxResources\", maxResources],\n [\"maxTotalAmount\", input.maxTotalAmount],\n ] as const) {\n if (value != null && (!Number.isInteger(value) || value < 0)) {\n throw new RangeError(`${name} must be a non-negative integer`);\n }\n }\n if (minResources > maxResources) {\n throw new RangeError(\"minResources must not exceed maxResources\");\n }\n\n const group: ResourceGroup & { groupId: string } = {\n groupId,\n groupName,\n usageType,\n minResources,\n maxResources,\n maxTotalAmount: input.maxTotalAmount,\n quickFilterTags: cloneValue(input.quickFilterTags),\n bookingProperties: cloneValue(input.bookingProperties ?? undefined),\n };\n this.draft.resourceGroupList = [...groups, group];\n this.addedGroups.set(key, cloneValue(group));\n return group;\n }\n\n private insertStep(step: StepDescription, stepOrder?: number): void {\n const steps = normalizeSteps([...(this.draft.stepDescriptionList ?? [])]);\n const position = assertStepPosition(stepOrder, steps.length);\n steps.splice(position - 1, 0, step);\n this.draft.stepDescriptionList = steps.map((item, index) => ({\n ...item,\n stepOrder: index + 1,\n }));\n this.normalizeAndSyncOrders();\n }\n\n private normalizeAndSyncOrders(): void {\n const hasSteps = this.draft.stepDescriptionList != null;\n const steps = normalizeSteps([...(this.draft.stepDescriptionList ?? [])]);\n if (hasSteps) this.draft.stepDescriptionList = steps;\n const orders = new Map<string, number>();\n for (const step of steps) {\n if (step.stepType === ServiceCheckInWizardStepType.Resource) {\n const groupId = getResourceGroupIdFromStep(step);\n if (groupId && step.stepOrder != null) orders.set(groupId, step.stepOrder);\n }\n }\n if (this.draft.resourceGroupList != null) {\n this.draft.resourceGroupList = this.draft.resourceGroupList.map((group) => ({\n ...group,\n order: group.groupId ? (orders.get(group.groupId) ?? group.order) : group.order,\n }));\n }\n }\n\n private validateConfiguration(): void {\n const groups = this.draft.resourceGroupList ?? [];\n const ids = new Set<string>();\n for (const group of groups) {\n if (!group.groupId || !GROUP_ID_PATTERN.test(group.groupId)) {\n throw new TypeError(\"Every resource group must have a valid 24-character hexadecimal id\");\n }\n if (ids.has(group.groupId)) throw new TypeError(`Duplicate resource group id: ${group.groupId}`);\n ids.add(group.groupId);\n }\n const usedIds = new Set<string>();\n for (const step of this.draft.stepDescriptionList ?? []) {\n if (step.stepType !== ServiceCheckInWizardStepType.Resource) continue;\n const groupId = getResourceGroupIdFromStep(step);\n if (!groupId || !ids.has(groupId)) {\n throw new TypeError(`Resource step references an unknown resource group: ${groupId ?? \"\"}`);\n }\n if (usedIds.has(groupId)) {\n throw new TypeError(`Resource group is used by more than one step: ${groupId}`);\n }\n usedIds.add(groupId);\n }\n }\n}\n","import {\n ServiceCheckInWizardStepParameterName,\n ServiceCheckInWizardStepType,\n getResourceGroupIdFromStep,\n getTimeStepUiMode,\n isStepFlag,\n sortStepDescriptionsByOrder,\n type TimeStepUiMode,\n} from \"./booking-wizard-hints.js\";\nimport type { ServiceItem } from \"./types.js\";\n\nfunction isExistsStrict(n: number | undefined): n is number {\n return n !== undefined && n !== null;\n}\n\n/**\n * Как в **torrow-apps** `RegisterCheckInToTimeProcessHelper.getSkipConditionForResourceStep`:\n * шаг выбора ресурса не показывается при вырожденных лимитах группы.\n */\nexport function shouldSkipResourceStep(min: number | undefined, max: number | undefined): boolean {\n const maxIsNull = max === 0;\n const maxIsOne = max === 1;\n const minMoreThenOne = isExistsStrict(min) && min > 1;\n const minIsNegative = isExistsStrict(min) && min < 0;\n const maxIsNegative = isExistsStrict(max) && max < 0;\n return maxIsNull || (maxIsOne && minMoreThenOne) || minIsNegative || maxIsNegative;\n}\n\nexport type BookingWizardExpandedStep =\n | {\n kind: \"time\";\n /** Порядок среди развёрнутых шагов (1-based). */\n sequence: number;\n stepOrder: number;\n /** Совпадает с именами ветки Time в `getStepListByStepDescription` (WizardStepTypeEnum). */\n wizardStepType: TimeStepUiMode;\n }\n | {\n kind: \"resource\";\n sequence: number;\n stepOrder: number;\n resourceGroupId: string;\n resourceGroupName?: string | null;\n isStepHidden: boolean;\n isResourceDetailHidden: boolean;\n autoChoiceResource: boolean;\n }\n | {\n kind: \"payment\";\n sequence: number;\n stepOrder: number;\n };\n\n/**\n * Разворачивает `service.stepDescriptionList` в шаги UI (время / ресурс / оплата) по правилам\n * **`RegisterCheckInToTimeProcessHelper.getStepListByStepDescription`** без NGXS и без `anyResourceSelected`.\n * Пропуски: нет `ResourceGroupId`, неизвестная группа, `shouldSkipResourceStep`.\n *\n * Шаг **Payment** в мобильном FSM обрабатывается отдельно (`choosePaymentMethod`); здесь он отражает\n * порядок в `stepDescriptionList` для headless-сценариев и агентов.\n */\nexport function expandBookingWizardSteps(service: ServiceItem): BookingWizardExpandedStep[] {\n const ordered = sortStepDescriptionsByOrder(service.stepDescriptionList);\n const out: BookingWizardExpandedStep[] = [];\n let seq = 0;\n for (const step of ordered) {\n const st = step.stepType ?? ServiceCheckInWizardStepType.Unknown;\n if (st === ServiceCheckInWizardStepType.Time) {\n const wizardStepType = getTimeStepUiMode(service.sessionDurationProperties);\n out.push({\n kind: \"time\",\n sequence: ++seq,\n stepOrder: step.stepOrder ?? seq,\n wizardStepType,\n });\n continue;\n }\n if (st === ServiceCheckInWizardStepType.Resource) {\n const resourceGroupId = getResourceGroupIdFromStep(step);\n if (!resourceGroupId) continue;\n const rg = service.resourceGroupList?.find((g) => g.groupId === resourceGroupId);\n if (!rg) continue;\n if (shouldSkipResourceStep(rg.minResources ?? undefined, rg.maxResources ?? undefined)) continue;\n out.push({\n kind: \"resource\",\n sequence: ++seq,\n stepOrder: step.stepOrder ?? seq,\n resourceGroupId,\n resourceGroupName: rg.groupName,\n isStepHidden: isStepFlag(step, ServiceCheckInWizardStepParameterName.HiddenStep),\n isResourceDetailHidden: isStepFlag(step, ServiceCheckInWizardStepParameterName.HideResourceDetail),\n autoChoiceResource: isStepFlag(step, ServiceCheckInWizardStepParameterName.AutoChoiceResource),\n });\n continue;\n }\n if (st === ServiceCheckInWizardStepType.Payment) {\n out.push({ kind: \"payment\", sequence: ++seq, stepOrder: step.stepOrder ?? seq });\n }\n }\n return out;\n}\n","import type { WorkloadPeriod } from \"../resources/types.js\";\nimport type { GetCheckInScheduleResp } from \"./types.js\";\n\nexport type FreeCheckInSlot = WorkloadPeriod & {\n from: Date;\n to: Date;\n};\n\n/** Проверяет, что период из ответа `FreeTimeSlots` пригоден для выбора пользователем. */\nexport function isFreeCheckInSlot(period: WorkloadPeriod): period is FreeCheckInSlot {\n return (\n period.from != null &&\n period.to != null &&\n (period.status == null || period.status === \"FreeTime\")\n );\n}\n\n/** Возвращает полные свободные интервалы без изменения ответа сервера. */\nexport function getFreeCheckInSlots(\n response: GetCheckInScheduleResp | null | undefined,\n): FreeCheckInSlot[] {\n return (response?.checkInSchedule ?? []).filter(isFreeCheckInSlot);\n}\n","import { TorrowSdkError } from \"../../http/TorrowSdkError.js\";\n\nexport const ServiceOrderConflictErrorNameValues = {\n ResourceUnavailable: \"REQUESTED_RESOURCE_IS_NOT_AVAILABLE\",\n QuantityUnavailable: \"REQUESTED_RESOURCE_QUANTITY_IS_NOT_AVAILABLE\",\n ServiceUnavailableAtTime: \"SERVICE_IS_NOT_AVAILABLE_AT_TIME\",\n} as const;\n\nexport type ServiceOrderConflictReason =\n | \"resource-unavailable\"\n | \"quantity-unavailable\"\n | \"service-unavailable-at-time\";\n\n/** Преобразует серверное имя business-конфликта заказа в стабильную причину для приложения. */\nexport function getServiceOrderConflictReason(\n error: unknown,\n): ServiceOrderConflictReason | undefined {\n if (!(error instanceof TorrowSdkError)) return undefined;\n switch (error.http?.apiErrorName) {\n case ServiceOrderConflictErrorNameValues.ResourceUnavailable:\n return \"resource-unavailable\";\n case ServiceOrderConflictErrorNameValues.QuantityUnavailable:\n return \"quantity-unavailable\";\n case ServiceOrderConflictErrorNameValues.ServiceUnavailableAtTime:\n return \"service-unavailable-at-time\";\n default:\n return undefined;\n }\n}\n\n/** Отличает известный конфликт доступности заказа от остальных HTTP-ошибок. */\nexport function isServiceOrderConflictError(error: unknown): error is TorrowSdkError {\n return getServiceOrderConflictReason(error) !== undefined;\n}\n","import type { CaseItem } from \"./types.js\";\n\n/**\n * Как в **torrow-apps** `PaymentProcessState.normalizePaymentUrl`: если в ответе нет схемы,\n * подставить `https://` (частые относительные/безсхемные URL от провайдера).\n */\nexport function normalizePaymentUrl(url: string | null | undefined): string | undefined {\n if (url == null || url.trim() === \"\") return undefined;\n const u = url.trim();\n if (u.startsWith(\"http://\") || u.startsWith(\"https://\")) return u;\n return `https://${u}`;\n}\n\n/** Сырое значение из DTO без нормализации. */\nexport function getTicketPaymentUrlRaw(caseItem: CaseItem | undefined | null): string | undefined {\n const raw = caseItem?.personalInfo?.ticketResource?.ticketProperties?.paymentUrl;\n return raw == null || raw === \"\" ? undefined : raw;\n}\n\n/**\n * URL оплаты из **`CaseItem.personalInfo.ticketResource.ticketProperties.paymentUrl`**\n * (вид владельца/участника после `createOrder` + загрузка кейса).\n * Для гостя с токеном — тот же путь после `GET .../cases/{id}` с `securityToken` / `caseParticipantId`.\n */\nexport function getTicketPaymentUrl(caseItem: CaseItem | undefined | null): string | undefined {\n return normalizePaymentUrl(getTicketPaymentUrlRaw(caseItem));\n}\n","import type { ServiceItem } from \"../services/types.js\";\nimport type {\n ResourceItem,\n ResourceBuildResult,\n ResourceItemForCreateOrUpdate,\n ResourceServiceBindingOptions,\n ResourceUsageConditionType,\n ServiceDescription,\n} from \"./types.js\";\nimport { UsageConditionTypeValues } from \"./types.js\";\n\nfunction cloneValue<T>(value: T): T {\n if (value instanceof Date) return new Date(value.getTime()) as T;\n if (Array.isArray(value)) return value.map((item) => cloneValue(item)) as T;\n if (value && typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) result[key] = cloneValue(item);\n return result as T;\n }\n return value;\n}\n\nfunction isSameBinding(\n description: ServiceDescription,\n serviceId: string,\n resourceGroupId: string,\n): boolean {\n return description.id === serviceId && description.resourceGroupId === resourceGroupId;\n}\n\n/**\n * Локально собирает тело ресурса и его связи с услугами.\n * Builder не выполняет HTTP; результат сохраняется обычным `resourceItems.create` или `update`.\n */\nexport class ResourceBuilder {\n private draft: ResourceItemForCreateOrUpdate;\n\n private constructor(body: ResourceItemForCreateOrUpdate) {\n this.draft = cloneValue(body);\n }\n\n static create(body: ResourceItemForCreateOrUpdate): ResourceBuilder {\n return new ResourceBuilder(body);\n }\n\n static from(resource: ResourceItem): ResourceBuilder {\n return new ResourceBuilder(resource);\n }\n\n attachToService(\n service: ServiceItem,\n resourceGroupId: string,\n options?: ResourceServiceBindingOptions,\n ): this {\n const serviceId = service.id?.trim();\n if (!serviceId) throw new TypeError(\"Service must have a non-empty id\");\n const normalizedGroupId = resourceGroupId.trim();\n if (!normalizedGroupId) throw new TypeError(\"resourceGroupId must not be empty\");\n\n const group = service.resourceGroupList?.find((item) => item.groupId === normalizedGroupId);\n if (!group) throw new TypeError(`Service resource group not found: ${normalizedGroupId}`);\n if (!group.usageType) throw new TypeError(\"Service resource group has no usageType\");\n if (this.draft.usageType != null && this.draft.usageType !== group.usageType) {\n throw new TypeError(\"Resource usageType does not match the service resource group\");\n }\n\n const descriptions = [...(this.draft.serviceDescriptions ?? [])];\n const matching = descriptions.filter((item) =>\n isSameBinding(item, serviceId, normalizedGroupId),\n );\n const current = matching[0];\n const next: ServiceDescription = {\n ...current,\n id: serviceId,\n serviceName: service.name,\n resourceGroupId: normalizedGroupId,\n resourceGroupName: group.groupName,\n usageAmount: options?.usageAmount === undefined ? current?.usageAmount : options.usageAmount,\n sortIndex: options?.sortIndex === undefined ? current?.sortIndex : options.sortIndex,\n laterBinding: group.bookingProperties != null,\n };\n const firstIndex = descriptions.findIndex((item) =>\n isSameBinding(item, serviceId, normalizedGroupId),\n );\n const withoutBinding = descriptions.filter((item) =>\n !isSameBinding(item, serviceId, normalizedGroupId),\n );\n if (firstIndex < 0) withoutBinding.push(next);\n else withoutBinding.splice(firstIndex, 0, next);\n\n this.draft = {\n ...this.draft,\n usageType: this.draft.usageType ?? group.usageType,\n serviceDescriptions: withoutBinding,\n };\n return this;\n }\n\n detachFromService(serviceId: string, resourceGroupId: string): this {\n const normalizedServiceId = serviceId.trim();\n const normalizedGroupId = resourceGroupId.trim();\n if (!normalizedServiceId) throw new TypeError(\"serviceId must not be empty\");\n if (!normalizedGroupId) throw new TypeError(\"resourceGroupId must not be empty\");\n this.draft = {\n ...this.draft,\n serviceDescriptions: (this.draft.serviceDescriptions ?? []).filter(\n (item) => !isSameBinding(item, normalizedServiceId, normalizedGroupId),\n ),\n };\n return this;\n }\n\n /** Задаёт зависимость или исключение ресурса по id ранее выбранных ресурсов. */\n setUsageCondition(type: ResourceUsageConditionType, conditionIds: readonly string[]): this {\n if (\n type !== UsageConditionTypeValues.Additional &&\n type !== UsageConditionTypeValues.Exclusion\n ) {\n throw new TypeError(`Unsupported usage condition type: ${String(type)}`);\n }\n const normalizedIds = conditionIds.map((conditionId) => conditionId.trim());\n if (normalizedIds.length === 0) {\n throw new TypeError(\"conditionIds must not be empty\");\n }\n if (normalizedIds.some((conditionId) => !conditionId)) {\n throw new TypeError(\"conditionIds must not contain empty ids\");\n }\n if (new Set(normalizedIds).size !== normalizedIds.length) {\n throw new TypeError(\"conditionIds must not contain duplicates\");\n }\n this.draft = {\n ...this.draft,\n usageCondition: {\n usageConditionType: type,\n conditionIdList: normalizedIds,\n },\n };\n return this;\n }\n\n clearUsageCondition(): this {\n this.draft = {\n ...this.draft,\n usageCondition: {\n usageConditionType: UsageConditionTypeValues.None,\n conditionIdList: [],\n },\n };\n return this;\n }\n\n build(): ResourceBuildResult {\n return { body: cloneValue(this.draft) };\n }\n}\n","import type { components } from \"../../schema/generated.js\";\n\n/** OpenAPI `DeviceType` — wire-строки для `DeviceInfo.deviceType`. */\nexport type DeviceType = components[\"schemas\"][\"DeviceType\"];\n\n/**\n * Значения OpenAPI enum **`DeviceType`** для приложений\n * (`deviceInfo.deviceType` в `requestToken` / `refresh`, фильтры устройств и т.п.).\n *\n * @example\n * ```ts\n * import { DeviceTypeValues } from \"@torrow/sdk-client\";\n * deviceInfo: { deviceId, deviceType: DeviceTypeValues.Desktop }\n * ```\n */\nexport const DeviceTypeValues = {\n Unknown: \"Unknown\",\n Mobile: \"Mobile\",\n Tablet: \"Tablet\",\n Desktop: \"Desktop\",\n} as const satisfies Record<string, DeviceType>;\n\n/** Все допустимые wire-значения (стабильный порядок). */\nexport const DeviceTypeValueList: readonly DeviceType[] = [\n DeviceTypeValues.Unknown,\n DeviceTypeValues.Mobile,\n DeviceTypeValues.Tablet,\n DeviceTypeValues.Desktop,\n];\n\nexport function isDeviceType(value: string): value is DeviceType {\n return (DeviceTypeValueList as readonly string[]).includes(value);\n}\n\n/**\n * Разбор строки в `DeviceType` (без учёта регистра).\n * Пустая / неизвестная → `undefined`.\n */\nexport function parseDeviceType(raw: string | undefined | null): DeviceType | undefined {\n const t = raw?.trim();\n if (!t) return undefined;\n return DeviceTypeValueList.find((x) => x.toLowerCase() === t.toLowerCase());\n}\n","import type {\n ItemViewSortConditionDto as ItemViewSortCondition,\n ParticipantStateDto as ParticipantState,\n ParticipantTypeDto as ParticipantType,\n} from \"../../schema/openapi-dto-aliases.js\";\n\nexport type { ItemViewSortCondition, ParticipantState, ParticipantType };\n\n/** Wire-значения OpenAPI `ItemViewSortCondition` для списков и views. */\nexport const ItemViewSortConditionValues = {\n OrderAsc: \"OrderAsc\",\n OrderDesc: \"OrderDesc\",\n LastModifiedAsc: \"LastModifiedAsc\",\n LastModifiedDesc: \"LastModifiedDesc\",\n OrderAscLastModifiedAsc: \"OrderAscLastModifiedAsc\",\n OrderDescLastModifiedAsc: \"OrderDescLastModifiedAsc\",\n OrderAscLastModifiedDesc: \"OrderAscLastModifiedDesc\",\n OrderDescLastModifiedDesc: \"OrderDescLastModifiedDesc\",\n LastModifiedAscOrderAsc: \"LastModifiedAscOrderAsc\",\n LastModifiedAscOrderDesc: \"LastModifiedAscOrderDesc\",\n LastModifiedDescOrderAsc: \"LastModifiedDescOrderAsc\",\n LastModifiedDescOrderDesc: \"LastModifiedDescOrderDesc\",\n} as const satisfies { [Value in ItemViewSortCondition]: Value };\n\n/** Все допустимые условия сортировки представлений в стабильном порядке. */\nexport const ItemViewSortConditionValueList: readonly ItemViewSortCondition[] = Object.values(\n ItemViewSortConditionValues,\n);\n\nexport function isItemViewSortCondition(value: string): value is ItemViewSortCondition {\n return (ItemViewSortConditionValueList as readonly string[]).includes(value);\n}\n\n/** Shared query for personallist endpoints (contacts, notes, services, cases). */\nexport type PersonalListQuery = {\n take?: number | null;\n skip?: number | null;\n lmfrom?: Date | null;\n lmto?: Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemViewSortCondition | null;\n profileId?: string | null;\n onlyWithEmptyProfile?: boolean | null;\n participantStateList?: ParticipantState[] | null;\n participantTypeList?: ParticipantType[] | null;\n};\n"],"mappings":"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","names":["TorrowSdkErrorCategory","TorrowSdkRequestState","TorrowSdkEffectArea","TorrowSdkEffectState","TorrowSdkErrorDomain","OtpErrorReason","AuthSessionErrorReason","BehaviorSettingsEffectStep","AuthSessionEffectStep","KnownApiErrorName","Discriminator","BASE","BASE","BASE","BASE","BASE","prefix","BASE","ServiceBehaviorSettingsIssueReason","record","BASE","BASE","BASE","trimNonEmptyString","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","VerificationMethodValues","TokenStatusValues","group","cloneValue"]}
|