@teamlearners/clawops 0.40.0 → 0.41.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/base-client.ts","../src/resource.ts","../src/util.ts","../src/types/shared.ts","../src/pagination.ts","../src/types/assignment-link.ts","../src/resources/assignment-links.ts","../src/types/blocked-recipient.ts","../src/resources/blocked-recipients.ts","../src/types/call.ts","../src/types/transcript.ts","../src/types/summary.ts","../src/resources/calls.ts","../src/types/kakao.ts","../src/resources/kakao.ts","../src/types/message.ts","../src/resources/messages.ts","../src/types/number.ts","../src/resources/numbers.ts","../src/resources/recordings.ts","../src/types/sip.ts","../src/resources/sip-credentials.ts","../src/resources/sip-endpoints.ts","../src/types/webhook-log.ts","../src/resources/webhook-logs.ts","../src/resources/accounts.ts","../src/webhooks.ts","../src/client.ts","../src/client-default.ts"],"names":["ClawOpsError","DEFAULT_BASE_URL","DEFAULT_MAX_RETRIES","DEFAULT_TIMEOUT","VERSION","method","APITimeoutError","APIConnectionError","makeStatusError","APIResponseValidationError","INITIAL_RETRY_DELAY","MAX_RETRY_DELAY","z","timingSafeEqual","createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from 'zod';\nimport {\n DEFAULT_BASE_URL,\n DEFAULT_MAX_RETRIES,\n DEFAULT_TIMEOUT,\n INITIAL_RETRY_DELAY,\n MAX_RETRY_DELAY,\n} from './constants.js';\nimport {\n APIConnectionError,\n APIResponseValidationError,\n APITimeoutError,\n ClawOpsError,\n makeStatusError,\n} from './error.js';\nimport { VERSION } from './version.js';\n\nconst LOCALHOST_HOSTS = new Set(['localhost', '127.0.0.1', '0.0.0.0', '[::1]']);\n\nfunction validateBaseUrl(url: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new ClawOpsError(`Invalid base_url: ${url}`);\n }\n if (parsed.protocol === 'https:') return url;\n if (parsed.protocol === 'http:' && LOCALHOST_HOSTS.has(parsed.hostname)) return url;\n throw new ClawOpsError(\n `base_url은 HTTPS를 사용해야 합니다 (받은 값: '${url}'). ` +\n `로컬 개발 시에는 http://localhost를 사용할 수 있습니다.`,\n );\n}\n\nexport interface APIClientOptions {\n apiKey: string;\n baseURL?: string;\n timeout?: number;\n maxRetries?: number;\n fetch?: typeof globalThis.fetch;\n defaultHeaders?: Record<string, string>;\n}\n\n/**\n * 본문 직렬화와 그에 딸린 `Content-Type` 을 **함께** 정한다.\n *\n * ⚠️ `contentType: null` 은 \"헤더를 붙이지 말라\" 는 뜻이다. multipart 의 boundary 는 fetch 가\n * 붙이므로, 기본값(`application/json`)이 남으면 서버가 본문을 파싱하지 못하고 그 실패는\n * \"왜 파일이 안 왔지\" 로만 드러난다.\n *\n * ⚠️ 직렬화가 재시도 루프 **밖**이라 재시도마다 다시 stringify 하지 않는다.\n */\nfunction serializeBody(body?: Record<string, unknown> | FormData | null): {\n payload: FormData | string | undefined;\n contentType: string | null;\n} {\n if (body instanceof FormData) return { payload: body, contentType: null };\n if (!body) return { payload: undefined, contentType: 'application/json' };\n return { payload: JSON.stringify(body), contentType: 'application/json' };\n}\n\nexport class APIClient {\n protected _apiKey: string;\n protected _baseURL: string;\n protected _maxRetries: number;\n protected _timeout: number;\n protected _fetch: typeof globalThis.fetch;\n protected _defaultHeaders: Record<string, string>;\n\n constructor(options: APIClientOptions) {\n this._apiKey = options.apiKey;\n this._baseURL = validateBaseUrl((options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/+$/, ''));\n this._maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this._timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this._fetch = options.fetch ?? globalThis.fetch;\n this._defaultHeaders = options.defaultHeaders ?? {};\n }\n\n private _buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this._apiKey}`,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'User-Agent': `claw-ops-node/${VERSION}`,\n ...this._defaultHeaders,\n };\n if (extra) Object.assign(headers, extra);\n return headers;\n }\n\n protected async _send(\n method: string,\n path: string,\n options: {\n /** `FormData` 면 그대로 보낸다(multipart) — 직렬화도 Content-Type 도 건드리지 않는다. */\n body?: Record<string, unknown> | FormData | null;\n query?: Record<string, unknown> | null;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Response> {\n const headers = this._buildHeaders(options.extraHeaders);\n\n // 본문과 Content-Type 은 **한 결정**이다 — 따로 두면 새 본문 종류를 더할 때 한쪽만\n // 고치게 되고, 헤더 쪽을 빠뜨리면 조용히 깨진다.\n const { payload, contentType } = serializeBody(options.body);\n if (contentType === null) delete headers['Content-Type'];\n else headers['Content-Type'] = contentType;\n\n const params = new URLSearchParams();\n const queryObj = { ...options.query, ...options.extraQuery };\n for (const [k, v] of Object.entries(queryObj)) {\n if (v != null) params.set(k, String(v));\n }\n\n const queryString = params.toString();\n const url = `${this._baseURL}${path}${queryString ? `?${queryString}` : ''}`;\n const reqTimeout = options.timeout ?? this._timeout;\n\n let retriesLeft = this._maxRetries;\n\n while (true) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), reqTimeout);\n\n let response: Response;\n try {\n response = await this._fetch(url, {\n method,\n headers,\n body: payload,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timeoutId);\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (retriesLeft > 0) {\n retriesLeft--;\n await this._sleep(this._retryDelay(this._maxRetries - retriesLeft));\n continue;\n }\n throw new APITimeoutError({ method, url });\n }\n if (retriesLeft > 0) {\n retriesLeft--;\n await this._sleep(this._retryDelay(this._maxRetries - retriesLeft));\n continue;\n }\n throw new APIConnectionError({ method, url });\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (response.ok) return response;\n\n if (retriesLeft > 0 && this._shouldRetry(response.status)) {\n retriesLeft--;\n await this._sleep(this._retryDelay(this._maxRetries - retriesLeft));\n continue;\n }\n\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = null;\n }\n throw makeStatusError(response.status, body, response.headers, { method, url });\n }\n }\n\n protected async _request<T>(\n method: string,\n path: string,\n options: {\n /** `FormData` 면 그대로 보낸다(multipart) — 직렬화도 Content-Type 도 건드리지 않는다. */\n body?: Record<string, unknown> | FormData | null;\n query?: Record<string, unknown> | null;\n castTo?: z.ZodType<T>;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<T | null> {\n const response = await this._send(method, path, options);\n if (response.status === 204 || !options.castTo) return null;\n\n const url = `${this._baseURL}${path}`;\n let json: unknown;\n try {\n json = await response.json();\n } catch {\n throw new APIResponseValidationError({ status: response.status }, { method, url });\n }\n const parsed = options.castTo.safeParse(json);\n if (!parsed.success) {\n throw new APIResponseValidationError({ status: response.status }, { method, url });\n }\n return parsed.data;\n }\n\n private _shouldRetry(status: number): boolean {\n return status === 408 || status === 409 || status === 429 || status >= 500;\n }\n\n private _retryDelay(retriesTaken: number): number {\n const delay = Math.min(INITIAL_RETRY_DELAY * 2 ** retriesTaken, MAX_RETRY_DELAY);\n return delay * (1 + Math.random());\n }\n\n private _sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n async _get<T>(\n path: string,\n options: {\n castTo: z.ZodType<T>;\n query?: Record<string, unknown> | null;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n },\n ): Promise<T> {\n const result = await this._request<T>(method('GET'), path, options);\n return result!;\n }\n\n async _post<T>(\n path: string,\n options: {\n /** `FormData` 면 그대로 보낸다(multipart) — 직렬화도 Content-Type 도 건드리지 않는다. */\n body?: Record<string, unknown> | FormData | null;\n castTo: z.ZodType<T>;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n },\n ): Promise<T> {\n const result = await this._request<T>('POST', path, options);\n return result!;\n }\n\n async _put<T>(\n path: string,\n options: {\n body?: Record<string, unknown> | null;\n castTo: z.ZodType<T>;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n },\n ): Promise<T> {\n const result = await this._request<T>('PUT', path, options);\n return result!;\n }\n\n async _patch<T>(\n path: string,\n options: {\n body?: Record<string, unknown> | null;\n castTo: z.ZodType<T>;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n },\n ): Promise<T> {\n const result = await this._request<T>('PATCH', path, options);\n return result!;\n }\n\n async _getRaw(\n path: string,\n options: {\n query?: Record<string, unknown> | null;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Response> {\n return this._send('GET', path, options);\n }\n\n /**\n * 본문을 돌려주는 DELETE. 기존 `_delete` 는 void 라 응답을 버리는데, soft delete 처럼\n * 삭제 결과 리소스를 그대로 반환하는 endpoint 가 있어서 따로 둔다.\n */\n async _deleteWithResponse<T>(\n path: string,\n options: {\n body?: Record<string, unknown> | null;\n castTo: z.ZodType<T>;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n },\n ): Promise<T> {\n const result = await this._request<T>('DELETE', path, options);\n return result!;\n }\n\n async _delete(\n path: string,\n options: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n } = {},\n ): Promise<void> {\n await this._request('DELETE', path, options);\n }\n}\n\nfunction method(m: string): string {\n return m;\n}\n","import type { APIClient } from './base-client.js';\n\nexport class APIResource {\n protected _client: APIClient;\n protected _accountId: string;\n\n constructor(client: APIClient, accountId: string) {\n this._client = client;\n this._accountId = accountId;\n }\n\n protected get _basePath(): string {\n return `/v1/accounts/${this._accountId}`;\n }\n}\n","/**\n * snake_case를 camelCase로 변환합니다.\n * trailing underscore(예약어 회피용)는 제거합니다.\n * 예: 'from_' -> 'from', 'account_id' -> 'accountId'\n */\nexport function toCamelCase(snake: string): string {\n if (snake.endsWith('_')) {\n snake = snake.slice(0, -1);\n }\n const parts = snake.split('_');\n return parts[0] + parts.slice(1).map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join('');\n}\n\n/**\n * null/undefined 값을 제거하여 API에 불필요한 필드를 보내지 않습니다.\n */\nexport function stripNotGiven(data: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(data)) {\n if (v != null) {\n result[k] = v;\n }\n }\n return result;\n}\n","import { z } from 'zod';\n\nexport const PaginationMetaSchema = z\n .object({\n total: z.number(),\n page: z.number(),\n pageSize: z.number(),\n })\n .passthrough();\n\nexport type PaginationMeta = z.infer<typeof PaginationMetaSchema>;\n","import { z } from 'zod';\nimport type { APIClient } from './base-client.js';\nimport { PaginationMetaSchema } from './types/shared.js';\n\nexport function PageSchema<T>(itemSchema: z.ZodType<T>) {\n return z\n .object({\n data: z.array(itemSchema),\n meta: PaginationMetaSchema,\n })\n .passthrough();\n}\n\nexport class Page<T> {\n data: T[];\n meta: { total: number; page: number; pageSize: number };\n\n private _client: APIClient | null = null;\n private _path = '';\n private _itemSchema: z.ZodType<T> | null = null;\n private _query: Record<string, unknown> = {};\n\n constructor(data: T[], meta: { total: number; page: number; pageSize: number }) {\n this.data = data;\n this.meta = meta;\n }\n\n /** @internal */\n _setClient(\n client: APIClient,\n path: string,\n itemSchema: z.ZodType<T>,\n query: Record<string, unknown>,\n ): void {\n this._client = client;\n this._path = path;\n this._itemSchema = itemSchema;\n this._query = query;\n }\n\n hasNextPage(): boolean {\n return (this.meta.page + 1) * this.meta.pageSize < this.meta.total;\n }\n\n async nextPage(): Promise<Page<T>> {\n if (!this._client || !this._itemSchema) {\n throw new Error('Page client is not set');\n }\n if (!this.hasNextPage()) {\n throw new Error('No more pages');\n }\n const nextQuery = { ...this._query, page: this.meta.page + 1 };\n const schema = PageSchema(this._itemSchema);\n\n const raw = await this._client._get(this._path, {\n castTo: schema,\n query: nextQuery,\n });\n\n const page = new Page<T>(raw.data, raw.meta);\n page._setClient(this._client, this._path, this._itemSchema, this._query);\n return page;\n }\n\n [Symbol.iterator](): Iterator<T> {\n return this.data[Symbol.iterator]();\n }\n\n async *autoPagingIter(): AsyncGenerator<T> {\n let page: Page<T> = this;\n while (true) {\n for (const item of page.data) {\n yield item;\n }\n if (!page.hasNextPage()) break;\n page = await page.nextPage();\n }\n }\n}\n","import { z } from 'zod';\n\nexport const AssignmentLinkAssignmentSchema = z\n .object({\n number: z.string(),\n name: z.string().nullable().optional(),\n consumedAt: z.string(),\n releasedAt: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport const AssignmentLinkSchema = z\n .object({\n linkId: z.string(),\n url: z.string(),\n status: z.enum(['pending', 'consumed', 'expired', 'revoked']),\n createdAt: z.string(),\n expiresAt: z.string(),\n consumedAt: z.string().nullable().optional(),\n webhookUrl: z.string().nullable().optional(),\n webhookMethod: z.enum(['POST', 'GET']).nullable().optional(),\n note: z.string().nullable().optional(),\n assignment: AssignmentLinkAssignmentSchema.nullable().optional(),\n })\n .passthrough();\n\nexport const AssignmentLinkCreateResponseSchema = z\n .object({\n token: z.string(),\n url: z.string(),\n expiresAt: z.string(),\n })\n .passthrough();\n\nexport type AssignmentLinkAssignment = z.infer<typeof AssignmentLinkAssignmentSchema>;\nexport type AssignmentLink = z.infer<typeof AssignmentLinkSchema>;\nexport type AssignmentLinkCreateResponse = z.infer<typeof AssignmentLinkCreateResponseSchema>;\nexport type AssignmentLinkStatus = AssignmentLink['status'];\n","import { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport {\n AssignmentLinkSchema,\n AssignmentLinkCreateResponseSchema,\n} from '../types/assignment-link.js';\nimport type {\n AssignmentLink,\n AssignmentLinkCreateResponse,\n AssignmentLinkStatus,\n} from '../types/assignment-link.js';\n\ntype RequestOptions = {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n};\n\n/**\n * 관리번호(External Assignment) 발급 링크 리소스.\n *\n * POST/DELETE는 `external_assignment` 애드온이 활성화된 계정에서만 가능합니다.\n * GET 조회는 애드온 활성 여부와 무관하게 가능합니다.\n */\nexport class AssignmentLinks extends APIResource {\n async create(\n params: {\n webhookUrl?: string;\n webhookMethod?: 'POST' | 'GET';\n note?: string;\n } = {},\n options: RequestOptions = {},\n ): Promise<AssignmentLinkCreateResponse> {\n const body = stripNotGiven({\n webhookUrl: params.webhookUrl,\n webhookMethod: params.webhookMethod,\n note: params.note,\n });\n return this._client._post(`${this._basePath}/assignment-links`, {\n body: Object.keys(body).length ? body : undefined,\n castTo: AssignmentLinkCreateResponseSchema,\n ...options,\n });\n }\n\n async list(\n params: {\n status?: AssignmentLinkStatus;\n page?: number;\n pageSize?: number;\n } = {},\n options: RequestOptions = {},\n ): Promise<Page<AssignmentLink>> {\n const query = stripNotGiven({\n status: params.status,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/assignment-links`;\n const schema = PageSchema(AssignmentLinkSchema);\n const raw = await this._client._get(path, {\n castTo: schema,\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<AssignmentLink>(raw.data, raw.meta);\n page._setClient(this._client, path, AssignmentLinkSchema, query);\n return page;\n }\n\n async retrieve(\n linkId: string,\n options: RequestOptions = {},\n ): Promise<AssignmentLink> {\n return this._client._get(`${this._basePath}/assignment-links/${linkId}`, {\n castTo: AssignmentLinkSchema,\n ...options,\n });\n }\n\n async revoke(\n linkId: string,\n options: { extraHeaders?: Record<string, string>; timeout?: number } = {},\n ): Promise<void> {\n await this._client._delete(\n `${this._basePath}/assignment-links/${linkId}`,\n options,\n );\n }\n}\n","import { z } from 'zod';\n\nexport const BlockedRecipientSchema = z\n .object({\n id: z.string(),\n /** 국내 표기로 정규화된 번호 (예 '01012345678'). */\n number: z.string(),\n channel: z.enum(['call', 'message']),\n /** 지금 차단 중인지. 해제분도 이력으로 조회되므로 이 값으로 구분한다. */\n active: z.boolean(),\n source: z.string(),\n sourceRef: z.string().nullable().optional(),\n note: z.string().nullable().optional(),\n createdBy: z.string().nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n unblockedAt: z.string().nullable().optional(),\n unblockedSource: z.string().nullable().optional(),\n unblockedBy: z.string().nullable().optional(),\n unblockedNote: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type BlockedRecipient = z.infer<typeof BlockedRecipientSchema>;\nexport type BlockedChannel = BlockedRecipient['channel'];\nexport type BlockedRecipientStatus = 'active' | 'released' | 'all';\nexport type BlockedRecipientSource = 'api' | 'console' | 'import';\n","import { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport { BlockedRecipientSchema } from '../types/blocked-recipient.js';\nimport type {\n BlockedRecipient,\n BlockedChannel,\n BlockedRecipientStatus,\n BlockedRecipientSource,\n} from '../types/blocked-recipient.js';\n\ntype RequestOptions = {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n};\n\n/**\n * 수신거부(DNC) 명단 리소스.\n *\n * 등록된 번호는 이 계정의 **발신**(전화·문자)에서 제외됩니다. 착신은 막지 않습니다 —\n * 그 번호에서 걸려오는 전화는 그대로 받습니다.\n *\n * 전화와 문자는 각각 따로 차단합니다. 같은 번호라도 채널마다 별개 항목이므로,\n * 둘 다 막으려면 `channel` 을 바꿔 두 번 등록합니다.\n */\nexport class BlockedRecipients extends APIResource {\n /**\n * 번호를 수신거부 명단에 등록합니다.\n *\n * 하이픈·`+82` 표기 모두 허용되며 국내 표기로 정규화되어 저장됩니다.\n *\n * **멱등입니다** — 이미 차단 중인 (번호, 채널)을 다시 등록해도 에러가 아니라 기존 항목을\n * 돌려줍니다. 같은 사람이 수신거부를 두 번 요청하는 것은 정상 상황이기 때문입니다.\n */\n async create(\n params: {\n number: string;\n channel: BlockedChannel;\n source?: BlockedRecipientSource;\n sourceRef?: string;\n note?: string;\n },\n options: RequestOptions = {},\n ): Promise<BlockedRecipient> {\n const body = stripNotGiven({\n number: params.number,\n channel: params.channel,\n source: params.source,\n sourceRef: params.sourceRef,\n note: params.note,\n });\n return this._client._post(`${this._basePath}/blocked-recipients`, {\n body,\n castTo: BlockedRecipientSchema,\n ...options,\n });\n }\n\n /**\n * 수신거부 목록을 조회합니다. 기본은 **현재 차단 중인 항목만** 이며,\n * 해제 이력까지 보려면 `status` 를 `'released'` 또는 `'all'` 로 지정합니다.\n */\n async list(\n params: {\n channel?: BlockedChannel;\n number?: string;\n status?: BlockedRecipientStatus;\n page?: number;\n pageSize?: number;\n } = {},\n options: RequestOptions = {},\n ): Promise<Page<BlockedRecipient>> {\n const query = stripNotGiven({\n channel: params.channel,\n number: params.number,\n status: params.status,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/blocked-recipients`;\n const raw = await this._client._get(path, {\n castTo: PageSchema(BlockedRecipientSchema),\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<BlockedRecipient>(raw.data, raw.meta);\n page._setClient(this._client, path, BlockedRecipientSchema, query);\n return page;\n }\n\n /** 항목 상세를 조회합니다. 해제된 항목도 이력으로 남아 조회됩니다(`active: false`). */\n async retrieve(blockId: string, options: RequestOptions = {}): Promise<BlockedRecipient> {\n return this._client._get(`${this._basePath}/blocked-recipients/${blockId}`, {\n castTo: BlockedRecipientSchema,\n ...options,\n });\n }\n\n /**\n * 메모를 수정합니다.\n *\n * 번호와 채널은 바꿀 수 없습니다 — 바꾸면 \"누가 무엇을 언제 거부했는가\"라는 증빙이\n * 뒤틀립니다. 잘못 등록했다면 해제한 뒤 올바른 번호로 새로 등록하세요.\n */\n async update(\n blockId: string,\n params: { note?: string | null } = {},\n options: RequestOptions = {},\n ): Promise<BlockedRecipient> {\n return this._client._patch(`${this._basePath}/blocked-recipients/${blockId}`, {\n body: { note: params.note ?? null },\n castTo: BlockedRecipientSchema,\n ...options,\n });\n }\n\n /**\n * 수신거부를 해제해 다시 발신할 수 있게 합니다.\n *\n * **항목은 삭제되지 않습니다.** `active` 가 false 가 되고 `unblockedAt` 이 기록될 뿐,\n * 행은 이력으로 남습니다 — 언제 거부했고 언제 풀렸는지가 곧 증빙이기 때문입니다.\n * 해제분은 `list({ status: 'released' })` 로 볼 수 있습니다.\n *\n * 이미 해제된 항목에 다시 호출해도 성공하며, 최초 해제 시각은 덮어쓰지 않습니다.\n */\n async release(\n blockId: string,\n params: { note?: string } = {},\n options: RequestOptions = {},\n ): Promise<BlockedRecipient> {\n const body = stripNotGiven({ note: params.note });\n return this._client._deleteWithResponse(\n `${this._basePath}/blocked-recipients/${blockId}`,\n {\n body: Object.keys(body).length ? body : undefined,\n castTo: BlockedRecipientSchema,\n ...options,\n },\n );\n }\n}\n","import { z } from 'zod';\n\nexport const CallSchema = z\n .object({\n callId: z.string(),\n /**\n * 진행 중: queued / ringing / in-progress.\n * 종료: completed(응답 후 정상 종료) / no-answer(벨은 울렸으나 무응답) / busy(통화중) /\n * rejected(수신 거절) / canceled(응답 전 발신 측 취소) / failed(시스템·망 오류).\n * completed 만이 실제로 연결된 통화를 의미한다.\n */\n status: z.enum([\n 'queued',\n 'ringing',\n 'in-progress',\n 'completed',\n 'failed',\n 'busy',\n 'no-answer',\n 'canceled',\n 'rejected',\n ]),\n to: z.string(),\n from: z.string(),\n direction: z.enum(['outbound', 'inbound']),\n duration: z.number().nullable().optional(),\n recordingUrl: z.string().nullable().optional(),\n /** AMD(machineDetection) 결과 — AMD 켠 발신 통화에만 값 존재. */\n answeredBy: z.enum(['human', 'machine', 'unknown']).nullable().optional(),\n /**\n * 통화 종료 사유. status 가 왜 그렇게 끝났는지를 구분한다 — 특히 failed 는 결번·망 오류·\n * 시스템 오류를 모두 포함하는 대분류라, 발신 리스트를 정제하려면 status 가 아니라 이 값을 본다.\n *\n * 재시도해도 소용없음: invalid_number(결번) / number_changed / incompatible_destination.\n * 재시도 가치 있음: no_answer / user_busy / temporary_failure / switching_congestion /\n * no_circuit_available / network_out_of_order / destination_out_of_order /\n * recovery_on_timer_expire / resource_unavailable.\n * 그 외: normal_clearing(정상 종료) / caller_canceled / call_rejected / protocol_error /\n * unspecified / app_error·call_stuck(ClawOps 측 오류 — 재시도 권장) / unknown.\n *\n * enum 으로 좁히지 않는다 — 통신망이 새 cause 를 보내면 서버가 값을 넓히는데, 그때마다\n * SDK 릴리즈를 기다려야 파싱되는 구조는 안 된다.\n */\n hangupCause: z.string().nullable().optional(),\n /** 통신망 Q.850 cause code. 1·5·28=결번, 16=정상해제, 17=통화중, 19=무응답, 38=망장애. */\n hangupCauseQ850: z.number().nullable().optional(),\n /**\n * 종료를 유발한 SIP 응답코드(404=없는 번호, 486=통화중, 500=망 오류 등).\n * 국내 통신망은 실제 사유를 500 으로 감싸 보내기도 하므로 hangupCause 가 더 정확하다.\n */\n sipResponseCode: z.number().nullable().optional(),\n /**\n * 종료 책임 주체. carrier(통신망) / callee(수신자) / caller(발신자) /\n * app·system(ClawOps 측 오류 — 수신자 번호를 정제 대상에 넣지 말고 재시도할 것).\n */\n hangupSource: z.enum(['carrier', 'callee', 'caller', 'app', 'system']).nullable().optional(),\n accountId: z.string(),\n dateCreated: z.string(),\n dateUpdated: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type Call = z.infer<typeof CallSchema>;\n\nexport const CallControlResponseSchema = z\n .object({\n callId: z.string(),\n status: z.string(),\n })\n .passthrough();\n\nexport type CallControlResponse = z.infer<typeof CallControlResponseSchema>;\n","import { z } from 'zod';\n\n/**\n * 화자 식별자. **2026-08 이후 전사는 `speaker_0`·`speaker_1`… 형식**이고, 전환 통화처럼\n * 참여자가 셋 이상이면 그만큼 늘어난다. 그 이전 전사에는 `AGENT`·`CUSTOMER` 가 그대로\n * 남아 있으므로 **두 형식을 모두 받아야 한다.** 화자와 역할의 연결은 보장되지 않는다.\n */\nexport type TranscriptSpeaker = 'CUSTOMER' | 'AGENT' | (string & {});\n\n/** 전사 실패 단계. `trigger` 는 시스템 실패라 재요청할 수 있다. */\nexport type TranscriptStage =\n | 'download'\n | 'runtime'\n | 'transcription'\n | 'trigger'\n | 'recover'\n | (string & {});\n\nexport const TranscriptSegmentSchema = z\n .object({\n /**\n * ⛔ **닫힌 enum 으로 두지 않는다.** 서버는 이미 `speaker_0` 을 보내고 있고, 세그먼트\n * 하나가 어긋나면 `segments` 배열 때문에 **전사 응답 전체**가 실패한다.\n */\n speaker: z.string() as z.ZodType<TranscriptSpeaker>,\n start: z.number(),\n end: z.number(),\n text: z.string(),\n })\n .passthrough();\n\nexport type TranscriptSegment = z.infer<typeof TranscriptSegmentSchema>;\n\n/**\n * 통화 전사 상태. status 에 따라 채워지는 필드가 다름:\n * - \"completed\": callId, segmentCount, segments\n * - \"pending\": startedAt\n * - \"failed\": stage, error. stage=\"trigger\" 는 시스템 실패로 재요청 가능\n * - \"not_requested\": 이외 필드 비어있음\n */\nexport const TranscriptStatusSchema = z\n .object({\n status: z.enum(['completed', 'pending', 'failed', 'not_requested']),\n callId: z.string().optional(),\n segmentCount: z.number().optional(),\n segments: z.array(TranscriptSegmentSchema).optional(),\n startedAt: z.string().optional(),\n /**\n * ⛔ **실패 단계는 서버 코드가 만든다** — 전사 파이프라인이 `download`·`runtime`·\n * `transcription`·`recover` 를 내보내고, 영구 실패는 예외 객체의 속성을 그대로 싣는다.\n * 어휘가 열려 있어 스펙의 enum 조차 스냅샷일 뿐이다.\n *\n * ⚠️ 여기가 닫혀 있으면 **전사가 실패했을 때 그 이유를 물으면 던진다** — 고객이 가장\n * 답을 필요로 하는 순간이다.\n */\n stage: (z.string() as z.ZodType<TranscriptStage>).nullable().optional(),\n error: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type TranscriptStatus = z.infer<typeof TranscriptStatusSchema>;\n\n/** POST 요청이 accept 되어 Job 이 트리거된 상태 (202). */\nexport const TranscriptRequestAcceptedSchema = z\n .object({\n status: z.literal('pending'),\n callId: z.string(),\n })\n .passthrough();\n\nexport type TranscriptRequestAccepted = z.infer<typeof TranscriptRequestAcceptedSchema>;\n","import { z } from 'zod';\n\n/**\n * 통화 요약 상태. status 에 따라 채워지는 필드가 다름:\n * - \"completed\": callId, resultJson, provider, model, promptVersion, schemaVersion, updatedAt\n * - \"pending\": 이외 필드 비어있음\n * - \"failed\": failedReason\n * - \"not_requested\": 통화는 있지만 요약 row 가 아직 없음\n */\nexport const SummaryStatusSchema = z\n .object({\n status: z.enum(['completed', 'pending', 'failed', 'not_requested']),\n callId: z.string().optional(),\n resultJson: z.record(z.string(), z.unknown()).nullable().optional(),\n provider: z.string().nullable().optional(),\n model: z.string().nullable().optional(),\n promptVersion: z.string().nullable().optional(),\n schemaVersion: z.string().nullable().optional(),\n failedReason: z.string().nullable().optional(),\n updatedAt: z.string().optional(),\n })\n .passthrough();\n\nexport type SummaryStatus = z.infer<typeof SummaryStatusSchema>;\n","import { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport { CallSchema, CallControlResponseSchema } from '../types/call.js';\nimport type { Call, CallControlResponse } from '../types/call.js';\nimport type {\n CallContextParam,\n CallCreateParams,\n CallListParams,\n} from '../types/call-params.js';\nimport {\n TranscriptStatusSchema,\n TranscriptRequestAcceptedSchema,\n} from '../types/transcript.js';\nimport type { TranscriptStatus, TranscriptRequestAccepted } from '../types/transcript.js';\nimport { SummaryStatusSchema } from '../types/summary.js';\nimport type { SummaryStatus } from '../types/summary.js';\n\n/**\n * `callContext` 를 REST 본문의 PascalCase 로 옮긴다.\n *\n * 파라미터는 camelCase(`instruction`/`variables`)로 받지만 서버는 PascalCase 만 받는다\n * (스펙상 `additionalProperties: false` 라 camelCase 를 그대로 보내면 400).\n * `stripNotGiven` 은 최상위 키만 훑으므로 중첩 객체는 여기서 직접 정리한다.\n */\nfunction callContextBody(\n ctx: CallContextParam | undefined,\n): Record<string, unknown> | undefined {\n if (!ctx) return undefined;\n const body: Record<string, unknown> = { Instruction: ctx.instruction };\n if (ctx.variables !== undefined) body.Variables = ctx.variables;\n return body;\n}\n\nexport class Calls extends APIResource {\n async create(\n params: CallCreateParams,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Call> {\n const body = stripNotGiven({\n To: params.to,\n From: params.from,\n Url: params.url,\n AgentId: params.agentId,\n CallContext: callContextBody(params.callContext),\n CallFlowId: params.callFlowId,\n Variables: params.variables,\n StatusCallback: params.statusCallback,\n StatusCallbackEvent: params.statusCallbackEvent,\n Timeout: params.timeout,\n MachineDetection: params.machineDetection,\n });\n return this._client._post(`${this._basePath}/calls`, {\n body,\n castTo: CallSchema,\n ...options,\n });\n }\n\n async list(\n params: CallListParams = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Page<Call>> {\n const query = stripNotGiven({\n status: params.status,\n from: params.from,\n to: params.to,\n number: params.number,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/calls`;\n const schema = PageSchema(CallSchema);\n const raw = await this._client._get(path, {\n castTo: schema,\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<Call>(raw.data, raw.meta);\n page._setClient(this._client, path, CallSchema, query);\n return page;\n }\n\n async get(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Call> {\n return this._client._get(`${this._basePath}/calls/${callId}`, {\n castTo: CallSchema,\n ...options,\n });\n }\n\n async update(\n callId: string,\n params: { status?: 'completed' } = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<CallControlResponse> {\n return this._client._post(`${this._basePath}/calls/${callId}`, {\n body: { Status: params.status ?? 'completed' },\n castTo: CallControlResponseSchema,\n ...options,\n });\n }\n\n /**\n * 통화 전사 상태 조회. 완료된 경우 segment 배열까지 한 번에 반환합니다.\n *\n * @throws NotFoundError (404) — 통화 없음\n * @throws PermissionDeniedError (403) — accountId 불일치\n */\n async getTranscript(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<TranscriptStatus> {\n return this._client._get(`${this._basePath}/calls/${callId}/transcript`, {\n castTo: TranscriptStatusSchema,\n ...options,\n });\n }\n\n /**\n * 특정 통화 1 건에 대해 전사를 명시 요청.\n * 조직 설정 \"통화 받아쓰기\" 가 꺼져 있어도 해당 통화만 전사됩니다.\n * 재실행 금지 — 이미 요청된 통화는 ConflictError(409) 발생.\n * 시스템 레벨 트리거 실패(stage=trigger) 만 재시도 가능.\n * 전사된 오디오 길이만큼 사용량 기반으로 과금됩니다.\n *\n * @throws BadRequestError (400) — 녹음 없음\n * @throws NotFoundError (404) — 통화 없음\n * @throws PermissionDeniedError (403) — accountId 불일치\n * @throws ConflictError (409) — 이미 요청됨\n */\n async requestTranscript(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<TranscriptRequestAccepted> {\n return this._client._post(`${this._basePath}/calls/${callId}/transcript`, {\n castTo: TranscriptRequestAcceptedSchema,\n ...options,\n });\n }\n\n /**\n * 통화 요약 상태 조회. transcript 가 완료된 통화에 대해 자동 생성된\n * LLM 구조화 요약 결과를 반환합니다. completed 일 때 resultJson 채워짐.\n *\n * @throws NotFoundError (404) — 통화 없음\n * @throws PermissionDeniedError (403) — accountId 불일치\n */\n async getSummary(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<SummaryStatus> {\n return this._client._get(`${this._basePath}/calls/${callId}/summary`, {\n castTo: SummaryStatusSchema,\n ...options,\n });\n }\n}\n","import { z } from 'zod';\n\n/**\n * 채널 연결 상태. 서버가 어휘를 소유하므로 **열린 유니온**이다 — 목록에 없는 값도 그대로\n * 실리고, 낡는 것은 자동완성뿐이다.\n */\nexport type KakaoChannelStatus = 'connected' | 'needs_attention' | (string & {});\n\n/**\n * 이 계정에 연결된 카카오 비즈니스 채널.\n *\n * ⚠️ `searchId` 는 채널 소유자가 카카오 비즈니스에서 바꿀 수 있다. **연동 키로 쓰지 말 것** —\n * 키는 `id`(ClawOps 리소스 ID)다.\n */\nexport const KakaoChannelSchema = z\n .object({\n /** ClawOps 채널 리소스 ID. 템플릿 조회와 알림톡 발송에 이 값을 쓴다. */\n id: z.string(),\n /** 카카오 채널 검색용 ID. `@` 없는 형태로 저장된다. */\n searchId: z.string(),\n name: z.string(),\n categoryCode: z.string(),\n /**\n * `connected` = 연결 완료. `needs_attention` = 연결 기록은 있으나 카카오 채널 상태를\n * 확인하지 못한 상태다 — 실제로 끊겼을 수도, 일시적인 조회 실패일 수도 있다.\n * `channels.retrieve()` 를 다시 부르면 재확인한다.\n *\n * ⛔ **닫힌 enum 으로 두지 않는다.** 어휘는 서버가 소유하므로, 상태가 하나 늘면\n * 닫힌 enum 은 조회를 통째로 실패시킨다(알림톡 `'ata'` 가 정확히 그렇게 터졌다).\n * 열린 유니온이면 자동완성만 낡고 조회는 계속 산다.\n */\n status: z.string() as z.ZodType<KakaoChannelStatus>,\n /** 담당자 휴대전화번호(마스킹). 원문은 저장하지 않는다. */\n managerPhoneMasked: z.string().nullable().optional(),\n connectedAt: z.string(),\n /** 카카오 채널 상태를 마지막으로 확인한 시각. null 이면 연결 이후 한 번도 확인하지 않았다. */\n syncedAt: z.string().nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n })\n .passthrough();\n\nexport type KakaoChannel = z.infer<typeof KakaoChannelSchema>;\n\n/**\n * 알림톡 템플릿.\n *\n * 본문·버튼·아이템 리스트·강조 문구는 **카카오 검수를 받은 그대로** 발송된다. 발송 요청으로\n * 바꿀 수 있는 것은 `variables` 값뿐이다.\n */\nexport const KakaoTemplateSchema = z\n .object({\n /** ClawOps 템플릿 리소스 ID. 발송의 `kakao.templateId` 에 이 값을 쓴다. */\n id: z.string(),\n /** ClawOps 채널 리소스 ID. 발송의 `kakao.channelId` 와 같은 값이다. */\n channelId: z.string(),\n name: z.string(),\n /** 검수를 받은 템플릿 본문. `#{변수}` 자리는 발송 시 치환된다. */\n content: z.string(),\n /**\n * 카카오 검수 상태(`APPROVED`·`REJECTED` 등). **카카오 쪽 열린 집합이라 문자열이다.**\n * 발송 가능 여부 판정은 `sendable` 이 정본이다.\n */\n status: z.string(),\n /** 휴면 템플릿. `true` 면 승인 상태여도 발송할 수 없다. */\n dormant: z.boolean(),\n /** 지금 발송에 쓸 수 있으면 true. `status === 'APPROVED' && !dormant` 다. */\n sendable: z.boolean(),\n /** `CHANNEL`(채널 소유) 또는 `GROUP`(기본 제공). */\n assignType: z.string(),\n messageType: z.string(),\n emphasizeType: z.string(),\n /**\n * 발송 시 `kakao.variables` 에 모두 채워야 하는 변수 이름.\n * 버튼 링크·강조 문구에 들어간 변수도 이 한 목록에 모인다.\n */\n variables: z.array(z.string()),\n createdAt: z.string(),\n updatedAt: z.string(),\n })\n .passthrough();\n\nexport type KakaoTemplate = z.infer<typeof KakaoTemplateSchema>;\n\n/**\n * 브랜드 메시지 말풍선 유형. **이 값이 단가를 정한다** — 텍스트형이 가장 싸고\n * 와이드리스트·캐러셀·커머스가 가장 비싸다.\n *\n * `MessageType` 과 같은 이유로 열어 둔 유니온이다.\n */\nexport type BrandBubbleType =\n | 'TEXT'\n | 'IMAGE'\n | 'WIDE'\n | 'WIDE_ITEM_LIST'\n | 'CAROUSEL_FEED'\n | 'COMMERCE'\n | 'CAROUSEL_COMMERCE'\n // ⚠️ `PREMIUM_VIDEO` 는 카카오TV 종료로 등록 경로가 막혀 알려진 값에서 뺐다.\n | (string & {});\n\n/**\n * 브랜드 메시지 템플릿.\n *\n * ⭐ **알림톡과 달리 검수가 없다** — `status`·`dormant`·`sendable` 이 없는 이유이고,\n * 목록에 있으면 곧 발송할 수 있다.\n */\nexport const KakaoBrandTemplateSchema = z\n .object({\n /** ClawOps 템플릿 리소스 ID. 발송의 `brand.templateId` 에 이 값을 쓴다. */\n id: z.string(),\n /** ClawOps 채널 리소스 ID. 발송의 `brand.channelId` 와 같은 값이다. */\n channelId: z.string(),\n name: z.string(),\n chatBubbleType: z.string() as z.ZodType<BrandBubbleType>,\n /**\n * 말풍선 본문.\n *\n * ⚠️ **유형에 따라 `null` 이다.** 본문이 담기는 자리가 유형마다 달라 `TEXT`·`IMAGE`·\n * `WIDE` 에만 채워진다 — 나머지는 헤더·카드·상품명이 그 자리를 대신한다.\n */\n content: z.string().nullable(),\n /** 와이드리스트형의 머리말. 다른 유형에서는 `null`. */\n header: z.string().nullable(),\n /** 발송 시 `brand.variables` 에 모두 채워야 하는 변수 이름. */\n variables: z.array(z.string()),\n createdAt: z.string(),\n updatedAt: z.string(),\n })\n .passthrough();\n\nexport type KakaoBrandTemplate = z.infer<typeof KakaoBrandTemplateSchema>;\n\n/**\n * 자유형 말풍선에 실을 이미지.\n *\n * ⭐ `id` 는 **ClawOps 리소스 ID** 다 — 벤더 파일 식별자가 아니다. 발송의\n * `brand.free.imageId` 에 이 값을 넣으면 서버가 벤더 값으로 바꿔 보낸다.\n */\nexport const KakaoBrandImageSchema = z\n .object({\n id: z.string(),\n /** 업로드할 때 지정한 말풍선 유형. 규격이 유형마다 달라 다른 유형엔 재사용할 수 없다. */\n bubbleType: z.string() as z.ZodType<BrandBubbleType>,\n /** `'main'` | `'sub'`. 서브는 와이드리스트형에만 있다(메인 2:1, 서브 1:1). */\n slot: z.string(),\n /** 업로드한 원본 파일 이름. */\n name: z.string().nullable(),\n createdAt: z.string(),\n })\n .passthrough();\n\nexport type KakaoBrandImage = z.infer<typeof KakaoBrandImageSchema>;\n\n/** 채널 업종 카테고리. **열린 집합이므로 코드에 하드코딩하지 말 것** — 이 응답이 정본이다. */\nexport const KakaoChannelCategorySchema = z\n .object({\n /** 채널 연결의 `categoryCode` 에 그대로 보내는 값. */\n code: z.string(),\n name: z.string(),\n })\n .passthrough();\n\nexport type KakaoChannelCategory = z.infer<typeof KakaoChannelCategorySchema>;\n\nexport const KakaoChannelCategoryListSchema = z\n .object({\n data: z.array(KakaoChannelCategorySchema),\n meta: z\n .object({\n /** 이 목록을 공급자에서 실제로 받아 온 시각. */\n fetchedAt: z.string(),\n /** 서버 캐시에서 응답했는지. 캐시는 짧고 값이 바뀌면 자동으로 따라간다. */\n cached: z.boolean(),\n })\n .passthrough(),\n })\n .passthrough();\n\nexport type KakaoChannelCategoryList = z.infer<typeof KakaoChannelCategoryListSchema>;\n\n/**\n * 인증번호 발송 요청 접수 결과.\n *\n * **응답에 인증번호는 없다.** 인증번호는 카카오 비즈니스에 등록된 담당자 휴대전화로만 가고,\n * ClawOps 는 그 값을 받지도 저장하지도 않는다.\n */\nexport const KakaoTokenRequestSchema = z\n .object({\n requested: z.boolean(),\n /** 정규화된 검색용 ID. `channels.connect()` 에 이 값을 그대로 보낸다. */\n searchId: z.string(),\n /** 인증번호가 발송된 번호(마스킹). */\n phoneNumberMasked: z.string(),\n /** 재요청까지 기다릴 시간(초). */\n retryAfterSeconds: z.number(),\n })\n .passthrough();\n\nexport type KakaoTokenRequest = z.infer<typeof KakaoTokenRequestSchema>;\n","import { z } from 'zod';\n\nimport { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport {\n KakaoBrandImageSchema,\n KakaoBrandTemplateSchema,\n KakaoChannelSchema,\n KakaoChannelCategoryListSchema,\n KakaoTemplateSchema,\n KakaoTokenRequestSchema,\n} from '../types/kakao.js';\nimport type {\n BrandBubbleType,\n KakaoBrandImage,\n KakaoBrandTemplate,\n KakaoChannel,\n KakaoChannelCategoryList,\n KakaoTemplate,\n KakaoTokenRequest,\n} from '../types/kakao.js';\nimport type {\n KakaoBrandTemplateListParams,\n KakaoChannelConnectParams,\n KakaoChannelListParams,\n KakaoTemplateListParams,\n KakaoTokenRequestParams,\n} from '../types/kakao-params.js';\n\ntype RequestOptions = {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n};\n\n/**\n * 카카오 비즈니스 채널.\n *\n * 채널 연결은 두 단계다 — `requestToken()` 으로 담당자 휴대전화에 인증번호를 보내고,\n * 받은 번호를 `connect()` 에 실어 완료한다. 서버는 그 사이 상태를 저장하지 않으므로\n * `searchId` 와 `phoneNumber` 를 두 번 모두 보낸다.\n */\nexport class KakaoChannels extends APIResource {\n private get _path(): string {\n return `${this._basePath}/kakao/channels`;\n }\n\n /**\n * 연결된 채널 목록.\n *\n * **카카오 쪽 상태를 확인하지 않는다** — 저장된 연결 정보를 그대로 돌려주므로 빠르다.\n * 실제 채널 상태까지 확인하려면 `retrieve()` 를 쓴다.\n */\n async list(\n params: KakaoChannelListParams = {},\n options: RequestOptions = {},\n ): Promise<Page<KakaoChannel>> {\n const query = stripNotGiven({\n status: params.status,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = this._path;\n const raw = await this._client._get(path, {\n castTo: PageSchema(KakaoChannelSchema),\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<KakaoChannel>(raw.data, raw.meta);\n page._setClient(this._client, path, KakaoChannelSchema, query);\n return page;\n }\n\n /**\n * 채널 하나를 조회한다. **목록과 달리 카카오 쪽 상태를 실제로 확인하고 `status` 를 갱신한다.**\n *\n * `connect()` 가 타임아웃됐을 때 결과를 확정하는 경로이기도 하다 — 연결을 재호출하면 중복\n * 등록을 시도하게 되지만 이 조회는 몇 번을 불러도 안전하다.\n *\n * 카카오 쪽 조회에 실패해도 `404` 가 아니다. 연결 기록은 유효하므로 `status` 가\n * `needs_attention` 으로 온다.\n */\n async retrieve(channelId: string, options: RequestOptions = {}): Promise<KakaoChannel> {\n return this._client._get(`${this._path}/${channelId}`, {\n castTo: KakaoChannelSchema,\n ...options,\n });\n }\n\n /**\n * 채널 권한을 증명할 인증번호를 **담당자 휴대전화로 발송**해 달라고 요청한다. 연결의 첫 단계다.\n *\n * 응답에 인증번호는 없다(`202`). 받은 번호는 `connect()` 의 `token` 으로 보내며, 유효 시간이\n * 있으므로 받은 뒤 바로 진행한다. 재요청이 잦으면 `429 KAKAO_RATE_LIMITED` 이고\n * 응답의 `retryAfterSeconds` 만큼 기다린다.\n */\n async requestToken(\n params: KakaoTokenRequestParams,\n options: RequestOptions = {},\n ): Promise<KakaoTokenRequest> {\n return this._client._post(`${this._path}/token`, {\n body: { searchId: params.searchId, phoneNumber: params.phoneNumber },\n castTo: KakaoTokenRequestSchema,\n ...options,\n });\n }\n\n /**\n * 인증번호로 채널 연결을 완료한다. **먼저 `requestToken()` 을 불러야 한다.**\n *\n * **멱등이다** — 이미 이 계정에 연결된 채널이면 인증번호를 소모하지 않고 기존 연결을 돌려준다.\n * 다른 계정에 연결된 채널은 멱등이 아니라 충돌이라 `409 KAKAO_CHANNEL_ALREADY_LINKED` 다.\n *\n * ⚠️ **타임아웃되면 재호출하지 말 것.** 이미 연결에 성공했을 수 있어 중복 등록을 시도하게 된다.\n * `list()` 나 `retrieve()` 로 실제 등록 여부를 확인한 뒤 결과를 확정한다.\n *\n * ⚠️ **실패해도 인증번호는 소모된다**(`422 KAKAO_TOKEN_INVALID`·`KAKAO_CHANNEL_REJECTED`).\n * 원인을 해결한 뒤 `requestToken()` 부터 다시 시작해야 한다.\n */\n async connect(\n params: KakaoChannelConnectParams,\n options: RequestOptions = {},\n ): Promise<KakaoChannel> {\n return this._client._post(this._path, {\n body: {\n searchId: params.searchId,\n phoneNumber: params.phoneNumber,\n categoryCode: params.categoryCode,\n token: params.token,\n },\n castTo: KakaoChannelSchema,\n ...options,\n });\n }\n\n /**\n * 채널 연동을 해제한다. 카카오톡 채널 자체는 지워지지 않고 ClawOps 와의 연동만 끊긴다.\n *\n * ⚠️ **되돌릴 수 없고, 그 채널에 등록된 알림톡 템플릿도 함께 삭제된다.** 템플릿은 카카오\n * 검수를 다시 받아야 하므로 복구에 시간이 걸린다 — 호출 전에 사용자 확인을 받을 것.\n *\n * 해제 후에는 그 채널을 다시 연결할 수 있다(본인이든 다른 계정이든). `requestToken()` 부터\n * 다시 시작하면 된다.\n */\n async disconnect(channelId: string, options: RequestOptions = {}): Promise<KakaoChannel> {\n return this._client._deleteWithResponse(`${this._path}/${channelId}`, {\n castTo: KakaoChannelSchema,\n ...options,\n });\n }\n}\n\n/** 알림톡 템플릿(읽기 전용). 등록·검수는 콘솔에서 한다. */\nexport class KakaoTemplates extends APIResource {\n /**\n * 한 채널의 알림톡 템플릿 목록.\n *\n * 응답의 `data[].id` 를 발송의 `kakao.templateId` 로, `data[].channelId` 를\n * `kakao.channelId` 로 쓴다. **`sendable: true` 인 템플릿만 발송할 수 있고**,\n * `variables` 의 모든 항목을 발송 요청의 `kakao.variables` 에 채워야 한다.\n */\n async list(\n params: KakaoTemplateListParams,\n options: RequestOptions = {},\n ): Promise<Page<KakaoTemplate>> {\n const query = stripNotGiven({\n channelId: params.channelId,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/kakao/templates`;\n const raw = await this._client._get(path, {\n castTo: PageSchema(KakaoTemplateSchema),\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<KakaoTemplate>(raw.data, raw.meta);\n page._setClient(this._client, path, KakaoTemplateSchema, query);\n return page;\n }\n}\n\nexport class KakaoBrandTemplates extends APIResource {\n /**\n * 한 채널의 브랜드 메시지 템플릿 목록.\n *\n * 응답의 `data[].id` 를 발송의 `brand.templateId` 로, `data[].channelId` 를\n * `brand.channelId` 로 쓴다. `variables` 의 모든 항목을 `brand.variables` 에 채워야 한다.\n *\n * ⭐ **알림톡과 달리 검수가 없어** `sendable` 같은 칸이 없다 — 목록에 있으면 곧 보낼 수 있다.\n */\n async list(\n params: KakaoBrandTemplateListParams,\n options: RequestOptions = {},\n ): Promise<Page<KakaoBrandTemplate>> {\n const query = stripNotGiven({\n channelId: params.channelId,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/kakao/brand-templates`;\n const raw = await this._client._get(path, {\n castTo: PageSchema(KakaoBrandTemplateSchema),\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<KakaoBrandTemplate>(raw.data, raw.meta);\n page._setClient(this._client, path, KakaoBrandTemplateSchema, query);\n return page;\n }\n}\n\n/**\n * 자유형 말풍선에 실을 이미지.\n *\n * ⭐ **업로드 한 번, 발송 여러 번.** 캠페인 하나에 수천 건이 같은 그림을 쓰므로 받은 `id` 를\n * 재사용한다 — 발송마다 다시 올릴 필요가 없다.\n *\n * ⚠️ **규격이 말풍선 유형마다 다르다.** 업로드할 때 준 `bubbleType` 과 다른 유형에 쓰면\n * 카카오가 발송 단계에서 거절한다 — 그 유형으로 다시 올려야 한다.\n */\nexport class KakaoBrandImages extends APIResource {\n private get _path(): string {\n return `${this._basePath}/kakao/brand-images`;\n }\n\n /**\n * 이미지를 올리고 발송에 쓸 `id` 를 받는다.\n *\n * ```ts\n * const image = await client.kakao.brandImages.upload({\n * file: readFileSync('banner.png'),\n * filename: 'banner.png',\n * bubbleType: 'WIDE',\n * });\n * await client.messages.create({\n * to: '01012345678',\n * from: '07012345678',\n * brand: {\n * channelId,\n * free: { chatBubbleType: 'WIDE', content: '신메뉴가 나왔어요.', imageId: image.id },\n * },\n * });\n * ```\n *\n * ⚠️ `TEXT` 는 이미지 자리가 없어 `400` 이다. 자동완성에 뜨지만 쓸 수 없다.\n *\n * ⚠️ **상한은 5MB 다.** 넘으면 `400`, 10MB 를 넘으면 업로드 검증기가 먼저 끊어 `413` 이고\n * **`code` 가 없다** — 즉 \"너무 크다\" 가 두 모양으로 온다.\n *\n * @param params.filename 원본 파일 이름. 목록에서 사람이 알아볼 유일한 단서다.\n * @param params.slot 와이드리스트형에서 작은 항목에 쓸 이미지면 `'sub'`. 기본은 `'main'`.\n */\n async upload(\n params: { file: Blob | Uint8Array; filename: string; bubbleType: BrandBubbleType; slot?: string },\n options: RequestOptions = {},\n ): Promise<{ id: string }> {\n const form = new FormData();\n // ⚠️ 파일 이름을 **인자로 받는다.** `File` 을 요구하면 Node 18 에서 아예 못 만든다\n // (전역 `File` 은 Node 20 부터다). `Blob` 은 이름을 못 들고, 이름이 없으면 목록에서\n // 무엇인지 알아볼 단서가 사라진다.\n const blob = params.file instanceof Blob ? params.file : new Blob([params.file]);\n form.append('image', blob, params.filename);\n form.append('bubbleType', params.bubbleType);\n if (params.slot) form.append('slot', params.slot);\n\n return this._client._post(this._path, {\n body: form,\n castTo: z.object({ id: z.string() }).passthrough(),\n ...options,\n });\n }\n\n /** 올려 둔 이미지 목록. **`id` 를 잃었을 때 되찾는 경로다.** */\n async list(\n params: { page?: number; pageSize?: number } = {},\n options: RequestOptions = {},\n ): Promise<Page<KakaoBrandImage>> {\n const query = stripNotGiven({ page: params.page, pageSize: params.pageSize });\n const path = this._path;\n const raw = await this._client._get(path, {\n castTo: PageSchema(KakaoBrandImageSchema),\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<KakaoBrandImage>(raw.data, raw.meta);\n page._setClient(this._client, path, KakaoBrandImageSchema, query);\n return page;\n }\n}\n\n/**\n * 카카오 알림톡·브랜드 메시지 관련 리소스.\n *\n * 발송 자체는 `client.messages.create({ kakao: … })` 또는 `({ brand: … })` 다 —\n * 여기서 얻은 채널·템플릿 ID 를 그대로 쓴다.\n */\nexport class Kakao extends APIResource {\n get channels(): KakaoChannels {\n return new KakaoChannels(this._client, this._accountId);\n }\n\n get templates(): KakaoTemplates {\n return new KakaoTemplates(this._client, this._accountId);\n }\n\n /** 브랜드 메시지 템플릿. 알림톡 템플릿(`templates`)과 **다른 표**다. */\n get brandTemplates(): KakaoBrandTemplates {\n return new KakaoBrandTemplates(this._client, this._accountId);\n }\n\n /** 자유형 말풍선에 실을 이미지. 템플릿형은 이미지가 템플릿에 들어 있어 필요 없다. */\n get brandImages(): KakaoBrandImages {\n return new KakaoBrandImages(this._client, this._accountId);\n }\n\n /**\n * 채널 연결 시 지정할 업종 카테고리 목록.\n *\n * **값을 코드에 하드코딩하지 말 것** — 카카오/공급자 쪽에서 늘거나 바뀌는 열린 집합이고\n * 이 응답이 그때그때의 정본이다. 응답의 `code` 를 `channels.connect()` 의 `categoryCode`\n * 로 그대로 보낸다.\n *\n * 페이지네이션이 없어 `Page` 가 아니라 `{ data, meta }` 를 그대로 돌려준다.\n */\n async channelCategories(options: RequestOptions = {}): Promise<KakaoChannelCategoryList> {\n return this._client._get(`${this._basePath}/kakao/channel-categories`, {\n castTo: KakaoChannelCategoryListSchema,\n ...options,\n });\n }\n}\n","import { z } from 'zod';\n\n/**\n * 메시지 상태.\n *\n * ⚠️ 한때 여기 `'sending'` 이 있었는데 **서버가 한 번도 보낸 적 없는 값**이다 — 어휘를 손으로\n * 관리하면 없는 값이 들어오고 있는 값이 빠진다. 그래서 이 유니온은 자동완성용이고,\n * 검증은 하지 않는다.\n */\nexport type MessageStatus = 'queued' | 'sent' | 'failed' | 'received' | (string & {});\n\n/**\n * 메시지 유형. `KakaoChannelStatus` 와 같은 이유로 **열린 유니온**이다 — 서버가 어휘를\n * 소유하므로 값이 하나 늘어도 조회는 살아 있어야 하고, 낡는 것은 자동완성뿐이다.\n */\nexport type MessageType =\n | 'sms'\n | 'lms'\n | 'mms'\n /** 카카오 알림톡. */\n | 'ata'\n /** 카카오 브랜드 메시지. */\n | 'bms'\n | (string & {});\n\nexport const MessageSchema = z\n .object({\n messageId: z.string(),\n status: z.string() as z.ZodType<MessageStatus>,\n /**\n * `'ata'`(알림톡)·`'bms'`(브랜드 메시지)는 카카오로 나간다. `body` 에는 템플릿에 변수를\n * 치환한 결과가 담기고, 버튼·아이템 리스트·강조 문구는 템플릿에 담긴 대로 발송되어\n * 이 값에는 담기지 않는다.\n *\n * ⛔ **닫힌 enum 으로 두지 않는다.** 어휘는 서버가 소유하므로, 유형이 하나 늘면 닫힌\n * enum 은 **목록을 통째로** 실패시킨다(`list()` 는 페이지를 한 번에 파싱한다). 실제로\n * 두 번 그렇게 터졌다 — `'ata'` 가 나왔을 때, 그리고 `'bms'` 가 나왔을 때.\n */\n type: z.string() as z.ZodType<MessageType>,\n to: z.string(),\n from: z.string(),\n body: z.string().nullable().optional(),\n subject: z.string().nullable().optional(),\n numMedia: z.number(),\n mediaUrl: z.array(z.string()),\n direction: z.enum(['outbound', 'inbound']),\n accountId: z.string(),\n dateCreated: z.string(),\n dateUpdated: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type Message = z.infer<typeof MessageSchema>;\n","import { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport { MessageSchema } from '../types/message.js';\nimport type { Message } from '../types/message.js';\nimport type {\n BrandSendParams,\n KakaoSendParams,\n MessageCreateParams,\n MessageListParams,\n} from '../types/message-params.js';\n\n/**\n * 알림톡·브랜드의 발송 지정을 서버 표기(PascalCase)로 옮긴다.\n *\n * 두 채널이 **한 함수를 쓴다** — 알림톡엔 자유형이 없어 `Free` 가 언제나 `undefined` 이고,\n * `stripNotGiven` 이 그걸 떨군다. 갈라 두면 서버가 `Variables` 키 이름을 바꿀 때 두 곳을\n * 고쳐야 하고, 한쪽을 빠뜨려도 값이 `Record<string, unknown>` 이라 컴파일이 통과한다.\n *\n * ⛔ **네 칸을 그대로 옮긴다 — 여기서 템플릿형/자유형을 고르지 않는다.** `free` 가 있으면\n * `TemplateId` 를 떨구는 식으로 짜면, 둘 다 실은 (타입을 안 쓰는) 호출자가 `400` 대신\n * **자기가 안 시킨 자유형이 나간 것**을 받는다. 배타 판정은 서버 한 곳이다.\n *\n * ⚠️ `Free` 는 불투명 오브젝트다. `stripNotGiven` 은 한 겹만 훑으므로 안쪽은 손대지 않는다 —\n * 판정은 서버의 말풍선 표가 한다.\n */\nconst sendBlock = (p?: KakaoSendParams | BrandSendParams) =>\n p &&\n stripNotGiven({\n ChannelId: p.channelId,\n TemplateId: p.templateId,\n Variables: p.variables,\n Free: p.free,\n });\n\nexport class Messages extends APIResource {\n /**\n * 문자(SMS/LMS/MMS) 또는 카카오 알림톡·브랜드 메시지를 발송합니다.\n *\n * 셋은 배타적입니다 — `kakao` 를 실으면 알림톡, `brand` 를 실으면 브랜드 메시지이고,\n * 이때 `body`·`subject`·`mediaUrl` 은 실을 수 없습니다(본문은 템플릿이 정합니다).\n *\n * ```ts\n * // 문자\n * await client.messages.create({ to: '010…', from: '070…', body: '안녕하세요' });\n *\n * // 알림톡 — 실패하면 fallback 문구가 문자로 대신 나갑니다(별도 1건으로 과금)\n * await client.messages.create({\n * to: '010…',\n * from: '070…',\n * kakao: { channelId, templateId, variables: { 고객명: '홍길동' } },\n * fallback: { body: '주문이 접수되었습니다.' },\n * });\n *\n * // 브랜드 메시지 — 채널을 추가한 친구에게 나가는 광고성 메시지\n * // ⚠️ 야간 제한과 대체발송 없음 — 제약은 `BrandMessageCreateParams` 참고.\n * await client.messages.create({\n * to: '010…',\n * from: '070…',\n * brand: { channelId, templateId, variables: { 고객명: '홍길동' } },\n * });\n * ```\n */\n async create(\n params: MessageCreateParams,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Message> {\n const body = stripNotGiven({\n To: params.to,\n From: params.from,\n Body: params.body,\n Type: params.type,\n Subject: params.subject,\n MediaUrl: params.mediaUrl,\n IdempotencyKey: params.idempotencyKey,\n // 중첩 객체는 손으로 조립한다 — stripNotGiven 은 한 겹만 훑는다.\n Kakao: sendBlock(params.kakao),\n Brand: sendBlock(params.brand),\n Fallback:\n params.fallback &&\n stripNotGiven({\n Type: params.fallback.type,\n Subject: params.fallback.subject,\n Body: params.fallback.body,\n Disabled: params.fallback.disabled,\n }),\n });\n return this._client._post(`${this._basePath}/messages`, {\n body,\n castTo: MessageSchema,\n ...options,\n });\n }\n\n async list(\n params: MessageListParams = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Page<Message>> {\n const query = stripNotGiven({\n type: params.type,\n status: params.status,\n number: params.number,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/messages`;\n const schema = PageSchema(MessageSchema);\n const raw = await this._client._get(path, {\n castTo: schema,\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<Message>(raw.data, raw.meta);\n page._setClient(this._client, path, MessageSchema, query);\n return page;\n }\n\n async get(\n messageId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Message> {\n return this._client._get(`${this._basePath}/messages/${messageId}`, {\n castTo: MessageSchema,\n ...options,\n });\n }\n}\n","import { z } from 'zod';\n\n/**\n * 착신 라우팅 모드.\n *\n * - `webhook` : webhookUrl 의 VoiceML 이 처리.\n * - `agent` : agentId 의 매니지드 에이전트가 착신.\n * - `callflow` : callFlowId 의 콜 플로우(ARS)가 착신.\n * - `forward` : forwardTo(같은 계정 보유 번호)로 내부 착신전환.\n * - `sip` : sipEndpointId 의 라우트로 외부 PBX 다이얼.\n * - `softphone` : sipCredentialId 의 등록 단말로 착신.\n */\nexport const ROUTING_TYPES = [\n 'webhook',\n 'sip',\n 'softphone',\n 'forward',\n 'agent',\n 'callflow',\n] as const;\n\nexport type RoutingType = (typeof ROUTING_TYPES)[number];\n\nexport const PhoneNumberSchema = z\n .object({\n number: z.string(),\n numberType: z.string().nullable().optional(),\n source: z.string().nullable().optional(),\n // routingType 은 enum 으로 좁히지 않는다. 좁히면 서버가 라우팅 종류를 늘렸을 때 그 번호가\n // 섞인 목록 조회가 통째로 실패한다(0.28.0 까지의 실제 결함: 'agent' 로 라우팅된 번호\n // 하나가 numbers.list() 전체를 깨뜨렸다).\n routingType: z.string().nullable().optional(),\n agentId: z.string().nullable().optional(),\n callFlowId: z.string().nullable().optional(),\n forwardTo: z.string().nullable().optional(),\n sipEndpointId: z.string().nullable().optional(),\n sipCredentialId: z.string().nullable().optional(),\n webhookUrl: z.string().nullable().optional(),\n webhookMethod: z.string().nullable().optional(),\n webhookHeaders: z.record(z.string()).nullable().optional(),\n callContextUrl: z.string().nullable().optional(),\n statusCallback: z.string().nullable().optional(),\n statusCallbackEvents: z.string().nullable().optional(),\n dictionaryId: z.string().nullable().optional(),\n createdAt: z.string().nullable().optional(),\n })\n .passthrough();\n\n/**\n * 전화번호. `routingType` 은 알려진 값에 자동완성이 뜨지만, 서버가 새 라우팅을 추가해도\n * 파싱이 깨지지 않도록 임의의 문자열을 허용한다.\n */\nexport type PhoneNumber = Omit<z.infer<typeof PhoneNumberSchema>, 'routingType'> & {\n routingType?: RoutingType | (string & {}) | null;\n};\n\nexport type NumberListItem = PhoneNumber;\nexport type NumberUpdateResponse = PhoneNumber;\n","import { z } from 'zod';\nimport { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { PhoneNumberSchema } from '../types/number.js';\nimport type { PhoneNumber, NumberListItem, NumberUpdateResponse } from '../types/number.js';\nimport type { NumberCreateParams, NumberUpdateParams } from '../types/number-params.js';\n\ninterface RequestOptions {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n}\n\nexport class Numbers extends APIResource {\n /**\n * 번호를 발급합니다. 번호 풀에서 자동으로 배정되며 어떤 번호가 나올지는 지정할 수 없습니다.\n *\n * 발급 직후 번호는 `routingType: \"webhook\"` 이고 `webhookUrl` 이 비어 있어, 그대로 두면\n * 걸려온 전화가 거절됩니다. 이어서 `update()` 로 착신 라우팅을 지정하세요.\n */\n async create(params: NumberCreateParams = {}, options: RequestOptions = {}): Promise<PhoneNumber> {\n const body = stripNotGiven({\n webhookUrl: params.webhookUrl,\n webhookMethod: params.webhookMethod,\n webhookHeaders: params.webhookHeaders,\n statusCallback: params.statusCallback,\n statusCallbackEvents: params.statusCallbackEvents,\n });\n return this._client._post(`${this._basePath}/numbers`, {\n body: Object.keys(body).length ? body : undefined,\n castTo: PhoneNumberSchema,\n ...options,\n });\n }\n\n /**\n * 등록된 번호 목록을 조회합니다. 페이지네이션과 필터가 없으며 보유한 번호가 한 번에 전부\n * 반환됩니다.\n */\n async list(options: RequestOptions = {}): Promise<NumberListItem[]> {\n const schema = z.object({ data: z.array(PhoneNumberSchema) }).passthrough();\n const result = await this._client._get(`${this._basePath}/numbers`, {\n castTo: schema,\n ...options,\n });\n return result.data;\n }\n\n /**\n * 번호 설정을 수정합니다. 착신 라우팅(webhook/agent/callflow/forward/sip/softphone)과\n * webhook, 상태 통지, 받아쓰기 사전을 변경할 수 있습니다. 보낸 필드만 반영되고 생략한\n * 필드는 유지됩니다.\n *\n * 라우팅을 바꾸면 다른 라우팅 필드는 서버에서 자동으로 비워집니다. `agent` 에서\n * `webhook` 으로 되돌리면 `agentId` 가 null 이 되므로, 다시 `agent` 로 돌아갈 때\n * `agentId` 를 새로 지정해야 합니다.\n */\n async update(\n number: string,\n params: NumberUpdateParams = {},\n options: RequestOptions = {},\n ): Promise<NumberUpdateResponse> {\n const body = stripNotGiven({\n routingType: params.routingType,\n agentId: params.agentId,\n callFlowId: params.callFlowId,\n forwardTo: params.forwardTo,\n sipEndpointId: params.sipEndpointId,\n sipCredentialId: params.sipCredentialId,\n webhookUrl: params.webhookUrl,\n webhookMethod: params.webhookMethod,\n webhookHeaders: params.webhookHeaders,\n callContextUrl: params.callContextUrl,\n statusCallback: params.statusCallback,\n statusCallbackEvents: params.statusCallbackEvents,\n dictionaryId: params.dictionaryId,\n });\n return this._client._put(`${this._basePath}/numbers/${number}`, {\n body,\n castTo: PhoneNumberSchema,\n ...options,\n });\n }\n\n /**\n * 번호를 반납합니다. 번호는 풀로 복귀하며 되돌릴 수 없습니다. 같은 번호를 다시\n * 발급받는다는 보장이 없습니다.\n */\n async delete(\n number: string,\n options: { extraHeaders?: Record<string, string>; timeout?: number } = {},\n ): Promise<void> {\n await this._client._delete(`${this._basePath}/numbers/${number}`, options);\n }\n}\n","import { APIResource } from '../resource.js';\n\nexport interface RecordingDownload {\n /** WAV 바이너리 데이터 (PCM 16bit mono 8kHz) */\n data: ArrayBuffer;\n /** 응답의 Content-Type (예: 'audio/wav') */\n contentType: string;\n /** Content-Disposition 헤더에서 파싱한 파일명 (없으면 null) */\n filename: string | null;\n}\n\nfunction parseFilename(disposition: string | null): string | null {\n if (!disposition) return null;\n const star = disposition.match(/filename\\*=(?:[\\w-]+'[^']*')?([^;]+)/i);\n if (star) {\n try {\n return decodeURIComponent(star[1].trim());\n } catch {\n // fall through to plain filename\n }\n }\n const quoted = disposition.match(/filename=\"([^\"]+)\"/i);\n if (quoted) return quoted[1].trim();\n const bare = disposition.match(/filename=([^;]+)/i);\n return bare ? bare[1].trim() : null;\n}\n\nexport class Recordings extends APIResource {\n /**\n * 통화 녹음(WAV)을 다운로드합니다.\n *\n * 콘솔과 동일한 서버측 MixMonitor 원본 (PCM 16bit mono 8kHz).\n *\n * @throws NotFoundError (404) — 통화가 없거나 녹음이 없음(`recordingUrl: null`).\n * @throws PermissionDeniedError (403) — accountId 불일치.\n */\n async download(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<RecordingDownload> {\n const response = await this._client._getRaw(\n `${this._basePath}/recordings/${callId}`,\n options,\n );\n const data = await response.arrayBuffer();\n return {\n data,\n contentType: response.headers.get('content-type') ?? 'audio/wav',\n filename: parseFilename(response.headers.get('content-disposition')),\n };\n }\n\n /**\n * 통화 녹음을 삭제합니다 (포인터 제거, 멱등 — 이미 없어도 성공).\n *\n * @throws NotFoundError (404) — 통화가 없음.\n * @throws PermissionDeniedError (403) — accountId 불일치.\n */\n async delete(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n } = {},\n ): Promise<void> {\n await this._client._delete(`${this._basePath}/recordings/${callId}`, options);\n }\n}\n","import { z } from 'zod';\n\n/**\n * SIP 단말(digest credential). 평문 password/ha1 은 조회 응답에 포함되지 않음\n * (생성 시 1회만 노출). softphone 라우팅 설정 시 이 객체의 id 를\n * numbers.update(number, { sipCredentialId }) 로 넘긴다.\n */\nexport const SipCredentialSchema = z\n .object({\n id: z.string(),\n accountId: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n username: z.string().nullable().optional(),\n realm: z.string().nullable().optional(),\n enabled: z.boolean().nullable().optional(),\n status: z.enum(['active', 'disabled', 'deleted']).nullable().optional(),\n ipAclId: z.string().nullable().optional(),\n allowedNumbers: z.array(z.string()).nullable().optional(),\n lastUsedAt: z.string().nullable().optional(),\n dateCreated: z.string().nullable().optional(),\n dateUpdated: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type SipCredential = z.infer<typeof SipCredentialSchema>;\n\n/**\n * SIP 엔드포인트(외부 PBX 트렁크). sip 라우팅 설정 시 이 객체의 id 를\n * numbers.update(number, { sipEndpointId }) 로 넘긴다.\n */\nexport const SipEndpointSchema = z\n .object({\n id: z.string(),\n accountId: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n maxConcurrent: z.number().nullable().optional(),\n status: z.enum(['active', 'disabled']).nullable().optional(),\n routes: z.array(z.unknown()).nullable().optional(),\n dateCreated: z.string().nullable().optional(),\n dateUpdated: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type SipEndpoint = z.infer<typeof SipEndpointSchema>;\n","import { z } from 'zod';\nimport { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { SipCredentialSchema } from '../types/sip.js';\nimport type { SipCredential } from '../types/sip.js';\n\n/**\n * SIP 단말(credential) 리소스 — 조회 전용.\n * 생성/수정/삭제는 대시보드 또는 REST API 사용. 본 SDK 는 softphone 라우팅 설정에\n * 필요한 credential id 확인용 list/get 만 제공한다 (password/ha1 미노출).\n */\nexport class SipCredentials extends APIResource {\n async list(\n params: { status?: 'active' | 'disabled'; page?: number; pageSize?: number } = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<SipCredential[]> {\n const query = stripNotGiven({\n status: params.status,\n page: params.page,\n pageSize: params.pageSize,\n });\n const schema = z.object({ data: z.array(SipCredentialSchema) }).passthrough();\n const result = await this._client._get(`${this._basePath}/sip-credentials`, {\n castTo: schema,\n ...options,\n extraQuery: { ...query, ...options.extraQuery },\n });\n return result.data;\n }\n\n async get(\n credentialId: string,\n options: { extraHeaders?: Record<string, string>; timeout?: number } = {},\n ): Promise<SipCredential> {\n return this._client._get(`${this._basePath}/sip-credentials/${credentialId}`, {\n castTo: SipCredentialSchema,\n ...options,\n });\n }\n}\n","import { z } from 'zod';\nimport { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { SipEndpointSchema } from '../types/sip.js';\nimport type { SipEndpoint } from '../types/sip.js';\n\n/**\n * SIP 엔드포인트(외부 PBX 트렁크) 리소스 — 조회 전용.\n * 생성/수정/삭제는 대시보드 또는 REST API 사용. 본 SDK 는 sip 라우팅 설정에\n * 필요한 endpoint id 확인용 list/get 만 제공한다.\n */\nexport class SipEndpoints extends APIResource {\n async list(\n params: { status?: 'active' | 'disabled'; page?: number; pageSize?: number } = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<SipEndpoint[]> {\n const query = stripNotGiven({\n status: params.status,\n page: params.page,\n pageSize: params.pageSize,\n });\n const schema = z.object({ data: z.array(SipEndpointSchema) }).passthrough();\n const result = await this._client._get(`${this._basePath}/sip-endpoints`, {\n castTo: schema,\n ...options,\n extraQuery: { ...query, ...options.extraQuery },\n });\n return result.data;\n }\n\n async get(\n endpointId: string,\n options: { extraHeaders?: Record<string, string>; timeout?: number } = {},\n ): Promise<SipEndpoint> {\n return this._client._get(`${this._basePath}/sip-endpoints/${endpointId}`, {\n castTo: SipEndpointSchema,\n ...options,\n });\n }\n}\n","import { z } from 'zod';\n\nexport const WebhookLogSchema = z\n .object({\n id: z.string(),\n webhookId: z.string(),\n event: z.string(),\n requestUrl: z.string(),\n requestPayload: z.record(z.unknown()),\n responseStatus: z.number().nullable().optional(),\n responseBody: z.string().nullable().optional(),\n responseTimeMs: z.number().nullable().optional(),\n status: z.enum(['pending', 'delivered', 'failed']),\n attempt: z.number(),\n maxAttempts: z.number(),\n createdAt: z.string(),\n completedAt: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type WebhookLog = z.infer<typeof WebhookLogSchema>;\n","import { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport { WebhookLogSchema } from '../types/webhook-log.js';\nimport type { WebhookLog } from '../types/webhook-log.js';\n\nexport class WebhookLogs extends APIResource {\n async list(\n webhookId: string,\n params: { page?: number; pageSize?: number } = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Page<WebhookLog>> {\n const query = stripNotGiven({ page: params.page, pageSize: params.pageSize });\n const path = `${this._basePath}/webhooks/${webhookId}/logs`;\n const schema = PageSchema(WebhookLogSchema);\n const raw = await this._client._get(path, {\n castTo: schema,\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<WebhookLog>(raw.data, raw.meta);\n page._setClient(this._client, path, WebhookLogSchema, query);\n return page;\n }\n}\n","import type { APIClient } from '../base-client.js';\nimport { AssignmentLinks } from './assignment-links.js';\nimport { BlockedRecipients } from './blocked-recipients.js';\nimport { Calls } from './calls.js';\nimport { Kakao } from './kakao.js';\nimport { Messages } from './messages.js';\nimport { Numbers } from './numbers.js';\nimport { Recordings } from './recordings.js';\nimport { WebhookLogs } from './webhook-logs.js';\n\nexport class AccountContext {\n private _client: APIClient;\n private _accountId: string;\n\n constructor(client: APIClient, accountId: string) {\n this._client = client;\n this._accountId = accountId;\n }\n\n get calls(): Calls {\n return new Calls(this._client, this._accountId);\n }\n\n get messages(): Messages {\n return new Messages(this._client, this._accountId);\n }\n\n get numbers(): Numbers {\n return new Numbers(this._client, this._accountId);\n }\n\n get recordings(): Recordings {\n return new Recordings(this._client, this._accountId);\n }\n\n get webhookLogs(): WebhookLogs {\n return new WebhookLogs(this._client, this._accountId);\n }\n\n get assignmentLinks(): AssignmentLinks {\n return new AssignmentLinks(this._client, this._accountId);\n }\n\n get blockedRecipients(): BlockedRecipients {\n return new BlockedRecipients(this._client, this._accountId);\n }\n\n get kakao(): Kakao {\n return new Kakao(this._client, this._accountId);\n }\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\nimport { ClawOpsError } from './error.js';\n\nexport class WebhookVerificationError extends ClawOpsError {\n constructor(message = 'Webhook 서명이 일치하지 않습니다.') {\n super(message);\n this.name = 'WebhookVerificationError';\n }\n}\n\nexport class Webhooks {\n verify(options: {\n url: string;\n params: Record<string, string>;\n signature: string;\n signingKey: string;\n }): boolean {\n const expected = Webhooks._computeSignature(options.url, options.params, options.signingKey);\n const expectedBuf = Buffer.from(expected, 'utf-8');\n const signatureBuf = Buffer.from(options.signature, 'utf-8');\n\n if (expectedBuf.length !== signatureBuf.length || !timingSafeEqual(expectedBuf, signatureBuf)) {\n throw new WebhookVerificationError();\n }\n return true;\n }\n\n static _computeSignature(\n url: string,\n params: Record<string, string>,\n signingKey: string,\n ): string {\n const sortedParams = Object.keys(params)\n .sort()\n .map((k) => `${k}${params[k]}`)\n .join('');\n const dataToSign = url + sortedParams;\n const digest = createHmac('sha256', signingKey).update(dataToSign, 'utf-8').digest();\n return digest.toString('base64');\n }\n}\n","import { APIClient, type APIClientOptions } from './base-client.js';\nimport { DEFAULT_BASE_URL } from './constants.js';\nimport { ClawOpsError } from './error.js';\nimport { AssignmentLinks } from './resources/assignment-links.js';\nimport { BlockedRecipients } from './resources/blocked-recipients.js';\nimport { Calls } from './resources/calls.js';\nimport { Kakao } from './resources/kakao.js';\nimport { Messages } from './resources/messages.js';\nimport { Numbers } from './resources/numbers.js';\nimport { Recordings } from './resources/recordings.js';\nimport { SipCredentials } from './resources/sip-credentials.js';\nimport { SipEndpoints } from './resources/sip-endpoints.js';\nimport { WebhookLogs } from './resources/webhook-logs.js';\nimport { AccountContext } from './resources/accounts.js';\nimport { Webhooks } from './webhooks.js';\n\nexport interface ClawOpsOptions {\n apiKey?: string;\n accountId?: string;\n baseURL?: string;\n timeout?: number;\n maxRetries?: number;\n fetch?: typeof globalThis.fetch;\n defaultHeaders?: Record<string, string>;\n}\n\nexport class ClawOps extends APIClient {\n private _defaultAccountId: string;\n\n constructor(options: ClawOpsOptions = {}) {\n let apiKey = options.apiKey ?? process.env.CLAWOPS_API_KEY;\n if (!apiKey) {\n throw new ClawOpsError('apiKey를 지정하거나 CLAWOPS_API_KEY 환경변수를 설정하세요.');\n }\n\n let accountId = options.accountId ?? process.env.CLAWOPS_ACCOUNT_ID;\n if (!accountId) {\n throw new ClawOpsError('accountId를 지정하거나 CLAWOPS_ACCOUNT_ID 환경변수를 설정하세요.');\n }\n\n const baseURL = options.baseURL ?? process.env.CLAWOPS_BASE_URL ?? DEFAULT_BASE_URL;\n\n super({\n apiKey,\n baseURL,\n timeout: options.timeout,\n maxRetries: options.maxRetries,\n fetch: options.fetch,\n defaultHeaders: options.defaultHeaders,\n });\n\n this._defaultAccountId = accountId;\n }\n\n get calls(): Calls {\n return new Calls(this, this._defaultAccountId);\n }\n\n get messages(): Messages {\n return new Messages(this, this._defaultAccountId);\n }\n\n get numbers(): Numbers {\n return new Numbers(this, this._defaultAccountId);\n }\n\n get sipCredentials(): SipCredentials {\n return new SipCredentials(this, this._defaultAccountId);\n }\n\n get sipEndpoints(): SipEndpoints {\n return new SipEndpoints(this, this._defaultAccountId);\n }\n\n get recordings(): Recordings {\n return new Recordings(this, this._defaultAccountId);\n }\n\n get webhookLogs(): WebhookLogs {\n return new WebhookLogs(this, this._defaultAccountId);\n }\n\n get assignmentLinks(): AssignmentLinks {\n return new AssignmentLinks(this, this._defaultAccountId);\n }\n\n get blockedRecipients(): BlockedRecipients {\n return new BlockedRecipients(this, this._defaultAccountId);\n }\n\n /** 카카오 채널·알림톡 템플릿. 발송은 `messages.create({ kakao: … })` 다. */\n get kakao(): Kakao {\n return new Kakao(this, this._defaultAccountId);\n }\n\n get webhooks(): Webhooks {\n return new Webhooks();\n }\n\n accounts(accountId: string): AccountContext {\n return new AccountContext(this, accountId);\n }\n}\n","import { ClawOps } from './client.js';\nexport default ClawOps;\n"]}
1
+ {"version":3,"sources":["../src/base-client.ts","../src/resource.ts","../src/util.ts","../src/types/shared.ts","../src/pagination.ts","../src/types/assignment-link.ts","../src/resources/assignment-links.ts","../src/types/blocked-recipient.ts","../src/resources/blocked-recipients.ts","../src/types/call.ts","../src/types/transcript.ts","../src/types/summary.ts","../src/resources/calls.ts","../src/types/kakao.ts","../src/resources/kakao.ts","../src/types/message.ts","../src/resources/messages.ts","../src/types/number.ts","../src/resources/numbers.ts","../src/resources/recordings.ts","../src/types/sip.ts","../src/resources/sip-credentials.ts","../src/resources/sip-endpoints.ts","../src/types/webhook-log.ts","../src/resources/webhook-logs.ts","../src/resources/accounts.ts","../src/webhooks.ts","../src/client.ts","../src/client-default.ts"],"names":["ClawOpsError","DEFAULT_BASE_URL","DEFAULT_MAX_RETRIES","DEFAULT_TIMEOUT","VERSION","method","APITimeoutError","APIConnectionError","makeStatusError","APIResponseValidationError","INITIAL_RETRY_DELAY","MAX_RETRY_DELAY","z","timingSafeEqual","createHmac"],"mappings":";;;;;;;;;;;AAiBA,IAAM,eAAA,uBAAsB,GAAA,CAAI,CAAC,aAAa,WAAA,EAAa,SAAA,EAAW,OAAO,CAAC,CAAA;AAE9E,SAAS,gBAAgB,GAAA,EAAqB;AAC5C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,IAAI,GAAG,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIA,8BAAA,CAAa,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAE,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU,OAAO,GAAA;AACzC,EAAA,IAAI,MAAA,CAAO,aAAa,OAAA,IAAW,eAAA,CAAgB,IAAI,MAAA,CAAO,QAAQ,GAAG,OAAO,GAAA;AAChF,EAAA,MAAM,IAAIA,8BAAA;AAAA,IACR,iGAAqC,GAAG,CAAA,2HAAA;AAAA,GAE1C;AACF;AAoBA,SAAS,cAAc,IAAA,EAGrB;AACA,EAAA,IAAI,gBAAgB,QAAA,EAAU,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,aAAa,IAAA,EAAK;AACxE,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,OAAA,EAAS,MAAA,EAAW,aAAa,kBAAA,EAAmB;AACxE,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,UAAU,IAAI,CAAA,EAAG,aAAa,kBAAA,EAAmB;AAC1E;AAEO,IAAM,YAAN,MAAgB;AAAA,EACX,OAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EAEV,YAAY,OAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,MAAA;AACvB,IAAA,IAAA,CAAK,QAAA,GAAW,iBAAiB,OAAA,CAAQ,OAAA,IAAWC,oCAAkB,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA;AACzF,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,UAAA,IAAcC,qCAAA;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,OAAA,IAAWC,iCAAA;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,KAAA,IAAS,UAAA,CAAW,KAAA;AAC1C,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA,CAAQ,cAAA,IAAkB,EAAC;AAAA,EACpD;AAAA,EAEQ,cAAc,KAAA,EAAwD;AAC5E,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,MACrC,cAAA,EAAgB,kBAAA;AAAA,MAChB,MAAA,EAAQ,kBAAA;AAAA,MACR,YAAA,EAAc,iBAAiBC,yBAAO,CAAA,CAAA;AAAA,MACtC,GAAG,IAAA,CAAK;AAAA,KACV;AACA,IAAA,IAAI,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,KAAK,CAAA;AACvC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAgB,KAAA,CACdC,OAAAA,EACA,IAAA,EACA,OAAA,GAOI,EAAC,EACc;AACnB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,YAAY,CAAA;AAIvD,IAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,aAAA,CAAc,QAAQ,IAAI,CAAA;AAC3D,IAAA,IAAI,WAAA,KAAgB,IAAA,EAAM,OAAO,OAAA,CAAQ,cAAc,CAAA;AAAA,SAClD,OAAA,CAAQ,cAAc,CAAA,GAAI,WAAA;AAE/B,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,MAAM,WAAW,EAAE,GAAG,QAAQ,KAAA,EAAO,GAAG,QAAQ,UAAA,EAAW;AAC3D,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC7C,MAAA,IAAI,KAAK,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAI,CAAA,EAAG,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAC1E,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,QAAA;AAE3C,IAAA,IAAI,cAAc,IAAA,CAAK,WAAA;AAEvB,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,UAAU,CAAA;AAEjE,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK;AAAA,UAChC,MAAA,EAAAA,OAAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA,EAAM,OAAA;AAAA,UACN,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,YAAA,CAAa,SAAS,CAAA;AACtB,QAAA,IAAI,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AAC5D,UAAA,IAAI,cAAc,CAAA,EAAG;AACnB,YAAA,WAAA,EAAA;AACA,YAAA,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,YAAY,IAAA,CAAK,WAAA,GAAc,WAAW,CAAC,CAAA;AAClE,YAAA;AAAA,UACF;AACA,UAAA,MAAM,IAAIC,iCAAA,CAAgB,EAAE,MAAA,EAAAD,OAAAA,EAAQ,KAAK,CAAA;AAAA,QAC3C;AACA,QAAA,IAAI,cAAc,CAAA,EAAG;AACnB,UAAA,WAAA,EAAA;AACA,UAAA,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,YAAY,IAAA,CAAK,WAAA,GAAc,WAAW,CAAC,CAAA;AAClE,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAIE,oCAAA,CAAmB,EAAE,MAAA,EAAAF,OAAAA,EAAQ,KAAK,CAAA;AAAA,MAC9C,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,SAAS,CAAA;AAAA,MACxB;AAEA,MAAA,IAAI,QAAA,CAAS,IAAI,OAAO,QAAA;AAExB,MAAA,IAAI,cAAc,CAAA,IAAK,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,MAAM,CAAA,EAAG;AACzD,QAAA,WAAA,EAAA;AACA,QAAA,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,YAAY,IAAA,CAAK,WAAA,GAAc,WAAW,CAAC,CAAA;AAClE,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,MAC7B,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,GAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAMG,iCAAA,CAAgB,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,QAAA,CAAS,SAAS,EAAE,MAAA,EAAAH,OAAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,MAAgB,QAAA,CACdA,OAAAA,EACA,IAAA,EACA,OAAA,GAQI,EAAC,EACc;AACnB,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAA,CAAMA,OAAAA,EAAQ,MAAM,OAAO,CAAA;AACvD,IAAA,IAAI,SAAS,MAAA,KAAW,GAAA,IAAO,CAAC,OAAA,CAAQ,QAAQ,OAAO,IAAA;AAEvD,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,GAAG,IAAI,CAAA,CAAA;AACnC,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAII,4CAAA,CAA2B,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAO,EAAG,EAAE,MAAA,EAAAJ,OAAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACnF;AACA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AAC5C,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,IAAII,4CAAA,CAA2B,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAO,EAAG,EAAE,MAAA,EAAAJ,OAAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA,EAEQ,aAAa,MAAA,EAAyB;AAC5C,IAAA,OAAO,WAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,OAAO,MAAA,IAAU,GAAA;AAAA,EACzE;AAAA,EAEQ,YAAY,YAAA,EAA8B;AAChD,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAIK,qCAAA,GAAsB,CAAA,IAAK,cAAcC,iCAAe,CAAA;AAC/E,IAAA,OAAO,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO,CAAA;AAAA,EAClC;AAAA,EAEQ,OAAO,EAAA,EAA2B;AACxC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,IAAA,CACJ,IAAA,EACA,OAAA,EAOY;AACZ,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAY,OAAO,KAAK,CAAA,EAAG,MAAM,OAAO,CAAA;AAClE,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,CACJ,IAAA,EACA,OAAA,EAQY;AACZ,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAY,MAAA,EAAQ,MAAM,OAAO,CAAA;AAC3D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,CACJ,IAAA,EACA,OAAA,EAOY;AACZ,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAY,KAAA,EAAO,MAAM,OAAO,CAAA;AAC1D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,CACJ,IAAA,EACA,OAAA,EAOY;AACZ,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAY,OAAA,EAAS,MAAM,OAAO,CAAA;AAC5D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,CACJ,IAAA,EACA,OAAA,GAKI,EAAC,EACc;AACnB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAA,CACJ,IAAA,EACA,OAAA,EAOY;AACZ,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAY,QAAA,EAAU,MAAM,OAAO,CAAA;AAC7D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,CACJ,IAAA,EACA,OAAA,GAGI,EAAC,EACU;AACf,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AAAA,EAC7C;AACF;AAEA,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,CAAA;AACT;;;ACzTO,IAAM,cAAN,MAAkB;AAAA,EACb,OAAA;AAAA,EACA,UAAA;AAAA,EAEV,WAAA,CAAY,QAAmB,SAAA,EAAmB;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,EACpB;AAAA,EAEA,IAAc,SAAA,GAAoB;AAChC,IAAA,OAAO,CAAA,aAAA,EAAgB,KAAK,UAAU,CAAA,CAAA;AAAA,EACxC;AACF,CAAA;;;ACEO,SAAS,cAAc,IAAA,EAAwD;AACpF,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzC,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;ACtBO,IAAM,oBAAA,GAAuBC,MACjC,MAAA,CAAO;AAAA,EACN,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,QAAA,EAAUA,MAAE,MAAA;AACd,CAAC,EACA,WAAA,EAAY;;;ACJR,SAAS,WAAc,UAAA,EAA0B;AACtD,EAAA,OAAOA,MACJ,MAAA,CAAO;AAAA,IACN,IAAA,EAAMA,KAAAA,CAAE,KAAA,CAAM,UAAU,CAAA;AAAA,IACxB,IAAA,EAAM;AAAA,GACP,EACA,WAAA,EAAY;AACjB;AAEO,IAAM,IAAA,GAAN,MAAM,KAAA,CAAQ;AAAA,EACnB,IAAA;AAAA,EACA,IAAA;AAAA,EAEQ,OAAA,GAA4B,IAAA;AAAA,EAC5B,KAAA,GAAQ,EAAA;AAAA,EACR,WAAA,GAAmC,IAAA;AAAA,EACnC,SAAkC,EAAC;AAAA,EAE3C,WAAA,CAAY,MAAW,IAAA,EAAyD;AAC9E,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA,EAGA,UAAA,CACE,MAAA,EACA,IAAA,EACA,UAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAAA,EAChB;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,IAAA,GAAO,CAAA,IAAK,KAAK,IAAA,CAAK,QAAA,GAAW,KAAK,IAAA,CAAK,KAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,QAAA,GAA6B;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,KAAK,WAAA,EAAa;AACtC,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,MAAM,IAAI,MAAM,eAAe,CAAA;AAAA,IACjC;AACA,IAAA,MAAM,SAAA,GAAY,EAAE,GAAG,IAAA,CAAK,QAAQ,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,CAAA,EAAE;AAC7D,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,WAAW,CAAA;AAE1C,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,KAAA,EAAO;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,MAAM,OAAO,IAAI,KAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,OAAA,EAAS,IAAA,CAAK,OAAO,IAAA,CAAK,WAAA,EAAa,KAAK,MAAM,CAAA;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,CAAC,MAAA,CAAO,QAAQ,CAAA,GAAiB;AAC/B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAE;AAAA,EACpC;AAAA,EAEA,OAAO,cAAA,GAAoC;AACzC,IAAA,IAAI,IAAA,GAAgB,IAAA;AACpB,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,IAAA,EAAM;AAC5B,QAAA,MAAM,IAAA;AAAA,MACR;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACzB,MAAA,IAAA,GAAO,MAAM,KAAK,QAAA,EAAS;AAAA,IAC7B;AAAA,EACF;AACF;AC5EO,IAAM,8BAAA,GAAiCA,MAC3C,MAAA,CAAO;AAAA,EACN,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,MAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACrC,UAAA,EAAYA,MAAE,MAAA,EAAO;AAAA,EACrB,YAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AACpC,CAAC,EACA,WAAA,EAAY;AAER,IAAM,oBAAA,GAAuBA,MACjC,MAAA,CAAO;AAAA,EACN,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,GAAA,EAAKA,MAAE,MAAA,EAAO;AAAA,EACd,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,WAAW,UAAA,EAAY,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,EAC5D,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,YAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC3C,YAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC3C,aAAA,EAAeA,KAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,KAAK,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,EAC3D,MAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACrC,UAAA,EAAY,8BAAA,CAA+B,QAAA,EAAS,CAAE,QAAA;AACxD,CAAC,EACA,WAAA,EAAY;AAER,IAAM,kCAAA,GAAqCA,MAC/C,MAAA,CAAO;AAAA,EACN,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,GAAA,EAAKA,MAAE,MAAA,EAAO;AAAA,EACd,SAAA,EAAWA,MAAE,MAAA;AACf,CAAC,EACA,WAAA,EAAY;;;ACPR,IAAM,eAAA,GAAN,cAA8B,WAAA,CAAY;AAAA,EAC/C,MAAM,MAAA,CACJ,MAAA,GAII,EAAC,EACL,OAAA,GAA0B,EAAC,EACY;AACvC,IAAA,MAAM,OAAO,aAAA,CAAc;AAAA,MACzB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,MAAM,MAAA,CAAO;AAAA,KACd,CAAA;AACD,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,iBAAA,CAAA,EAAqB;AAAA,MAC9D,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,IAAA,GAAO,MAAA;AAAA,MACxC,MAAA,EAAQ,kCAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,IAAA,CACJ,MAAA,GAII,EAAC,EACL,OAAA,GAA0B,EAAC,EACI;AAC/B,IAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,MAC1B,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,iBAAA,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,WAAW,oBAAoB,CAAA;AAC9C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAA,EAAM;AAAA,MACxC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAA,GAAQ,MAAA;AAAA,MAC3C,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,MAAM,OAAO,IAAI,IAAA,CAAqB,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AACxD,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,sBAAsB,KAAK,CAAA;AAC/D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CACJ,MAAA,EACA,OAAA,GAA0B,EAAC,EACF;AACzB,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,EAAG,KAAK,SAAS,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAA,EAAI;AAAA,MACvE,MAAA,EAAQ,oBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,GAAuE,EAAC,EACzD;AACf,IAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,MACjB,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAA;AAAA,MAC5C;AAAA,KACF;AAAA,EACF;AACF;ACxFO,IAAM,sBAAA,GAAyBA,MACnC,MAAA,CAAO;AAAA,EACN,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQb,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQpB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA;AAAA,EAElB,MAAA,EAAQA,MAAE,OAAA,EAAQ;AAAA,EAClB,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,WAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC1C,MAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACrC,WAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC1C,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,aAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC5C,iBAAiBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAChD,aAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC5C,eAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AACvC,CAAC,EACA,WAAA,EAAY;;;ACFR,IAAM,iBAAA,GAAN,cAAgC,WAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjD,MAAM,MAAA,CACJ,MAAA,EAOA,OAAA,GAA0B,EAAC,EACA;AAC3B,IAAA,MAAM,OAAO,aAAA,CAAc;AAAA,MACzB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,MAAM,MAAA,CAAO;AAAA,KACd,CAAA;AACD,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,mBAAA,CAAA,EAAuB;AAAA,MAChE,IAAA;AAAA,MACA,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,CACJ,MAAA,GAMI,EAAC,EACL,OAAA,GAA0B,EAAC,EACM;AACjC,IAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,MAC1B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,mBAAA,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAA,EAAM;AAAA,MACxC,MAAA,EAAQ,WAAW,sBAAsB,CAAA;AAAA,MACzC,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAA,GAAQ,MAAA;AAAA,MAC3C,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,MAAM,OAAO,IAAI,IAAA,CAAuB,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AAC1D,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,wBAAwB,KAAK,CAAA;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,QAAA,CAAS,OAAA,EAAiB,OAAA,GAA0B,EAAC,EAA8B;AACvF,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,EAAG,KAAK,SAAS,CAAA,oBAAA,EAAuB,OAAO,CAAA,CAAA,EAAI;AAAA,MAC1E,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OACJ,OAAA,EACA,MAAA,GAAmC,EAAC,EACpC,OAAA,GAA0B,EAAC,EACA;AAC3B,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,CAAO,CAAA,EAAG,KAAK,SAAS,CAAA,oBAAA,EAAuB,OAAO,CAAA,CAAA,EAAI;AAAA,MAC5E,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,CAAO,QAAQ,IAAA,EAAK;AAAA,MAClC,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QACJ,OAAA,EACA,MAAA,GAA4B,EAAC,EAC7B,OAAA,GAA0B,EAAC,EACA;AAC3B,IAAA,MAAM,OAAO,aAAA,CAAc,EAAE,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AAChD,IAAA,OAAO,IAAA,CAAK,QAAQ,mBAAA,CAAoB,CAAA,EAAG,KAAK,SAAS,CAAA,oBAAA,EAAuB,OAAO,CAAA,CAAA,EAAI;AAAA,MACzF,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,IAAA,GAAO,MAAA;AAAA,MACxC,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;AC/IO,IAAM,UAAA,GAAaA,MACvB,MAAA,CAAO;AAAA,EACN,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,MAAA,EAAQA,MAAE,IAAA,CAAK;AAAA,IACb,QAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AAAA,EACD,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,WAAWA,KAAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,SAAS,CAAC,CAAA;AAAA,EACzC,UAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACzC,cAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA;AAAA,EAE7C,UAAA,EAAYA,KAAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,SAAA,EAAW,SAAS,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAexE,aAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA;AAAA,EAE5C,iBAAiBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhD,iBAAiBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhD,YAAA,EAAcA,KAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAC,CAAA,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC3F,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,EACtB,aAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AACrC,CAAC,EACA,WAAA,EAAY;AAIR,IAAM,yBAAA,GAA4BA,MACtC,MAAA,CAAO;AAAA,EACN,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,MAAA,EAAQA,MAAE,MAAA;AACZ,CAAC,EACA,WAAA,EAAY;ACnDR,IAAM,uBAAA,GAA0BA,MACpC,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKN,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,GAAA,EAAKA,MAAE,MAAA,EAAO;AAAA,EACd,IAAA,EAAMA,MAAE,MAAA;AACV,CAAC,EACA,WAAA,EAAY;AAWR,IAAM,sBAAA,GAAyBA,MACnC,MAAA,CAAO;AAAA,EACN,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,aAAa,SAAA,EAAW,QAAA,EAAU,eAAe,CAAC,CAAA;AAAA,EAClE,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,QAAA,EAAUA,KAAAA,CAAE,KAAA,CAAM,uBAAuB,EAAE,QAAA,EAAS;AAAA,EACpD,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/B,OAAQA,KAAAA,CAAE,MAAA,EAAO,CAAiC,QAAA,GAAW,QAAA,EAAS;AAAA,EACtE,OAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AAC/B,CAAC,EACA,WAAA,EAAY;AAKR,IAAM,+BAAA,GAAkCA,MAC5C,MAAA,CAAO;AAAA,EACN,MAAA,EAAQA,KAAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EAC3B,MAAA,EAAQA,MAAE,MAAA;AACZ,CAAC,EACA,WAAA,EAAY;AC3DR,IAAM,mBAAA,GAAsBA,MAChC,MAAA,CAAO;AAAA,EACN,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,aAAa,SAAA,EAAW,QAAA,EAAU,eAAe,CAAC,CAAA;AAAA,EAClE,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,UAAA,EAAYA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,EAAO,EAAGA,KAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,EAClE,UAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACzC,OAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACtC,eAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC9C,eAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC9C,cAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC7C,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACxB,CAAC,EACA,WAAA,EAAY;;;ACIf,SAAS,gBACP,GAAA,EACqC;AACrC,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,MAAM,IAAA,GAAgC,EAAE,WAAA,EAAa,GAAA,CAAI,WAAA,EAAY;AACrE,EAAA,IAAI,GAAA,CAAI,SAAA,KAAc,MAAA,EAAW,IAAA,CAAK,YAAY,GAAA,CAAI,SAAA;AACtD,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,KAAA,GAAN,cAAoB,WAAA,CAAY;AAAA,EACrC,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,GAII,EAAC,EACU;AACf,IAAA,MAAM,OAAO,aAAA,CAAc;AAAA,MACzB,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,WAAA,EAAa,eAAA,CAAgB,MAAA,CAAO,WAAW,CAAA;AAAA,MAC/C,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,qBAAqB,MAAA,CAAO,mBAAA;AAAA,MAC5B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,kBAAkB,MAAA,CAAO;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,MAAA,CAAA,EAAU;AAAA,MACnD,IAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,IAAA,CACJ,MAAA,GAAyB,EAAC,EAC1B,OAAA,GAII,EAAC,EACgB;AACrB,IAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,MAC1B,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,MAAA,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,WAAW,UAAU,CAAA;AACpC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAA,EAAM;AAAA,MACxC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAA,GAAQ,MAAA;AAAA,MAC3C,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,MAAM,OAAO,IAAI,IAAA,CAAW,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,YAAY,KAAK,CAAA;AACrD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,GAAA,CACJ,MAAA,EACA,OAAA,GAII,EAAC,EACU;AACf,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,EAAG,KAAK,SAAS,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI;AAAA,MAC5D,MAAA,EAAQ,UAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OACJ,MAAA,EACA,MAAA,GAAmC,EAAC,EACpC,OAAA,GAII,EAAC,EACyB;AAC9B,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,SAAS,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI;AAAA,MAC7D,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAA,CAAO,UAAU,WAAA,EAAY;AAAA,MAC7C,MAAA,EAAQ,yBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAA,CACJ,MAAA,EACA,OAAA,GAII,EAAC,EACsB;AAC3B,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,EAAG,KAAK,SAAS,CAAA,OAAA,EAAU,MAAM,CAAA,WAAA,CAAA,EAAe;AAAA,MACvE,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,iBAAA,CACJ,MAAA,EACA,OAAA,GAII,EAAC,EAC+B;AACpC,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,SAAS,CAAA,OAAA,EAAU,MAAM,CAAA,WAAA,CAAA,EAAe;AAAA,MACxE,MAAA,EAAQ,+BAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UAAA,CACJ,MAAA,EACA,OAAA,GAII,EAAC,EACmB;AACxB,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,EAAG,KAAK,SAAS,CAAA,OAAA,EAAU,MAAM,CAAA,QAAA,CAAA,EAAY;AAAA,MACpE,MAAA,EAAQ,mBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;AC7KO,IAAM,kBAAA,GAAqBA,MAC/B,MAAA,CAAO;AAAA;AAAA,EAEN,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEb,QAAA,EAAUA,MAAE,MAAA,EAAO;AAAA,EACnB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,YAAA,EAAcA,MAAE,MAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUvB,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEjB,oBAAoBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACnD,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEtB,UAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACzC,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,MAAE,MAAA;AACf,CAAC,EACA,WAAA,EAAY;AAUR,IAAM,mBAAA,GAAsBA,MAChC,MAAA,CAAO;AAAA;AAAA,EAEN,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEb,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEf,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlB,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEjB,OAAA,EAASA,MAAE,OAAA,EAAQ;AAAA;AAAA,EAEnB,QAAA,EAAUA,MAAE,OAAA,EAAQ;AAAA;AAAA,EAEpB,UAAA,EAAYA,MAAE,MAAA,EAAO;AAAA,EACrB,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,EACtB,aAAA,EAAeA,MAAE,MAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxB,SAAA,EAAWA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,QAAQ,CAAA;AAAA,EAC7B,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,MAAE,MAAA;AACf,CAAC,EACA,WAAA,EAAY;AA2BR,IAAM,wBAAA,GAA2BA,MACrC,MAAA,CAAO;AAAA;AAAA,EAEN,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEb,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,cAAA,EAAgBA,MAAE,MAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzB,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE7B,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE5B,SAAA,EAAWA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,QAAQ,CAAA;AAAA,EAC7B,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,MAAE,MAAA;AACf,CAAC,EACA,WAAA,EAAY;AAUR,IAAM,qBAAA,GAAwBA,MAClC,MAAA,CAAO;AAAA,EACN,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEb,UAAA,EAAYA,MAAE,MAAA,EAAO;AAAA;AAAA,EAErB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEf,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,SAAA,EAAWA,MAAE,MAAA;AACf,CAAC,EACA,WAAA,EAAY;AAKR,IAAM,0BAAA,GAA6BA,MACvC,MAAA,CAAO;AAAA;AAAA,EAEN,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,IAAA,EAAMA,MAAE,MAAA;AACV,CAAC,EACA,WAAA,EAAY;AAIR,IAAM,8BAAA,GAAiCA,MAC3C,MAAA,CAAO;AAAA,EACN,IAAA,EAAMA,KAAAA,CAAE,KAAA,CAAM,0BAA0B,CAAA;AAAA,EACxC,IAAA,EAAMA,MACH,MAAA,CAAO;AAAA;AAAA,IAEN,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA;AAAA,IAEpB,MAAA,EAAQA,MAAE,OAAA;AAAQ,GACnB,EACA,WAAA;AACL,CAAC,EACA,WAAA,EAAY;AAUR,IAAM,uBAAA,GAA0BA,MACpC,MAAA,CAAO;AAAA,EACN,SAAA,EAAWA,MAAE,OAAA,EAAQ;AAAA;AAAA,EAErB,QAAA,EAAUA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEnB,iBAAA,EAAmBA,MAAE,MAAA,EAAO;AAAA;AAAA,EAE5B,iBAAA,EAAmBA,MAAE,MAAA;AACvB,CAAC,EACA,WAAA,EAAY;;;AC1JR,IAAM,aAAA,GAAN,cAA4B,WAAA,CAAY;AAAA,EAC7C,IAAY,KAAA,GAAgB;AAC1B,IAAA,OAAO,CAAA,EAAG,KAAK,SAAS,CAAA,eAAA,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,IAAA,CACJ,MAAA,GAAiC,EAAC,EAClC,OAAA,GAA0B,EAAC,EACE;AAC7B,IAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,MAC1B,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAA,EAAM;AAAA,MACxC,MAAA,EAAQ,WAAW,kBAAkB,CAAA;AAAA,MACrC,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAA,GAAQ,MAAA;AAAA,MAC3C,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,MAAM,OAAO,IAAI,IAAA,CAAmB,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AACtD,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,oBAAoB,KAAK,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QAAA,CAAS,SAAA,EAAmB,OAAA,GAA0B,EAAC,EAA0B;AACrF,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,EAAG,KAAK,KAAK,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI;AAAA,MACrD,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,MAAA,EACA,OAAA,GAA0B,EAAC,EACC;AAC5B,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,MAAA,CAAA,EAAU;AAAA,MAC/C,MAAM,EAAE,QAAA,EAAU,OAAO,QAAA,EAAU,WAAA,EAAa,OAAO,WAAA,EAAY;AAAA,MACnE,MAAA,EAAQ,uBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,OAAA,CACJ,MAAA,EACA,OAAA,GAA0B,EAAC,EACJ;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO;AAAA,MACpC,IAAA,EAAM;AAAA,QACJ,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,OAAO,MAAA,CAAO;AAAA,OAChB;AAAA,MACA,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,UAAA,CAAW,SAAA,EAAmB,OAAA,GAA0B,EAAC,EAA0B;AACvF,IAAA,OAAO,IAAA,CAAK,QAAQ,mBAAA,CAAoB,CAAA,EAAG,KAAK,KAAK,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI;AAAA,MACpE,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ9C,MAAM,IAAA,CACJ,MAAA,EACA,OAAA,GAA0B,EAAC,EACG;AAC9B,IAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,MAC1B,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,gBAAA,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAA,EAAM;AAAA,MACxC,MAAA,EAAQ,WAAW,mBAAmB,CAAA;AAAA,MACtC,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAA,GAAQ,MAAA;AAAA,MAC3C,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,MAAM,OAAO,IAAI,IAAA,CAAoB,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AACvD,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,qBAAqB,KAAK,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,WAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnD,MAAM,IAAA,CACJ,MAAA,EACA,OAAA,GAA0B,EAAC,EACQ;AACnC,IAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,MAC1B,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,sBAAA,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAA,EAAM;AAAA,MACxC,MAAA,EAAQ,WAAW,wBAAwB,CAAA;AAAA,MAC3C,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAA,GAAQ,MAAA;AAAA,MAC3C,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,MAAM,OAAO,IAAI,IAAA,CAAyB,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AAC5D,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,0BAA0B,KAAK,CAAA;AACnE,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAWO,IAAM,gBAAA,GAAN,cAA+B,WAAA,CAAY;AAAA,EAChD,IAAY,KAAA,GAAgB;AAC1B,IAAA,OAAO,CAAA,EAAG,KAAK,SAAS,CAAA,mBAAA,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BA,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,GAA0B,EAAC,EACF;AACzB,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAI1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,YAAgB,IAAA,GAAO,MAAA,CAAO,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,MAAA,CAAO,IAAI,CAAC,CAAA;AAC/E,IAAA,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,IAAA,EAAM,MAAA,CAAO,QAAQ,CAAA;AAC1C,IAAA,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,UAAU,CAAA;AAC3C,IAAA,IAAI,OAAO,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,OAAO,IAAI,CAAA;AAEhD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO;AAAA,MACpC,IAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAQA,KAAAA,CAAE,MAAA,CAAO,EAAE,EAAA,EAAIA,MAAE,MAAA,EAAO,EAAG,CAAA,CAAE,WAAA,EAAY;AAAA,MACjD,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAA,CACJ,MAAA,GAA+C,EAAC,EAChD,OAAA,GAA0B,EAAC,EACK;AAChC,IAAA,MAAM,KAAA,GAAQ,cAAc,EAAE,IAAA,EAAM,OAAO,IAAA,EAAM,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,CAAA;AAC5E,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAA,EAAM;AAAA,MACxC,MAAA,EAAQ,WAAW,qBAAqB,CAAA;AAAA,MACxC,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAA,GAAQ,MAAA;AAAA,MAC3C,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,MAAM,OAAO,IAAI,IAAA,CAAsB,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AACzD,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,uBAAuB,KAAK,CAAA;AAChE,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAQO,IAAM,KAAA,GAAN,cAAoB,WAAA,CAAY;AAAA,EACrC,IAAI,QAAA,GAA0B;AAC5B,IAAA,OAAO,IAAI,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EACxD;AAAA,EAEA,IAAI,SAAA,GAA4B;AAC9B,IAAA,OAAO,IAAI,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EACzD;AAAA;AAAA,EAGA,IAAI,cAAA,GAAsC;AACxC,IAAA,OAAO,IAAI,mBAAA,CAAoB,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EAC9D;AAAA;AAAA,EAGA,IAAI,WAAA,GAAgC;AAClC,IAAA,OAAO,IAAI,gBAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,iBAAA,CAAkB,OAAA,GAA0B,EAAC,EAAsC;AACvF,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,yBAAA,CAAA,EAA6B;AAAA,MACrE,MAAA,EAAQ,8BAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;ACnTO,IAAM,aAAA,GAAgBA,MAC1B,MAAA,CAAO;AAAA,EACN,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,MAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACrC,SAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACxC,QAAA,EAAUA,MAAE,MAAA,EAAO;AAAA,EACnB,QAAA,EAAUA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,QAAQ,CAAA;AAAA,EAC5B,WAAWA,KAAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,SAAS,CAAC,CAAA;AAAA,EACzC,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,EACtB,aAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AACrC,CAAC,EACA,WAAA,EAAY;;;ACxBf,IAAM,SAAA,GAAY,CAAC,CAAA,KACjB,CAAA,IACA,aAAA,CAAc;AAAA,EACZ,WAAW,CAAA,CAAE,SAAA;AAAA,EACb,YAAY,CAAA,CAAE,UAAA;AAAA,EACd,WAAW,CAAA,CAAE,SAAA;AAAA,EACb,MAAM,CAAA,CAAE;AACV,CAAC,CAAA;AAEI,IAAM,QAAA,GAAN,cAAuB,WAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BxC,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,GAII,EAAC,EACa;AAClB,IAAA,MAAM,OAAO,aAAA,CAAc;AAAA,MACzB,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,gBAAgB,MAAA,CAAO,cAAA;AAAA;AAAA,MAEvB,KAAA,EAAO,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AAAA,MAC7B,KAAA,EAAO,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AAAA,MAC7B,QAAA,EACE,MAAA,CAAO,QAAA,IACP,aAAA,CAAc;AAAA,QACZ,IAAA,EAAM,OAAO,QAAA,CAAS,IAAA;AAAA,QACtB,OAAA,EAAS,OAAO,QAAA,CAAS,OAAA;AAAA,QACzB,IAAA,EAAM,OAAO,QAAA,CAAS,IAAA;AAAA,QACtB,QAAA,EAAU,OAAO,QAAA,CAAS;AAAA,OAC3B;AAAA,KACJ,CAAA;AACD,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,SAAA,CAAA,EAAa;AAAA,MACtD,IAAA;AAAA,MACA,MAAA,EAAQ,aAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,IAAA,CACJ,MAAA,GAA4B,EAAC,EAC7B,OAAA,GAII,EAAC,EACmB;AACxB,IAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,MAC1B,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,SAAA,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,WAAW,aAAa,CAAA;AACvC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAA,EAAM;AAAA,MACxC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAA,GAAQ,MAAA;AAAA,MAC3C,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,MAAM,OAAO,IAAI,IAAA,CAAc,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,eAAe,KAAK,CAAA;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,GAAA,CACJ,SAAA,EACA,OAAA,GAII,EAAC,EACa;AAClB,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,EAAG,KAAK,SAAS,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI;AAAA,MAClE,MAAA,EAAQ,aAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;ACnHO,IAAM,iBAAA,GAAoBA,MAC9B,MAAA,CAAO;AAAA,EACN,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,YAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC3C,QAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA,EAIvC,aAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC5C,SAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACxC,YAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC3C,WAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC1C,eAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC9C,iBAAiBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAChD,YAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC3C,eAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC9C,cAAA,EAAgBA,MAAE,MAAA,CAAOA,KAAAA,CAAE,QAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,EACzD,gBAAgBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC/C,gBAAgBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC/C,sBAAsBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACrD,cAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC7C,WAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AACnC,CAAC,EACA,WAAA,EAAY;;;ACjCR,IAAM,OAAA,GAAN,cAAsB,WAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvC,MAAM,MAAA,CAAO,MAAA,GAA6B,EAAC,EAAG,OAAA,GAA0B,EAAC,EAAyB;AAChG,IAAA,MAAM,OAAO,aAAA,CAAc;AAAA,MACzB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,sBAAsB,MAAA,CAAO;AAAA,KAC9B,CAAA;AACD,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,QAAA,CAAA,EAAY;AAAA,MACrD,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,IAAA,GAAO,MAAA;AAAA,MACxC,MAAA,EAAQ,iBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,CAAK,OAAA,GAA0B,EAAC,EAA8B;AAClE,IAAA,MAAM,MAAA,GAASA,KAAAA,CAAE,MAAA,CAAO,EAAE,IAAA,EAAMA,KAAAA,CAAE,KAAA,CAAM,iBAAiB,CAAA,EAAG,CAAA,CAAE,WAAA,EAAY;AAC1E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,QAAA,CAAA,EAAY;AAAA,MAClE,MAAA,EAAQ,MAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,OACJ,MAAA,EACA,MAAA,GAA6B,EAAC,EAC9B,OAAA,GAA0B,EAAC,EACI;AAC/B,IAAA,MAAM,OAAO,aAAA,CAAc;AAAA,MACzB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,sBAAsB,MAAA,CAAO,oBAAA;AAAA,MAC7B,cAAc,MAAA,CAAO;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,EAAG,KAAK,SAAS,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA,EAAI;AAAA,MAC9D,IAAA;AAAA,MACA,MAAA,EAAQ,iBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,GAAuE,EAAC,EACzD;AACf,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,CAAA,EAAG,KAAK,SAAS,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA,EAC3E;AACF;;;ACnFA,SAAS,cAAc,WAAA,EAA2C;AAChE,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,uCAAuC,CAAA;AACtE,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAI;AACF,MAAA,OAAO,kBAAA,CAAmB,IAAA,CAAK,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,IAC1C,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,KAAA,CAAM,qBAAqB,CAAA;AACtD,EAAA,IAAI,MAAA,EAAQ,OAAO,MAAA,CAAO,CAAC,EAAE,IAAA,EAAK;AAClC,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,mBAAmB,CAAA;AAClD,EAAA,OAAO,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,CAAE,MAAK,GAAI,IAAA;AACjC;AAEO,IAAM,UAAA,GAAN,cAAyB,WAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS1C,MAAM,QAAA,CACJ,MAAA,EACA,OAAA,GAII,EAAC,EACuB;AAC5B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA;AAAA,MAClC,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,YAAA,EAAe,MAAM,CAAA,CAAA;AAAA,MACtC;AAAA,KACF;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,WAAA,EAAY;AACxC,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,WAAA,EAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,WAAA;AAAA,MACrD,UAAU,aAAA,CAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAC;AAAA,KACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,GAGI,EAAC,EACU;AACf,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,CAAA,EAAG,KAAK,SAAS,CAAA,YAAA,EAAe,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA,EAC9E;AACF;AChEO,IAAM,mBAAA,GAAsBA,MAChC,MAAA,CAAO;AAAA,EACN,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,EACb,WAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC1C,MAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACrC,UAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACzC,OAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACtC,SAASA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACzC,MAAA,EAAQA,KAAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,UAAA,EAAY,SAAS,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,EACtE,SAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACxC,cAAA,EAAgBA,MAAE,KAAA,CAAMA,KAAAA,CAAE,QAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,EACxD,YAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC3C,aAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC5C,aAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AACrC,CAAC,EACA,WAAA,EAAY;AAQR,IAAM,iBAAA,GAAoBA,MAC9B,MAAA,CAAO;AAAA,EACN,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,EACb,WAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC1C,MAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACrC,eAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC9C,MAAA,EAAQA,KAAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,EAC3D,MAAA,EAAQA,MAAE,KAAA,CAAMA,KAAAA,CAAE,SAAS,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,EACjD,aAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC5C,aAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AACrC,CAAC,EACA,WAAA,EAAY;;;AC9BR,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA,EAC9C,MAAM,IAAA,CACJ,MAAA,GAA+E,EAAC,EAChF,OAAA,GAII,EAAC,EACqB;AAC1B,IAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,MAC1B,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,MAAA,GAASA,KAAAA,CAAE,MAAA,CAAO,EAAE,IAAA,EAAMA,KAAAA,CAAE,KAAA,CAAM,mBAAmB,CAAA,EAAG,CAAA,CAAE,WAAA,EAAY;AAC5E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,gBAAA,CAAA,EAAoB;AAAA,MAC1E,MAAA,EAAQ,MAAA;AAAA,MACR,GAAG,OAAA;AAAA,MACH,YAAY,EAAE,GAAG,KAAA,EAAO,GAAG,QAAQ,UAAA;AAAW,KAC/C,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,GAAA,CACJ,YAAA,EACA,OAAA,GAAuE,EAAC,EAChD;AACxB,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,EAAG,KAAK,SAAS,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAA,EAAI;AAAA,MAC5E,MAAA,EAAQ,mBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;AChCO,IAAM,YAAA,GAAN,cAA2B,WAAA,CAAY;AAAA,EAC5C,MAAM,IAAA,CACJ,MAAA,GAA+E,EAAC,EAChF,OAAA,GAII,EAAC,EACmB;AACxB,IAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,MAC1B,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,MAAA,GAASA,KAAAA,CAAE,MAAA,CAAO,EAAE,IAAA,EAAMA,KAAAA,CAAE,KAAA,CAAM,iBAAiB,CAAA,EAAG,CAAA,CAAE,WAAA,EAAY;AAC1E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,cAAA,CAAA,EAAkB;AAAA,MACxE,MAAA,EAAQ,MAAA;AAAA,MACR,GAAG,OAAA;AAAA,MACH,YAAY,EAAE,GAAG,KAAA,EAAO,GAAG,QAAQ,UAAA;AAAW,KAC/C,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,GAAA,CACJ,UAAA,EACA,OAAA,GAAuE,EAAC,EAClD;AACtB,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,EAAG,KAAK,SAAS,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,EAAI;AAAA,MACxE,MAAA,EAAQ,iBAAA;AAAA,MACR,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;ACzCO,IAAM,gBAAA,GAAmBA,MAC7B,MAAA,CAAO;AAAA,EACN,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,EACb,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,UAAA,EAAYA,MAAE,MAAA,EAAO;AAAA,EACrB,cAAA,EAAgBA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,SAAS,CAAA;AAAA,EACpC,gBAAgBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC/C,cAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC7C,gBAAgBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC/C,QAAQA,KAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,WAAA,EAAa,QAAQ,CAAC,CAAA;AAAA,EACjD,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,EACtB,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,aAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AACrC,CAAC,EACA,WAAA,EAAY;;;ACZR,IAAM,WAAA,GAAN,cAA0B,WAAA,CAAY;AAAA,EAC3C,MAAM,KACJ,SAAA,EACA,MAAA,GAA+C,EAAC,EAChD,OAAA,GAII,EAAC,EACsB;AAC3B,IAAA,MAAM,KAAA,GAAQ,cAAc,EAAE,IAAA,EAAM,OAAO,IAAA,EAAM,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,CAAA;AAC5E,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAS,aAAa,SAAS,CAAA,KAAA,CAAA;AACpD,IAAA,MAAM,MAAA,GAAS,WAAW,gBAAgB,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAA,EAAM;AAAA,MACxC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAA,GAAQ,MAAA;AAAA,MAC3C,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,MAAM,OAAO,IAAI,IAAA,CAAiB,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,kBAAkB,KAAK,CAAA;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AClBO,IAAM,iBAAN,MAAqB;AAAA,EAClB,OAAA;AAAA,EACA,UAAA;AAAA,EAER,WAAA,CAAY,QAAmB,SAAA,EAAmB;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,EACpB;AAAA,EAEA,IAAI,KAAA,GAAe;AACjB,IAAA,OAAO,IAAI,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EAChD;AAAA,EAEA,IAAI,QAAA,GAAqB;AACvB,IAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EACnD;AAAA,EAEA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EAClD;AAAA,EAEA,IAAI,UAAA,GAAyB;AAC3B,IAAA,OAAO,IAAI,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EACrD;AAAA,EAEA,IAAI,WAAA,GAA2B;AAC7B,IAAA,OAAO,IAAI,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EACtD;AAAA,EAEA,IAAI,eAAA,GAAmC;AACrC,IAAA,OAAO,IAAI,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EAC1D;AAAA,EAEA,IAAI,iBAAA,GAAuC;AACzC,IAAA,OAAO,IAAI,iBAAA,CAAkB,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EAC5D;AAAA,EAEA,IAAI,KAAA,GAAe;AACjB,IAAA,OAAO,IAAI,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,EAChD;AACF;AC/CO,IAAM,wBAAA,GAAN,cAAuCZ,8BAAA,CAAa;AAAA,EACzD,WAAA,CAAY,UAAU,+EAAA,EAA0B;AAC9C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AAAA,EACd;AACF;AAEO,IAAM,QAAA,GAAN,MAAM,SAAA,CAAS;AAAA,EACpB,OAAO,OAAA,EAKK;AACV,IAAA,MAAM,QAAA,GAAW,UAAS,iBAAA,CAAkB,OAAA,CAAQ,KAAK,OAAA,CAAQ,MAAA,EAAQ,QAAQ,UAAU,CAAA;AAC3F,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA;AACjD,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,WAAW,OAAO,CAAA;AAE3D,IAAA,IAAI,WAAA,CAAY,WAAW,YAAA,CAAa,MAAA,IAAU,CAACa,sBAAA,CAAgB,WAAA,EAAa,YAAY,CAAA,EAAG;AAC7F,MAAA,MAAM,IAAI,wBAAA,EAAyB;AAAA,IACrC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,iBAAA,CACL,GAAA,EACA,MAAA,EACA,UAAA,EACQ;AACR,IAAA,MAAM,eAAe,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CACpC,IAAA,GACA,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAC,GAAG,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA,CAC7B,KAAK,EAAE,CAAA;AACV,IAAA,MAAM,aAAa,GAAA,GAAM,YAAA;AACzB,IAAA,MAAM,MAAA,GAASC,kBAAW,QAAA,EAAU,UAAU,EAAE,MAAA,CAAO,UAAA,EAAY,OAAO,CAAA,CAAE,MAAA,EAAO;AACnF,IAAA,OAAO,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,EACjC;AACF;;;ACdO,IAAM,OAAA,GAAN,cAAsB,SAAA,CAAU;AAAA,EAC7B,iBAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAA0B,EAAC,EAAG;AACxC,IAAA,IAAI,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,eAAA;AAC3C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAId,+BAAa,4HAA4C,CAAA;AAAA,IACrE;AAEA,IAAA,IAAI,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,GAAA,CAAI,kBAAA;AACjD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAIA,+BAAa,kIAAkD,CAAA;AAAA,IAC3E;AAEA,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,IAAI,gBAAA,IAAoBC,kCAAA;AAEnE,IAAA,KAAA,CAAM;AAAA,MACJ,MAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,gBAAgB,OAAA,CAAQ;AAAA,KACzB,CAAA;AAED,IAAA,IAAA,CAAK,iBAAA,GAAoB,SAAA;AAAA,EAC3B;AAAA,EAEA,IAAI,KAAA,GAAe;AACjB,IAAA,OAAO,IAAI,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC/C;AAAA,EAEA,IAAI,QAAA,GAAqB;AACvB,IAAA,OAAO,IAAI,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAClD;AAAA,EAEA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,IAAI,OAAA,CAAQ,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACjD;AAAA,EAEA,IAAI,cAAA,GAAiC;AACnC,IAAA,OAAO,IAAI,cAAA,CAAe,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACxD;AAAA,EAEA,IAAI,YAAA,GAA6B;AAC/B,IAAA,OAAO,IAAI,YAAA,CAAa,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACtD;AAAA,EAEA,IAAI,UAAA,GAAyB;AAC3B,IAAA,OAAO,IAAI,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACpD;AAAA,EAEA,IAAI,WAAA,GAA2B;AAC7B,IAAA,OAAO,IAAI,WAAA,CAAY,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACrD;AAAA,EAEA,IAAI,eAAA,GAAmC;AACrC,IAAA,OAAO,IAAI,eAAA,CAAgB,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACzD;AAAA,EAEA,IAAI,iBAAA,GAAuC;AACzC,IAAA,OAAO,IAAI,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC3D;AAAA;AAAA,EAGA,IAAI,KAAA,GAAe;AACjB,IAAA,OAAO,IAAI,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC/C;AAAA,EAEA,IAAI,QAAA,GAAqB;AACvB,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA,EAEA,SAAS,SAAA,EAAmC;AAC1C,IAAA,OAAO,IAAI,cAAA,CAAe,IAAA,EAAM,SAAS,CAAA;AAAA,EAC3C;AACF;;;ACrGA,IAAO,sBAAA,GAAQ","file":"index.cjs","sourcesContent":["import { z } from 'zod';\nimport {\n DEFAULT_BASE_URL,\n DEFAULT_MAX_RETRIES,\n DEFAULT_TIMEOUT,\n INITIAL_RETRY_DELAY,\n MAX_RETRY_DELAY,\n} from './constants.js';\nimport {\n APIConnectionError,\n APIResponseValidationError,\n APITimeoutError,\n ClawOpsError,\n makeStatusError,\n} from './error.js';\nimport { VERSION } from './version.js';\n\nconst LOCALHOST_HOSTS = new Set(['localhost', '127.0.0.1', '0.0.0.0', '[::1]']);\n\nfunction validateBaseUrl(url: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new ClawOpsError(`Invalid base_url: ${url}`);\n }\n if (parsed.protocol === 'https:') return url;\n if (parsed.protocol === 'http:' && LOCALHOST_HOSTS.has(parsed.hostname)) return url;\n throw new ClawOpsError(\n `base_url은 HTTPS를 사용해야 합니다 (받은 값: '${url}'). ` +\n `로컬 개발 시에는 http://localhost를 사용할 수 있습니다.`,\n );\n}\n\nexport interface APIClientOptions {\n apiKey: string;\n baseURL?: string;\n timeout?: number;\n maxRetries?: number;\n fetch?: typeof globalThis.fetch;\n defaultHeaders?: Record<string, string>;\n}\n\n/**\n * 본문 직렬화와 그에 딸린 `Content-Type` 을 **함께** 정한다.\n *\n * ⚠️ `contentType: null` 은 \"헤더를 붙이지 말라\" 는 뜻이다. multipart 의 boundary 는 fetch 가\n * 붙이므로, 기본값(`application/json`)이 남으면 서버가 본문을 파싱하지 못하고 그 실패는\n * \"왜 파일이 안 왔지\" 로만 드러난다.\n *\n * ⚠️ 직렬화가 재시도 루프 **밖**이라 재시도마다 다시 stringify 하지 않는다.\n */\nfunction serializeBody(body?: Record<string, unknown> | FormData | null): {\n payload: FormData | string | undefined;\n contentType: string | null;\n} {\n if (body instanceof FormData) return { payload: body, contentType: null };\n if (!body) return { payload: undefined, contentType: 'application/json' };\n return { payload: JSON.stringify(body), contentType: 'application/json' };\n}\n\nexport class APIClient {\n protected _apiKey: string;\n protected _baseURL: string;\n protected _maxRetries: number;\n protected _timeout: number;\n protected _fetch: typeof globalThis.fetch;\n protected _defaultHeaders: Record<string, string>;\n\n constructor(options: APIClientOptions) {\n this._apiKey = options.apiKey;\n this._baseURL = validateBaseUrl((options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/+$/, ''));\n this._maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this._timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this._fetch = options.fetch ?? globalThis.fetch;\n this._defaultHeaders = options.defaultHeaders ?? {};\n }\n\n private _buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this._apiKey}`,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'User-Agent': `claw-ops-node/${VERSION}`,\n ...this._defaultHeaders,\n };\n if (extra) Object.assign(headers, extra);\n return headers;\n }\n\n protected async _send(\n method: string,\n path: string,\n options: {\n /** `FormData` 면 그대로 보낸다(multipart) — 직렬화도 Content-Type 도 건드리지 않는다. */\n body?: Record<string, unknown> | FormData | null;\n query?: Record<string, unknown> | null;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Response> {\n const headers = this._buildHeaders(options.extraHeaders);\n\n // 본문과 Content-Type 은 **한 결정**이다 — 따로 두면 새 본문 종류를 더할 때 한쪽만\n // 고치게 되고, 헤더 쪽을 빠뜨리면 조용히 깨진다.\n const { payload, contentType } = serializeBody(options.body);\n if (contentType === null) delete headers['Content-Type'];\n else headers['Content-Type'] = contentType;\n\n const params = new URLSearchParams();\n const queryObj = { ...options.query, ...options.extraQuery };\n for (const [k, v] of Object.entries(queryObj)) {\n if (v != null) params.set(k, String(v));\n }\n\n const queryString = params.toString();\n const url = `${this._baseURL}${path}${queryString ? `?${queryString}` : ''}`;\n const reqTimeout = options.timeout ?? this._timeout;\n\n let retriesLeft = this._maxRetries;\n\n while (true) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), reqTimeout);\n\n let response: Response;\n try {\n response = await this._fetch(url, {\n method,\n headers,\n body: payload,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timeoutId);\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (retriesLeft > 0) {\n retriesLeft--;\n await this._sleep(this._retryDelay(this._maxRetries - retriesLeft));\n continue;\n }\n throw new APITimeoutError({ method, url });\n }\n if (retriesLeft > 0) {\n retriesLeft--;\n await this._sleep(this._retryDelay(this._maxRetries - retriesLeft));\n continue;\n }\n throw new APIConnectionError({ method, url });\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (response.ok) return response;\n\n if (retriesLeft > 0 && this._shouldRetry(response.status)) {\n retriesLeft--;\n await this._sleep(this._retryDelay(this._maxRetries - retriesLeft));\n continue;\n }\n\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = null;\n }\n throw makeStatusError(response.status, body, response.headers, { method, url });\n }\n }\n\n protected async _request<T>(\n method: string,\n path: string,\n options: {\n /** `FormData` 면 그대로 보낸다(multipart) — 직렬화도 Content-Type 도 건드리지 않는다. */\n body?: Record<string, unknown> | FormData | null;\n query?: Record<string, unknown> | null;\n castTo?: z.ZodType<T>;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<T | null> {\n const response = await this._send(method, path, options);\n if (response.status === 204 || !options.castTo) return null;\n\n const url = `${this._baseURL}${path}`;\n let json: unknown;\n try {\n json = await response.json();\n } catch {\n throw new APIResponseValidationError({ status: response.status }, { method, url });\n }\n const parsed = options.castTo.safeParse(json);\n if (!parsed.success) {\n throw new APIResponseValidationError({ status: response.status }, { method, url });\n }\n return parsed.data;\n }\n\n private _shouldRetry(status: number): boolean {\n return status === 408 || status === 409 || status === 429 || status >= 500;\n }\n\n private _retryDelay(retriesTaken: number): number {\n const delay = Math.min(INITIAL_RETRY_DELAY * 2 ** retriesTaken, MAX_RETRY_DELAY);\n return delay * (1 + Math.random());\n }\n\n private _sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n async _get<T>(\n path: string,\n options: {\n castTo: z.ZodType<T>;\n query?: Record<string, unknown> | null;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n },\n ): Promise<T> {\n const result = await this._request<T>(method('GET'), path, options);\n return result!;\n }\n\n async _post<T>(\n path: string,\n options: {\n /** `FormData` 면 그대로 보낸다(multipart) — 직렬화도 Content-Type 도 건드리지 않는다. */\n body?: Record<string, unknown> | FormData | null;\n castTo: z.ZodType<T>;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n },\n ): Promise<T> {\n const result = await this._request<T>('POST', path, options);\n return result!;\n }\n\n async _put<T>(\n path: string,\n options: {\n body?: Record<string, unknown> | null;\n castTo: z.ZodType<T>;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n },\n ): Promise<T> {\n const result = await this._request<T>('PUT', path, options);\n return result!;\n }\n\n async _patch<T>(\n path: string,\n options: {\n body?: Record<string, unknown> | null;\n castTo: z.ZodType<T>;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n },\n ): Promise<T> {\n const result = await this._request<T>('PATCH', path, options);\n return result!;\n }\n\n async _getRaw(\n path: string,\n options: {\n query?: Record<string, unknown> | null;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Response> {\n return this._send('GET', path, options);\n }\n\n /**\n * 본문을 돌려주는 DELETE. 기존 `_delete` 는 void 라 응답을 버리는데, soft delete 처럼\n * 삭제 결과 리소스를 그대로 반환하는 endpoint 가 있어서 따로 둔다.\n */\n async _deleteWithResponse<T>(\n path: string,\n options: {\n body?: Record<string, unknown> | null;\n castTo: z.ZodType<T>;\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n },\n ): Promise<T> {\n const result = await this._request<T>('DELETE', path, options);\n return result!;\n }\n\n async _delete(\n path: string,\n options: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n } = {},\n ): Promise<void> {\n await this._request('DELETE', path, options);\n }\n}\n\nfunction method(m: string): string {\n return m;\n}\n","import type { APIClient } from './base-client.js';\n\nexport class APIResource {\n protected _client: APIClient;\n protected _accountId: string;\n\n constructor(client: APIClient, accountId: string) {\n this._client = client;\n this._accountId = accountId;\n }\n\n protected get _basePath(): string {\n return `/v1/accounts/${this._accountId}`;\n }\n}\n","/**\n * snake_case를 camelCase로 변환합니다.\n * trailing underscore(예약어 회피용)는 제거합니다.\n * 예: 'from_' -> 'from', 'account_id' -> 'accountId'\n */\nexport function toCamelCase(snake: string): string {\n if (snake.endsWith('_')) {\n snake = snake.slice(0, -1);\n }\n const parts = snake.split('_');\n return parts[0] + parts.slice(1).map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join('');\n}\n\n/**\n * null/undefined 값을 제거하여 API에 불필요한 필드를 보내지 않습니다.\n */\nexport function stripNotGiven(data: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(data)) {\n if (v != null) {\n result[k] = v;\n }\n }\n return result;\n}\n","import { z } from 'zod';\n\nexport const PaginationMetaSchema = z\n .object({\n total: z.number(),\n page: z.number(),\n pageSize: z.number(),\n })\n .passthrough();\n\nexport type PaginationMeta = z.infer<typeof PaginationMetaSchema>;\n","import { z } from 'zod';\nimport type { APIClient } from './base-client.js';\nimport { PaginationMetaSchema } from './types/shared.js';\n\nexport function PageSchema<T>(itemSchema: z.ZodType<T>) {\n return z\n .object({\n data: z.array(itemSchema),\n meta: PaginationMetaSchema,\n })\n .passthrough();\n}\n\nexport class Page<T> {\n data: T[];\n meta: { total: number; page: number; pageSize: number };\n\n private _client: APIClient | null = null;\n private _path = '';\n private _itemSchema: z.ZodType<T> | null = null;\n private _query: Record<string, unknown> = {};\n\n constructor(data: T[], meta: { total: number; page: number; pageSize: number }) {\n this.data = data;\n this.meta = meta;\n }\n\n /** @internal */\n _setClient(\n client: APIClient,\n path: string,\n itemSchema: z.ZodType<T>,\n query: Record<string, unknown>,\n ): void {\n this._client = client;\n this._path = path;\n this._itemSchema = itemSchema;\n this._query = query;\n }\n\n hasNextPage(): boolean {\n return (this.meta.page + 1) * this.meta.pageSize < this.meta.total;\n }\n\n async nextPage(): Promise<Page<T>> {\n if (!this._client || !this._itemSchema) {\n throw new Error('Page client is not set');\n }\n if (!this.hasNextPage()) {\n throw new Error('No more pages');\n }\n const nextQuery = { ...this._query, page: this.meta.page + 1 };\n const schema = PageSchema(this._itemSchema);\n\n const raw = await this._client._get(this._path, {\n castTo: schema,\n query: nextQuery,\n });\n\n const page = new Page<T>(raw.data, raw.meta);\n page._setClient(this._client, this._path, this._itemSchema, this._query);\n return page;\n }\n\n [Symbol.iterator](): Iterator<T> {\n return this.data[Symbol.iterator]();\n }\n\n async *autoPagingIter(): AsyncGenerator<T> {\n let page: Page<T> = this;\n while (true) {\n for (const item of page.data) {\n yield item;\n }\n if (!page.hasNextPage()) break;\n page = await page.nextPage();\n }\n }\n}\n","import { z } from 'zod';\n\nexport const AssignmentLinkAssignmentSchema = z\n .object({\n number: z.string(),\n name: z.string().nullable().optional(),\n consumedAt: z.string(),\n releasedAt: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport const AssignmentLinkSchema = z\n .object({\n linkId: z.string(),\n url: z.string(),\n status: z.enum(['pending', 'consumed', 'expired', 'revoked']),\n createdAt: z.string(),\n expiresAt: z.string(),\n consumedAt: z.string().nullable().optional(),\n webhookUrl: z.string().nullable().optional(),\n webhookMethod: z.enum(['POST', 'GET']).nullable().optional(),\n note: z.string().nullable().optional(),\n assignment: AssignmentLinkAssignmentSchema.nullable().optional(),\n })\n .passthrough();\n\nexport const AssignmentLinkCreateResponseSchema = z\n .object({\n token: z.string(),\n url: z.string(),\n expiresAt: z.string(),\n })\n .passthrough();\n\nexport type AssignmentLinkAssignment = z.infer<typeof AssignmentLinkAssignmentSchema>;\nexport type AssignmentLink = z.infer<typeof AssignmentLinkSchema>;\nexport type AssignmentLinkCreateResponse = z.infer<typeof AssignmentLinkCreateResponseSchema>;\nexport type AssignmentLinkStatus = AssignmentLink['status'];\n","import { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport {\n AssignmentLinkSchema,\n AssignmentLinkCreateResponseSchema,\n} from '../types/assignment-link.js';\nimport type {\n AssignmentLink,\n AssignmentLinkCreateResponse,\n AssignmentLinkStatus,\n} from '../types/assignment-link.js';\n\ntype RequestOptions = {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n};\n\n/**\n * 관리번호(External Assignment) 발급 링크 리소스.\n *\n * POST/DELETE는 `external_assignment` 애드온이 활성화된 계정에서만 가능합니다.\n * GET 조회는 애드온 활성 여부와 무관하게 가능합니다.\n */\nexport class AssignmentLinks extends APIResource {\n async create(\n params: {\n webhookUrl?: string;\n webhookMethod?: 'POST' | 'GET';\n note?: string;\n } = {},\n options: RequestOptions = {},\n ): Promise<AssignmentLinkCreateResponse> {\n const body = stripNotGiven({\n webhookUrl: params.webhookUrl,\n webhookMethod: params.webhookMethod,\n note: params.note,\n });\n return this._client._post(`${this._basePath}/assignment-links`, {\n body: Object.keys(body).length ? body : undefined,\n castTo: AssignmentLinkCreateResponseSchema,\n ...options,\n });\n }\n\n async list(\n params: {\n status?: AssignmentLinkStatus;\n page?: number;\n pageSize?: number;\n } = {},\n options: RequestOptions = {},\n ): Promise<Page<AssignmentLink>> {\n const query = stripNotGiven({\n status: params.status,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/assignment-links`;\n const schema = PageSchema(AssignmentLinkSchema);\n const raw = await this._client._get(path, {\n castTo: schema,\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<AssignmentLink>(raw.data, raw.meta);\n page._setClient(this._client, path, AssignmentLinkSchema, query);\n return page;\n }\n\n async retrieve(\n linkId: string,\n options: RequestOptions = {},\n ): Promise<AssignmentLink> {\n return this._client._get(`${this._basePath}/assignment-links/${linkId}`, {\n castTo: AssignmentLinkSchema,\n ...options,\n });\n }\n\n async revoke(\n linkId: string,\n options: { extraHeaders?: Record<string, string>; timeout?: number } = {},\n ): Promise<void> {\n await this._client._delete(\n `${this._basePath}/assignment-links/${linkId}`,\n options,\n );\n }\n}\n","import { z } from 'zod';\n\nexport const BlockedRecipientSchema = z\n .object({\n id: z.string(),\n /**\n * 수신거부한 상대. **채널과 무관하게 항상 이 칸에 들어갑니다** —\n * `call`·`message` 면 국내 표기로 정규화된 전화번호(예 `'01012345678'`),\n * `email` 이면 소문자로 정규화된 이메일 주소(예 `'kim@example.com'`).\n *\n * 채널이 늘어도 이 칸 하나만 읽으면 됩니다.\n */\n recipient: z.string(),\n /**\n * ⚠️ `email` 이 2026-09-07 에 추가됐습니다. 이 값을 **enum 으로 좁히지 마세요** —\n * 서버가 채널을 늘리면 옛 SDK 가 파싱 단계에서 통째로 실패합니다. 실제로 그 일이\n * 있었습니다: `['call','message']` 로 굳혀 둔 탓에, 이메일 항목이 하나라도 섞이면\n * 목록 조회 전체가 깨졌습니다. 알려진 값은 `BlockedChannel` 로 노출하되 파싱은\n * 열어 둡니다.\n */\n channel: z.string(),\n /** 지금 차단 중인지. 해제분도 이력으로 조회되므로 이 값으로 구분한다. */\n active: z.boolean(),\n source: z.string(),\n sourceRef: z.string().nullable().optional(),\n note: z.string().nullable().optional(),\n createdBy: z.string().nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n unblockedAt: z.string().nullable().optional(),\n unblockedSource: z.string().nullable().optional(),\n unblockedBy: z.string().nullable().optional(),\n unblockedNote: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type BlockedRecipient = z.infer<typeof BlockedRecipientSchema>;\n\n/**\n * 차단 채널. `call`=전화, `message`=문자(SMS/LMS/MMS 공통), `email`=이메일.\n *\n * 같은 상대라도 채널마다 별개 항목입니다 — 전화와 이메일을 모두 막으려면 두 번 등록합니다.\n *\n * ⚠️ 응답의 `channel` 은 `string` 입니다(위 참조). 이 타입은 **요청을 쓸 때의 도움말**이고,\n * `(string & {})` 를 유니온에 두어 서버가 새 채널을 내놔도 타입이 막지 않게 했습니다.\n */\nexport type BlockedChannel = 'call' | 'message' | 'email' | (string & {});\n\nexport type BlockedRecipientStatus = 'active' | 'released' | 'all';\n\n/**\n * 접수 경로. 공개 API 로 등록하면 이 넷 중 하나입니다.\n *\n * ⚠️ 응답에는 **여기 없는 값도 옵니다** — `ars`(ARS 수신거부 9번), `sms`(문자 회신) 처럼\n * 내부 접수 경로로 들어온 항목이 그렇습니다. 그래서 응답의 `source` 는 `string` 입니다.\n */\nexport type BlockedRecipientSource = 'api' | 'console' | 'import' | 'agent';\n","import { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport { BlockedRecipientSchema } from '../types/blocked-recipient.js';\nimport type {\n BlockedRecipient,\n BlockedChannel,\n BlockedRecipientStatus,\n BlockedRecipientSource,\n} from '../types/blocked-recipient.js';\n\ntype RequestOptions = {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n};\n\n/**\n * 수신거부(DNC) 명단 리소스.\n *\n * 등록된 대상은 이 계정의 **발신**(전화·문자·이메일)에서 제외됩니다. 착신은 막지 않습니다 —\n * 그 번호에서 걸려오는 전화도, 그 주소에서 오는 메일도 그대로 받습니다.\n *\n * 채널은 각각 따로 차단합니다. 같은 상대라도 채널마다 별개 항목이므로, 전화와 이메일을\n * 모두 막으려면 `channel` 을 바꿔 두 번 등록합니다.\n *\n * ⚠️ **채널마다 막는 방식이 다릅니다.**\n * - 전화·문자: 수신거부 대상이면 그 발신 요청 **전체**가 `422 recipient_blocked` 로 거절됩니다.\n * - 이메일: 차단된 수신자만 **빼고 나머지에게는 보냅니다.** 응답의 `suppressed` 에 빠진\n * 주소가 담기므로, `2xx` 를 받아도 그 칸을 확인해야 누가 안 갔는지 알 수 있습니다.\n * 수신자가 전원 걸렸을 때만 `422` 입니다.\n */\nexport class BlockedRecipients extends APIResource {\n /**\n * 수신거부 명단에 등록합니다.\n *\n * `recipient` 의 형식은 `channel` 이 정합니다 — `call`·`message` 는 **전화번호**(하이픈·`+82`\n * 표기 모두 허용, 국내 표기로 정규화되어 저장), `email` 은 **이메일 주소**(소문자로 정규화).\n *\n * **멱등입니다** — 이미 차단 중인 (대상, 채널)을 다시 등록해도 에러가 아니라 기존 항목을\n * 돌려줍니다. 같은 사람이 수신거부를 두 번 요청하는 것은 정상 상황이기 때문입니다.\n */\n async create(\n params: {\n recipient: string;\n channel: BlockedChannel;\n source?: BlockedRecipientSource;\n sourceRef?: string;\n note?: string;\n },\n options: RequestOptions = {},\n ): Promise<BlockedRecipient> {\n const body = stripNotGiven({\n recipient: params.recipient,\n channel: params.channel,\n source: params.source,\n sourceRef: params.sourceRef,\n note: params.note,\n });\n return this._client._post(`${this._basePath}/blocked-recipients`, {\n body,\n castTo: BlockedRecipientSchema,\n ...options,\n });\n }\n\n /**\n * 수신거부 목록을 조회합니다. 기본은 **현재 차단 중인 항목만** 이며,\n * 해제 이력까지 보려면 `status` 를 `'released'` 또는 `'all'` 로 지정합니다.\n */\n async list(\n params: {\n channel?: BlockedChannel;\n recipient?: string;\n status?: BlockedRecipientStatus;\n page?: number;\n pageSize?: number;\n } = {},\n options: RequestOptions = {},\n ): Promise<Page<BlockedRecipient>> {\n const query = stripNotGiven({\n channel: params.channel,\n recipient: params.recipient,\n status: params.status,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/blocked-recipients`;\n const raw = await this._client._get(path, {\n castTo: PageSchema(BlockedRecipientSchema),\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<BlockedRecipient>(raw.data, raw.meta);\n page._setClient(this._client, path, BlockedRecipientSchema, query);\n return page;\n }\n\n /** 항목 상세를 조회합니다. 해제된 항목도 이력으로 남아 조회됩니다(`active: false`). */\n async retrieve(blockId: string, options: RequestOptions = {}): Promise<BlockedRecipient> {\n return this._client._get(`${this._basePath}/blocked-recipients/${blockId}`, {\n castTo: BlockedRecipientSchema,\n ...options,\n });\n }\n\n /**\n * 메모를 수정합니다.\n *\n * 번호와 채널은 바꿀 수 없습니다 — 바꾸면 \"누가 무엇을 언제 거부했는가\"라는 증빙이\n * 뒤틀립니다. 잘못 등록했다면 해제한 뒤 올바른 번호로 새로 등록하세요.\n */\n async update(\n blockId: string,\n params: { note?: string | null } = {},\n options: RequestOptions = {},\n ): Promise<BlockedRecipient> {\n return this._client._patch(`${this._basePath}/blocked-recipients/${blockId}`, {\n body: { note: params.note ?? null },\n castTo: BlockedRecipientSchema,\n ...options,\n });\n }\n\n /**\n * 수신거부를 해제해 다시 발신할 수 있게 합니다.\n *\n * **항목은 삭제되지 않습니다.** `active` 가 false 가 되고 `unblockedAt` 이 기록될 뿐,\n * 행은 이력으로 남습니다 — 언제 거부했고 언제 풀렸는지가 곧 증빙이기 때문입니다.\n * 해제분은 `list({ status: 'released' })` 로 볼 수 있습니다.\n *\n * 이미 해제된 항목에 다시 호출해도 성공하며, 최초 해제 시각은 덮어쓰지 않습니다.\n */\n async release(\n blockId: string,\n params: { note?: string } = {},\n options: RequestOptions = {},\n ): Promise<BlockedRecipient> {\n const body = stripNotGiven({ note: params.note });\n return this._client._deleteWithResponse(`${this._basePath}/blocked-recipients/${blockId}`, {\n body: Object.keys(body).length ? body : undefined,\n castTo: BlockedRecipientSchema,\n ...options,\n });\n }\n}\n","import { z } from 'zod';\n\nexport const CallSchema = z\n .object({\n callId: z.string(),\n /**\n * 진행 중: queued / ringing / in-progress.\n * 종료: completed(응답 후 정상 종료) / no-answer(벨은 울렸으나 무응답) / busy(통화중) /\n * rejected(수신 거절) / canceled(응답 전 발신 측 취소) / failed(시스템·망 오류).\n * completed 만이 실제로 연결된 통화를 의미한다.\n */\n status: z.enum([\n 'queued',\n 'ringing',\n 'in-progress',\n 'completed',\n 'failed',\n 'busy',\n 'no-answer',\n 'canceled',\n 'rejected',\n ]),\n to: z.string(),\n from: z.string(),\n direction: z.enum(['outbound', 'inbound']),\n duration: z.number().nullable().optional(),\n recordingUrl: z.string().nullable().optional(),\n /** AMD(machineDetection) 결과 — AMD 켠 발신 통화에만 값 존재. */\n answeredBy: z.enum(['human', 'machine', 'unknown']).nullable().optional(),\n /**\n * 통화 종료 사유. status 가 왜 그렇게 끝났는지를 구분한다 — 특히 failed 는 결번·망 오류·\n * 시스템 오류를 모두 포함하는 대분류라, 발신 리스트를 정제하려면 status 가 아니라 이 값을 본다.\n *\n * 재시도해도 소용없음: invalid_number(결번) / number_changed / incompatible_destination.\n * 재시도 가치 있음: no_answer / user_busy / temporary_failure / switching_congestion /\n * no_circuit_available / network_out_of_order / destination_out_of_order /\n * recovery_on_timer_expire / resource_unavailable.\n * 그 외: normal_clearing(정상 종료) / caller_canceled / call_rejected / protocol_error /\n * unspecified / app_error·call_stuck(ClawOps 측 오류 — 재시도 권장) / unknown.\n *\n * enum 으로 좁히지 않는다 — 통신망이 새 cause 를 보내면 서버가 값을 넓히는데, 그때마다\n * SDK 릴리즈를 기다려야 파싱되는 구조는 안 된다.\n */\n hangupCause: z.string().nullable().optional(),\n /** 통신망 Q.850 cause code. 1·5·28=결번, 16=정상해제, 17=통화중, 19=무응답, 38=망장애. */\n hangupCauseQ850: z.number().nullable().optional(),\n /**\n * 종료를 유발한 SIP 응답코드(404=없는 번호, 486=통화중, 500=망 오류 등).\n * 국내 통신망은 실제 사유를 500 으로 감싸 보내기도 하므로 hangupCause 가 더 정확하다.\n */\n sipResponseCode: z.number().nullable().optional(),\n /**\n * 종료 책임 주체. carrier(통신망) / callee(수신자) / caller(발신자) /\n * app·system(ClawOps 측 오류 — 수신자 번호를 정제 대상에 넣지 말고 재시도할 것).\n */\n hangupSource: z.enum(['carrier', 'callee', 'caller', 'app', 'system']).nullable().optional(),\n accountId: z.string(),\n dateCreated: z.string(),\n dateUpdated: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type Call = z.infer<typeof CallSchema>;\n\nexport const CallControlResponseSchema = z\n .object({\n callId: z.string(),\n status: z.string(),\n })\n .passthrough();\n\nexport type CallControlResponse = z.infer<typeof CallControlResponseSchema>;\n","import { z } from 'zod';\n\n/**\n * 화자 식별자. **2026-08 이후 전사는 `speaker_0`·`speaker_1`… 형식**이고, 전환 통화처럼\n * 참여자가 셋 이상이면 그만큼 늘어난다. 그 이전 전사에는 `AGENT`·`CUSTOMER` 가 그대로\n * 남아 있으므로 **두 형식을 모두 받아야 한다.** 화자와 역할의 연결은 보장되지 않는다.\n */\nexport type TranscriptSpeaker = 'CUSTOMER' | 'AGENT' | (string & {});\n\n/** 전사 실패 단계. `trigger` 는 시스템 실패라 재요청할 수 있다. */\nexport type TranscriptStage =\n | 'download'\n | 'runtime'\n | 'transcription'\n | 'trigger'\n | 'recover'\n | (string & {});\n\nexport const TranscriptSegmentSchema = z\n .object({\n /**\n * ⛔ **닫힌 enum 으로 두지 않는다.** 서버는 이미 `speaker_0` 을 보내고 있고, 세그먼트\n * 하나가 어긋나면 `segments` 배열 때문에 **전사 응답 전체**가 실패한다.\n */\n speaker: z.string() as z.ZodType<TranscriptSpeaker>,\n start: z.number(),\n end: z.number(),\n text: z.string(),\n })\n .passthrough();\n\nexport type TranscriptSegment = z.infer<typeof TranscriptSegmentSchema>;\n\n/**\n * 통화 전사 상태. status 에 따라 채워지는 필드가 다름:\n * - \"completed\": callId, segmentCount, segments\n * - \"pending\": startedAt\n * - \"failed\": stage, error. stage=\"trigger\" 는 시스템 실패로 재요청 가능\n * - \"not_requested\": 이외 필드 비어있음\n */\nexport const TranscriptStatusSchema = z\n .object({\n status: z.enum(['completed', 'pending', 'failed', 'not_requested']),\n callId: z.string().optional(),\n segmentCount: z.number().optional(),\n segments: z.array(TranscriptSegmentSchema).optional(),\n startedAt: z.string().optional(),\n /**\n * ⛔ **실패 단계는 서버 코드가 만든다** — 전사 파이프라인이 `download`·`runtime`·\n * `transcription`·`recover` 를 내보내고, 영구 실패는 예외 객체의 속성을 그대로 싣는다.\n * 어휘가 열려 있어 스펙의 enum 조차 스냅샷일 뿐이다.\n *\n * ⚠️ 여기가 닫혀 있으면 **전사가 실패했을 때 그 이유를 물으면 던진다** — 고객이 가장\n * 답을 필요로 하는 순간이다.\n */\n stage: (z.string() as z.ZodType<TranscriptStage>).nullable().optional(),\n error: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type TranscriptStatus = z.infer<typeof TranscriptStatusSchema>;\n\n/** POST 요청이 accept 되어 Job 이 트리거된 상태 (202). */\nexport const TranscriptRequestAcceptedSchema = z\n .object({\n status: z.literal('pending'),\n callId: z.string(),\n })\n .passthrough();\n\nexport type TranscriptRequestAccepted = z.infer<typeof TranscriptRequestAcceptedSchema>;\n","import { z } from 'zod';\n\n/**\n * 통화 요약 상태. status 에 따라 채워지는 필드가 다름:\n * - \"completed\": callId, resultJson, provider, model, promptVersion, schemaVersion, updatedAt\n * - \"pending\": 이외 필드 비어있음\n * - \"failed\": failedReason\n * - \"not_requested\": 통화는 있지만 요약 row 가 아직 없음\n */\nexport const SummaryStatusSchema = z\n .object({\n status: z.enum(['completed', 'pending', 'failed', 'not_requested']),\n callId: z.string().optional(),\n resultJson: z.record(z.string(), z.unknown()).nullable().optional(),\n provider: z.string().nullable().optional(),\n model: z.string().nullable().optional(),\n promptVersion: z.string().nullable().optional(),\n schemaVersion: z.string().nullable().optional(),\n failedReason: z.string().nullable().optional(),\n updatedAt: z.string().optional(),\n })\n .passthrough();\n\nexport type SummaryStatus = z.infer<typeof SummaryStatusSchema>;\n","import { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport { CallSchema, CallControlResponseSchema } from '../types/call.js';\nimport type { Call, CallControlResponse } from '../types/call.js';\nimport type {\n CallContextParam,\n CallCreateParams,\n CallListParams,\n} from '../types/call-params.js';\nimport {\n TranscriptStatusSchema,\n TranscriptRequestAcceptedSchema,\n} from '../types/transcript.js';\nimport type { TranscriptStatus, TranscriptRequestAccepted } from '../types/transcript.js';\nimport { SummaryStatusSchema } from '../types/summary.js';\nimport type { SummaryStatus } from '../types/summary.js';\n\n/**\n * `callContext` 를 REST 본문의 PascalCase 로 옮긴다.\n *\n * 파라미터는 camelCase(`instruction`/`variables`)로 받지만 서버는 PascalCase 만 받는다\n * (스펙상 `additionalProperties: false` 라 camelCase 를 그대로 보내면 400).\n * `stripNotGiven` 은 최상위 키만 훑으므로 중첩 객체는 여기서 직접 정리한다.\n */\nfunction callContextBody(\n ctx: CallContextParam | undefined,\n): Record<string, unknown> | undefined {\n if (!ctx) return undefined;\n const body: Record<string, unknown> = { Instruction: ctx.instruction };\n if (ctx.variables !== undefined) body.Variables = ctx.variables;\n return body;\n}\n\nexport class Calls extends APIResource {\n async create(\n params: CallCreateParams,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Call> {\n const body = stripNotGiven({\n To: params.to,\n From: params.from,\n Url: params.url,\n AgentId: params.agentId,\n CallContext: callContextBody(params.callContext),\n CallFlowId: params.callFlowId,\n Variables: params.variables,\n StatusCallback: params.statusCallback,\n StatusCallbackEvent: params.statusCallbackEvent,\n Timeout: params.timeout,\n MachineDetection: params.machineDetection,\n });\n return this._client._post(`${this._basePath}/calls`, {\n body,\n castTo: CallSchema,\n ...options,\n });\n }\n\n async list(\n params: CallListParams = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Page<Call>> {\n const query = stripNotGiven({\n status: params.status,\n from: params.from,\n to: params.to,\n number: params.number,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/calls`;\n const schema = PageSchema(CallSchema);\n const raw = await this._client._get(path, {\n castTo: schema,\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<Call>(raw.data, raw.meta);\n page._setClient(this._client, path, CallSchema, query);\n return page;\n }\n\n async get(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Call> {\n return this._client._get(`${this._basePath}/calls/${callId}`, {\n castTo: CallSchema,\n ...options,\n });\n }\n\n async update(\n callId: string,\n params: { status?: 'completed' } = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<CallControlResponse> {\n return this._client._post(`${this._basePath}/calls/${callId}`, {\n body: { Status: params.status ?? 'completed' },\n castTo: CallControlResponseSchema,\n ...options,\n });\n }\n\n /**\n * 통화 전사 상태 조회. 완료된 경우 segment 배열까지 한 번에 반환합니다.\n *\n * @throws NotFoundError (404) — 통화 없음\n * @throws PermissionDeniedError (403) — accountId 불일치\n */\n async getTranscript(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<TranscriptStatus> {\n return this._client._get(`${this._basePath}/calls/${callId}/transcript`, {\n castTo: TranscriptStatusSchema,\n ...options,\n });\n }\n\n /**\n * 특정 통화 1 건에 대해 전사를 명시 요청.\n * 조직 설정 \"통화 받아쓰기\" 가 꺼져 있어도 해당 통화만 전사됩니다.\n * 재실행 금지 — 이미 요청된 통화는 ConflictError(409) 발생.\n * 시스템 레벨 트리거 실패(stage=trigger) 만 재시도 가능.\n * 전사된 오디오 길이만큼 사용량 기반으로 과금됩니다.\n *\n * @throws BadRequestError (400) — 녹음 없음\n * @throws NotFoundError (404) — 통화 없음\n * @throws PermissionDeniedError (403) — accountId 불일치\n * @throws ConflictError (409) — 이미 요청됨\n */\n async requestTranscript(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<TranscriptRequestAccepted> {\n return this._client._post(`${this._basePath}/calls/${callId}/transcript`, {\n castTo: TranscriptRequestAcceptedSchema,\n ...options,\n });\n }\n\n /**\n * 통화 요약 상태 조회. transcript 가 완료된 통화에 대해 자동 생성된\n * LLM 구조화 요약 결과를 반환합니다. completed 일 때 resultJson 채워짐.\n *\n * @throws NotFoundError (404) — 통화 없음\n * @throws PermissionDeniedError (403) — accountId 불일치\n */\n async getSummary(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<SummaryStatus> {\n return this._client._get(`${this._basePath}/calls/${callId}/summary`, {\n castTo: SummaryStatusSchema,\n ...options,\n });\n }\n}\n","import { z } from 'zod';\n\n/**\n * 채널 연결 상태. 서버가 어휘를 소유하므로 **열린 유니온**이다 — 목록에 없는 값도 그대로\n * 실리고, 낡는 것은 자동완성뿐이다.\n */\nexport type KakaoChannelStatus = 'connected' | 'needs_attention' | (string & {});\n\n/**\n * 이 계정에 연결된 카카오 비즈니스 채널.\n *\n * ⚠️ `searchId` 는 채널 소유자가 카카오 비즈니스에서 바꿀 수 있다. **연동 키로 쓰지 말 것** —\n * 키는 `id`(ClawOps 리소스 ID)다.\n */\nexport const KakaoChannelSchema = z\n .object({\n /** ClawOps 채널 리소스 ID. 템플릿 조회와 알림톡 발송에 이 값을 쓴다. */\n id: z.string(),\n /** 카카오 채널 검색용 ID. `@` 없는 형태로 저장된다. */\n searchId: z.string(),\n name: z.string(),\n categoryCode: z.string(),\n /**\n * `connected` = 연결 완료. `needs_attention` = 연결 기록은 있으나 카카오 채널 상태를\n * 확인하지 못한 상태다 — 실제로 끊겼을 수도, 일시적인 조회 실패일 수도 있다.\n * `channels.retrieve()` 를 다시 부르면 재확인한다.\n *\n * ⛔ **닫힌 enum 으로 두지 않는다.** 어휘는 서버가 소유하므로, 상태가 하나 늘면\n * 닫힌 enum 은 조회를 통째로 실패시킨다(알림톡 `'ata'` 가 정확히 그렇게 터졌다).\n * 열린 유니온이면 자동완성만 낡고 조회는 계속 산다.\n */\n status: z.string() as z.ZodType<KakaoChannelStatus>,\n /** 담당자 휴대전화번호(마스킹). 원문은 저장하지 않는다. */\n managerPhoneMasked: z.string().nullable().optional(),\n connectedAt: z.string(),\n /** 카카오 채널 상태를 마지막으로 확인한 시각. null 이면 연결 이후 한 번도 확인하지 않았다. */\n syncedAt: z.string().nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n })\n .passthrough();\n\nexport type KakaoChannel = z.infer<typeof KakaoChannelSchema>;\n\n/**\n * 알림톡 템플릿.\n *\n * 본문·버튼·아이템 리스트·강조 문구는 **카카오 검수를 받은 그대로** 발송된다. 발송 요청으로\n * 바꿀 수 있는 것은 `variables` 값뿐이다.\n */\nexport const KakaoTemplateSchema = z\n .object({\n /** ClawOps 템플릿 리소스 ID. 발송의 `kakao.templateId` 에 이 값을 쓴다. */\n id: z.string(),\n /** ClawOps 채널 리소스 ID. 발송의 `kakao.channelId` 와 같은 값이다. */\n channelId: z.string(),\n name: z.string(),\n /** 검수를 받은 템플릿 본문. `#{변수}` 자리는 발송 시 치환된다. */\n content: z.string(),\n /**\n * 카카오 검수 상태(`APPROVED`·`REJECTED` 등). **카카오 쪽 열린 집합이라 문자열이다.**\n * 발송 가능 여부 판정은 `sendable` 이 정본이다.\n */\n status: z.string(),\n /** 휴면 템플릿. `true` 면 승인 상태여도 발송할 수 없다. */\n dormant: z.boolean(),\n /** 지금 발송에 쓸 수 있으면 true. `status === 'APPROVED' && !dormant` 다. */\n sendable: z.boolean(),\n /** `CHANNEL`(채널 소유) 또는 `GROUP`(기본 제공). */\n assignType: z.string(),\n messageType: z.string(),\n emphasizeType: z.string(),\n /**\n * 발송 시 `kakao.variables` 에 모두 채워야 하는 변수 이름.\n * 버튼 링크·강조 문구에 들어간 변수도 이 한 목록에 모인다.\n */\n variables: z.array(z.string()),\n createdAt: z.string(),\n updatedAt: z.string(),\n })\n .passthrough();\n\nexport type KakaoTemplate = z.infer<typeof KakaoTemplateSchema>;\n\n/**\n * 브랜드 메시지 말풍선 유형. **이 값이 단가를 정한다** — 텍스트형이 가장 싸고\n * 와이드리스트·캐러셀·커머스가 가장 비싸다.\n *\n * `MessageType` 과 같은 이유로 열어 둔 유니온이다.\n */\nexport type BrandBubbleType =\n | 'TEXT'\n | 'IMAGE'\n | 'WIDE'\n | 'WIDE_ITEM_LIST'\n | 'CAROUSEL_FEED'\n | 'COMMERCE'\n | 'CAROUSEL_COMMERCE'\n // ⚠️ `PREMIUM_VIDEO` 는 카카오TV 종료로 등록 경로가 막혀 알려진 값에서 뺐다.\n | (string & {});\n\n/**\n * 브랜드 메시지 템플릿.\n *\n * ⭐ **알림톡과 달리 검수가 없다** — `status`·`dormant`·`sendable` 이 없는 이유이고,\n * 목록에 있으면 곧 발송할 수 있다.\n */\nexport const KakaoBrandTemplateSchema = z\n .object({\n /** ClawOps 템플릿 리소스 ID. 발송의 `brand.templateId` 에 이 값을 쓴다. */\n id: z.string(),\n /** ClawOps 채널 리소스 ID. 발송의 `brand.channelId` 와 같은 값이다. */\n channelId: z.string(),\n name: z.string(),\n chatBubbleType: z.string() as z.ZodType<BrandBubbleType>,\n /**\n * 말풍선 본문.\n *\n * ⚠️ **유형에 따라 `null` 이다.** 본문이 담기는 자리가 유형마다 달라 `TEXT`·`IMAGE`·\n * `WIDE` 에만 채워진다 — 나머지는 헤더·카드·상품명이 그 자리를 대신한다.\n */\n content: z.string().nullable(),\n /** 와이드리스트형의 머리말. 다른 유형에서는 `null`. */\n header: z.string().nullable(),\n /** 발송 시 `brand.variables` 에 모두 채워야 하는 변수 이름. */\n variables: z.array(z.string()),\n createdAt: z.string(),\n updatedAt: z.string(),\n })\n .passthrough();\n\nexport type KakaoBrandTemplate = z.infer<typeof KakaoBrandTemplateSchema>;\n\n/**\n * 자유형 말풍선에 실을 이미지.\n *\n * ⭐ `id` 는 **ClawOps 리소스 ID** 다 — 벤더 파일 식별자가 아니다. 발송의\n * `brand.free.imageId` 에 이 값을 넣으면 서버가 벤더 값으로 바꿔 보낸다.\n */\nexport const KakaoBrandImageSchema = z\n .object({\n id: z.string(),\n /** 업로드할 때 지정한 말풍선 유형. 규격이 유형마다 달라 다른 유형엔 재사용할 수 없다. */\n bubbleType: z.string() as z.ZodType<BrandBubbleType>,\n /** `'main'` | `'sub'`. 서브는 와이드리스트형에만 있다(메인 2:1, 서브 1:1). */\n slot: z.string(),\n /** 업로드한 원본 파일 이름. */\n name: z.string().nullable(),\n createdAt: z.string(),\n })\n .passthrough();\n\nexport type KakaoBrandImage = z.infer<typeof KakaoBrandImageSchema>;\n\n/** 채널 업종 카테고리. **열린 집합이므로 코드에 하드코딩하지 말 것** — 이 응답이 정본이다. */\nexport const KakaoChannelCategorySchema = z\n .object({\n /** 채널 연결의 `categoryCode` 에 그대로 보내는 값. */\n code: z.string(),\n name: z.string(),\n })\n .passthrough();\n\nexport type KakaoChannelCategory = z.infer<typeof KakaoChannelCategorySchema>;\n\nexport const KakaoChannelCategoryListSchema = z\n .object({\n data: z.array(KakaoChannelCategorySchema),\n meta: z\n .object({\n /** 이 목록을 공급자에서 실제로 받아 온 시각. */\n fetchedAt: z.string(),\n /** 서버 캐시에서 응답했는지. 캐시는 짧고 값이 바뀌면 자동으로 따라간다. */\n cached: z.boolean(),\n })\n .passthrough(),\n })\n .passthrough();\n\nexport type KakaoChannelCategoryList = z.infer<typeof KakaoChannelCategoryListSchema>;\n\n/**\n * 인증번호 발송 요청 접수 결과.\n *\n * **응답에 인증번호는 없다.** 인증번호는 카카오 비즈니스에 등록된 담당자 휴대전화로만 가고,\n * ClawOps 는 그 값을 받지도 저장하지도 않는다.\n */\nexport const KakaoTokenRequestSchema = z\n .object({\n requested: z.boolean(),\n /** 정규화된 검색용 ID. `channels.connect()` 에 이 값을 그대로 보낸다. */\n searchId: z.string(),\n /** 인증번호가 발송된 번호(마스킹). */\n phoneNumberMasked: z.string(),\n /** 재요청까지 기다릴 시간(초). */\n retryAfterSeconds: z.number(),\n })\n .passthrough();\n\nexport type KakaoTokenRequest = z.infer<typeof KakaoTokenRequestSchema>;\n","import { z } from 'zod';\n\nimport { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport {\n KakaoBrandImageSchema,\n KakaoBrandTemplateSchema,\n KakaoChannelSchema,\n KakaoChannelCategoryListSchema,\n KakaoTemplateSchema,\n KakaoTokenRequestSchema,\n} from '../types/kakao.js';\nimport type {\n BrandBubbleType,\n KakaoBrandImage,\n KakaoBrandTemplate,\n KakaoChannel,\n KakaoChannelCategoryList,\n KakaoTemplate,\n KakaoTokenRequest,\n} from '../types/kakao.js';\nimport type {\n KakaoBrandTemplateListParams,\n KakaoChannelConnectParams,\n KakaoChannelListParams,\n KakaoTemplateListParams,\n KakaoTokenRequestParams,\n} from '../types/kakao-params.js';\n\ntype RequestOptions = {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n};\n\n/**\n * 카카오 비즈니스 채널.\n *\n * 채널 연결은 두 단계다 — `requestToken()` 으로 담당자 휴대전화에 인증번호를 보내고,\n * 받은 번호를 `connect()` 에 실어 완료한다. 서버는 그 사이 상태를 저장하지 않으므로\n * `searchId` 와 `phoneNumber` 를 두 번 모두 보낸다.\n */\nexport class KakaoChannels extends APIResource {\n private get _path(): string {\n return `${this._basePath}/kakao/channels`;\n }\n\n /**\n * 연결된 채널 목록.\n *\n * **카카오 쪽 상태를 확인하지 않는다** — 저장된 연결 정보를 그대로 돌려주므로 빠르다.\n * 실제 채널 상태까지 확인하려면 `retrieve()` 를 쓴다.\n */\n async list(\n params: KakaoChannelListParams = {},\n options: RequestOptions = {},\n ): Promise<Page<KakaoChannel>> {\n const query = stripNotGiven({\n status: params.status,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = this._path;\n const raw = await this._client._get(path, {\n castTo: PageSchema(KakaoChannelSchema),\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<KakaoChannel>(raw.data, raw.meta);\n page._setClient(this._client, path, KakaoChannelSchema, query);\n return page;\n }\n\n /**\n * 채널 하나를 조회한다. **목록과 달리 카카오 쪽 상태를 실제로 확인하고 `status` 를 갱신한다.**\n *\n * `connect()` 가 타임아웃됐을 때 결과를 확정하는 경로이기도 하다 — 연결을 재호출하면 중복\n * 등록을 시도하게 되지만 이 조회는 몇 번을 불러도 안전하다.\n *\n * 카카오 쪽 조회에 실패해도 `404` 가 아니다. 연결 기록은 유효하므로 `status` 가\n * `needs_attention` 으로 온다.\n */\n async retrieve(channelId: string, options: RequestOptions = {}): Promise<KakaoChannel> {\n return this._client._get(`${this._path}/${channelId}`, {\n castTo: KakaoChannelSchema,\n ...options,\n });\n }\n\n /**\n * 채널 권한을 증명할 인증번호를 **담당자 휴대전화로 발송**해 달라고 요청한다. 연결의 첫 단계다.\n *\n * 응답에 인증번호는 없다(`202`). 받은 번호는 `connect()` 의 `token` 으로 보내며, 유효 시간이\n * 있으므로 받은 뒤 바로 진행한다. 재요청이 잦으면 `429 KAKAO_RATE_LIMITED` 이고\n * 응답의 `retryAfterSeconds` 만큼 기다린다.\n */\n async requestToken(\n params: KakaoTokenRequestParams,\n options: RequestOptions = {},\n ): Promise<KakaoTokenRequest> {\n return this._client._post(`${this._path}/token`, {\n body: { searchId: params.searchId, phoneNumber: params.phoneNumber },\n castTo: KakaoTokenRequestSchema,\n ...options,\n });\n }\n\n /**\n * 인증번호로 채널 연결을 완료한다. **먼저 `requestToken()` 을 불러야 한다.**\n *\n * **멱등이다** — 이미 이 계정에 연결된 채널이면 인증번호를 소모하지 않고 기존 연결을 돌려준다.\n * 다른 계정에 연결된 채널은 멱등이 아니라 충돌이라 `409 KAKAO_CHANNEL_ALREADY_LINKED` 다.\n *\n * ⚠️ **타임아웃되면 재호출하지 말 것.** 이미 연결에 성공했을 수 있어 중복 등록을 시도하게 된다.\n * `list()` 나 `retrieve()` 로 실제 등록 여부를 확인한 뒤 결과를 확정한다.\n *\n * ⚠️ **실패해도 인증번호는 소모된다**(`422 KAKAO_TOKEN_INVALID`·`KAKAO_CHANNEL_REJECTED`).\n * 원인을 해결한 뒤 `requestToken()` 부터 다시 시작해야 한다.\n */\n async connect(\n params: KakaoChannelConnectParams,\n options: RequestOptions = {},\n ): Promise<KakaoChannel> {\n return this._client._post(this._path, {\n body: {\n searchId: params.searchId,\n phoneNumber: params.phoneNumber,\n categoryCode: params.categoryCode,\n token: params.token,\n },\n castTo: KakaoChannelSchema,\n ...options,\n });\n }\n\n /**\n * 채널 연동을 해제한다. 카카오톡 채널 자체는 지워지지 않고 ClawOps 와의 연동만 끊긴다.\n *\n * ⚠️ **되돌릴 수 없고, 그 채널에 등록된 알림톡 템플릿도 함께 삭제된다.** 템플릿은 카카오\n * 검수를 다시 받아야 하므로 복구에 시간이 걸린다 — 호출 전에 사용자 확인을 받을 것.\n *\n * 해제 후에는 그 채널을 다시 연결할 수 있다(본인이든 다른 계정이든). `requestToken()` 부터\n * 다시 시작하면 된다.\n */\n async disconnect(channelId: string, options: RequestOptions = {}): Promise<KakaoChannel> {\n return this._client._deleteWithResponse(`${this._path}/${channelId}`, {\n castTo: KakaoChannelSchema,\n ...options,\n });\n }\n}\n\n/** 알림톡 템플릿(읽기 전용). 등록·검수는 콘솔에서 한다. */\nexport class KakaoTemplates extends APIResource {\n /**\n * 한 채널의 알림톡 템플릿 목록.\n *\n * 응답의 `data[].id` 를 발송의 `kakao.templateId` 로, `data[].channelId` 를\n * `kakao.channelId` 로 쓴다. **`sendable: true` 인 템플릿만 발송할 수 있고**,\n * `variables` 의 모든 항목을 발송 요청의 `kakao.variables` 에 채워야 한다.\n */\n async list(\n params: KakaoTemplateListParams,\n options: RequestOptions = {},\n ): Promise<Page<KakaoTemplate>> {\n const query = stripNotGiven({\n channelId: params.channelId,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/kakao/templates`;\n const raw = await this._client._get(path, {\n castTo: PageSchema(KakaoTemplateSchema),\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<KakaoTemplate>(raw.data, raw.meta);\n page._setClient(this._client, path, KakaoTemplateSchema, query);\n return page;\n }\n}\n\nexport class KakaoBrandTemplates extends APIResource {\n /**\n * 한 채널의 브랜드 메시지 템플릿 목록.\n *\n * 응답의 `data[].id` 를 발송의 `brand.templateId` 로, `data[].channelId` 를\n * `brand.channelId` 로 쓴다. `variables` 의 모든 항목을 `brand.variables` 에 채워야 한다.\n *\n * ⭐ **알림톡과 달리 검수가 없어** `sendable` 같은 칸이 없다 — 목록에 있으면 곧 보낼 수 있다.\n */\n async list(\n params: KakaoBrandTemplateListParams,\n options: RequestOptions = {},\n ): Promise<Page<KakaoBrandTemplate>> {\n const query = stripNotGiven({\n channelId: params.channelId,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/kakao/brand-templates`;\n const raw = await this._client._get(path, {\n castTo: PageSchema(KakaoBrandTemplateSchema),\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<KakaoBrandTemplate>(raw.data, raw.meta);\n page._setClient(this._client, path, KakaoBrandTemplateSchema, query);\n return page;\n }\n}\n\n/**\n * 자유형 말풍선에 실을 이미지.\n *\n * ⭐ **업로드 한 번, 발송 여러 번.** 캠페인 하나에 수천 건이 같은 그림을 쓰므로 받은 `id` 를\n * 재사용한다 — 발송마다 다시 올릴 필요가 없다.\n *\n * ⚠️ **규격이 말풍선 유형마다 다르다.** 업로드할 때 준 `bubbleType` 과 다른 유형에 쓰면\n * 카카오가 발송 단계에서 거절한다 — 그 유형으로 다시 올려야 한다.\n */\nexport class KakaoBrandImages extends APIResource {\n private get _path(): string {\n return `${this._basePath}/kakao/brand-images`;\n }\n\n /**\n * 이미지를 올리고 발송에 쓸 `id` 를 받는다.\n *\n * ```ts\n * const image = await client.kakao.brandImages.upload({\n * file: readFileSync('banner.png'),\n * filename: 'banner.png',\n * bubbleType: 'WIDE',\n * });\n * await client.messages.create({\n * to: '01012345678',\n * from: '07012345678',\n * brand: {\n * channelId,\n * free: { chatBubbleType: 'WIDE', content: '신메뉴가 나왔어요.', imageId: image.id },\n * },\n * });\n * ```\n *\n * ⚠️ `TEXT` 는 이미지 자리가 없어 `400` 이다. 자동완성에 뜨지만 쓸 수 없다.\n *\n * ⚠️ **상한은 5MB 다.** 넘으면 `400`, 10MB 를 넘으면 업로드 검증기가 먼저 끊어 `413` 이고\n * **`code` 가 없다** — 즉 \"너무 크다\" 가 두 모양으로 온다.\n *\n * @param params.filename 원본 파일 이름. 목록에서 사람이 알아볼 유일한 단서다.\n * @param params.slot 와이드리스트형에서 작은 항목에 쓸 이미지면 `'sub'`. 기본은 `'main'`.\n */\n async upload(\n params: { file: Blob | Uint8Array; filename: string; bubbleType: BrandBubbleType; slot?: string },\n options: RequestOptions = {},\n ): Promise<{ id: string }> {\n const form = new FormData();\n // ⚠️ 파일 이름을 **인자로 받는다.** `File` 을 요구하면 Node 18 에서 아예 못 만든다\n // (전역 `File` 은 Node 20 부터다). `Blob` 은 이름을 못 들고, 이름이 없으면 목록에서\n // 무엇인지 알아볼 단서가 사라진다.\n const blob = params.file instanceof Blob ? params.file : new Blob([params.file]);\n form.append('image', blob, params.filename);\n form.append('bubbleType', params.bubbleType);\n if (params.slot) form.append('slot', params.slot);\n\n return this._client._post(this._path, {\n body: form,\n castTo: z.object({ id: z.string() }).passthrough(),\n ...options,\n });\n }\n\n /** 올려 둔 이미지 목록. **`id` 를 잃었을 때 되찾는 경로다.** */\n async list(\n params: { page?: number; pageSize?: number } = {},\n options: RequestOptions = {},\n ): Promise<Page<KakaoBrandImage>> {\n const query = stripNotGiven({ page: params.page, pageSize: params.pageSize });\n const path = this._path;\n const raw = await this._client._get(path, {\n castTo: PageSchema(KakaoBrandImageSchema),\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<KakaoBrandImage>(raw.data, raw.meta);\n page._setClient(this._client, path, KakaoBrandImageSchema, query);\n return page;\n }\n}\n\n/**\n * 카카오 알림톡·브랜드 메시지 관련 리소스.\n *\n * 발송 자체는 `client.messages.create({ kakao: … })` 또는 `({ brand: … })` 다 —\n * 여기서 얻은 채널·템플릿 ID 를 그대로 쓴다.\n */\nexport class Kakao extends APIResource {\n get channels(): KakaoChannels {\n return new KakaoChannels(this._client, this._accountId);\n }\n\n get templates(): KakaoTemplates {\n return new KakaoTemplates(this._client, this._accountId);\n }\n\n /** 브랜드 메시지 템플릿. 알림톡 템플릿(`templates`)과 **다른 표**다. */\n get brandTemplates(): KakaoBrandTemplates {\n return new KakaoBrandTemplates(this._client, this._accountId);\n }\n\n /** 자유형 말풍선에 실을 이미지. 템플릿형은 이미지가 템플릿에 들어 있어 필요 없다. */\n get brandImages(): KakaoBrandImages {\n return new KakaoBrandImages(this._client, this._accountId);\n }\n\n /**\n * 채널 연결 시 지정할 업종 카테고리 목록.\n *\n * **값을 코드에 하드코딩하지 말 것** — 카카오/공급자 쪽에서 늘거나 바뀌는 열린 집합이고\n * 이 응답이 그때그때의 정본이다. 응답의 `code` 를 `channels.connect()` 의 `categoryCode`\n * 로 그대로 보낸다.\n *\n * 페이지네이션이 없어 `Page` 가 아니라 `{ data, meta }` 를 그대로 돌려준다.\n */\n async channelCategories(options: RequestOptions = {}): Promise<KakaoChannelCategoryList> {\n return this._client._get(`${this._basePath}/kakao/channel-categories`, {\n castTo: KakaoChannelCategoryListSchema,\n ...options,\n });\n }\n}\n","import { z } from 'zod';\n\n/**\n * 메시지 상태.\n *\n * ⚠️ 한때 여기 `'sending'` 이 있었는데 **서버가 한 번도 보낸 적 없는 값**이다 — 어휘를 손으로\n * 관리하면 없는 값이 들어오고 있는 값이 빠진다. 그래서 이 유니온은 자동완성용이고,\n * 검증은 하지 않는다.\n */\nexport type MessageStatus = 'queued' | 'sent' | 'failed' | 'received' | (string & {});\n\n/**\n * 메시지 유형. `KakaoChannelStatus` 와 같은 이유로 **열린 유니온**이다 — 서버가 어휘를\n * 소유하므로 값이 하나 늘어도 조회는 살아 있어야 하고, 낡는 것은 자동완성뿐이다.\n */\nexport type MessageType =\n | 'sms'\n | 'lms'\n | 'mms'\n /** 카카오 알림톡. */\n | 'ata'\n /** 카카오 브랜드 메시지. */\n | 'bms'\n | (string & {});\n\nexport const MessageSchema = z\n .object({\n messageId: z.string(),\n status: z.string() as z.ZodType<MessageStatus>,\n /**\n * `'ata'`(알림톡)·`'bms'`(브랜드 메시지)는 카카오로 나간다. `body` 에는 템플릿에 변수를\n * 치환한 결과가 담기고, 버튼·아이템 리스트·강조 문구는 템플릿에 담긴 대로 발송되어\n * 이 값에는 담기지 않는다.\n *\n * ⛔ **닫힌 enum 으로 두지 않는다.** 어휘는 서버가 소유하므로, 유형이 하나 늘면 닫힌\n * enum 은 **목록을 통째로** 실패시킨다(`list()` 는 페이지를 한 번에 파싱한다). 실제로\n * 두 번 그렇게 터졌다 — `'ata'` 가 나왔을 때, 그리고 `'bms'` 가 나왔을 때.\n */\n type: z.string() as z.ZodType<MessageType>,\n to: z.string(),\n from: z.string(),\n body: z.string().nullable().optional(),\n subject: z.string().nullable().optional(),\n numMedia: z.number(),\n mediaUrl: z.array(z.string()),\n direction: z.enum(['outbound', 'inbound']),\n accountId: z.string(),\n dateCreated: z.string(),\n dateUpdated: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type Message = z.infer<typeof MessageSchema>;\n","import { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport { MessageSchema } from '../types/message.js';\nimport type { Message } from '../types/message.js';\nimport type {\n BrandSendParams,\n KakaoSendParams,\n MessageCreateParams,\n MessageListParams,\n} from '../types/message-params.js';\n\n/**\n * 알림톡·브랜드의 발송 지정을 서버 표기(PascalCase)로 옮긴다.\n *\n * 두 채널이 **한 함수를 쓴다** — 알림톡엔 자유형이 없어 `Free` 가 언제나 `undefined` 이고,\n * `stripNotGiven` 이 그걸 떨군다. 갈라 두면 서버가 `Variables` 키 이름을 바꿀 때 두 곳을\n * 고쳐야 하고, 한쪽을 빠뜨려도 값이 `Record<string, unknown>` 이라 컴파일이 통과한다.\n *\n * ⛔ **네 칸을 그대로 옮긴다 — 여기서 템플릿형/자유형을 고르지 않는다.** `free` 가 있으면\n * `TemplateId` 를 떨구는 식으로 짜면, 둘 다 실은 (타입을 안 쓰는) 호출자가 `400` 대신\n * **자기가 안 시킨 자유형이 나간 것**을 받는다. 배타 판정은 서버 한 곳이다.\n *\n * ⚠️ `Free` 는 불투명 오브젝트다. `stripNotGiven` 은 한 겹만 훑으므로 안쪽은 손대지 않는다 —\n * 판정은 서버의 말풍선 표가 한다.\n */\nconst sendBlock = (p?: KakaoSendParams | BrandSendParams) =>\n p &&\n stripNotGiven({\n ChannelId: p.channelId,\n TemplateId: p.templateId,\n Variables: p.variables,\n Free: p.free,\n });\n\nexport class Messages extends APIResource {\n /**\n * 문자(SMS/LMS/MMS) 또는 카카오 알림톡·브랜드 메시지를 발송합니다.\n *\n * 셋은 배타적입니다 — `kakao` 를 실으면 알림톡, `brand` 를 실으면 브랜드 메시지이고,\n * 이때 `body`·`subject`·`mediaUrl` 은 실을 수 없습니다(본문은 템플릿이 정합니다).\n *\n * ```ts\n * // 문자\n * await client.messages.create({ to: '010…', from: '070…', body: '안녕하세요' });\n *\n * // 알림톡 — 실패하면 fallback 문구가 문자로 대신 나갑니다(별도 1건으로 과금)\n * await client.messages.create({\n * to: '010…',\n * from: '070…',\n * kakao: { channelId, templateId, variables: { 고객명: '홍길동' } },\n * fallback: { body: '주문이 접수되었습니다.' },\n * });\n *\n * // 브랜드 메시지 — 채널을 추가한 친구에게 나가는 광고성 메시지\n * // ⚠️ 야간 제한과 대체발송 없음 — 제약은 `BrandMessageCreateParams` 참고.\n * await client.messages.create({\n * to: '010…',\n * from: '070…',\n * brand: { channelId, templateId, variables: { 고객명: '홍길동' } },\n * });\n * ```\n */\n async create(\n params: MessageCreateParams,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Message> {\n const body = stripNotGiven({\n To: params.to,\n From: params.from,\n Body: params.body,\n Type: params.type,\n Subject: params.subject,\n MediaUrl: params.mediaUrl,\n IdempotencyKey: params.idempotencyKey,\n // 중첩 객체는 손으로 조립한다 — stripNotGiven 은 한 겹만 훑는다.\n Kakao: sendBlock(params.kakao),\n Brand: sendBlock(params.brand),\n Fallback:\n params.fallback &&\n stripNotGiven({\n Type: params.fallback.type,\n Subject: params.fallback.subject,\n Body: params.fallback.body,\n Disabled: params.fallback.disabled,\n }),\n });\n return this._client._post(`${this._basePath}/messages`, {\n body,\n castTo: MessageSchema,\n ...options,\n });\n }\n\n async list(\n params: MessageListParams = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Page<Message>> {\n const query = stripNotGiven({\n type: params.type,\n status: params.status,\n number: params.number,\n page: params.page,\n pageSize: params.pageSize,\n });\n const path = `${this._basePath}/messages`;\n const schema = PageSchema(MessageSchema);\n const raw = await this._client._get(path, {\n castTo: schema,\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<Message>(raw.data, raw.meta);\n page._setClient(this._client, path, MessageSchema, query);\n return page;\n }\n\n async get(\n messageId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Message> {\n return this._client._get(`${this._basePath}/messages/${messageId}`, {\n castTo: MessageSchema,\n ...options,\n });\n }\n}\n","import { z } from 'zod';\n\n/**\n * 착신 라우팅 모드.\n *\n * - `webhook` : webhookUrl 의 VoiceML 이 처리.\n * - `agent` : agentId 의 매니지드 에이전트가 착신.\n * - `callflow` : callFlowId 의 콜 플로우(ARS)가 착신.\n * - `forward` : forwardTo(같은 계정 보유 번호)로 내부 착신전환.\n * - `sip` : sipEndpointId 의 라우트로 외부 PBX 다이얼.\n * - `softphone` : sipCredentialId 의 등록 단말로 착신.\n */\nexport const ROUTING_TYPES = [\n 'webhook',\n 'sip',\n 'softphone',\n 'forward',\n 'agent',\n 'callflow',\n] as const;\n\nexport type RoutingType = (typeof ROUTING_TYPES)[number];\n\nexport const PhoneNumberSchema = z\n .object({\n number: z.string(),\n numberType: z.string().nullable().optional(),\n source: z.string().nullable().optional(),\n // routingType 은 enum 으로 좁히지 않는다. 좁히면 서버가 라우팅 종류를 늘렸을 때 그 번호가\n // 섞인 목록 조회가 통째로 실패한다(0.28.0 까지의 실제 결함: 'agent' 로 라우팅된 번호\n // 하나가 numbers.list() 전체를 깨뜨렸다).\n routingType: z.string().nullable().optional(),\n agentId: z.string().nullable().optional(),\n callFlowId: z.string().nullable().optional(),\n forwardTo: z.string().nullable().optional(),\n sipEndpointId: z.string().nullable().optional(),\n sipCredentialId: z.string().nullable().optional(),\n webhookUrl: z.string().nullable().optional(),\n webhookMethod: z.string().nullable().optional(),\n webhookHeaders: z.record(z.string()).nullable().optional(),\n callContextUrl: z.string().nullable().optional(),\n statusCallback: z.string().nullable().optional(),\n statusCallbackEvents: z.string().nullable().optional(),\n dictionaryId: z.string().nullable().optional(),\n createdAt: z.string().nullable().optional(),\n })\n .passthrough();\n\n/**\n * 전화번호. `routingType` 은 알려진 값에 자동완성이 뜨지만, 서버가 새 라우팅을 추가해도\n * 파싱이 깨지지 않도록 임의의 문자열을 허용한다.\n */\nexport type PhoneNumber = Omit<z.infer<typeof PhoneNumberSchema>, 'routingType'> & {\n routingType?: RoutingType | (string & {}) | null;\n};\n\nexport type NumberListItem = PhoneNumber;\nexport type NumberUpdateResponse = PhoneNumber;\n","import { z } from 'zod';\nimport { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { PhoneNumberSchema } from '../types/number.js';\nimport type { PhoneNumber, NumberListItem, NumberUpdateResponse } from '../types/number.js';\nimport type { NumberCreateParams, NumberUpdateParams } from '../types/number-params.js';\n\ninterface RequestOptions {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n}\n\nexport class Numbers extends APIResource {\n /**\n * 번호를 발급합니다. 번호 풀에서 자동으로 배정되며 어떤 번호가 나올지는 지정할 수 없습니다.\n *\n * 발급 직후 번호는 `routingType: \"webhook\"` 이고 `webhookUrl` 이 비어 있어, 그대로 두면\n * 걸려온 전화가 거절됩니다. 이어서 `update()` 로 착신 라우팅을 지정하세요.\n */\n async create(params: NumberCreateParams = {}, options: RequestOptions = {}): Promise<PhoneNumber> {\n const body = stripNotGiven({\n webhookUrl: params.webhookUrl,\n webhookMethod: params.webhookMethod,\n webhookHeaders: params.webhookHeaders,\n statusCallback: params.statusCallback,\n statusCallbackEvents: params.statusCallbackEvents,\n });\n return this._client._post(`${this._basePath}/numbers`, {\n body: Object.keys(body).length ? body : undefined,\n castTo: PhoneNumberSchema,\n ...options,\n });\n }\n\n /**\n * 등록된 번호 목록을 조회합니다. 페이지네이션과 필터가 없으며 보유한 번호가 한 번에 전부\n * 반환됩니다.\n */\n async list(options: RequestOptions = {}): Promise<NumberListItem[]> {\n const schema = z.object({ data: z.array(PhoneNumberSchema) }).passthrough();\n const result = await this._client._get(`${this._basePath}/numbers`, {\n castTo: schema,\n ...options,\n });\n return result.data;\n }\n\n /**\n * 번호 설정을 수정합니다. 착신 라우팅(webhook/agent/callflow/forward/sip/softphone)과\n * webhook, 상태 통지, 받아쓰기 사전을 변경할 수 있습니다. 보낸 필드만 반영되고 생략한\n * 필드는 유지됩니다.\n *\n * 라우팅을 바꾸면 다른 라우팅 필드는 서버에서 자동으로 비워집니다. `agent` 에서\n * `webhook` 으로 되돌리면 `agentId` 가 null 이 되므로, 다시 `agent` 로 돌아갈 때\n * `agentId` 를 새로 지정해야 합니다.\n */\n async update(\n number: string,\n params: NumberUpdateParams = {},\n options: RequestOptions = {},\n ): Promise<NumberUpdateResponse> {\n const body = stripNotGiven({\n routingType: params.routingType,\n agentId: params.agentId,\n callFlowId: params.callFlowId,\n forwardTo: params.forwardTo,\n sipEndpointId: params.sipEndpointId,\n sipCredentialId: params.sipCredentialId,\n webhookUrl: params.webhookUrl,\n webhookMethod: params.webhookMethod,\n webhookHeaders: params.webhookHeaders,\n callContextUrl: params.callContextUrl,\n statusCallback: params.statusCallback,\n statusCallbackEvents: params.statusCallbackEvents,\n dictionaryId: params.dictionaryId,\n });\n return this._client._put(`${this._basePath}/numbers/${number}`, {\n body,\n castTo: PhoneNumberSchema,\n ...options,\n });\n }\n\n /**\n * 번호를 반납합니다. 번호는 풀로 복귀하며 되돌릴 수 없습니다. 같은 번호를 다시\n * 발급받는다는 보장이 없습니다.\n */\n async delete(\n number: string,\n options: { extraHeaders?: Record<string, string>; timeout?: number } = {},\n ): Promise<void> {\n await this._client._delete(`${this._basePath}/numbers/${number}`, options);\n }\n}\n","import { APIResource } from '../resource.js';\n\nexport interface RecordingDownload {\n /** WAV 바이너리 데이터 (PCM 16bit mono 8kHz) */\n data: ArrayBuffer;\n /** 응답의 Content-Type (예: 'audio/wav') */\n contentType: string;\n /** Content-Disposition 헤더에서 파싱한 파일명 (없으면 null) */\n filename: string | null;\n}\n\nfunction parseFilename(disposition: string | null): string | null {\n if (!disposition) return null;\n const star = disposition.match(/filename\\*=(?:[\\w-]+'[^']*')?([^;]+)/i);\n if (star) {\n try {\n return decodeURIComponent(star[1].trim());\n } catch {\n // fall through to plain filename\n }\n }\n const quoted = disposition.match(/filename=\"([^\"]+)\"/i);\n if (quoted) return quoted[1].trim();\n const bare = disposition.match(/filename=([^;]+)/i);\n return bare ? bare[1].trim() : null;\n}\n\nexport class Recordings extends APIResource {\n /**\n * 통화 녹음(WAV)을 다운로드합니다.\n *\n * 콘솔과 동일한 서버측 MixMonitor 원본 (PCM 16bit mono 8kHz).\n *\n * @throws NotFoundError (404) — 통화가 없거나 녹음이 없음(`recordingUrl: null`).\n * @throws PermissionDeniedError (403) — accountId 불일치.\n */\n async download(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<RecordingDownload> {\n const response = await this._client._getRaw(\n `${this._basePath}/recordings/${callId}`,\n options,\n );\n const data = await response.arrayBuffer();\n return {\n data,\n contentType: response.headers.get('content-type') ?? 'audio/wav',\n filename: parseFilename(response.headers.get('content-disposition')),\n };\n }\n\n /**\n * 통화 녹음을 삭제합니다 (포인터 제거, 멱등 — 이미 없어도 성공).\n *\n * @throws NotFoundError (404) — 통화가 없음.\n * @throws PermissionDeniedError (403) — accountId 불일치.\n */\n async delete(\n callId: string,\n options: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n } = {},\n ): Promise<void> {\n await this._client._delete(`${this._basePath}/recordings/${callId}`, options);\n }\n}\n","import { z } from 'zod';\n\n/**\n * SIP 단말(digest credential). 평문 password/ha1 은 조회 응답에 포함되지 않음\n * (생성 시 1회만 노출). softphone 라우팅 설정 시 이 객체의 id 를\n * numbers.update(number, { sipCredentialId }) 로 넘긴다.\n */\nexport const SipCredentialSchema = z\n .object({\n id: z.string(),\n accountId: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n username: z.string().nullable().optional(),\n realm: z.string().nullable().optional(),\n enabled: z.boolean().nullable().optional(),\n status: z.enum(['active', 'disabled', 'deleted']).nullable().optional(),\n ipAclId: z.string().nullable().optional(),\n allowedNumbers: z.array(z.string()).nullable().optional(),\n lastUsedAt: z.string().nullable().optional(),\n dateCreated: z.string().nullable().optional(),\n dateUpdated: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type SipCredential = z.infer<typeof SipCredentialSchema>;\n\n/**\n * SIP 엔드포인트(외부 PBX 트렁크). sip 라우팅 설정 시 이 객체의 id 를\n * numbers.update(number, { sipEndpointId }) 로 넘긴다.\n */\nexport const SipEndpointSchema = z\n .object({\n id: z.string(),\n accountId: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n maxConcurrent: z.number().nullable().optional(),\n status: z.enum(['active', 'disabled']).nullable().optional(),\n routes: z.array(z.unknown()).nullable().optional(),\n dateCreated: z.string().nullable().optional(),\n dateUpdated: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type SipEndpoint = z.infer<typeof SipEndpointSchema>;\n","import { z } from 'zod';\nimport { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { SipCredentialSchema } from '../types/sip.js';\nimport type { SipCredential } from '../types/sip.js';\n\n/**\n * SIP 단말(credential) 리소스 — 조회 전용.\n * 생성/수정/삭제는 대시보드 또는 REST API 사용. 본 SDK 는 softphone 라우팅 설정에\n * 필요한 credential id 확인용 list/get 만 제공한다 (password/ha1 미노출).\n */\nexport class SipCredentials extends APIResource {\n async list(\n params: { status?: 'active' | 'disabled'; page?: number; pageSize?: number } = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<SipCredential[]> {\n const query = stripNotGiven({\n status: params.status,\n page: params.page,\n pageSize: params.pageSize,\n });\n const schema = z.object({ data: z.array(SipCredentialSchema) }).passthrough();\n const result = await this._client._get(`${this._basePath}/sip-credentials`, {\n castTo: schema,\n ...options,\n extraQuery: { ...query, ...options.extraQuery },\n });\n return result.data;\n }\n\n async get(\n credentialId: string,\n options: { extraHeaders?: Record<string, string>; timeout?: number } = {},\n ): Promise<SipCredential> {\n return this._client._get(`${this._basePath}/sip-credentials/${credentialId}`, {\n castTo: SipCredentialSchema,\n ...options,\n });\n }\n}\n","import { z } from 'zod';\nimport { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { SipEndpointSchema } from '../types/sip.js';\nimport type { SipEndpoint } from '../types/sip.js';\n\n/**\n * SIP 엔드포인트(외부 PBX 트렁크) 리소스 — 조회 전용.\n * 생성/수정/삭제는 대시보드 또는 REST API 사용. 본 SDK 는 sip 라우팅 설정에\n * 필요한 endpoint id 확인용 list/get 만 제공한다.\n */\nexport class SipEndpoints extends APIResource {\n async list(\n params: { status?: 'active' | 'disabled'; page?: number; pageSize?: number } = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<SipEndpoint[]> {\n const query = stripNotGiven({\n status: params.status,\n page: params.page,\n pageSize: params.pageSize,\n });\n const schema = z.object({ data: z.array(SipEndpointSchema) }).passthrough();\n const result = await this._client._get(`${this._basePath}/sip-endpoints`, {\n castTo: schema,\n ...options,\n extraQuery: { ...query, ...options.extraQuery },\n });\n return result.data;\n }\n\n async get(\n endpointId: string,\n options: { extraHeaders?: Record<string, string>; timeout?: number } = {},\n ): Promise<SipEndpoint> {\n return this._client._get(`${this._basePath}/sip-endpoints/${endpointId}`, {\n castTo: SipEndpointSchema,\n ...options,\n });\n }\n}\n","import { z } from 'zod';\n\nexport const WebhookLogSchema = z\n .object({\n id: z.string(),\n webhookId: z.string(),\n event: z.string(),\n requestUrl: z.string(),\n requestPayload: z.record(z.unknown()),\n responseStatus: z.number().nullable().optional(),\n responseBody: z.string().nullable().optional(),\n responseTimeMs: z.number().nullable().optional(),\n status: z.enum(['pending', 'delivered', 'failed']),\n attempt: z.number(),\n maxAttempts: z.number(),\n createdAt: z.string(),\n completedAt: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type WebhookLog = z.infer<typeof WebhookLogSchema>;\n","import { APIResource } from '../resource.js';\nimport { stripNotGiven } from '../util.js';\nimport { Page, PageSchema } from '../pagination.js';\nimport { WebhookLogSchema } from '../types/webhook-log.js';\nimport type { WebhookLog } from '../types/webhook-log.js';\n\nexport class WebhookLogs extends APIResource {\n async list(\n webhookId: string,\n params: { page?: number; pageSize?: number } = {},\n options: {\n extraHeaders?: Record<string, string>;\n extraQuery?: Record<string, unknown>;\n timeout?: number;\n } = {},\n ): Promise<Page<WebhookLog>> {\n const query = stripNotGiven({ page: params.page, pageSize: params.pageSize });\n const path = `${this._basePath}/webhooks/${webhookId}/logs`;\n const schema = PageSchema(WebhookLogSchema);\n const raw = await this._client._get(path, {\n castTo: schema,\n query: Object.keys(query).length ? query : undefined,\n ...options,\n });\n const page = new Page<WebhookLog>(raw.data, raw.meta);\n page._setClient(this._client, path, WebhookLogSchema, query);\n return page;\n }\n}\n","import type { APIClient } from '../base-client.js';\nimport { AssignmentLinks } from './assignment-links.js';\nimport { BlockedRecipients } from './blocked-recipients.js';\nimport { Calls } from './calls.js';\nimport { Kakao } from './kakao.js';\nimport { Messages } from './messages.js';\nimport { Numbers } from './numbers.js';\nimport { Recordings } from './recordings.js';\nimport { WebhookLogs } from './webhook-logs.js';\n\nexport class AccountContext {\n private _client: APIClient;\n private _accountId: string;\n\n constructor(client: APIClient, accountId: string) {\n this._client = client;\n this._accountId = accountId;\n }\n\n get calls(): Calls {\n return new Calls(this._client, this._accountId);\n }\n\n get messages(): Messages {\n return new Messages(this._client, this._accountId);\n }\n\n get numbers(): Numbers {\n return new Numbers(this._client, this._accountId);\n }\n\n get recordings(): Recordings {\n return new Recordings(this._client, this._accountId);\n }\n\n get webhookLogs(): WebhookLogs {\n return new WebhookLogs(this._client, this._accountId);\n }\n\n get assignmentLinks(): AssignmentLinks {\n return new AssignmentLinks(this._client, this._accountId);\n }\n\n get blockedRecipients(): BlockedRecipients {\n return new BlockedRecipients(this._client, this._accountId);\n }\n\n get kakao(): Kakao {\n return new Kakao(this._client, this._accountId);\n }\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\nimport { ClawOpsError } from './error.js';\n\nexport class WebhookVerificationError extends ClawOpsError {\n constructor(message = 'Webhook 서명이 일치하지 않습니다.') {\n super(message);\n this.name = 'WebhookVerificationError';\n }\n}\n\nexport class Webhooks {\n verify(options: {\n url: string;\n params: Record<string, string>;\n signature: string;\n signingKey: string;\n }): boolean {\n const expected = Webhooks._computeSignature(options.url, options.params, options.signingKey);\n const expectedBuf = Buffer.from(expected, 'utf-8');\n const signatureBuf = Buffer.from(options.signature, 'utf-8');\n\n if (expectedBuf.length !== signatureBuf.length || !timingSafeEqual(expectedBuf, signatureBuf)) {\n throw new WebhookVerificationError();\n }\n return true;\n }\n\n static _computeSignature(\n url: string,\n params: Record<string, string>,\n signingKey: string,\n ): string {\n const sortedParams = Object.keys(params)\n .sort()\n .map((k) => `${k}${params[k]}`)\n .join('');\n const dataToSign = url + sortedParams;\n const digest = createHmac('sha256', signingKey).update(dataToSign, 'utf-8').digest();\n return digest.toString('base64');\n }\n}\n","import { APIClient, type APIClientOptions } from './base-client.js';\nimport { DEFAULT_BASE_URL } from './constants.js';\nimport { ClawOpsError } from './error.js';\nimport { AssignmentLinks } from './resources/assignment-links.js';\nimport { BlockedRecipients } from './resources/blocked-recipients.js';\nimport { Calls } from './resources/calls.js';\nimport { Kakao } from './resources/kakao.js';\nimport { Messages } from './resources/messages.js';\nimport { Numbers } from './resources/numbers.js';\nimport { Recordings } from './resources/recordings.js';\nimport { SipCredentials } from './resources/sip-credentials.js';\nimport { SipEndpoints } from './resources/sip-endpoints.js';\nimport { WebhookLogs } from './resources/webhook-logs.js';\nimport { AccountContext } from './resources/accounts.js';\nimport { Webhooks } from './webhooks.js';\n\nexport interface ClawOpsOptions {\n apiKey?: string;\n accountId?: string;\n baseURL?: string;\n timeout?: number;\n maxRetries?: number;\n fetch?: typeof globalThis.fetch;\n defaultHeaders?: Record<string, string>;\n}\n\nexport class ClawOps extends APIClient {\n private _defaultAccountId: string;\n\n constructor(options: ClawOpsOptions = {}) {\n let apiKey = options.apiKey ?? process.env.CLAWOPS_API_KEY;\n if (!apiKey) {\n throw new ClawOpsError('apiKey를 지정하거나 CLAWOPS_API_KEY 환경변수를 설정하세요.');\n }\n\n let accountId = options.accountId ?? process.env.CLAWOPS_ACCOUNT_ID;\n if (!accountId) {\n throw new ClawOpsError('accountId를 지정하거나 CLAWOPS_ACCOUNT_ID 환경변수를 설정하세요.');\n }\n\n const baseURL = options.baseURL ?? process.env.CLAWOPS_BASE_URL ?? DEFAULT_BASE_URL;\n\n super({\n apiKey,\n baseURL,\n timeout: options.timeout,\n maxRetries: options.maxRetries,\n fetch: options.fetch,\n defaultHeaders: options.defaultHeaders,\n });\n\n this._defaultAccountId = accountId;\n }\n\n get calls(): Calls {\n return new Calls(this, this._defaultAccountId);\n }\n\n get messages(): Messages {\n return new Messages(this, this._defaultAccountId);\n }\n\n get numbers(): Numbers {\n return new Numbers(this, this._defaultAccountId);\n }\n\n get sipCredentials(): SipCredentials {\n return new SipCredentials(this, this._defaultAccountId);\n }\n\n get sipEndpoints(): SipEndpoints {\n return new SipEndpoints(this, this._defaultAccountId);\n }\n\n get recordings(): Recordings {\n return new Recordings(this, this._defaultAccountId);\n }\n\n get webhookLogs(): WebhookLogs {\n return new WebhookLogs(this, this._defaultAccountId);\n }\n\n get assignmentLinks(): AssignmentLinks {\n return new AssignmentLinks(this, this._defaultAccountId);\n }\n\n get blockedRecipients(): BlockedRecipients {\n return new BlockedRecipients(this, this._defaultAccountId);\n }\n\n /** 카카오 채널·알림톡 템플릿. 발송은 `messages.create({ kakao: … })` 다. */\n get kakao(): Kakao {\n return new Kakao(this, this._defaultAccountId);\n }\n\n get webhooks(): Webhooks {\n return new Webhooks();\n }\n\n accounts(accountId: string): AccountContext {\n return new AccountContext(this, accountId);\n }\n}\n","import { ClawOps } from './client.js';\nexport default ClawOps;\n"]}