signalbird 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/embed.d.mts +1 -1
- package/dist/embed.d.ts +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/signalbird.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -94,7 +94,7 @@ değil, kasıtlı bir duvardır — anahtar bir kez istemciye indiğinde herkesi
|
|
|
94
94
|
| Go | `go get github.com/Pariette-Inc/signalbird.sdk` |
|
|
95
95
|
| .NET, ASP.NET Core | `dotnet add package Signalbird.Sdk` |
|
|
96
96
|
| Swift (iOS, macOS) | SPM: `https://github.com/Pariette-Inc/signalbird.sdk` |
|
|
97
|
-
| Kotlin (Android) | `implementation("io.signalbird:signalbird-sdk:2.0.
|
|
97
|
+
| Kotlin (Android) | `implementation("io.signalbird:signalbird-sdk:2.0.2")` |
|
|
98
98
|
| Canlı sohbet widget'ı (herhangi bir site) | `<script async src="https://signalbird.io/sdk/v1/signalbird.js" data-key="sb_public_live_…" data-channel="destek"></script>` |
|
|
99
99
|
|
|
100
100
|
> Hepsi **bu repodan** çıkar ve **aynı sürümü** taşır — ayrı SDK reposu ya da
|
package/dist/embed.d.mts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
type EmbedModule = 'chat' | 'monitoring' | 'campaigns' | 'contacts' | 'radio' | 'messages';
|
|
15
15
|
type EmbedTheme = 'light' | 'dark' | 'auto';
|
|
16
16
|
/**
|
|
17
|
-
* Jeton üretimi EV SAHİBİNİN SUNUCUSUNDA olur;
|
|
17
|
+
* Jeton üretimi EV SAHİBİNİN SUNUCUSUNDA olur; gizli domain anahtarı (`sb_secret_live_…`)
|
|
18
18
|
* tarayıcıya asla inmez. SDK yalnızca sonucu ister.
|
|
19
19
|
*
|
|
20
20
|
* Dönüş: Signalbird'ün `POST /v1/partner/companies/{ext}/embed` yanıtındaki
|
package/dist/embed.d.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
type EmbedModule = 'chat' | 'monitoring' | 'campaigns' | 'contacts' | 'radio' | 'messages';
|
|
15
15
|
type EmbedTheme = 'light' | 'dark' | 'auto';
|
|
16
16
|
/**
|
|
17
|
-
* Jeton üretimi EV SAHİBİNİN SUNUCUSUNDA olur;
|
|
17
|
+
* Jeton üretimi EV SAHİBİNİN SUNUCUSUNDA olur; gizli domain anahtarı (`sb_secret_live_…`)
|
|
18
18
|
* tarayıcıya asla inmez. SDK yalnızca sonucu ister.
|
|
19
19
|
*
|
|
20
20
|
* Dönüş: Signalbird'ün `POST /v1/partner/companies/{ext}/embed` yanıtındaki
|
package/dist/index.d.mts
CHANGED
|
@@ -432,7 +432,7 @@ interface SbResult<T = unknown> {
|
|
|
432
432
|
*/
|
|
433
433
|
|
|
434
434
|
interface PartnerConfig {
|
|
435
|
-
/** `
|
|
435
|
+
/** `sb_secret_live_…` — gizli domain anahtarı. Tarayıcıya İNMEZ. */
|
|
436
436
|
domainKey: string;
|
|
437
437
|
baseUrl?: string;
|
|
438
438
|
timeout?: number;
|
|
@@ -1042,7 +1042,7 @@ declare class SignalbirdManagement {
|
|
|
1042
1042
|
* müşterinin kendi anahtarıyla (`sb_`) şirket açamaması içindi; o kural aynen
|
|
1043
1043
|
* duruyor. Sözleşmeli partner farklı bir taraftır.
|
|
1044
1044
|
*
|
|
1045
|
-
*
|
|
1045
|
+
* Gizli anahtar **asla tarayıcıya inmez**: gömme jetonunu partner'ın
|
|
1046
1046
|
* kendi sunucusu üretir, tarayıcı yalnız o kısa ömürlü jetonu görür.
|
|
1047
1047
|
*
|
|
1048
1048
|
* Sözleşme: docs/CONTRACT.md § 12
|
|
@@ -1147,12 +1147,12 @@ declare function verifyWebhook(rawBody: string | Uint8Array, signatureHeader: st
|
|
|
1147
1147
|
* kullanılır — gizli anahtar istemciye inmez.
|
|
1148
1148
|
*
|
|
1149
1149
|
* Üç sunucu istemcisi vardır; anahtarları ve kapıları farklıdır:
|
|
1150
|
-
* - `SignalbirdClient` → Telsiz (log yazma), `
|
|
1150
|
+
* - `SignalbirdClient` → Telsiz (log yazma), `sb_secret_live_…`
|
|
1151
1151
|
* - `SignalbirdMessaging` → Gönderim (e-posta/SMS/push/kişi/kampanya), `sb_…`
|
|
1152
1152
|
* - `SignalbirdManagement` → Yönetim (Telsiz projesi, sohbet gelen kutusu,
|
|
1153
1153
|
* uygulama kaydı), `sb_…` + `radio|chat|apps` scope'ları
|
|
1154
1154
|
* - `SignalbirdPartner` → Partner (müşteri sağlama, modül yetkisi, gömme),
|
|
1155
|
-
*
|
|
1155
|
+
* gizli anahtar — yalnız sözleşmeli platformlar
|
|
1156
1156
|
*
|
|
1157
1157
|
* Son kullanıcı (ziyaretçi) yüzeyi ayrı giriş noktasındadır:
|
|
1158
1158
|
* `signalbird/app` — ve onun çatı uyarlamaları `/react`, `/vue`,
|
package/dist/index.d.ts
CHANGED
|
@@ -432,7 +432,7 @@ interface SbResult<T = unknown> {
|
|
|
432
432
|
*/
|
|
433
433
|
|
|
434
434
|
interface PartnerConfig {
|
|
435
|
-
/** `
|
|
435
|
+
/** `sb_secret_live_…` — gizli domain anahtarı. Tarayıcıya İNMEZ. */
|
|
436
436
|
domainKey: string;
|
|
437
437
|
baseUrl?: string;
|
|
438
438
|
timeout?: number;
|
|
@@ -1042,7 +1042,7 @@ declare class SignalbirdManagement {
|
|
|
1042
1042
|
* müşterinin kendi anahtarıyla (`sb_`) şirket açamaması içindi; o kural aynen
|
|
1043
1043
|
* duruyor. Sözleşmeli partner farklı bir taraftır.
|
|
1044
1044
|
*
|
|
1045
|
-
*
|
|
1045
|
+
* Gizli anahtar **asla tarayıcıya inmez**: gömme jetonunu partner'ın
|
|
1046
1046
|
* kendi sunucusu üretir, tarayıcı yalnız o kısa ömürlü jetonu görür.
|
|
1047
1047
|
*
|
|
1048
1048
|
* Sözleşme: docs/CONTRACT.md § 12
|
|
@@ -1147,12 +1147,12 @@ declare function verifyWebhook(rawBody: string | Uint8Array, signatureHeader: st
|
|
|
1147
1147
|
* kullanılır — gizli anahtar istemciye inmez.
|
|
1148
1148
|
*
|
|
1149
1149
|
* Üç sunucu istemcisi vardır; anahtarları ve kapıları farklıdır:
|
|
1150
|
-
* - `SignalbirdClient` → Telsiz (log yazma), `
|
|
1150
|
+
* - `SignalbirdClient` → Telsiz (log yazma), `sb_secret_live_…`
|
|
1151
1151
|
* - `SignalbirdMessaging` → Gönderim (e-posta/SMS/push/kişi/kampanya), `sb_…`
|
|
1152
1152
|
* - `SignalbirdManagement` → Yönetim (Telsiz projesi, sohbet gelen kutusu,
|
|
1153
1153
|
* uygulama kaydı), `sb_…` + `radio|chat|apps` scope'ları
|
|
1154
1154
|
* - `SignalbirdPartner` → Partner (müşteri sağlama, modül yetkisi, gömme),
|
|
1155
|
-
*
|
|
1155
|
+
* gizli anahtar — yalnız sözleşmeli platformlar
|
|
1156
1156
|
*
|
|
1157
1157
|
* Son kullanıcı (ziyaretçi) yüzeyi ayrı giriş noktasındadır:
|
|
1158
1158
|
* `signalbird/app` — ve onun çatı uyarlamaları `/react`, `/vue`,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/node/types.ts","../src/node/client.ts","../src/node/messaging.ts","../src/node/http.ts","../src/node/management.ts","../src/node/partner.ts","../src/node/webhook.ts","../src/node/index.ts"],"names":["code","message","buildQuery","createHmac","timingSafeEqual"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Telsiz (Radio) istemcisinin ortak tipleri.\n *\n * SDK'nın tek işi vardır: bir kanala mesaj yazmak. Bildirimin kime, hangi\n * kanaldan ve hangi saatte gideceği SUNUCUDA, kanal ayarlarında durur —\n * istemci bunu bilmez ve bilmemelidir. Aksi hâlde bildirim kuralını\n * değiştirmek için müşterinin kodunu yeniden yayınlaması gerekirdi.\n */\n\n/** Kanalın seviyesi; verilmezse kanalın kendi varsayılanı geçerlidir. */\nexport type Level = 'debug' | 'info' | 'warn' | 'error' | 'critical';\n\n/** Gizli domain anahtarının öneki — sunucu tarafı. */\nexport const SECRET_PREFIX = 'sb_secret_live_';\n\n/** Açık domain anahtarının öneki — tarayıcı ve mobil. */\nexport const PUBLIC_PREFIX = 'sb_public_live_';\n\nexport interface SignalbirdConfig {\n /**\n * Gizli domain anahtarı (`sb_secret_live_…`) — `SIGNALBIRD_DOMAIN_KEY`.\n *\n * Bu anahtar GİZLİDİR ve tarayıcıya gömülemez: sunucu `Origin` başlığı taşıyan\n * istekleri reddeder (401 `SECRET_KEY_IN_BROWSER`). Tarayıcı için\n * `signalbird/browser` ve açık anahtar (`sb_public_live_…`) kullanılır.\n *\n * v2 (1 Eyl 2026): eskiden `apiKey` idi ve yüzey başına ayrı bir anahtar\n * ailesi vardı (`sbr_live_`, `sb_`, `sbw_pub_`, `sbp_live_`). Hepsi tek\n * anahtara indi — sözleşme:\n * ../signalbird.api/docs/KEY_ARCHITECTURE_2026-09-01.md\n */\n domainKey: string;\n\n /** Varsayılan: https://live.signalbird.io/api */\n baseUrl?: string;\n\n /** Her olaya eklenen köken adı (sunucu adı, servis adı). */\n source?: string;\n\n /** İstek zaman aşımı (ms). Varsayılan 5000 — log göndermek isteği bekletmemeli. */\n timeout?: number;\n\n /**\n * Hata fırlatılsın mı. Varsayılan `false`.\n *\n * Log göndermek uygulamanın ASIL işi değildir: telsiz erişilemezse müşterinin\n * ödeme akışı çökmemelidir. Varsayılan davranış sessizce yutup `ok: false`\n * dönmektir; geliştirme sırasında `throwOnError: true` ile açılabilir.\n */\n throwOnError?: boolean;\n\n /** Konsola uyarı yazılsın mı (varsayılan: NODE_ENV !== 'production'). */\n debug?: boolean;\n}\n\nexport interface LogInput {\n /**\n * Modül anahtarı — panelde açtığınız kanalın adı (`penyuSatisBildirimi`).\n *\n * Gizli DEĞİLDİR ve kodun içinde durur: domain anahtarı olmadan hiçbir işe\n * yaramaz. Tanımsız bir ad gönderirseniz kanal SESSİZ olarak açılır — kayıt\n * düşmez, ama bildirim de gitmez; kuralı panelden siz koyarsınız.\n */\n key: string;\n message: string;\n level?: Level;\n context?: Record<string, unknown>;\n source?: string;\n}\n\nexport interface LogResult {\n ok: boolean;\n /** Sunucunun döndüğü olay kimliği (rev_…). */\n eventId?: string;\n /** Reddedildiyse sebep: INVALID_KEY, MODULE_DISABLED, LIMIT_REACHED… */\n code?: string;\n status?: number;\n}\n\nexport interface BatchResult {\n accepted: number;\n total: number;\n results: Record<number, { ok: boolean; eventId?: string; code?: string }>;\n}\n\n/** `throwOnError: true` iken fırlatılır. */\nexport class SignalbirdError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly code?: string,\n /** Sunucunun ham yanıt gövdesi (varsa) — gönderim istemcisi doldurur. */\n readonly body?: unknown\n ) {\n super(message);\n this.name = 'SignalbirdError';\n }\n}\n\nexport const DEFAULT_BASE_URL = 'https://live.signalbird.io/api';\n","/**\n * Telsiz istemcisi (sunucu tarafı).\n *\n * Bağımlılığı yoktur: Node 18+ ile gelen `fetch` kullanılır. Bir log\n * kütüphanesinin kendi bağımlılık zincirini müşterinin projesine taşıması,\n * sürüm çakışmalarının en sinir bozucu kaynağıdır.\n */\nimport {\n DEFAULT_BASE_URL,\n PUBLIC_PREFIX,\n SECRET_PREFIX,\n SignalbirdError,\n type BatchResult,\n type Level,\n type LogInput,\n type LogResult,\n type SignalbirdConfig,\n} from './types';\n\nexport class SignalbirdClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly throwOnError: boolean;\n private readonly debug: boolean;\n private readonly source?: string;\n\n constructor(private readonly config: SignalbirdConfig) {\n if (!config.domainKey) {\n throw new SignalbirdError('Signalbird: domainKey zorunlu.', 0, 'NO_KEY');\n }\n\n /*\n * Yanlış anahtar türü KURULUMDA yakalanır, ilk istekte değil.\n *\n * Açık anahtarı sunucuda kullanmak sessiz bir hatadır: istek gider,\n * `ORIGIN_REQUIRED` döner ve sebebi log'da görünmez. Haftalar sonra fark\n * etmektense burada durmak yeğdir.\n */\n if (config.domainKey.startsWith(PUBLIC_PREFIX)) {\n throw new SignalbirdError(\n 'Signalbird: sunucu istemcisine AÇIK anahtar (sb_public_live_…) verildi. ' +\n 'Gizli anahtarı (sb_secret_live_…) kullanın; açık anahtar tarayıcı içindir.',\n 0,\n 'WRONG_KEY_TYPE'\n );\n }\n\n if (!config.domainKey.startsWith(SECRET_PREFIX)) {\n throw new SignalbirdError(\n 'Signalbird: anahtar biçimi tanınmadı. Gizli domain anahtarı ' +\n '`sb_secret_live_` ile başlar (Panel → Alan adları → Anahtarlar).',\n 0,\n 'WRONG_KEY_TYPE'\n );\n }\n\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '');\n this.timeout = config.timeout ?? 5000;\n this.throwOnError = config.throwOnError ?? false;\n this.debug = config.debug ?? process.env.NODE_ENV !== 'production';\n this.source = config.source;\n }\n\n /** Tek kayıt gönderir. */\n async log(input: LogInput): Promise<LogResult> {\n return this.send('/v1/radio/log', {\n key: input.key,\n message: input.message,\n level: input.level,\n context: input.context,\n source: input.source ?? this.source,\n });\n }\n\n /**\n * Toplu gönderim — 100 kayda kadar.\n *\n * Kısmi başarı normaldir (kota tam ortada dolabilir), o yüzden sonuç tek bir\n * durum değil satır satır döner.\n */\n async batch(events: LogInput[]): Promise<BatchResult> {\n const payload = {\n events: events.slice(0, 100).map((event) => ({\n key: event.key,\n message: event.message,\n level: event.level,\n context: event.context,\n source: event.source ?? this.source,\n })),\n };\n\n const response = await this.request('/v1/radio/log/batch', payload);\n\n if (!response) {\n return { accepted: 0, total: events.length, results: {} };\n }\n\n const results: BatchResult['results'] = {};\n\n for (const [index, row] of Object.entries(response.body?.results ?? {})) {\n const value = row as { ok: boolean; event_id?: string; code?: string };\n results[Number(index)] = { ok: value.ok, eventId: value.event_id, code: value.code };\n }\n\n return {\n accepted: Number(response.body?.accepted ?? 0),\n total: Number(response.body?.total ?? events.length),\n results,\n };\n }\n\n // ── Seviye kısayolları ────────────────────────────────────────────────\n // İlk argüman MODÜL ANAHTARIDIR (panelde açtığınız kanalın adı), seviye\n // değil: `sb.error('kritikApiHatasi', '…')`.\n\n debugLog(key: string, message: string, context?: Record<string, unknown>) {\n return this.log({ key, message, level: 'debug', context });\n }\n\n info(key: string, message: string, context?: Record<string, unknown>) {\n return this.log({ key, message, level: 'info', context });\n }\n\n warn(key: string, message: string, context?: Record<string, unknown>) {\n return this.log({ key, message, level: 'warn', context });\n }\n\n error(key: string, message: string, context?: Record<string, unknown>) {\n return this.log({ key, message, level: 'error', context });\n }\n\n critical(key: string, message: string, context?: Record<string, unknown>) {\n return this.log({ key, message, level: 'critical', context });\n }\n\n /**\n * Yakalanmamış hataları Telsiz'e bağlar.\n *\n * Kancayı takıp süreci ÖLDÜRMEYE devam eder: `uncaughtException` sonrası\n * süreci ayakta tutmak, bozuk durumdaki bir uygulamayı çalıştırmaya devam\n * etmek demektir — log göndermek bunu meşrulaştırmaz.\n */\n captureUncaught(key = 'critical'): () => void {\n const onError = (error: Error) => {\n void this.log({\n key,\n message: error.message,\n level: 'critical',\n context: { stack: error.stack?.split('\\n').slice(0, 20).join('\\n') },\n });\n };\n\n const onRejection = (reason: unknown) => {\n void this.log({\n key,\n message: reason instanceof Error ? reason.message : String(reason),\n level: 'error',\n context: reason instanceof Error ? { stack: reason.stack } : undefined,\n });\n };\n\n process.on('uncaughtException', onError);\n process.on('unhandledRejection', onRejection);\n\n return () => {\n process.off('uncaughtException', onError);\n process.off('unhandledRejection', onRejection);\n };\n }\n\n private async send(path: string, payload: unknown): Promise<LogResult> {\n const response = await this.request(path, payload);\n\n if (!response) {\n return { ok: false, code: 'NETWORK_ERROR' };\n }\n\n if (!response.ok) {\n const code = response.body?.code ?? 'UNKNOWN';\n\n if (this.throwOnError) {\n throw new SignalbirdError(`Signalbird: ${code}`, response.status, code);\n }\n\n if (this.debug) {\n console.warn(`[signalbird] gönderilemedi: ${code} (HTTP ${response.status})`);\n }\n\n return { ok: false, code, status: response.status };\n }\n\n return { ok: true, eventId: response.body?.event_id, status: response.status };\n }\n\n private async request(\n path: string,\n payload: unknown\n ): Promise<{ ok: boolean; status: number; body: any } | null> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(this.baseUrl + path, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n // Kanonik başlık `X-Signalbird-Key`; `Authorization: Bearer` de\n // kabul edilir ama anahtarın bir OAuth jetonu olmadığı açık olsun.\n 'X-Signalbird-Key': this.config.domainKey,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n const body = await response.json().catch(() => ({}));\n\n return { ok: response.ok, status: response.status, body };\n } catch (error) {\n if (this.throwOnError) {\n throw new SignalbirdError(\n error instanceof Error ? error.message : 'network error',\n 0,\n 'NETWORK_ERROR'\n );\n }\n\n if (this.debug) {\n console.warn('[signalbird] ulaşılamadı:', error);\n }\n\n return null;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\nexport type { Level, LogInput, LogResult, BatchResult, SignalbirdConfig };\n","/**\n * Gönderim (Messaging) istemcisi — sunucu tarafı.\n *\n * Takım API anahtarıyla (`sb_…`) e-posta/SMS/push gönderir, kişi ve liste\n * yönetir, kampanya açar, mesaj durumlarını okur. Telsiz istemcisinden\n * (`SignalbirdClient`) ayrıdır: farklı anahtar, farklı kapı, farklı kota.\n *\n * Bağımlılığı yoktur (Node 18+ `fetch`). Retry yoktur: aynı iletiyi iki kez\n * göndermek, hiç göndermemekten pahalıdır — yeniden deneme kararı çağıranındır.\n *\n * Sözleşme: docs/CONTRACT.md § 8\n */\nimport { DEFAULT_BASE_URL, SignalbirdError } from './types';\nimport type {\n Batch,\n BulkContactsInput,\n BulkContactsResult,\n CampaignCreateResult,\n CampaignDetail,\n Contact,\n ContactInput,\n ContactList,\n CreateCampaignInput,\n CreateContactListInput,\n ListCampaignMessagesQuery,\n ListCampaignsQuery,\n ListContactsQuery,\n ListMessagesQuery,\n Message,\n MessagingConfig,\n Paginated,\n SbResult,\n SendEmailInput,\n SendPushInput,\n SendResult,\n SendSmsInput,\n SmsPreview,\n} from './messaging-types';\n\n/** Toplu kişi yüklemede tek istekteki üst sınır (API tarafı da bunu kabul eder). */\nconst BULK_CHUNK = 1000;\n\ntype Query = object | undefined;\n\nexport class SignalbirdMessaging {\n private readonly domainKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly throwOnError: boolean;\n private readonly debug: boolean;\n\n constructor(config: MessagingConfig) {\n if (!config.domainKey) {\n throw new SignalbirdError('Signalbird: domainKey zorunlu.', 0, 'NO_KEY');\n }\n /*\n * Açık anahtar (`sb_public_live_…`) buraya verilirse her istek 403 döner\n * (`SECRET_KEY_REQUIRED`). Kurulumda söylemek, haftalar sonra bulunacak\n * bir hatayı önler.\n */\n if (!config.domainKey.startsWith('sb_secret_live_')) {\n throw new SignalbirdError(\n 'Signalbird: bu istemci GİZLİ domain anahtarı ister (sb_secret_live_…). ' +\n 'Açık anahtar (sb_public_live_…) yalnız tarayıcı ve mobil içindir.',\n 0,\n 'WRONG_KEY_TYPE'\n );\n }\n\n this.domainKey = config.domainKey;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '');\n this.timeout = config.timeout ?? 15000;\n this.throwOnError = config.throwOnError ?? false;\n this.debug = config.debug ?? false;\n }\n\n // ── Gönderim ──────────────────────────────────────────────────────────\n\n sendEmail(input: SendEmailInput): Promise<SbResult<SendResult>> {\n return this.request('POST', '/v1/email/send', input);\n }\n\n sendSms(input: SendSmsInput): Promise<SbResult<SendResult>> {\n return this.request('POST', '/v1/sms/send', input);\n }\n\n /**\n * Otomasyon olayı — kendi sisteminizdeki bir olayı bildirir ve eşleşen\n * akışı tetikler (§11). Signalbird olayın anlamını bilmez; adı sizindir.\n */\n track(input: {\n event: string;\n contact: { email?: string; phone?: string; external_id?: string; first_name?: string; last_name?: string };\n data?: Record<string, unknown>;\n }): Promise<SbResult<{ enrolled: number; canceled: number; contact_id: number }>> {\n return this.request('POST', '/v1/events', input);\n }\n\n /** SMS parça/karakter hesabı — kota harcamaz. */\n previewSms(body: string): Promise<SbResult<SmsPreview>> {\n return this.request('POST', '/v1/sms/preview', { body });\n }\n\n sendPush(input: SendPushInput): Promise<SbResult<SendResult>> {\n return this.request('POST', '/v1/push/send', input);\n }\n\n // ── Kişiler ───────────────────────────────────────────────────────────\n\n listContacts(query?: ListContactsQuery): Promise<SbResult<Paginated<Contact>>> {\n return this.request('GET', '/v1/contacts', undefined, query);\n }\n\n createContact(contact: ContactInput): Promise<SbResult<Contact>> {\n return this.request('POST', '/v1/contacts', contact);\n }\n\n updateContact(id: number | string, contact: Partial<ContactInput>): Promise<SbResult<Contact>> {\n return this.request('PATCH', `/v1/contacts/${encodeURIComponent(id)}`, contact);\n }\n\n deleteContact(id: number | string): Promise<SbResult<unknown>> {\n return this.request('DELETE', `/v1/contacts/${encodeURIComponent(id)}`);\n }\n\n /**\n * Toplu kişi yükleme.\n *\n * 1000'lik parçalara bölünür ve SIRAYLA gönderilir (paralel değil: aynı\n * e-posta iki parçada da varsa yarış olmasın). Sonuçlar tek yanıtta\n * birleştirilir. Bir parça başarısız olursa o noktada durulur ve o ana kadar\n * biriken sayımlar `data` içinde döner — çağıran kaç kişinin işlendiğini görür.\n */\n async bulkContacts(input: BulkContactsInput): Promise<SbResult<BulkContactsResult>> {\n const merged: BulkContactsResult = { imported: 0, updated: 0, skipped: [] };\n const { contacts, ...rest } = input;\n let status = 200;\n\n if (contacts.length === 0) {\n return { ok: true, status, data: merged };\n }\n\n for (let offset = 0; offset < contacts.length; offset += BULK_CHUNK) {\n const chunk = contacts.slice(offset, offset + BULK_CHUNK);\n const result = await this.request<BulkContactsResult>('POST', '/v1/contacts/bulk', {\n ...rest,\n contacts: chunk,\n });\n\n if (!result.ok) {\n return { ...result, data: merged };\n }\n\n status = result.status;\n merged.imported += Number(result.data?.imported ?? 0);\n merged.updated += Number(result.data?.updated ?? 0);\n if (Array.isArray(result.data?.skipped)) {\n merged.skipped.push(...result.data.skipped);\n }\n }\n\n return { ok: true, status, data: merged };\n }\n\n // ── Listeler ──────────────────────────────────────────────────────────\n\n listContactLists(): Promise<SbResult<ContactList[] | Paginated<ContactList>>> {\n return this.request('GET', '/v1/contact-lists');\n }\n\n createContactList(input: CreateContactListInput): Promise<SbResult<ContactList>> {\n return this.request('POST', '/v1/contact-lists', input);\n }\n\n deleteContactList(id: number | string): Promise<SbResult<unknown>> {\n return this.request('DELETE', `/v1/contact-lists/${encodeURIComponent(id)}`);\n }\n\n // ── Kampanyalar ───────────────────────────────────────────────────────\n\n listCampaigns(query?: ListCampaignsQuery): Promise<SbResult<Paginated<Batch> | Batch[]>> {\n return this.request('GET', '/v1/campaigns', undefined, query);\n }\n\n createCampaign(input: CreateCampaignInput): Promise<SbResult<CampaignCreateResult>> {\n return this.request('POST', '/v1/campaigns', input);\n }\n\n getCampaign(id: number | string): Promise<SbResult<CampaignDetail>> {\n return this.request('GET', `/v1/campaigns/${encodeURIComponent(id)}`);\n }\n\n cancelCampaign(id: number | string): Promise<SbResult<unknown>> {\n return this.request('POST', `/v1/campaigns/${encodeURIComponent(id)}/cancel`);\n }\n\n listCampaignMessages(\n id: number | string,\n query?: ListCampaignMessagesQuery\n ): Promise<SbResult<Paginated<Message>>> {\n return this.request('GET', `/v1/campaigns/${encodeURIComponent(id)}/messages`, undefined, query);\n }\n\n /**\n * Bir kampanyanın tüm mesajlarını sayfa sayfa gezer.\n *\n * for await (const m of sdk.iterateCampaignMessages(42)) { … }\n *\n * Bir sayfa alınamazsa `SignalbirdError` fırlatır (sessiz yarım liste,\n * \"hepsi bu\" sanılır — o daha tehlikeli).\n */\n async *iterateCampaignMessages(\n id: number | string,\n query: Omit<ListCampaignMessagesQuery, 'page'> = {}\n ): AsyncGenerator<Message, void, undefined> {\n let page = 1;\n\n while (true) {\n const result = await this.listCampaignMessages(id, { per_page: 100, ...query, page });\n\n if (!result.ok) {\n throw new SignalbirdError(`Signalbird: ${result.code}`, result.status, result.code, result.data);\n }\n\n for (const message of result.data.data ?? []) {\n yield message;\n }\n\n if (page >= (result.data.last_page ?? 1) || (result.data.data ?? []).length === 0) {\n return;\n }\n\n page++;\n }\n }\n\n // ── Mesajlar ──────────────────────────────────────────────────────────\n\n listMessages(query?: ListMessagesQuery): Promise<SbResult<Paginated<Message>>> {\n return this.request('GET', '/v1/messages', undefined, query);\n }\n\n getMessage(id: string): Promise<SbResult<Message>> {\n return this.request('GET', `/v1/messages/${encodeURIComponent(id)}`);\n }\n\n // ── HTTP ──────────────────────────────────────────────────────────────\n\n private async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n path: string,\n body?: unknown,\n query?: Query\n ): Promise<SbResult<T>> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n const url = this.baseUrl + path + buildQuery(query);\n\n let status = 0;\n let data: any;\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n Accept: 'application/json',\n 'X-Signalbird-Key': this.domainKey,\n ...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n status = response.status;\n const text = await response.text();\n try {\n data = text ? JSON.parse(text) : null;\n } catch {\n data = text;\n }\n\n if (response.ok) {\n return { ok: true, status, data: data as T };\n }\n } catch (error) {\n const timedOut = error instanceof Error && error.name === 'AbortError';\n const code = timedOut ? 'TIMEOUT' : 'NETWORK_ERROR';\n const message = error instanceof Error ? error.message : 'network error';\n\n return this.fail(0, code, message, undefined);\n } finally {\n clearTimeout(timer);\n }\n\n // HTTP hatası: API `{message, code}` döner; Laravel doğrulama hatası\n // `{message, errors}` döner (kodsuz) — onu VALIDATION_ERROR sayarız.\n const code: string =\n (data && typeof data === 'object' && typeof data.code === 'string' && data.code) ||\n (status === 422 ? 'VALIDATION_ERROR' : status === 401 ? 'API_KEY_INVALID' : `HTTP_${status}`);\n const message: string =\n (data && typeof data === 'object' && typeof data.message === 'string' && data.message) ||\n `HTTP ${status}`;\n\n return this.fail(status, code, message, data);\n }\n\n private fail<T>(status: number, code: string, message: string, data: unknown): SbResult<T> {\n if (this.throwOnError) {\n throw new SignalbirdError(`Signalbird: ${code} — ${message}`, status, code, data);\n }\n\n if (this.debug) {\n console.warn(`[signalbird] ${code} (HTTP ${status}): ${message}`);\n }\n\n return { ok: false, status, code, message, data };\n }\n}\n\n/** `undefined`/`null` alanlar atlanır; diziler `key[]=` biçiminde gider. */\nfunction buildQuery(query: Query): string {\n if (!query) return '';\n\n const params = new URLSearchParams();\n\n for (const [key, value] of Object.entries(query as Record<string, unknown>)) {\n if (value === undefined || value === null) continue;\n\n if (Array.isArray(value)) {\n for (const item of value) params.append(`${key}[]`, String(item));\n } else {\n params.append(key, String(value));\n }\n }\n\n const encoded = params.toString();\n\n return encoded ? `?${encoded}` : '';\n}\n","/**\n * Anahtarlı istemcilerin ortak taşıma katmanı.\n *\n * Gönderim ve Yönetim istemcileri aynı kapıyı kullanır (`Authorization: Bearer\n * sb_…`), aynı zarfı döner ve aynı kod eşlemesini uygular. İki yerde ayrı ayrı\n * yazılsaydı biri düzeltilip diğeri unutulurdu — hata kodları da sözleşmenin\n * bir parçasıdır.\n *\n * Sözleşme: docs/CONTRACT.md § 8.2 (zarf) ve § 8.5 (sorgu dizesi)\n */\nimport { SignalbirdError } from './types';\n\n/** Her metodun döndüğü zarf. Başarısızlık istisna değil, veridir. */\nexport interface SbResult<T = unknown> {\n ok: boolean;\n status: number;\n data?: T;\n code?: string;\n message?: string;\n}\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport interface TransportConfig {\n domainKey: string;\n baseUrl: string;\n timeout: number;\n throwOnError: boolean;\n debug: boolean;\n}\n\nexport class SbTransport {\n constructor(private readonly config: TransportConfig) {}\n\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n query?: object\n ): Promise<SbResult<T>> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.config.timeout);\n const url = this.config.baseUrl + path + buildQuery(query);\n\n let status = 0;\n let data: any;\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n Accept: 'application/json',\n 'X-Signalbird-Key': this.config.domainKey,\n ...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n status = response.status;\n const text = await response.text();\n try {\n data = text ? JSON.parse(text) : null;\n } catch {\n data = text;\n }\n\n if (response.ok) {\n return { ok: true, status, data: data as T };\n }\n } catch (error) {\n const timedOut = error instanceof Error && error.name === 'AbortError';\n\n return this.fail(\n 0,\n timedOut ? 'TIMEOUT' : 'NETWORK_ERROR',\n error instanceof Error ? error.message : 'network error',\n undefined\n );\n } finally {\n clearTimeout(timer);\n }\n\n // API `{message, code}` döner; Laravel doğrulama hatası `{message, errors}`\n // döner (kodsuz) — onu VALIDATION_ERROR sayarız.\n const code: string =\n (data && typeof data === 'object' && typeof data.code === 'string' && data.code) ||\n (status === 422 ? 'VALIDATION_ERROR' : status === 401 ? 'API_KEY_INVALID' : `HTTP_${status}`);\n const message: string =\n (data && typeof data === 'object' && typeof data.message === 'string' && data.message) ||\n `HTTP ${status}`;\n\n return this.fail(status, code, message, data);\n }\n\n private fail<T>(status: number, code: string, message: string, data: unknown): SbResult<T> {\n if (this.config.throwOnError) {\n throw new SignalbirdError(`Signalbird: ${code} — ${message}`, status, code, data);\n }\n\n if (this.config.debug) {\n console.warn(`[signalbird] ${code} (HTTP ${status}): ${message}`);\n }\n\n return { ok: false, status, code, message, data: data as T };\n }\n}\n\n/** `undefined`/`null` alanlar atlanır; diziler `key[]=` biçiminde gider. */\nexport function buildQuery(query: object | undefined): string {\n if (!query) return '';\n\n const params = new URLSearchParams();\n\n for (const [key, value] of Object.entries(query as Record<string, unknown>)) {\n if (value === undefined || value === null) continue;\n\n if (Array.isArray(value)) {\n for (const item of value) params.append(`${key}[]`, String(item));\n } else {\n params.append(key, String(value));\n }\n }\n\n const encoded = params.toString();\n\n return encoded ? `?${encoded}` : '';\n}\n\n/** Yol parçası — kimlikler URL'e gömülmeden önce kodlanır. */\nexport function seg(value: string | number): string {\n return encodeURIComponent(String(value));\n}\n","/**\n * Yönetim (Management) istemcisi — sunucu tarafı.\n *\n * Müşterinin panelde tıklayarak yaptığı her şeyi kodla yapar: Telsiz projesi ve\n * kanalı açar, olay akışını okur, sohbet gelen kutusunu işler, uygulama kaydı\n * ve cihaz listesi yönetir.\n *\n * Bu ADMIN yüzeyi DEĞİLDİR. Anahtar tek bir takıma bağlıdır ve yalnız o takımın\n * kayıtlarına dokunur; başka takımın kaydı 404 döner.\n *\n * Neden ayrı sınıf: Gönderim (`SignalbirdMessaging`) ileti gönderir ve kota\n * harcar; bu istemci yapılandırma değiştirir. Aynı anahtar ailesini kullanırlar\n * (`sb_…`) ama scope'ları ve hata kümeleri farklıdır — tek sınıfta birleşseydi\n * \"hangi scope gerekiyordu\" sorusu her metotta yeniden sorulurdu.\n *\n * Sözleşme: docs/CONTRACT.md § 10\n */\nimport { SbTransport, seg, type SbResult } from './http';\nimport { DEFAULT_BASE_URL, SignalbirdError } from './types';\nimport type {\n KeyedModule,\n ModuleKey,\n ModuleKeyInput,\n ModuleKeyLevel,\n NotifyChannel,\n AppDevice,\n CannedReply,\n CannedReplyInput,\n ChatConversation,\n ChatMessage,\n ChatReport,\n ChatReportRange,\n ChatTrigger,\n ChatTriggerInput,\n ChatVisitor,\n ConversationStatus,\n ListAppDevicesQuery,\n ListChatMessagesQuery,\n ListConversationsQuery,\n ListRadioEventsQuery,\n ManagementConfig,\n Paginated,\n RadioEvent,\n ReplyInput,\n StartConversationInput,\n UpdateConversationInput,\n UpdateVisitorInput,\n TeamEmbedTokenInput,\n} from './management-types';\nimport type { EmbedToken } from './partner-types';\n\nexport class SignalbirdManagement {\n private readonly http: SbTransport;\n\n constructor(config: ManagementConfig) {\n if (!config.domainKey) {\n throw new SignalbirdError('Signalbird: domainKey zorunlu.', 0, 'NO_KEY');\n }\n /*\n * Açık anahtar (`sb_public_live_…`) buraya verilirse her istek 403 döner\n * (`SECRET_KEY_REQUIRED`). Kurulumda söylemek, haftalar sonra bulunacak\n * bir hatayı önler.\n */\n if (!config.domainKey.startsWith('sb_secret_live_')) {\n throw new SignalbirdError(\n 'Signalbird: bu istemci GİZLİ domain anahtarı ister (sb_secret_live_…). ' +\n 'Açık anahtar (sb_public_live_…) yalnız tarayıcı ve mobil içindir.',\n 0,\n 'WRONG_KEY_TYPE'\n );\n }\n\n this.http = new SbTransport({\n domainKey: config.domainKey,\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, ''),\n timeout: config.timeout ?? 15000,\n throwOnError: config.throwOnError ?? false,\n debug: config.debug ?? false,\n });\n }\n\n // ── Telsiz: projeler ──────────────────────────────────────────────────\n\n /** Panelin Telsiz özeti: proje sayısı, günlük hacim, son olaylar. */\n radioSummary(): Promise<SbResult<Record<string, unknown>>> {\n return this.http.request('GET', '/v1/radio/summary');\n }\n\n /** Olay akışı — kanal, seviye ve tarihe göre süzülür. */\n radioEvents(query?: ListRadioEventsQuery): Promise<SbResult<Paginated<RadioEvent>>> {\n return this.http.request('GET', '/v1/radio/events', undefined, query);\n }\n\n // ── Modül anahtarları ─────────────────────────────────────────────────\n //\n // Telsiz projesi/kanalı ve uygulama kaydı 1 Eyl 2026'da kaldırıldı\n // (../signalbird.api/docs/KEY_ARCHITECTURE_2026-09-01.md §3). Yerlerini TEK\n // bir uç ailesi aldı: modül anahtarları. Beş modülün (logger, email, sms,\n // push, chat) hepsi aynı gövdeyi kullanır — beş ayrı metot kümesi yazmak,\n // altıncı modül geldiğinde altıncısını yazmak demekti.\n\n listModuleKeys(\n module: KeyedModule,\n query?: { domain_id?: number }\n ): Promise<SbResult<{ data: ModuleKey[] }>> {\n return this.http.request('GET', `/v1/modules/${seg(module)}/keys`, undefined, query);\n }\n\n getModuleKey(module: KeyedModule, id: number | string): Promise<SbResult<{ module_key: ModuleKey }>> {\n return this.http.request('GET', `/v1/modules/${seg(module)}/keys/${seg(id)}`);\n }\n\n /**\n * Kanal açar.\n *\n * `key` verilmezse başlıktan üretilir ve çakışırsa sonuna sayı eklenir —\n * \"bu ad alınmış\" hatasıyla geri dönmek, CI'da kanal açan bir betiği\n * durdururdu.\n */\n createModuleKey(module: KeyedModule, input: ModuleKeyInput): Promise<SbResult<{ module_key: ModuleKey }>> {\n return this.http.request('POST', `/v1/modules/${seg(module)}/keys`, input);\n }\n\n /**\n * Kanalı günceller.\n *\n * `key` DEĞİŞTİRİLEBİLİR (eskiden değişmezdi): eski ad 30 gün daha kabul\n * edilir, böylece üretimdeki kod bir sonraki deploya kadar kayıt kaybetmez.\n * `keep_previous: false` ile eski ad anında kapatılır.\n */\n updateModuleKey(\n module: KeyedModule,\n id: number | string,\n input: ModuleKeyInput\n ): Promise<SbResult<{ module_key: ModuleKey }>> {\n return this.http.request('PATCH', `/v1/modules/${seg(module)}/keys/${seg(id)}`, input);\n }\n\n deleteModuleKey(module: KeyedModule, id: number | string): Promise<SbResult<unknown>> {\n return this.http.request('DELETE', `/v1/modules/${seg(module)}/keys/${seg(id)}`);\n }\n\n // ── Sohbet: gelen kutusu ──────────────────────────────────────────────\n\n chatSummary(): Promise<SbResult<Record<string, unknown>>> {\n return this.http.request('GET', '/v1/chat/summary');\n }\n\n /** Kısa aralıklı yoklama için: yalnız değişenler + çevrimiçi ajanlar. */\n chatUpdates(): Promise<SbResult<Record<string, unknown>>> {\n return this.http.request('GET', '/v1/chat/updates');\n }\n\n listConversations(\n query?: ListConversationsQuery\n ): Promise<SbResult<Paginated<ChatConversation>>> {\n return this.http.request('GET', '/v1/chat/conversations', undefined, query);\n }\n\n getConversation(id: string): Promise<SbResult<{ conversation: ChatConversation }>> {\n return this.http.request('GET', `/v1/chat/conversations/${seg(id)}`);\n }\n\n /** `after` imleci `cm_…` mesaj kimliğidir; yoklamada tam listeyi çekmez. */\n listConversationMessages(\n id: string,\n query?: ListChatMessagesQuery\n ): Promise<SbResult<{ messages: ChatMessage[] }>> {\n return this.http.request('GET', `/v1/chat/conversations/${seg(id)}/messages`, undefined, query);\n }\n\n /** Proaktif sohbet — ziyaretçi yazmadan ajan başlatır. */\n startConversation(input: StartConversationInput): Promise<SbResult<{ conversation: ChatConversation }>> {\n return this.http.request('POST', '/v1/chat/conversations', input);\n }\n\n updateConversation(\n id: string,\n input: UpdateConversationInput\n ): Promise<SbResult<{ conversation: ChatConversation }>> {\n return this.http.request('PATCH', `/v1/chat/conversations/${seg(id)}`, input);\n }\n\n setConversationStatus(\n id: string,\n status: ConversationStatus\n ): Promise<SbResult<{ conversation: ChatConversation }>> {\n return this.http.request('POST', `/v1/chat/conversations/${seg(id)}/status`, { status });\n }\n\n /**\n * Atama atomiktir: `userId` verilmezse çağıran anahtarın sahibine atanır.\n * Başkasına atanmış sohbeti devralmak `chat:write` ister.\n */\n assignConversation(\n id: string,\n userId?: number | null\n ): Promise<SbResult<{ conversation: ChatConversation }>> {\n return this.http.request('POST', `/v1/chat/conversations/${seg(id)}/assign`, {\n user_id: userId ?? null,\n });\n }\n\n readConversation(id: string, lastMessageId?: string): Promise<SbResult<unknown>> {\n return this.http.request('POST', `/v1/chat/conversations/${seg(id)}/read`, {\n last_message_id: lastMessageId,\n });\n }\n\n setTyping(id: string, isTyping: boolean): Promise<SbResult<unknown>> {\n return this.http.request('POST', `/v1/chat/conversations/${seg(id)}/typing`, {\n is_typing: isTyping,\n });\n }\n\n reply(id: string, input: ReplyInput): Promise<SbResult<{ message: ChatMessage }>> {\n return this.http.request('POST', `/v1/chat/conversations/${seg(id)}/messages`, input);\n }\n\n editChatMessage(\n id: string,\n messageId: string,\n body: string\n ): Promise<SbResult<{ message: ChatMessage }>> {\n return this.http.request('PATCH', `/v1/chat/conversations/${seg(id)}/messages/${seg(messageId)}`, {\n body,\n });\n }\n\n deleteChatMessage(id: string, messageId: string): Promise<SbResult<unknown>> {\n return this.http.request(\n 'DELETE',\n `/v1/chat/conversations/${seg(id)}/messages/${seg(messageId)}`\n );\n }\n\n /** Tepki açma/kapama — aynı emoji ikinci kez gönderilirse kaldırılır. */\n reactToChatMessage(\n id: string,\n messageId: string,\n emoji: string\n ): Promise<SbResult<{ message: ChatMessage }>> {\n return this.http.request(\n 'POST',\n `/v1/chat/conversations/${seg(id)}/messages/${seg(messageId)}/reactions`,\n { emoji }\n );\n }\n\n // ── Sohbet: ziyaretçi ve hazır yanıtlar ───────────────────────────────\n\n getVisitor(id: string): Promise<SbResult<{ visitor: ChatVisitor }>> {\n return this.http.request('GET', `/v1/chat/visitors/${seg(id)}`);\n }\n\n updateVisitor(id: string, input: UpdateVisitorInput): Promise<SbResult<{ visitor: ChatVisitor }>> {\n return this.http.request('PATCH', `/v1/chat/visitors/${seg(id)}`, input);\n }\n\n banVisitor(id: string): Promise<SbResult<{ visitor: ChatVisitor }>> {\n return this.http.request('POST', `/v1/chat/visitors/${seg(id)}/ban`);\n }\n\n listCannedReplies(): Promise<SbResult<{ data: CannedReply[] }>> {\n return this.http.request('GET', '/v1/chat/canned-replies');\n }\n\n createCannedReply(input: CannedReplyInput): Promise<SbResult<{ reply: CannedReply }>> {\n return this.http.request('POST', '/v1/chat/canned-replies', input);\n }\n\n updateCannedReply(\n id: number | string,\n input: CannedReplyInput\n ): Promise<SbResult<{ reply: CannedReply }>> {\n return this.http.request('PATCH', `/v1/chat/canned-replies/${seg(id)}`, input);\n }\n\n deleteCannedReply(id: number | string): Promise<SbResult<unknown>> {\n return this.http.request('DELETE', `/v1/chat/canned-replies/${seg(id)}`);\n }\n\n // ── Sohbet: tetikleyiciler ────────────────────────────────────────────\n // \"Şu olduğunda şunu yap.\" Kural KAYITTA durur, kodda değil: müşteri\n // davranışı değiştirmek için sürüm çıkarmak zorunda kalmasın.\n\n listChatTriggers(): Promise<SbResult<{ data: ChatTrigger[]; schema: Record<string, string[]> }>> {\n return this.http.request('GET', '/v1/chat/triggers');\n }\n\n createChatTrigger(input: ChatTriggerInput): Promise<SbResult<{ trigger: ChatTrigger }>> {\n return this.http.request('POST', '/v1/chat/triggers', input);\n }\n\n updateChatTrigger(id: number | string, input: Partial<ChatTriggerInput>): Promise<SbResult<{ trigger: ChatTrigger }>> {\n return this.http.request('PATCH', `/v1/chat/triggers/${seg(id)}`, input);\n }\n\n deleteChatTrigger(id: number | string): Promise<SbResult<unknown>> {\n return this.http.request('DELETE', `/v1/chat/triggers/${seg(id)}`);\n }\n\n // ── Sohbet: rapor ─────────────────────────────────────────────────────\n\n /**\n * Yanıt süresi, çözüm süresi, memnuniyet ve ajan kırılımı.\n * Veri yoksa süreler `null` döner — 0 DEĞİL.\n */\n chatReport(range: ChatReportRange = '30d'): Promise<SbResult<ChatReport>> {\n return this.http.request('GET', '/v1/chat/reports', undefined, { range });\n }\n\n // Uygulama uçları KALDIRILDI (1 Eyl 2026): \"uygulama\" ayrı bir kayıt\n // değil. Sohbet widget'ı ve push kanalı birer modül anahtarıdır —\n // `listModuleKeys('chat')`, `listModuleKeys('push')`. Anahtar döndürme de\n // yok: döndürülen şey DOMAIN anahtarıdır ve o panelden yönetilir.\n\n /**\n * Gömme jetonu — Signalbird ekranını KENDİ panelinizde göstermek için.\n *\n * 120 saniye yaşar ve TEK KULLANIMLIKTIR: dönen `url`'i doğrudan bir\n * iframe'e verin, saklamayın. Anahtarın `can_issue_embed` onayı ŞARTTIR —\n * scope sisteminden geriye kalan tek kapı, çünkü jeton 60 dakikalık bir\n * panel oturumuna çevriliyor.\n */\n embedToken(input: TeamEmbedTokenInput): Promise<SbResult<EmbedToken>> {\n return this.http.request('POST', '/v1/embed/tokens', input);\n }\n\n /** Push kanalına kayıtlı son kullanıcı cihazları (token MASKELİ döner). */\n listModuleKeyDevices(\n module: KeyedModule,\n id: number | string,\n query?: ListAppDevicesQuery\n ): Promise<SbResult<Paginated<AppDevice>>> {\n return this.http.request('GET', `/v1/modules/${seg(module)}/keys/${seg(id)}/devices`, undefined, query);\n }\n}\n","/**\n * Partner istemcisi — BEŞİNCİ yüzey.\n *\n * Signalbird'ü kendi ürününün içinde satan sözleşmeli platform (veribenim,\n * submitcms) müşterisini bununla sağlar ve yetkilendirir: company + takım +\n * owner açar, domain ekler ve izlemeye alır, uptime okur, modül açar/kapatır,\n * gömme jetonu üretir.\n *\n * **Bu, CLAUDE.md'deki \"Admin yüzeyi OLMAYACAK\" kuralının bilinçli\n * istisnasıdır** ve istisna olduğu için ayrı anahtar türü taşır. Kural,\n * müşterinin kendi anahtarıyla (`sb_`) şirket açamaması içindi; o kural aynen\n * duruyor. Sözleşmeli partner farklı bir taraftır.\n *\n * Anahtar `sbp_live_…` **asla tarayıcıya inmez**: gömme jetonunu partner'ın\n * kendi sunucusu üretir, tarayıcı yalnız o kısa ömürlü jetonu görür.\n *\n * Sözleşme: docs/CONTRACT.md § 12\n */\nimport { SbTransport, seg, type SbResult } from './http';\nimport { DEFAULT_BASE_URL, SignalbirdError } from './types';\nimport type {\n AddDomainInput,\n AddDomainResult,\n CreateCompanyInput,\n CreateCompanyResult,\n EmbedToken,\n EmbedTokenInput,\n GrantModuleInput,\n ModuleEntitlement,\n PartnerCompany,\n PartnerConfig,\n PartnerDomain,\n PartnerUser,\n PartnerUserInput,\n UptimeRange,\n UptimeReport,\n VerifyDomainResult,\n} from './partner-types';\n\nexport class SignalbirdPartner {\n private readonly http: SbTransport;\n\n constructor(config: PartnerConfig) {\n if (!config.domainKey) {\n throw new SignalbirdError('Signalbird: domainKey zorunlu.', 0, 'NO_KEY');\n }\n /*\n * Açık anahtar (`sb_public_live_…`) buraya verilirse her istek 403 döner\n * (`SECRET_KEY_REQUIRED`). Kurulumda söylemek, haftalar sonra bulunacak\n * bir hatayı önler.\n */\n if (!config.domainKey.startsWith('sb_secret_live_')) {\n throw new SignalbirdError(\n 'Signalbird: bu istemci GİZLİ domain anahtarı ister (sb_secret_live_…). ' +\n 'Açık anahtar (sb_public_live_…) yalnız tarayıcı ve mobil içindir.',\n 0,\n 'WRONG_KEY_TYPE'\n );\n }\n\n this.http = new SbTransport({\n domainKey: config.domainKey,\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, ''),\n timeout: config.timeout ?? 15000,\n throwOnError: config.throwOnError ?? false,\n debug: config.debug ?? false,\n });\n }\n\n // ── Müşteri ───────────────────────────────────────────────────────────\n\n /**\n * Company + takım + owner açar. **Idempotenttir**: aynı `external_id` ile\n * ikinci çağrı yeni kayıt açmaz, `created:false` ile var olanı döner.\n * Anahtarlar (`keys`) yalnız ilk oluşturmada gelir.\n */\n createCompany(input: CreateCompanyInput): Promise<SbResult<CreateCompanyResult>> {\n return this.http.request('POST', '/v1/partner/companies', input);\n }\n\n listCompanies(query?: { page?: number; q?: string; per_page?: number }): Promise<\n SbResult<{ data: PartnerCompany[]; meta: Record<string, number> }>\n > {\n return this.http.request('GET', '/v1/partner/companies', undefined, query);\n }\n\n getCompany(externalId: string): Promise<SbResult<{ company: PartnerCompany }>> {\n return this.http.request('GET', `/v1/partner/companies/${seg(externalId)}`);\n }\n\n updateCompany(\n externalId: string,\n input: { name?: string; is_active?: boolean }\n ): Promise<SbResult<{ company: PartnerCompany }>> {\n return this.http.request('PATCH', `/v1/partner/companies/${seg(externalId)}`, input);\n }\n\n /** Askıya alır — SİLMEZ. Müşterinin izleme ve mesaj geçmişi durur. */\n suspendCompany(externalId: string): Promise<SbResult<{ company: PartnerCompany }>> {\n return this.http.request('DELETE', `/v1/partner/companies/${seg(externalId)}`);\n }\n\n rotateKey(externalId: string, type: 'api' | 'app'): Promise<SbResult<{ type: string; key: string }>> {\n return this.http.request('POST', `/v1/partner/companies/${seg(externalId)}/keys/rotate`, { type });\n }\n\n // ── Domain ────────────────────────────────────────────────────────────\n\n /**\n * Domain ekler ve (istenirse) izlemeye alır. Kayıt `verified_via:'partner'`\n * ile doğar: izleme, sohbet ve push için yeter — **e-posta/SMS kampanyası\n * için TXT şarttır**. Yanıttaki `dns` kaydını yayınlayıp `verifyDomain`\n * çağırmak kapıyı açar.\n */\n addDomain(companyExternalId: string, input: AddDomainInput): Promise<SbResult<AddDomainResult>> {\n return this.http.request('POST', `/v1/partner/companies/${seg(companyExternalId)}/domains`, input);\n }\n\n listDomains(companyExternalId: string): Promise<SbResult<{ data: PartnerDomain[] }>> {\n return this.http.request('GET', `/v1/partner/companies/${seg(companyExternalId)}/domains`);\n }\n\n getDomain(externalId: string): Promise<SbResult<{ domain: PartnerDomain }>> {\n return this.http.request('GET', `/v1/partner/domains/${seg(externalId)}`);\n }\n\n /** TXT'yi hemen sorgular; eşleşirse domain kampanya kapısından geçer olur. */\n verifyDomain(externalId: string): Promise<SbResult<VerifyDomainResult>> {\n return this.http.request('POST', `/v1/partner/domains/${seg(externalId)}/verify`);\n }\n\n removeDomain(externalId: string): Promise<SbResult<{ deleted: boolean }>> {\n return this.http.request('DELETE', `/v1/partner/domains/${seg(externalId)}`);\n }\n\n domainUptime(externalId: string, range: UptimeRange = '24h'): Promise<SbResult<UptimeReport>> {\n return this.http.request('GET', `/v1/partner/domains/${seg(externalId)}/uptime`, undefined, { range });\n }\n\n /** Tek istekte müşterinin tüm domainleri — liste ekranı N+1 atmasın. */\n companyUptime(\n companyExternalId: string,\n range: UptimeRange = '24h'\n ): Promise<SbResult<{ range: string; data: UptimeReport[] }>> {\n return this.http.request(\n 'GET',\n `/v1/partner/companies/${seg(companyExternalId)}/uptime`,\n undefined,\n { range }\n );\n }\n\n // ── Mesaj günlüğü ─────────────────────────────────────────────────────\n //\n // Salt okur; alıcı maskeli, gövde yok (MESSAGING_UNIFICATION §5.1).\n\n listMessages(\n companyExternalId: string,\n query: Record<string, string | number | undefined> = {}\n ): Promise<SbResult<unknown>> {\n return this.http.request(\n 'GET',\n `/v1/partner/companies/${seg(companyExternalId)}/messages`,\n undefined,\n query\n );\n }\n\n getMessage(companyExternalId: string, messageId: string): Promise<SbResult<unknown>> {\n return this.http.request(\n 'GET',\n `/v1/partner/companies/${seg(companyExternalId)}/messages/${seg(messageId)}`\n );\n }\n\n messageSummary(companyExternalId: string, range = '7d'): Promise<SbResult<unknown>> {\n return this.http.request(\n 'GET',\n `/v1/partner/companies/${seg(companyExternalId)}/message-summary`,\n undefined,\n { range }\n );\n }\n\n // ── Modül yetkisi ─────────────────────────────────────────────────────\n\n listModules(companyExternalId: string): Promise<SbResult<{ data: ModuleEntitlement[] }>> {\n return this.http.request('GET', `/v1/partner/companies/${seg(companyExternalId)}/modules`);\n }\n\n /** \"Bu müşteri şu modül için ödeme yaptı, kullanabilir.\" */\n grantModule(companyExternalId: string, input: GrantModuleInput): Promise<SbResult<ModuleEntitlement>> {\n return this.http.request('POST', `/v1/partner/companies/${seg(companyExternalId)}/modules`, input);\n }\n\n /** Yalnız partner'ın KENDİ verdiği hakkı geri alır; plan hakkına dokunmaz. */\n revokeModule(companyExternalId: string, module: string): Promise<SbResult<{ removed: boolean }>> {\n return this.http.request(\n 'DELETE',\n `/v1/partner/companies/${seg(companyExternalId)}/modules/${seg(module)}`\n );\n }\n\n // ── Kullanıcı ─────────────────────────────────────────────────────────\n\n createUser(\n companyExternalId: string,\n input: PartnerUserInput\n ): Promise<SbResult<{ created: boolean; user: PartnerUser }>> {\n return this.http.request('POST', `/v1/partner/companies/${seg(companyExternalId)}/users`, input);\n }\n\n listUsers(companyExternalId: string): Promise<SbResult<{ data: PartnerUser[] }>> {\n return this.http.request('GET', `/v1/partner/companies/${seg(companyExternalId)}/users`);\n }\n\n /** Üyeliği kaldırır, kişinin Signalbird hesabını SİLMEZ. */\n removeUser(companyExternalId: string, userExternalId: string): Promise<SbResult<{ removed: boolean }>> {\n return this.http.request(\n 'DELETE',\n `/v1/partner/companies/${seg(companyExternalId)}/users/${seg(userExternalId)}`\n );\n }\n\n // ── Gömme ─────────────────────────────────────────────────────────────\n\n /**\n * Panel ekranını partner sayfasına gömmek için kısa ömürlü jeton üretir.\n * 120 saniye yaşar ve TEK KULLANIMLIKTIR — jeton URL'de gider, log ve\n * `Referer` başlığına düşer.\n */\n createEmbedToken(companyExternalId: string, input: EmbedTokenInput): Promise<SbResult<EmbedToken>> {\n return this.http.request('POST', `/v1/partner/companies/${seg(companyExternalId)}/embed`, input);\n }\n}\n","/**\n * Mesaj olay webhook'larının imza doğrulaması.\n *\n * Signalbird her teslimatı `X-Signalbird-Signature: sha256=<hex>` başlığıyla\n * imzalar: `hex(hmac_sha256(raw_body, secret))`. Doğrulama HAM gövde üzerinde\n * yapılmalıdır — JSON'u ayrıştırıp yeniden serileştirmek anahtar sırasını\n * değiştirir ve imzayı bozar. Express'te `express.raw()` ya da `verify`\n * kancasıyla ham gövdeyi saklayın.\n */\nimport { createHmac, timingSafeEqual } from 'node:crypto';\n\nexport function verifyWebhook(\n rawBody: string | Uint8Array,\n signatureHeader: string | null | undefined,\n secret: string\n): boolean {\n if (!signatureHeader || !secret) return false;\n\n // \"sha256=abcd…\" — başka algoritma ya da biçim kabul edilmez.\n const match = /^\\s*sha256=([a-f0-9]+)\\s*$/i.exec(signatureHeader);\n if (!match) return false;\n\n const expected = createHmac('sha256', secret).update(rawBody).digest('hex');\n const provided = match[1].toLowerCase();\n\n // Uzunluk farkı, `timingSafeEqual`in fırlatmaması için önce elenir; uzunluk\n // zaten sabit (64) olduğundan zamanlama sızıntısı yaratmaz.\n if (provided.length !== expected.length) return false;\n\n return timingSafeEqual(Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8'));\n}\n","/**\n * signalbird — sunucu tarafı giriş noktası.\n *\n * Next.js sunucu bileşenleri, API route'ları, Express/Fastify/NestJS ve düz\n * Node betikleri buradan alır. TARAYICI için `signalbird/browser`\n * kullanılır — gizli anahtar istemciye inmez.\n *\n * Üç sunucu istemcisi vardır; anahtarları ve kapıları farklıdır:\n * - `SignalbirdClient` → Telsiz (log yazma), `sbr_live_…`\n * - `SignalbirdMessaging` → Gönderim (e-posta/SMS/push/kişi/kampanya), `sb_…`\n * - `SignalbirdManagement` → Yönetim (Telsiz projesi, sohbet gelen kutusu,\n * uygulama kaydı), `sb_…` + `radio|chat|apps` scope'ları\n * - `SignalbirdPartner` → Partner (müşteri sağlama, modül yetkisi, gömme),\n * `sbp_live_…` — yalnız sözleşmeli platformlar\n *\n * Son kullanıcı (ziyaretçi) yüzeyi ayrı giriş noktasındadır:\n * `signalbird/app` — ve onun çatı uyarlamaları `/react`, `/vue`,\n * `/angular`, `/react-native`.\n */\nexport { SignalbirdClient } from './client';\nexport { SignalbirdMessaging } from './messaging';\nexport { SignalbirdManagement } from './management';\nexport { SignalbirdPartner } from './partner';\nexport { verifyWebhook } from './webhook';\nexport type {\n TeamEmbedTokenInput,\n ManagementConfig,\n AppDevice,\n AppPlatform,\n CannedReply,\n CannedReplyInput,\n ChatConversation,\n ChatMessage,\n ChatVisitor,\n ConversationStatus,\n ListAppDevicesQuery,\n ListChatMessagesQuery,\n ListConversationsQuery,\n ListRadioEventsQuery,\n RadioEvent,\n RadioLevel,\n ReplyInput,\n StartConversationInput,\n UpdateConversationInput,\n UpdateVisitorInput,\n} from './management-types';\nexport type {\n MessagingConfig,\n SbResult,\n MessageClass,\n Channel,\n SendEmailInput,\n SendSmsInput,\n SendPushInput,\n SendResult,\n SmsPreview,\n ContactInput,\n Contact,\n ListContactsQuery,\n BulkContactsInput,\n BulkContactsResult,\n ContactList,\n CreateContactListInput,\n CreateCampaignInput,\n Batch,\n CampaignCreateResult,\n CampaignDetail,\n ListCampaignsQuery,\n Message,\n ListMessagesQuery,\n ListCampaignMessagesQuery,\n Paginated,\n MessagingErrorCode,\n} from './messaging-types';\nexport type {\n PartnerConfig,\n AddDomainInput,\n AddDomainResult,\n CreateCompanyInput,\n CreateCompanyResult,\n DnsRecord,\n EmbedModule,\n EmbedToken,\n EmbedTokenInput,\n GrantModuleInput,\n ModuleEntitlement,\n PartnerCompany,\n PartnerDomain,\n PartnerOwnerInput,\n PartnerUser,\n PartnerUserInput,\n UptimeIncident,\n UptimeRange,\n UptimeReport,\n VerifyDomainResult,\n} from './partner-types';\nexport {\n SignalbirdError,\n DEFAULT_BASE_URL,\n type BatchResult,\n type Level,\n type LogInput,\n type LogResult,\n type SignalbirdConfig,\n} from './types';\n\nimport { SignalbirdClient } from './client';\nimport { SignalbirdManagement } from './management';\nimport type { ManagementConfig } from './management-types';\nimport type { SignalbirdConfig } from './types';\n\nlet singleton: SignalbirdClient | null = null;\n\n/**\n * Ortam değişkeninden kurulan paylaşımlı istemci.\n *\n * `SIGNALBIRD_DOMAIN_KEY` okunur. Uygulamanın her köşesinde istemci kurup\n * anahtarı elden ele taşımak yerine tek çağrı yeter:\n *\n * import { signalbird } from 'signalbird'\n * await signalbird().critical('kritikApiHatasi', 'ödeme servisi öldü')\n */\nexport function signalbird(config?: Partial<SignalbirdConfig>): SignalbirdClient {\n if (singleton && !config) {\n return singleton;\n }\n\n const domainKey = config?.domainKey ?? process.env.SIGNALBIRD_DOMAIN_KEY ?? '';\n\n const client = new SignalbirdClient({\n domainKey,\n baseUrl: config?.baseUrl ?? process.env.SIGNALBIRD_URL,\n source: config?.source ?? process.env.SIGNALBIRD_SOURCE,\n ...config,\n });\n\n if (!config) {\n singleton = client;\n }\n\n return client;\n}\n\n/** Test ve sıcak yeniden yükleme için tekil istemciyi sıfırlar. */\nexport function resetSignalbird(): void {\n singleton = null;\n}\n\nlet managementSingleton: SignalbirdManagement | null = null;\n\n/**\n * Ortam değişkeninden kurulan paylaşımlı yönetim istemcisi.\n *\n * `SIGNALBIRD_DOMAIN_KEY` okunur (yoksa `SIGNALBIRD_DOMAIN_KEY` — ikisi de aynı\n * takım anahtarı ailesidir ve çoğu kurulumda tek anahtar kullanılır).\n *\n * import { management } from 'signalbird'\n * await management().createModuleKey('logger', { title: 'Kritik API hatası' })\n */\nexport function management(config?: Partial<ManagementConfig>): SignalbirdManagement {\n if (managementSingleton && !config) {\n return managementSingleton;\n }\n\n const client = new SignalbirdManagement({\n domainKey:\n config?.domainKey ??\n process.env.SIGNALBIRD_DOMAIN_KEY ??\n process.env.SIGNALBIRD_DOMAIN_KEY ??\n '',\n baseUrl: config?.baseUrl ?? process.env.SIGNALBIRD_URL,\n ...config,\n });\n\n if (!config) {\n managementSingleton = client;\n }\n\n return client;\n}\n\n/** Test ve sıcak yeniden yükleme için yönetim istemcisini sıfırlar. */\nexport function resetManagement(): void {\n managementSingleton = null;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/node/types.ts","../src/node/client.ts","../src/node/messaging.ts","../src/node/http.ts","../src/node/management.ts","../src/node/partner.ts","../src/node/webhook.ts","../src/node/index.ts"],"names":["code","message","buildQuery","createHmac","timingSafeEqual"],"mappings":";;;;;AAaO,IAAM,aAAA,GAAgB,iBAAA;AAGtB,IAAM,aAAA,GAAgB,iBAAA;AAsEtB,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EACzC,WAAA,CACE,OAAA,EACS,MAAA,EACA,IAAA,EAEA,IAAA,EACT;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AALJ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAGT,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,gBAAA,GAAmB;;;AChFzB,IAAM,mBAAN,MAAuB;AAAA,EAO5B,YAA6B,MAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAC3B,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,MAAM,IAAI,eAAA,CAAgB,gCAAA,EAAkC,CAAA,EAAG,QAAQ,CAAA;AAAA,IACzE;AASA,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,aAAa,CAAA,EAAG;AAC9C,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,gMAAA;AAAA,QAEA,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,aAAa,CAAA,EAAG;AAC/C,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,oKAAA;AAAA,QAEA,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACrE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,KAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,OAAA,CAAQ,IAAI,QAAA,KAAa,YAAA;AACtD,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAAA,EACvB;AAAA;AAAA,EAGA,MAAM,IAAI,KAAA,EAAqC;AAC7C,IAAA,OAAO,IAAA,CAAK,KAAK,eAAA,EAAiB;AAAA,MAChC,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK;AAAA,KAC9B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAM,MAAA,EAA0C;AACpD,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,MAAA,EAAQ,OAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QAC3C,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK;AAAA,OAC/B,CAAE;AAAA,KACJ;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,uBAAuB,OAAO,CAAA;AAElE,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAE,UAAU,CAAA,EAAG,KAAA,EAAO,OAAO,MAAA,EAAQ,OAAA,EAAS,EAAC,EAAE;AAAA,IAC1D;AAEA,IAAA,MAAM,UAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAM,OAAA,IAAW,EAAE,CAAA,EAAG;AACvE,MAAA,MAAM,KAAA,GAAQ,GAAA;AACd,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA,GAAI,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,OAAA,EAAS,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,IACrF;AAEA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,YAAY,CAAC,CAAA;AAAA,MAC7C,OAAO,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,KAAA,IAAS,OAAO,MAAM,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,CAAS,GAAA,EAAa,OAAA,EAAiB,OAAA,EAAmC;AACxE,IAAA,OAAO,IAAA,CAAK,IAAI,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,CAAA;AAAA,EAC3D;AAAA,EAEA,IAAA,CAAK,GAAA,EAAa,OAAA,EAAiB,OAAA,EAAmC;AACpE,IAAA,OAAO,IAAA,CAAK,IAAI,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,MAAA,EAAQ,SAAS,CAAA;AAAA,EAC1D;AAAA,EAEA,IAAA,CAAK,GAAA,EAAa,OAAA,EAAiB,OAAA,EAAmC;AACpE,IAAA,OAAO,IAAA,CAAK,IAAI,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,MAAA,EAAQ,SAAS,CAAA;AAAA,EAC1D;AAAA,EAEA,KAAA,CAAM,GAAA,EAAa,OAAA,EAAiB,OAAA,EAAmC;AACrE,IAAA,OAAO,IAAA,CAAK,IAAI,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,CAAA;AAAA,EAC3D;AAAA,EAEA,QAAA,CAAS,GAAA,EAAa,OAAA,EAAiB,OAAA,EAAmC;AACxE,IAAA,OAAO,IAAA,CAAK,IAAI,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,UAAA,EAAY,SAAS,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAA,CAAgB,MAAM,UAAA,EAAwB;AAC5C,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAiB;AAChC,MAAA,KAAK,KAAK,GAAA,CAAI;AAAA,QACZ,GAAA;AAAA,QACA,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,KAAA,EAAO,UAAA;AAAA,QACP,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAE,OACpE,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,MAAA,KAAoB;AACvC,MAAA,KAAK,KAAK,GAAA,CAAI;AAAA,QACZ,GAAA;AAAA,QACA,SAAS,MAAA,YAAkB,KAAA,GAAQ,MAAA,CAAO,OAAA,GAAU,OAAO,MAAM,CAAA;AAAA,QACjE,KAAA,EAAO,OAAA;AAAA,QACP,SAAS,MAAA,YAAkB,KAAA,GAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,OAAM,GAAI;AAAA,OAC9D,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,OAAA,CAAQ,EAAA,CAAG,qBAAqB,OAAO,CAAA;AACvC,IAAA,OAAA,CAAQ,EAAA,CAAG,sBAAsB,WAAW,CAAA;AAE5C,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,GAAA,CAAI,qBAAqB,OAAO,CAAA;AACxC,MAAA,OAAA,CAAQ,GAAA,CAAI,sBAAsB,WAAW,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF;AAAA,EAEA,MAAc,IAAA,CAAK,IAAA,EAAc,OAAA,EAAsC;AACrE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,OAAO,CAAA;AAEjD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,eAAA,EAAgB;AAAA,IAC5C;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,IAAA,IAAQ,SAAA;AAEpC,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,YAAA,EAAe,IAAI,CAAA,CAAA,EAAI,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,MACxE;AAEA,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAK,CAAA,+BAAA,EAA+B,IAAI,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MAC9E;AAEA,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,SAAS,MAAA,EAAO;AAAA,IACpD;AAEA,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,OAAA,EAAS,SAAS,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAO;AAAA,EAC/E;AAAA,EAEA,MAAc,OAAA,CACZ,IAAA,EACA,OAAA,EAC4D;AAC5D,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAE/D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,UAAU,IAAA,EAAM;AAAA,QAChD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,MAAA,EAAQ,kBAAA;AAAA;AAAA;AAAA,UAGR,kBAAA,EAAoB,KAAK,MAAA,CAAO;AAAA,SAClC;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,QAC5B,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAEnD,MAAA,OAAO,EAAE,EAAA,EAAI,QAAA,CAAS,IAAI,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IAC1D,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,UACzC,CAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,4CAA6B,KAAK,CAAA;AAAA,MACjD;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AACF;;;ACpMA,IAAM,UAAA,GAAa,GAAA;AAIZ,IAAM,sBAAN,MAA0B;AAAA,EAO/B,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,MAAM,IAAI,eAAA,CAAgB,gCAAA,EAAkC,CAAA,EAAG,QAAQ,CAAA;AAAA,IACzE;AAMA,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,iBAAiB,CAAA,EAAG;AACnD,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,6LAAA;AAAA,QAEA,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACrE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,IAAA;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,KAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,IAAS,KAAA;AAAA,EAC/B;AAAA;AAAA,EAIA,UAAU,KAAA,EAAsD;AAC9D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,gBAAA,EAAkB,KAAK,CAAA;AAAA,EACrD;AAAA,EAEA,QAAQ,KAAA,EAAoD;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,cAAA,EAAgB,KAAK,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,EAI4E;AAChF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,YAAA,EAAc,KAAK,CAAA;AAAA,EACjD;AAAA;AAAA,EAGA,WAAW,IAAA,EAA6C;AACtD,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,EAAQ,iBAAA,EAAmB,EAAE,MAAM,CAAA;AAAA,EACzD;AAAA,EAEA,SAAS,KAAA,EAAqD;AAC5D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,eAAA,EAAiB,KAAK,CAAA;AAAA,EACpD;AAAA;AAAA,EAIA,aAAa,KAAA,EAAkE;AAC7E,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,cAAA,EAAgB,QAAW,KAAK,CAAA;AAAA,EAC7D;AAAA,EAEA,cAAc,OAAA,EAAmD;AAC/D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,cAAA,EAAgB,OAAO,CAAA;AAAA,EACrD;AAAA,EAEA,aAAA,CAAc,IAAqB,OAAA,EAA4D;AAC7F,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,EAAS,CAAA,aAAA,EAAgB,mBAAmB,EAAE,CAAC,IAAI,OAAO,CAAA;AAAA,EAChF;AAAA,EAEA,cAAc,EAAA,EAAiD;AAC7D,IAAA,OAAO,KAAK,OAAA,CAAQ,QAAA,EAAU,gBAAgB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aAAa,KAAA,EAAiE;AAClF,IAAA,MAAM,MAAA,GAA6B,EAAE,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAC1E,IAAA,MAAM,EAAE,QAAA,EAAU,GAAG,IAAA,EAAK,GAAI,KAAA;AAC9B,IAAA,IAAI,MAAA,GAAS,GAAA;AAEb,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,IAC1C;AAEA,IAAA,KAAA,IAAS,SAAS,CAAA,EAAG,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,UAAU,UAAA,EAAY;AACnE,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,MAAA,EAAQ,SAAS,UAAU,CAAA;AACxD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAA4B,QAAQ,mBAAA,EAAqB;AAAA,QACjF,GAAG,IAAA;AAAA,QACH,QAAA,EAAU;AAAA,OACX,CAAA;AAED,MAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,QAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAO;AAAA,MACnC;AAEA,MAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAChB,MAAA,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,YAAY,CAAC,CAAA;AACpD,MAAA,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,WAAW,CAAC,CAAA;AAClD,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA,EAAG;AACvC,QAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,EAC1C;AAAA;AAAA,EAIA,gBAAA,GAA8E;AAC5E,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,mBAAmB,CAAA;AAAA,EAChD;AAAA,EAEA,kBAAkB,KAAA,EAA+D;AAC/E,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,mBAAA,EAAqB,KAAK,CAAA;AAAA,EACxD;AAAA,EAEA,kBAAkB,EAAA,EAAiD;AACjE,IAAA,OAAO,KAAK,OAAA,CAAQ,QAAA,EAAU,qBAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAC7E;AAAA;AAAA,EAIA,cAAc,KAAA,EAA2E;AACvF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,eAAA,EAAiB,QAAW,KAAK,CAAA;AAAA,EAC9D;AAAA,EAEA,eAAe,KAAA,EAAqE;AAClF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,eAAA,EAAiB,KAAK,CAAA;AAAA,EACpD;AAAA,EAEA,YAAY,EAAA,EAAwD;AAClE,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,EAAO,iBAAiB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACtE;AAAA,EAEA,eAAe,EAAA,EAAiD;AAC9D,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,EAAQ,iBAAiB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAC9E;AAAA,EAEA,oBAAA,CACE,IACA,KAAA,EACuC;AACvC,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,EAAO,CAAA,cAAA,EAAiB,mBAAmB,EAAE,CAAC,CAAA,SAAA,CAAA,EAAa,MAAA,EAAW,KAAK,CAAA;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,uBAAA,CACL,EAAA,EACA,KAAA,GAAiD,EAAC,EACR;AAC1C,IAAA,IAAI,IAAA,GAAO,CAAA;AAEX,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,oBAAA,CAAqB,EAAA,EAAI,EAAE,QAAA,EAAU,GAAA,EAAK,GAAG,KAAA,EAAO,IAAA,EAAM,CAAA;AAEpF,MAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,QAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA;AAAA,MACjG;AAEA,MAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG;AAC5C,QAAA,MAAM,OAAA;AAAA,MACR;AAEA,MAAA,IAAI,IAAA,KAAS,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,CAAA,CAAA,IAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG,MAAA,KAAW,CAAA,EAAG;AACjF,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,EAAA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,aAAa,KAAA,EAAkE;AAC7E,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,cAAA,EAAgB,QAAW,KAAK,CAAA;AAAA,EAC7D;AAAA,EAEA,WAAW,EAAA,EAAwC;AACjD,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,EAAO,gBAAgB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACrE;AAAA;AAAA,EAIA,MAAc,OAAA,CACZ,MAAA,EACA,IAAA,EACA,MACA,KAAA,EACsB;AACtB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAC/D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,GAAU,IAAA,GAAO,WAAW,KAAK,CAAA;AAElD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ,kBAAA;AAAA,UACR,oBAAoB,IAAA,CAAK,SAAA;AAAA,UACzB,GAAI,IAAA,KAAS,KAAA,CAAA,GAAY,EAAE,cAAA,EAAgB,kBAAA,KAAuB;AAAC,SACrE;AAAA,QACA,MAAM,IAAA,KAAS,KAAA,CAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QAClD,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,MAAA,GAAS,QAAA,CAAS,MAAA;AAClB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,MACnC,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,GAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAgB;AAAA,MAC7C;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA;AAC1D,MAAA,MAAMA,KAAAA,GAAO,WAAW,SAAA,GAAY,eAAA;AACpC,MAAA,MAAMC,QAAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAEzD,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAA,EAAGD,KAAAA,EAAMC,UAAS,MAAS,CAAA;AAAA,IAC9C,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAIA,IAAA,MAAM,OACH,IAAA,IAAQ,OAAO,SAAS,QAAA,IAAY,OAAO,KAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,KAC1E,WAAW,GAAA,GAAM,kBAAA,GAAqB,WAAW,GAAA,GAAM,iBAAA,GAAoB,QAAQ,MAAM,CAAA,CAAA,CAAA;AAC5F,IAAA,MAAM,OAAA,GACH,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,IAAY,IAAA,CAAK,OAAA,IAC9E,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA;AAEhB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAI,CAAA;AAAA,EAC9C;AAAA,EAEQ,IAAA,CAAQ,MAAA,EAAgB,IAAA,EAAc,OAAA,EAAiB,IAAA,EAA4B;AACzF,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,IAAI,gBAAgB,CAAA,YAAA,EAAe,IAAI,WAAM,OAAO,CAAA,CAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,IAClF;AAEA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAK,CAAA,aAAA,EAAgB,IAAI,UAAU,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,EAClD;AACF;AAGA,SAAS,WAAW,KAAA,EAAsB;AACxC,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AAC3E,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAE3C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,MAAA,CAAO,MAAA,CAAO,GAAG,GAAG,CAAA,EAAA,CAAA,EAAM,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IAClE,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,OAAO,QAAA,EAAS;AAEhC,EAAA,OAAO,OAAA,GAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,GAAK,EAAA;AACnC;;;ACnTO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,MAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA0B;AAAA,EAEvD,MAAM,OAAA,CACJ,MAAA,EACA,IAAA,EACA,MACA,KAAA,EACsB;AACtB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AACtE,IAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,IAAA,GAAOC,YAAW,KAAK,CAAA;AAEzD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ,kBAAA;AAAA,UACR,kBAAA,EAAoB,KAAK,MAAA,CAAO,SAAA;AAAA,UAChC,GAAI,IAAA,KAAS,KAAA,CAAA,GAAY,EAAE,cAAA,EAAgB,kBAAA,KAAuB;AAAC,SACrE;AAAA,QACA,MAAM,IAAA,KAAS,KAAA,CAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QAClD,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,MAAA,GAAS,QAAA,CAAS,MAAA;AAClB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,MACnC,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,GAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAgB;AAAA,MAC7C;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA;AAE1D,MAAA,OAAO,IAAA,CAAK,IAAA;AAAA,QACV,CAAA;AAAA,QACA,WAAW,SAAA,GAAY,eAAA;AAAA,QACvB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,QACzC;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAIA,IAAA,MAAM,OACH,IAAA,IAAQ,OAAO,SAAS,QAAA,IAAY,OAAO,KAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,KAC1E,WAAW,GAAA,GAAM,kBAAA,GAAqB,WAAW,GAAA,GAAM,iBAAA,GAAoB,QAAQ,MAAM,CAAA,CAAA,CAAA;AAC5F,IAAA,MAAM,OAAA,GACH,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,IAAY,IAAA,CAAK,OAAA,IAC9E,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA;AAEhB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAI,CAAA;AAAA,EAC9C;AAAA,EAEQ,IAAA,CAAQ,MAAA,EAAgB,IAAA,EAAc,OAAA,EAAiB,IAAA,EAA4B;AACzF,IAAA,IAAI,IAAA,CAAK,OAAO,YAAA,EAAc;AAC5B,MAAA,MAAM,IAAI,gBAAgB,CAAA,YAAA,EAAe,IAAI,WAAM,OAAO,CAAA,CAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,IAClF;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,KAAK,CAAA,aAAA,EAAgB,IAAI,UAAU,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAA,EAAgB;AAAA,EAC7D;AACF,CAAA;AAGO,SAASA,YAAW,KAAA,EAAmC;AAC5D,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AAC3E,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAE3C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,MAAA,CAAO,MAAA,CAAO,GAAG,GAAG,CAAA,EAAA,CAAA,EAAM,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IAClE,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,OAAO,QAAA,EAAS;AAEhC,EAAA,OAAO,OAAA,GAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,GAAK,EAAA;AACnC;AAGO,SAAS,IAAI,KAAA,EAAgC;AAClD,EAAA,OAAO,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAC,CAAA;AACzC;;;ACjFO,IAAM,uBAAN,MAA2B;AAAA,EAGhC,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,MAAM,IAAI,eAAA,CAAgB,gCAAA,EAAkC,CAAA,EAAG,QAAQ,CAAA;AAAA,IACzE;AAMA,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,iBAAiB,CAAA,EAAG;AACnD,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,6LAAA;AAAA,QAEA,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,WAAA,CAAY;AAAA,MAC1B,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAU,MAAA,CAAO,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,OAAA,IAAW,IAAA;AAAA,MAC3B,YAAA,EAAc,OAAO,YAAA,IAAgB,KAAA;AAAA,MACrC,KAAA,EAAO,OAAO,KAAA,IAAS;AAAA,KACxB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,YAAA,GAA2D;AACzD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,mBAAmB,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,YAAY,KAAA,EAAwE;AAClF,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,kBAAA,EAAoB,QAAW,KAAK,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAA,CACE,QACA,KAAA,EAC0C;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAA,YAAA,EAAe,IAAI,MAAM,CAAC,CAAA,KAAA,CAAA,EAAS,MAAA,EAAW,KAAK,CAAA;AAAA,EACrF;AAAA,EAEA,YAAA,CAAa,QAAqB,EAAA,EAAmE;AACnG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAA,YAAA,EAAe,GAAA,CAAI,MAAM,CAAC,CAAA,MAAA,EAAS,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAA,CAAgB,QAAqB,KAAA,EAAqE;AACxG,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,eAAe,GAAA,CAAI,MAAM,CAAC,CAAA,KAAA,CAAA,EAAS,KAAK,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAA,CACE,MAAA,EACA,EAAA,EACA,KAAA,EAC8C;AAC9C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,YAAA,EAAe,GAAA,CAAI,MAAM,CAAC,CAAA,MAAA,EAAS,GAAA,CAAI,EAAE,CAAC,IAAI,KAAK,CAAA;AAAA,EACvF;AAAA,EAEA,eAAA,CAAgB,QAAqB,EAAA,EAAiD;AACpF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,CAAA,YAAA,EAAe,GAAA,CAAI,MAAM,CAAC,CAAA,MAAA,EAAS,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACjF;AAAA;AAAA,EAIA,WAAA,GAA0D;AACxD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,kBAAkB,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,WAAA,GAA0D;AACxD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,kBAAkB,CAAA;AAAA,EACpD;AAAA,EAEA,kBACE,KAAA,EACgD;AAChD,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,wBAAA,EAA0B,QAAW,KAAK,CAAA;AAAA,EAC5E;AAAA,EAEA,gBAAgB,EAAA,EAAmE;AACjF,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,KAAA,EAAO,0BAA0B,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACrE;AAAA;AAAA,EAGA,wBAAA,CACE,IACA,KAAA,EACgD;AAChD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAA,uBAAA,EAA0B,IAAI,EAAE,CAAC,CAAA,SAAA,CAAA,EAAa,MAAA,EAAW,KAAK,CAAA;AAAA,EAChG;AAAA;AAAA,EAGA,kBAAkB,KAAA,EAAsF;AACtG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,0BAA0B,KAAK,CAAA;AAAA,EAClE;AAAA,EAEA,kBAAA,CACE,IACA,KAAA,EACuD;AACvD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,OAAA,EAAS,0BAA0B,GAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,EAC9E;AAAA,EAEA,qBAAA,CACE,IACA,MAAA,EACuD;AACvD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,uBAAA,EAA0B,GAAA,CAAI,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW,EAAE,MAAA,EAAQ,CAAA;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAA,CACE,IACA,MAAA,EACuD;AACvD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,0BAA0B,GAAA,CAAI,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,MAC3E,SAAS,MAAA,IAAU;AAAA,KACpB,CAAA;AAAA,EACH;AAAA,EAEA,gBAAA,CAAiB,IAAY,aAAA,EAAoD;AAC/E,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,0BAA0B,GAAA,CAAI,EAAE,CAAC,CAAA,KAAA,CAAA,EAAS;AAAA,MACzE,eAAA,EAAiB;AAAA,KAClB,CAAA;AAAA,EACH;AAAA,EAEA,SAAA,CAAU,IAAY,QAAA,EAA+C;AACnE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,0BAA0B,GAAA,CAAI,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,MAC3E,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAAA,EAEA,KAAA,CAAM,IAAY,KAAA,EAAgE;AAChF,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,0BAA0B,GAAA,CAAI,EAAE,CAAC,CAAA,SAAA,CAAA,EAAa,KAAK,CAAA;AAAA,EACtF;AAAA,EAEA,eAAA,CACE,EAAA,EACA,SAAA,EACA,IAAA,EAC6C;AAC7C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,uBAAA,EAA0B,GAAA,CAAI,EAAE,CAAC,CAAA,UAAA,EAAa,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA,EAAI;AAAA,MAChG;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,iBAAA,CAAkB,IAAY,SAAA,EAA+C;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA;AAAA,MACf,QAAA;AAAA,MACA,0BAA0B,GAAA,CAAI,EAAE,CAAC,CAAA,UAAA,EAAa,GAAA,CAAI,SAAS,CAAC,CAAA;AAAA,KAC9D;AAAA,EACF;AAAA;AAAA,EAGA,kBAAA,CACE,EAAA,EACA,SAAA,EACA,KAAA,EAC6C;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA;AAAA,MACf,MAAA;AAAA,MACA,0BAA0B,GAAA,CAAI,EAAE,CAAC,CAAA,UAAA,EAAa,GAAA,CAAI,SAAS,CAAC,CAAA,UAAA,CAAA;AAAA,MAC5D,EAAE,KAAA;AAAM,KACV;AAAA,EACF;AAAA;AAAA,EAIA,WAAW,EAAA,EAAyD;AAClE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,KAAA,EAAO,qBAAqB,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAChE;AAAA,EAEA,aAAA,CAAc,IAAY,KAAA,EAAwE;AAChG,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,OAAA,EAAS,qBAAqB,GAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,EACzE;AAAA,EAEA,WAAW,EAAA,EAAyD;AAClE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,qBAAqB,GAAA,CAAI,EAAE,CAAC,CAAA,IAAA,CAAM,CAAA;AAAA,EACrE;AAAA,EAEA,iBAAA,GAAgE;AAC9D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,yBAAyB,CAAA;AAAA,EAC3D;AAAA,EAEA,kBAAkB,KAAA,EAAoE;AACpF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,2BAA2B,KAAK,CAAA;AAAA,EACnE;AAAA,EAEA,iBAAA,CACE,IACA,KAAA,EAC2C;AAC3C,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,OAAA,EAAS,2BAA2B,GAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,EAC/E;AAAA,EAEA,kBAAkB,EAAA,EAAiD;AACjE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,QAAA,EAAU,2BAA2B,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAiG;AAC/F,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,mBAAmB,CAAA;AAAA,EACrD;AAAA,EAEA,kBAAkB,KAAA,EAAsE;AACtF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,qBAAqB,KAAK,CAAA;AAAA,EAC7D;AAAA,EAEA,iBAAA,CAAkB,IAAqB,KAAA,EAA+E;AACpH,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,OAAA,EAAS,qBAAqB,GAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,EACzE;AAAA,EAEA,kBAAkB,EAAA,EAAiD;AACjE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,QAAA,EAAU,qBAAqB,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAA,CAAW,QAAyB,KAAA,EAAsC;AACxE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,KAAA,EAAO,oBAAoB,MAAA,EAAW,EAAE,OAAO,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,WAAW,KAAA,EAA2D;AACpE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,oBAAoB,KAAK,CAAA;AAAA,EAC5D;AAAA;AAAA,EAGA,oBAAA,CACE,MAAA,EACA,EAAA,EACA,KAAA,EACyC;AACzC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,eAAe,GAAA,CAAI,MAAM,CAAC,CAAA,MAAA,EAAS,GAAA,CAAI,EAAE,CAAC,CAAA,QAAA,CAAA,EAAY,QAAW,KAAK,CAAA;AAAA,EACxG;AACF;;;AC1SO,IAAM,oBAAN,MAAwB;AAAA,EAG7B,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,MAAM,IAAI,eAAA,CAAgB,gCAAA,EAAkC,CAAA,EAAG,QAAQ,CAAA;AAAA,IACzE;AAMA,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,iBAAiB,CAAA,EAAG;AACnD,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,6LAAA;AAAA,QAEA,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,WAAA,CAAY;AAAA,MAC1B,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAU,MAAA,CAAO,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,OAAA,IAAW,IAAA;AAAA,MAC3B,YAAA,EAAc,OAAO,YAAA,IAAgB,KAAA;AAAA,MACrC,KAAA,EAAO,OAAO,KAAA,IAAS;AAAA,KACxB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cAAc,KAAA,EAAmE;AAC/E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,yBAAyB,KAAK,CAAA;AAAA,EACjE;AAAA,EAEA,cAAc,KAAA,EAEZ;AACA,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,uBAAA,EAAyB,QAAW,KAAK,CAAA;AAAA,EAC3E;AAAA,EAEA,WAAW,UAAA,EAAoE;AAC7E,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,KAAA,EAAO,yBAAyB,GAAA,CAAI,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAC5E;AAAA,EAEA,aAAA,CACE,YACA,KAAA,EACgD;AAChD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,OAAA,EAAS,yBAAyB,GAAA,CAAI,UAAU,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,EACrF;AAAA;AAAA,EAGA,eAAe,UAAA,EAAoE;AACjF,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,QAAA,EAAU,yBAAyB,GAAA,CAAI,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/E;AAAA,EAEA,SAAA,CAAU,YAAoB,IAAA,EAAuE;AACnG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,sBAAA,EAAyB,GAAA,CAAI,UAAU,CAAC,CAAA,YAAA,CAAA,EAAgB,EAAE,IAAA,EAAM,CAAA;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,SAAA,CAAU,mBAA2B,KAAA,EAA2D;AAC9F,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,yBAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,QAAA,CAAA,EAAY,KAAK,CAAA;AAAA,EACnG;AAAA,EAEA,YAAY,iBAAA,EAAyE;AACnF,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,KAAA,EAAO,yBAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,QAAA,CAAU,CAAA;AAAA,EAC3F;AAAA,EAEA,UAAU,UAAA,EAAkE;AAC1E,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,KAAA,EAAO,uBAAuB,GAAA,CAAI,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAC1E;AAAA;AAAA,EAGA,aAAa,UAAA,EAA2D;AACtE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,uBAAuB,GAAA,CAAI,UAAU,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAClF;AAAA,EAEA,aAAa,UAAA,EAA6D;AACxE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,QAAA,EAAU,uBAAuB,GAAA,CAAI,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAC7E;AAAA,EAEA,YAAA,CAAa,UAAA,EAAoB,KAAA,GAAqB,KAAA,EAAwC;AAC5F,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAA,oBAAA,EAAuB,GAAA,CAAI,UAAU,CAAC,CAAA,OAAA,CAAA,EAAW,MAAA,EAAW,EAAE,KAAA,EAAO,CAAA;AAAA,EACvG;AAAA;AAAA,EAGA,aAAA,CACE,iBAAA,EACA,KAAA,GAAqB,KAAA,EACuC;AAC5D,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA;AAAA,MACf,KAAA;AAAA,MACA,CAAA,sBAAA,EAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,OAAA,CAAA;AAAA,MAC/C,MAAA;AAAA,MACA,EAAE,KAAA;AAAM,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,CACE,iBAAA,EACA,KAAA,GAAqD,EAAC,EAC1B;AAC5B,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA;AAAA,MACf,KAAA;AAAA,MACA,CAAA,sBAAA,EAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,SAAA,CAAA;AAAA,MAC/C,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,UAAA,CAAW,mBAA2B,SAAA,EAA+C;AACnF,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA;AAAA,MACf,KAAA;AAAA,MACA,yBAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,UAAA,EAAa,GAAA,CAAI,SAAS,CAAC,CAAA;AAAA,KAC5E;AAAA,EACF;AAAA,EAEA,cAAA,CAAe,iBAAA,EAA2B,KAAA,GAAQ,IAAA,EAAkC;AAClF,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA;AAAA,MACf,KAAA;AAAA,MACA,CAAA,sBAAA,EAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,gBAAA,CAAA;AAAA,MAC/C,MAAA;AAAA,MACA,EAAE,KAAA;AAAM,KACV;AAAA,EACF;AAAA;AAAA,EAIA,YAAY,iBAAA,EAA6E;AACvF,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,KAAA,EAAO,yBAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,QAAA,CAAU,CAAA;AAAA,EAC3F;AAAA;AAAA,EAGA,WAAA,CAAY,mBAA2B,KAAA,EAA+D;AACpG,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,yBAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,QAAA,CAAA,EAAY,KAAK,CAAA;AAAA,EACnG;AAAA;AAAA,EAGA,YAAA,CAAa,mBAA2B,MAAA,EAAyD;AAC/F,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA;AAAA,MACf,QAAA;AAAA,MACA,yBAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,SAAA,EAAY,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,KACxE;AAAA,EACF;AAAA;AAAA,EAIA,UAAA,CACE,mBACA,KAAA,EAC4D;AAC5D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,yBAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,MAAA,CAAA,EAAU,KAAK,CAAA;AAAA,EACjG;AAAA,EAEA,UAAU,iBAAA,EAAuE;AAC/E,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,KAAA,EAAO,yBAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,MAAA,CAAQ,CAAA;AAAA,EACzF;AAAA;AAAA,EAGA,UAAA,CAAW,mBAA2B,cAAA,EAAiE;AACrG,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA;AAAA,MACf,QAAA;AAAA,MACA,yBAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,OAAA,EAAU,GAAA,CAAI,cAAc,CAAC,CAAA;AAAA,KAC9E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAA,CAAiB,mBAA2B,KAAA,EAAuD;AACjG,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,EAAQ,yBAAyB,GAAA,CAAI,iBAAiB,CAAC,CAAA,MAAA,CAAA,EAAU,KAAK,CAAA;AAAA,EACjG;AACF;AC/NO,SAAS,aAAA,CACd,OAAA,EACA,eAAA,EACA,MAAA,EACS;AACT,EAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,MAAA,EAAQ,OAAO,KAAA;AAGxC,EAAA,MAAM,KAAA,GAAQ,6BAAA,CAA8B,IAAA,CAAK,eAAe,CAAA;AAChE,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAEnB,EAAA,MAAM,QAAA,GAAWC,kBAAW,QAAA,EAAU,MAAM,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAC1E,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAItC,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,QAAA,CAAS,MAAA,EAAQ,OAAO,KAAA;AAEhD,EAAA,OAAOC,sBAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,MAAM,GAAG,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,MAAM,CAAC,CAAA;AACrF;;;ACiFA,IAAI,SAAA,GAAqC,IAAA;AAWlC,SAAS,WAAW,MAAA,EAAsD;AAC/E,EAAA,IAAI,SAAA,IAAa,CAAC,MAAA,EAAQ;AACxB,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,SAAA,IAAa,OAAA,CAAQ,IAAI,qBAAA,IAAyB,EAAA;AAE5E,EAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,CAAiB;AAAA,IAClC,SAAA;AAAA,IACA,OAAA,EAAS,MAAA,EAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,cAAA;AAAA,IACxC,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,iBAAA;AAAA,IACtC,GAAG;AAAA,GACJ,CAAA;AAED,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,SAAA,GAAY,MAAA;AAAA,EACd;AAEA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,eAAA,GAAwB;AACtC,EAAA,SAAA,GAAY,IAAA;AACd;AAEA,IAAI,mBAAA,GAAmD,IAAA;AAWhD,SAAS,WAAW,MAAA,EAA0D;AACnF,EAAA,IAAI,mBAAA,IAAuB,CAAC,MAAA,EAAQ;AAClC,IAAA,OAAO,mBAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,oBAAA,CAAqB;AAAA,IACtC,SAAA,EACE,QAAQ,SAAA,IACR,OAAA,CAAQ,IAAI,qBAAA,IACZ,OAAA,CAAQ,IAAI,qBAAA,IACZ,EAAA;AAAA,IACF,OAAA,EAAS,MAAA,EAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,cAAA;AAAA,IACxC,GAAG;AAAA,GACJ,CAAA;AAED,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,mBAAA,GAAsB,MAAA;AAAA,EACxB;AAEA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,eAAA,GAAwB;AACtC,EAAA,mBAAA,GAAsB,IAAA;AACxB","file":"index.js","sourcesContent":["/**\n * Telsiz (Radio) istemcisinin ortak tipleri.\n *\n * SDK'nın tek işi vardır: bir kanala mesaj yazmak. Bildirimin kime, hangi\n * kanaldan ve hangi saatte gideceği SUNUCUDA, kanal ayarlarında durur —\n * istemci bunu bilmez ve bilmemelidir. Aksi hâlde bildirim kuralını\n * değiştirmek için müşterinin kodunu yeniden yayınlaması gerekirdi.\n */\n\n/** Kanalın seviyesi; verilmezse kanalın kendi varsayılanı geçerlidir. */\nexport type Level = 'debug' | 'info' | 'warn' | 'error' | 'critical';\n\n/** Gizli domain anahtarının öneki — sunucu tarafı. */\nexport const SECRET_PREFIX = 'sb_secret_live_';\n\n/** Açık domain anahtarının öneki — tarayıcı ve mobil. */\nexport const PUBLIC_PREFIX = 'sb_public_live_';\n\nexport interface SignalbirdConfig {\n /**\n * Gizli domain anahtarı (`sb_secret_live_…`) — `SIGNALBIRD_DOMAIN_KEY`.\n *\n * Bu anahtar GİZLİDİR ve tarayıcıya gömülemez: sunucu `Origin` başlığı taşıyan\n * istekleri reddeder (401 `SECRET_KEY_IN_BROWSER`). Tarayıcı için\n * `signalbird/browser` ve açık anahtar (`sb_public_live_…`) kullanılır.\n *\n * v2 (1 Eyl 2026): eskiden `apiKey` idi ve yüzey başına ayrı bir anahtar\n * ailesi vardı (`sbr_live_`, `sb_`, `sbw_pub_`, `sbp_live_`). Hepsi tek\n * anahtara indi — sözleşme:\n * ../signalbird.api/docs/KEY_ARCHITECTURE_2026-09-01.md\n */\n domainKey: string;\n\n /** Varsayılan: https://live.signalbird.io/api */\n baseUrl?: string;\n\n /** Her olaya eklenen köken adı (sunucu adı, servis adı). */\n source?: string;\n\n /** İstek zaman aşımı (ms). Varsayılan 5000 — log göndermek isteği bekletmemeli. */\n timeout?: number;\n\n /**\n * Hata fırlatılsın mı. Varsayılan `false`.\n *\n * Log göndermek uygulamanın ASIL işi değildir: telsiz erişilemezse müşterinin\n * ödeme akışı çökmemelidir. Varsayılan davranış sessizce yutup `ok: false`\n * dönmektir; geliştirme sırasında `throwOnError: true` ile açılabilir.\n */\n throwOnError?: boolean;\n\n /** Konsola uyarı yazılsın mı (varsayılan: NODE_ENV !== 'production'). */\n debug?: boolean;\n}\n\nexport interface LogInput {\n /**\n * Modül anahtarı — panelde açtığınız kanalın adı (`penyuSatisBildirimi`).\n *\n * Gizli DEĞİLDİR ve kodun içinde durur: domain anahtarı olmadan hiçbir işe\n * yaramaz. Tanımsız bir ad gönderirseniz kanal SESSİZ olarak açılır — kayıt\n * düşmez, ama bildirim de gitmez; kuralı panelden siz koyarsınız.\n */\n key: string;\n message: string;\n level?: Level;\n context?: Record<string, unknown>;\n source?: string;\n}\n\nexport interface LogResult {\n ok: boolean;\n /** Sunucunun döndüğü olay kimliği (rev_…). */\n eventId?: string;\n /** Reddedildiyse sebep: INVALID_KEY, MODULE_DISABLED, LIMIT_REACHED… */\n code?: string;\n status?: number;\n}\n\nexport interface BatchResult {\n accepted: number;\n total: number;\n results: Record<number, { ok: boolean; eventId?: string; code?: string }>;\n}\n\n/** `throwOnError: true` iken fırlatılır. */\nexport class SignalbirdError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly code?: string,\n /** Sunucunun ham yanıt gövdesi (varsa) — gönderim istemcisi doldurur. */\n readonly body?: unknown\n ) {\n super(message);\n this.name = 'SignalbirdError';\n }\n}\n\nexport const DEFAULT_BASE_URL = 'https://live.signalbird.io/api';\n","/**\n * Telsiz istemcisi (sunucu tarafı).\n *\n * Bağımlılığı yoktur: Node 18+ ile gelen `fetch` kullanılır. Bir log\n * kütüphanesinin kendi bağımlılık zincirini müşterinin projesine taşıması,\n * sürüm çakışmalarının en sinir bozucu kaynağıdır.\n */\nimport {\n DEFAULT_BASE_URL,\n PUBLIC_PREFIX,\n SECRET_PREFIX,\n SignalbirdError,\n type BatchResult,\n type Level,\n type LogInput,\n type LogResult,\n type SignalbirdConfig,\n} from './types';\n\nexport class SignalbirdClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly throwOnError: boolean;\n private readonly debug: boolean;\n private readonly source?: string;\n\n constructor(private readonly config: SignalbirdConfig) {\n if (!config.domainKey) {\n throw new SignalbirdError('Signalbird: domainKey zorunlu.', 0, 'NO_KEY');\n }\n\n /*\n * Yanlış anahtar türü KURULUMDA yakalanır, ilk istekte değil.\n *\n * Açık anahtarı sunucuda kullanmak sessiz bir hatadır: istek gider,\n * `ORIGIN_REQUIRED` döner ve sebebi log'da görünmez. Haftalar sonra fark\n * etmektense burada durmak yeğdir.\n */\n if (config.domainKey.startsWith(PUBLIC_PREFIX)) {\n throw new SignalbirdError(\n 'Signalbird: sunucu istemcisine AÇIK anahtar (sb_public_live_…) verildi. ' +\n 'Gizli anahtarı (sb_secret_live_…) kullanın; açık anahtar tarayıcı içindir.',\n 0,\n 'WRONG_KEY_TYPE'\n );\n }\n\n if (!config.domainKey.startsWith(SECRET_PREFIX)) {\n throw new SignalbirdError(\n 'Signalbird: anahtar biçimi tanınmadı. Gizli domain anahtarı ' +\n '`sb_secret_live_` ile başlar (Panel → Alan adları → Anahtarlar).',\n 0,\n 'WRONG_KEY_TYPE'\n );\n }\n\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '');\n this.timeout = config.timeout ?? 5000;\n this.throwOnError = config.throwOnError ?? false;\n this.debug = config.debug ?? process.env.NODE_ENV !== 'production';\n this.source = config.source;\n }\n\n /** Tek kayıt gönderir. */\n async log(input: LogInput): Promise<LogResult> {\n return this.send('/v1/radio/log', {\n key: input.key,\n message: input.message,\n level: input.level,\n context: input.context,\n source: input.source ?? this.source,\n });\n }\n\n /**\n * Toplu gönderim — 100 kayda kadar.\n *\n * Kısmi başarı normaldir (kota tam ortada dolabilir), o yüzden sonuç tek bir\n * durum değil satır satır döner.\n */\n async batch(events: LogInput[]): Promise<BatchResult> {\n const payload = {\n events: events.slice(0, 100).map((event) => ({\n key: event.key,\n message: event.message,\n level: event.level,\n context: event.context,\n source: event.source ?? this.source,\n })),\n };\n\n const response = await this.request('/v1/radio/log/batch', payload);\n\n if (!response) {\n return { accepted: 0, total: events.length, results: {} };\n }\n\n const results: BatchResult['results'] = {};\n\n for (const [index, row] of Object.entries(response.body?.results ?? {})) {\n const value = row as { ok: boolean; event_id?: string; code?: string };\n results[Number(index)] = { ok: value.ok, eventId: value.event_id, code: value.code };\n }\n\n return {\n accepted: Number(response.body?.accepted ?? 0),\n total: Number(response.body?.total ?? events.length),\n results,\n };\n }\n\n // ── Seviye kısayolları ────────────────────────────────────────────────\n // İlk argüman MODÜL ANAHTARIDIR (panelde açtığınız kanalın adı), seviye\n // değil: `sb.error('kritikApiHatasi', '…')`.\n\n debugLog(key: string, message: string, context?: Record<string, unknown>) {\n return this.log({ key, message, level: 'debug', context });\n }\n\n info(key: string, message: string, context?: Record<string, unknown>) {\n return this.log({ key, message, level: 'info', context });\n }\n\n warn(key: string, message: string, context?: Record<string, unknown>) {\n return this.log({ key, message, level: 'warn', context });\n }\n\n error(key: string, message: string, context?: Record<string, unknown>) {\n return this.log({ key, message, level: 'error', context });\n }\n\n critical(key: string, message: string, context?: Record<string, unknown>) {\n return this.log({ key, message, level: 'critical', context });\n }\n\n /**\n * Yakalanmamış hataları Telsiz'e bağlar.\n *\n * Kancayı takıp süreci ÖLDÜRMEYE devam eder: `uncaughtException` sonrası\n * süreci ayakta tutmak, bozuk durumdaki bir uygulamayı çalıştırmaya devam\n * etmek demektir — log göndermek bunu meşrulaştırmaz.\n */\n captureUncaught(key = 'critical'): () => void {\n const onError = (error: Error) => {\n void this.log({\n key,\n message: error.message,\n level: 'critical',\n context: { stack: error.stack?.split('\\n').slice(0, 20).join('\\n') },\n });\n };\n\n const onRejection = (reason: unknown) => {\n void this.log({\n key,\n message: reason instanceof Error ? reason.message : String(reason),\n level: 'error',\n context: reason instanceof Error ? { stack: reason.stack } : undefined,\n });\n };\n\n process.on('uncaughtException', onError);\n process.on('unhandledRejection', onRejection);\n\n return () => {\n process.off('uncaughtException', onError);\n process.off('unhandledRejection', onRejection);\n };\n }\n\n private async send(path: string, payload: unknown): Promise<LogResult> {\n const response = await this.request(path, payload);\n\n if (!response) {\n return { ok: false, code: 'NETWORK_ERROR' };\n }\n\n if (!response.ok) {\n const code = response.body?.code ?? 'UNKNOWN';\n\n if (this.throwOnError) {\n throw new SignalbirdError(`Signalbird: ${code}`, response.status, code);\n }\n\n if (this.debug) {\n console.warn(`[signalbird] gönderilemedi: ${code} (HTTP ${response.status})`);\n }\n\n return { ok: false, code, status: response.status };\n }\n\n return { ok: true, eventId: response.body?.event_id, status: response.status };\n }\n\n private async request(\n path: string,\n payload: unknown\n ): Promise<{ ok: boolean; status: number; body: any } | null> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(this.baseUrl + path, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n // Kanonik başlık `X-Signalbird-Key`; `Authorization: Bearer` de\n // kabul edilir ama anahtarın bir OAuth jetonu olmadığı açık olsun.\n 'X-Signalbird-Key': this.config.domainKey,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n const body = await response.json().catch(() => ({}));\n\n return { ok: response.ok, status: response.status, body };\n } catch (error) {\n if (this.throwOnError) {\n throw new SignalbirdError(\n error instanceof Error ? error.message : 'network error',\n 0,\n 'NETWORK_ERROR'\n );\n }\n\n if (this.debug) {\n console.warn('[signalbird] ulaşılamadı:', error);\n }\n\n return null;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\nexport type { Level, LogInput, LogResult, BatchResult, SignalbirdConfig };\n","/**\n * Gönderim (Messaging) istemcisi — sunucu tarafı.\n *\n * Takım API anahtarıyla (`sb_…`) e-posta/SMS/push gönderir, kişi ve liste\n * yönetir, kampanya açar, mesaj durumlarını okur. Telsiz istemcisinden\n * (`SignalbirdClient`) ayrıdır: farklı anahtar, farklı kapı, farklı kota.\n *\n * Bağımlılığı yoktur (Node 18+ `fetch`). Retry yoktur: aynı iletiyi iki kez\n * göndermek, hiç göndermemekten pahalıdır — yeniden deneme kararı çağıranındır.\n *\n * Sözleşme: docs/CONTRACT.md § 8\n */\nimport { DEFAULT_BASE_URL, SignalbirdError } from './types';\nimport type {\n Batch,\n BulkContactsInput,\n BulkContactsResult,\n CampaignCreateResult,\n CampaignDetail,\n Contact,\n ContactInput,\n ContactList,\n CreateCampaignInput,\n CreateContactListInput,\n ListCampaignMessagesQuery,\n ListCampaignsQuery,\n ListContactsQuery,\n ListMessagesQuery,\n Message,\n MessagingConfig,\n Paginated,\n SbResult,\n SendEmailInput,\n SendPushInput,\n SendResult,\n SendSmsInput,\n SmsPreview,\n} from './messaging-types';\n\n/** Toplu kişi yüklemede tek istekteki üst sınır (API tarafı da bunu kabul eder). */\nconst BULK_CHUNK = 1000;\n\ntype Query = object | undefined;\n\nexport class SignalbirdMessaging {\n private readonly domainKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly throwOnError: boolean;\n private readonly debug: boolean;\n\n constructor(config: MessagingConfig) {\n if (!config.domainKey) {\n throw new SignalbirdError('Signalbird: domainKey zorunlu.', 0, 'NO_KEY');\n }\n /*\n * Açık anahtar (`sb_public_live_…`) buraya verilirse her istek 403 döner\n * (`SECRET_KEY_REQUIRED`). Kurulumda söylemek, haftalar sonra bulunacak\n * bir hatayı önler.\n */\n if (!config.domainKey.startsWith('sb_secret_live_')) {\n throw new SignalbirdError(\n 'Signalbird: bu istemci GİZLİ domain anahtarı ister (sb_secret_live_…). ' +\n 'Açık anahtar (sb_public_live_…) yalnız tarayıcı ve mobil içindir.',\n 0,\n 'WRONG_KEY_TYPE'\n );\n }\n\n this.domainKey = config.domainKey;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '');\n this.timeout = config.timeout ?? 15000;\n this.throwOnError = config.throwOnError ?? false;\n this.debug = config.debug ?? false;\n }\n\n // ── Gönderim ──────────────────────────────────────────────────────────\n\n sendEmail(input: SendEmailInput): Promise<SbResult<SendResult>> {\n return this.request('POST', '/v1/email/send', input);\n }\n\n sendSms(input: SendSmsInput): Promise<SbResult<SendResult>> {\n return this.request('POST', '/v1/sms/send', input);\n }\n\n /**\n * Otomasyon olayı — kendi sisteminizdeki bir olayı bildirir ve eşleşen\n * akışı tetikler (§11). Signalbird olayın anlamını bilmez; adı sizindir.\n */\n track(input: {\n event: string;\n contact: { email?: string; phone?: string; external_id?: string; first_name?: string; last_name?: string };\n data?: Record<string, unknown>;\n }): Promise<SbResult<{ enrolled: number; canceled: number; contact_id: number }>> {\n return this.request('POST', '/v1/events', input);\n }\n\n /** SMS parça/karakter hesabı — kota harcamaz. */\n previewSms(body: string): Promise<SbResult<SmsPreview>> {\n return this.request('POST', '/v1/sms/preview', { body });\n }\n\n sendPush(input: SendPushInput): Promise<SbResult<SendResult>> {\n return this.request('POST', '/v1/push/send', input);\n }\n\n // ── Kişiler ───────────────────────────────────────────────────────────\n\n listContacts(query?: ListContactsQuery): Promise<SbResult<Paginated<Contact>>> {\n return this.request('GET', '/v1/contacts', undefined, query);\n }\n\n createContact(contact: ContactInput): Promise<SbResult<Contact>> {\n return this.request('POST', '/v1/contacts', contact);\n }\n\n updateContact(id: number | string, contact: Partial<ContactInput>): Promise<SbResult<Contact>> {\n return this.request('PATCH', `/v1/contacts/${encodeURIComponent(id)}`, contact);\n }\n\n deleteContact(id: number | string): Promise<SbResult<unknown>> {\n return this.request('DELETE', `/v1/contacts/${encodeURIComponent(id)}`);\n }\n\n /**\n * Toplu kişi yükleme.\n *\n * 1000'lik parçalara bölünür ve SIRAYLA gönderilir (paralel değil: aynı\n * e-posta iki parçada da varsa yarış olmasın). Sonuçlar tek yanıtta\n * birleştirilir. Bir parça başarısız olursa o noktada durulur ve o ana kadar\n * biriken sayımlar `data` içinde döner — çağıran kaç kişinin işlendiğini görür.\n */\n async bulkContacts(input: BulkContactsInput): Promise<SbResult<BulkContactsResult>> {\n const merged: BulkContactsResult = { imported: 0, updated: 0, skipped: [] };\n const { contacts, ...rest } = input;\n let status = 200;\n\n if (contacts.length === 0) {\n return { ok: true, status, data: merged };\n }\n\n for (let offset = 0; offset < contacts.length; offset += BULK_CHUNK) {\n const chunk = contacts.slice(offset, offset + BULK_CHUNK);\n const result = await this.request<BulkContactsResult>('POST', '/v1/contacts/bulk', {\n ...rest,\n contacts: chunk,\n });\n\n if (!result.ok) {\n return { ...result, data: merged };\n }\n\n status = result.status;\n merged.imported += Number(result.data?.imported ?? 0);\n merged.updated += Number(result.data?.updated ?? 0);\n if (Array.isArray(result.data?.skipped)) {\n merged.skipped.push(...result.data.skipped);\n }\n }\n\n return { ok: true, status, data: merged };\n }\n\n // ── Listeler ──────────────────────────────────────────────────────────\n\n listContactLists(): Promise<SbResult<ContactList[] | Paginated<ContactList>>> {\n return this.request('GET', '/v1/contact-lists');\n }\n\n createContactList(input: CreateContactListInput): Promise<SbResult<ContactList>> {\n return this.request('POST', '/v1/contact-lists', input);\n }\n\n deleteContactList(id: number | string): Promise<SbResult<unknown>> {\n return this.request('DELETE', `/v1/contact-lists/${encodeURIComponent(id)}`);\n }\n\n // ── Kampanyalar ───────────────────────────────────────────────────────\n\n listCampaigns(query?: ListCampaignsQuery): Promise<SbResult<Paginated<Batch> | Batch[]>> {\n return this.request('GET', '/v1/campaigns', undefined, query);\n }\n\n createCampaign(input: CreateCampaignInput): Promise<SbResult<CampaignCreateResult>> {\n return this.request('POST', '/v1/campaigns', input);\n }\n\n getCampaign(id: number | string): Promise<SbResult<CampaignDetail>> {\n return this.request('GET', `/v1/campaigns/${encodeURIComponent(id)}`);\n }\n\n cancelCampaign(id: number | string): Promise<SbResult<unknown>> {\n return this.request('POST', `/v1/campaigns/${encodeURIComponent(id)}/cancel`);\n }\n\n listCampaignMessages(\n id: number | string,\n query?: ListCampaignMessagesQuery\n ): Promise<SbResult<Paginated<Message>>> {\n return this.request('GET', `/v1/campaigns/${encodeURIComponent(id)}/messages`, undefined, query);\n }\n\n /**\n * Bir kampanyanın tüm mesajlarını sayfa sayfa gezer.\n *\n * for await (const m of sdk.iterateCampaignMessages(42)) { … }\n *\n * Bir sayfa alınamazsa `SignalbirdError` fırlatır (sessiz yarım liste,\n * \"hepsi bu\" sanılır — o daha tehlikeli).\n */\n async *iterateCampaignMessages(\n id: number | string,\n query: Omit<ListCampaignMessagesQuery, 'page'> = {}\n ): AsyncGenerator<Message, void, undefined> {\n let page = 1;\n\n while (true) {\n const result = await this.listCampaignMessages(id, { per_page: 100, ...query, page });\n\n if (!result.ok) {\n throw new SignalbirdError(`Signalbird: ${result.code}`, result.status, result.code, result.data);\n }\n\n for (const message of result.data.data ?? []) {\n yield message;\n }\n\n if (page >= (result.data.last_page ?? 1) || (result.data.data ?? []).length === 0) {\n return;\n }\n\n page++;\n }\n }\n\n // ── Mesajlar ──────────────────────────────────────────────────────────\n\n listMessages(query?: ListMessagesQuery): Promise<SbResult<Paginated<Message>>> {\n return this.request('GET', '/v1/messages', undefined, query);\n }\n\n getMessage(id: string): Promise<SbResult<Message>> {\n return this.request('GET', `/v1/messages/${encodeURIComponent(id)}`);\n }\n\n // ── HTTP ──────────────────────────────────────────────────────────────\n\n private async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n path: string,\n body?: unknown,\n query?: Query\n ): Promise<SbResult<T>> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n const url = this.baseUrl + path + buildQuery(query);\n\n let status = 0;\n let data: any;\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n Accept: 'application/json',\n 'X-Signalbird-Key': this.domainKey,\n ...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n status = response.status;\n const text = await response.text();\n try {\n data = text ? JSON.parse(text) : null;\n } catch {\n data = text;\n }\n\n if (response.ok) {\n return { ok: true, status, data: data as T };\n }\n } catch (error) {\n const timedOut = error instanceof Error && error.name === 'AbortError';\n const code = timedOut ? 'TIMEOUT' : 'NETWORK_ERROR';\n const message = error instanceof Error ? error.message : 'network error';\n\n return this.fail(0, code, message, undefined);\n } finally {\n clearTimeout(timer);\n }\n\n // HTTP hatası: API `{message, code}` döner; Laravel doğrulama hatası\n // `{message, errors}` döner (kodsuz) — onu VALIDATION_ERROR sayarız.\n const code: string =\n (data && typeof data === 'object' && typeof data.code === 'string' && data.code) ||\n (status === 422 ? 'VALIDATION_ERROR' : status === 401 ? 'API_KEY_INVALID' : `HTTP_${status}`);\n const message: string =\n (data && typeof data === 'object' && typeof data.message === 'string' && data.message) ||\n `HTTP ${status}`;\n\n return this.fail(status, code, message, data);\n }\n\n private fail<T>(status: number, code: string, message: string, data: unknown): SbResult<T> {\n if (this.throwOnError) {\n throw new SignalbirdError(`Signalbird: ${code} — ${message}`, status, code, data);\n }\n\n if (this.debug) {\n console.warn(`[signalbird] ${code} (HTTP ${status}): ${message}`);\n }\n\n return { ok: false, status, code, message, data };\n }\n}\n\n/** `undefined`/`null` alanlar atlanır; diziler `key[]=` biçiminde gider. */\nfunction buildQuery(query: Query): string {\n if (!query) return '';\n\n const params = new URLSearchParams();\n\n for (const [key, value] of Object.entries(query as Record<string, unknown>)) {\n if (value === undefined || value === null) continue;\n\n if (Array.isArray(value)) {\n for (const item of value) params.append(`${key}[]`, String(item));\n } else {\n params.append(key, String(value));\n }\n }\n\n const encoded = params.toString();\n\n return encoded ? `?${encoded}` : '';\n}\n","/**\n * Anahtarlı istemcilerin ortak taşıma katmanı.\n *\n * Gönderim ve Yönetim istemcileri aynı kapıyı kullanır (`Authorization: Bearer\n * sb_…`), aynı zarfı döner ve aynı kod eşlemesini uygular. İki yerde ayrı ayrı\n * yazılsaydı biri düzeltilip diğeri unutulurdu — hata kodları da sözleşmenin\n * bir parçasıdır.\n *\n * Sözleşme: docs/CONTRACT.md § 8.2 (zarf) ve § 8.5 (sorgu dizesi)\n */\nimport { SignalbirdError } from './types';\n\n/** Her metodun döndüğü zarf. Başarısızlık istisna değil, veridir. */\nexport interface SbResult<T = unknown> {\n ok: boolean;\n status: number;\n data?: T;\n code?: string;\n message?: string;\n}\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport interface TransportConfig {\n domainKey: string;\n baseUrl: string;\n timeout: number;\n throwOnError: boolean;\n debug: boolean;\n}\n\nexport class SbTransport {\n constructor(private readonly config: TransportConfig) {}\n\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n query?: object\n ): Promise<SbResult<T>> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.config.timeout);\n const url = this.config.baseUrl + path + buildQuery(query);\n\n let status = 0;\n let data: any;\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n Accept: 'application/json',\n 'X-Signalbird-Key': this.config.domainKey,\n ...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n status = response.status;\n const text = await response.text();\n try {\n data = text ? JSON.parse(text) : null;\n } catch {\n data = text;\n }\n\n if (response.ok) {\n return { ok: true, status, data: data as T };\n }\n } catch (error) {\n const timedOut = error instanceof Error && error.name === 'AbortError';\n\n return this.fail(\n 0,\n timedOut ? 'TIMEOUT' : 'NETWORK_ERROR',\n error instanceof Error ? error.message : 'network error',\n undefined\n );\n } finally {\n clearTimeout(timer);\n }\n\n // API `{message, code}` döner; Laravel doğrulama hatası `{message, errors}`\n // döner (kodsuz) — onu VALIDATION_ERROR sayarız.\n const code: string =\n (data && typeof data === 'object' && typeof data.code === 'string' && data.code) ||\n (status === 422 ? 'VALIDATION_ERROR' : status === 401 ? 'API_KEY_INVALID' : `HTTP_${status}`);\n const message: string =\n (data && typeof data === 'object' && typeof data.message === 'string' && data.message) ||\n `HTTP ${status}`;\n\n return this.fail(status, code, message, data);\n }\n\n private fail<T>(status: number, code: string, message: string, data: unknown): SbResult<T> {\n if (this.config.throwOnError) {\n throw new SignalbirdError(`Signalbird: ${code} — ${message}`, status, code, data);\n }\n\n if (this.config.debug) {\n console.warn(`[signalbird] ${code} (HTTP ${status}): ${message}`);\n }\n\n return { ok: false, status, code, message, data: data as T };\n }\n}\n\n/** `undefined`/`null` alanlar atlanır; diziler `key[]=` biçiminde gider. */\nexport function buildQuery(query: object | undefined): string {\n if (!query) return '';\n\n const params = new URLSearchParams();\n\n for (const [key, value] of Object.entries(query as Record<string, unknown>)) {\n if (value === undefined || value === null) continue;\n\n if (Array.isArray(value)) {\n for (const item of value) params.append(`${key}[]`, String(item));\n } else {\n params.append(key, String(value));\n }\n }\n\n const encoded = params.toString();\n\n return encoded ? `?${encoded}` : '';\n}\n\n/** Yol parçası — kimlikler URL'e gömülmeden önce kodlanır. */\nexport function seg(value: string | number): string {\n return encodeURIComponent(String(value));\n}\n","/**\n * Yönetim (Management) istemcisi — sunucu tarafı.\n *\n * Müşterinin panelde tıklayarak yaptığı her şeyi kodla yapar: Telsiz projesi ve\n * kanalı açar, olay akışını okur, sohbet gelen kutusunu işler, uygulama kaydı\n * ve cihaz listesi yönetir.\n *\n * Bu ADMIN yüzeyi DEĞİLDİR. Anahtar tek bir takıma bağlıdır ve yalnız o takımın\n * kayıtlarına dokunur; başka takımın kaydı 404 döner.\n *\n * Neden ayrı sınıf: Gönderim (`SignalbirdMessaging`) ileti gönderir ve kota\n * harcar; bu istemci yapılandırma değiştirir. Aynı anahtar ailesini kullanırlar\n * (`sb_…`) ama scope'ları ve hata kümeleri farklıdır — tek sınıfta birleşseydi\n * \"hangi scope gerekiyordu\" sorusu her metotta yeniden sorulurdu.\n *\n * Sözleşme: docs/CONTRACT.md § 10\n */\nimport { SbTransport, seg, type SbResult } from './http';\nimport { DEFAULT_BASE_URL, SignalbirdError } from './types';\nimport type {\n KeyedModule,\n ModuleKey,\n ModuleKeyInput,\n ModuleKeyLevel,\n NotifyChannel,\n AppDevice,\n CannedReply,\n CannedReplyInput,\n ChatConversation,\n ChatMessage,\n ChatReport,\n ChatReportRange,\n ChatTrigger,\n ChatTriggerInput,\n ChatVisitor,\n ConversationStatus,\n ListAppDevicesQuery,\n ListChatMessagesQuery,\n ListConversationsQuery,\n ListRadioEventsQuery,\n ManagementConfig,\n Paginated,\n RadioEvent,\n ReplyInput,\n StartConversationInput,\n UpdateConversationInput,\n UpdateVisitorInput,\n TeamEmbedTokenInput,\n} from './management-types';\nimport type { EmbedToken } from './partner-types';\n\nexport class SignalbirdManagement {\n private readonly http: SbTransport;\n\n constructor(config: ManagementConfig) {\n if (!config.domainKey) {\n throw new SignalbirdError('Signalbird: domainKey zorunlu.', 0, 'NO_KEY');\n }\n /*\n * Açık anahtar (`sb_public_live_…`) buraya verilirse her istek 403 döner\n * (`SECRET_KEY_REQUIRED`). Kurulumda söylemek, haftalar sonra bulunacak\n * bir hatayı önler.\n */\n if (!config.domainKey.startsWith('sb_secret_live_')) {\n throw new SignalbirdError(\n 'Signalbird: bu istemci GİZLİ domain anahtarı ister (sb_secret_live_…). ' +\n 'Açık anahtar (sb_public_live_…) yalnız tarayıcı ve mobil içindir.',\n 0,\n 'WRONG_KEY_TYPE'\n );\n }\n\n this.http = new SbTransport({\n domainKey: config.domainKey,\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, ''),\n timeout: config.timeout ?? 15000,\n throwOnError: config.throwOnError ?? false,\n debug: config.debug ?? false,\n });\n }\n\n // ── Telsiz: projeler ──────────────────────────────────────────────────\n\n /** Panelin Telsiz özeti: proje sayısı, günlük hacim, son olaylar. */\n radioSummary(): Promise<SbResult<Record<string, unknown>>> {\n return this.http.request('GET', '/v1/radio/summary');\n }\n\n /** Olay akışı — kanal, seviye ve tarihe göre süzülür. */\n radioEvents(query?: ListRadioEventsQuery): Promise<SbResult<Paginated<RadioEvent>>> {\n return this.http.request('GET', '/v1/radio/events', undefined, query);\n }\n\n // ── Modül anahtarları ─────────────────────────────────────────────────\n //\n // Telsiz projesi/kanalı ve uygulama kaydı 1 Eyl 2026'da kaldırıldı\n // (../signalbird.api/docs/KEY_ARCHITECTURE_2026-09-01.md §3). Yerlerini TEK\n // bir uç ailesi aldı: modül anahtarları. Beş modülün (logger, email, sms,\n // push, chat) hepsi aynı gövdeyi kullanır — beş ayrı metot kümesi yazmak,\n // altıncı modül geldiğinde altıncısını yazmak demekti.\n\n listModuleKeys(\n module: KeyedModule,\n query?: { domain_id?: number }\n ): Promise<SbResult<{ data: ModuleKey[] }>> {\n return this.http.request('GET', `/v1/modules/${seg(module)}/keys`, undefined, query);\n }\n\n getModuleKey(module: KeyedModule, id: number | string): Promise<SbResult<{ module_key: ModuleKey }>> {\n return this.http.request('GET', `/v1/modules/${seg(module)}/keys/${seg(id)}`);\n }\n\n /**\n * Kanal açar.\n *\n * `key` verilmezse başlıktan üretilir ve çakışırsa sonuna sayı eklenir —\n * \"bu ad alınmış\" hatasıyla geri dönmek, CI'da kanal açan bir betiği\n * durdururdu.\n */\n createModuleKey(module: KeyedModule, input: ModuleKeyInput): Promise<SbResult<{ module_key: ModuleKey }>> {\n return this.http.request('POST', `/v1/modules/${seg(module)}/keys`, input);\n }\n\n /**\n * Kanalı günceller.\n *\n * `key` DEĞİŞTİRİLEBİLİR (eskiden değişmezdi): eski ad 30 gün daha kabul\n * edilir, böylece üretimdeki kod bir sonraki deploya kadar kayıt kaybetmez.\n * `keep_previous: false` ile eski ad anında kapatılır.\n */\n updateModuleKey(\n module: KeyedModule,\n id: number | string,\n input: ModuleKeyInput\n ): Promise<SbResult<{ module_key: ModuleKey }>> {\n return this.http.request('PATCH', `/v1/modules/${seg(module)}/keys/${seg(id)}`, input);\n }\n\n deleteModuleKey(module: KeyedModule, id: number | string): Promise<SbResult<unknown>> {\n return this.http.request('DELETE', `/v1/modules/${seg(module)}/keys/${seg(id)}`);\n }\n\n // ── Sohbet: gelen kutusu ──────────────────────────────────────────────\n\n chatSummary(): Promise<SbResult<Record<string, unknown>>> {\n return this.http.request('GET', '/v1/chat/summary');\n }\n\n /** Kısa aralıklı yoklama için: yalnız değişenler + çevrimiçi ajanlar. */\n chatUpdates(): Promise<SbResult<Record<string, unknown>>> {\n return this.http.request('GET', '/v1/chat/updates');\n }\n\n listConversations(\n query?: ListConversationsQuery\n ): Promise<SbResult<Paginated<ChatConversation>>> {\n return this.http.request('GET', '/v1/chat/conversations', undefined, query);\n }\n\n getConversation(id: string): Promise<SbResult<{ conversation: ChatConversation }>> {\n return this.http.request('GET', `/v1/chat/conversations/${seg(id)}`);\n }\n\n /** `after` imleci `cm_…` mesaj kimliğidir; yoklamada tam listeyi çekmez. */\n listConversationMessages(\n id: string,\n query?: ListChatMessagesQuery\n ): Promise<SbResult<{ messages: ChatMessage[] }>> {\n return this.http.request('GET', `/v1/chat/conversations/${seg(id)}/messages`, undefined, query);\n }\n\n /** Proaktif sohbet — ziyaretçi yazmadan ajan başlatır. */\n startConversation(input: StartConversationInput): Promise<SbResult<{ conversation: ChatConversation }>> {\n return this.http.request('POST', '/v1/chat/conversations', input);\n }\n\n updateConversation(\n id: string,\n input: UpdateConversationInput\n ): Promise<SbResult<{ conversation: ChatConversation }>> {\n return this.http.request('PATCH', `/v1/chat/conversations/${seg(id)}`, input);\n }\n\n setConversationStatus(\n id: string,\n status: ConversationStatus\n ): Promise<SbResult<{ conversation: ChatConversation }>> {\n return this.http.request('POST', `/v1/chat/conversations/${seg(id)}/status`, { status });\n }\n\n /**\n * Atama atomiktir: `userId` verilmezse çağıran anahtarın sahibine atanır.\n * Başkasına atanmış sohbeti devralmak `chat:write` ister.\n */\n assignConversation(\n id: string,\n userId?: number | null\n ): Promise<SbResult<{ conversation: ChatConversation }>> {\n return this.http.request('POST', `/v1/chat/conversations/${seg(id)}/assign`, {\n user_id: userId ?? null,\n });\n }\n\n readConversation(id: string, lastMessageId?: string): Promise<SbResult<unknown>> {\n return this.http.request('POST', `/v1/chat/conversations/${seg(id)}/read`, {\n last_message_id: lastMessageId,\n });\n }\n\n setTyping(id: string, isTyping: boolean): Promise<SbResult<unknown>> {\n return this.http.request('POST', `/v1/chat/conversations/${seg(id)}/typing`, {\n is_typing: isTyping,\n });\n }\n\n reply(id: string, input: ReplyInput): Promise<SbResult<{ message: ChatMessage }>> {\n return this.http.request('POST', `/v1/chat/conversations/${seg(id)}/messages`, input);\n }\n\n editChatMessage(\n id: string,\n messageId: string,\n body: string\n ): Promise<SbResult<{ message: ChatMessage }>> {\n return this.http.request('PATCH', `/v1/chat/conversations/${seg(id)}/messages/${seg(messageId)}`, {\n body,\n });\n }\n\n deleteChatMessage(id: string, messageId: string): Promise<SbResult<unknown>> {\n return this.http.request(\n 'DELETE',\n `/v1/chat/conversations/${seg(id)}/messages/${seg(messageId)}`\n );\n }\n\n /** Tepki açma/kapama — aynı emoji ikinci kez gönderilirse kaldırılır. */\n reactToChatMessage(\n id: string,\n messageId: string,\n emoji: string\n ): Promise<SbResult<{ message: ChatMessage }>> {\n return this.http.request(\n 'POST',\n `/v1/chat/conversations/${seg(id)}/messages/${seg(messageId)}/reactions`,\n { emoji }\n );\n }\n\n // ── Sohbet: ziyaretçi ve hazır yanıtlar ───────────────────────────────\n\n getVisitor(id: string): Promise<SbResult<{ visitor: ChatVisitor }>> {\n return this.http.request('GET', `/v1/chat/visitors/${seg(id)}`);\n }\n\n updateVisitor(id: string, input: UpdateVisitorInput): Promise<SbResult<{ visitor: ChatVisitor }>> {\n return this.http.request('PATCH', `/v1/chat/visitors/${seg(id)}`, input);\n }\n\n banVisitor(id: string): Promise<SbResult<{ visitor: ChatVisitor }>> {\n return this.http.request('POST', `/v1/chat/visitors/${seg(id)}/ban`);\n }\n\n listCannedReplies(): Promise<SbResult<{ data: CannedReply[] }>> {\n return this.http.request('GET', '/v1/chat/canned-replies');\n }\n\n createCannedReply(input: CannedReplyInput): Promise<SbResult<{ reply: CannedReply }>> {\n return this.http.request('POST', '/v1/chat/canned-replies', input);\n }\n\n updateCannedReply(\n id: number | string,\n input: CannedReplyInput\n ): Promise<SbResult<{ reply: CannedReply }>> {\n return this.http.request('PATCH', `/v1/chat/canned-replies/${seg(id)}`, input);\n }\n\n deleteCannedReply(id: number | string): Promise<SbResult<unknown>> {\n return this.http.request('DELETE', `/v1/chat/canned-replies/${seg(id)}`);\n }\n\n // ── Sohbet: tetikleyiciler ────────────────────────────────────────────\n // \"Şu olduğunda şunu yap.\" Kural KAYITTA durur, kodda değil: müşteri\n // davranışı değiştirmek için sürüm çıkarmak zorunda kalmasın.\n\n listChatTriggers(): Promise<SbResult<{ data: ChatTrigger[]; schema: Record<string, string[]> }>> {\n return this.http.request('GET', '/v1/chat/triggers');\n }\n\n createChatTrigger(input: ChatTriggerInput): Promise<SbResult<{ trigger: ChatTrigger }>> {\n return this.http.request('POST', '/v1/chat/triggers', input);\n }\n\n updateChatTrigger(id: number | string, input: Partial<ChatTriggerInput>): Promise<SbResult<{ trigger: ChatTrigger }>> {\n return this.http.request('PATCH', `/v1/chat/triggers/${seg(id)}`, input);\n }\n\n deleteChatTrigger(id: number | string): Promise<SbResult<unknown>> {\n return this.http.request('DELETE', `/v1/chat/triggers/${seg(id)}`);\n }\n\n // ── Sohbet: rapor ─────────────────────────────────────────────────────\n\n /**\n * Yanıt süresi, çözüm süresi, memnuniyet ve ajan kırılımı.\n * Veri yoksa süreler `null` döner — 0 DEĞİL.\n */\n chatReport(range: ChatReportRange = '30d'): Promise<SbResult<ChatReport>> {\n return this.http.request('GET', '/v1/chat/reports', undefined, { range });\n }\n\n // Uygulama uçları KALDIRILDI (1 Eyl 2026): \"uygulama\" ayrı bir kayıt\n // değil. Sohbet widget'ı ve push kanalı birer modül anahtarıdır —\n // `listModuleKeys('chat')`, `listModuleKeys('push')`. Anahtar döndürme de\n // yok: döndürülen şey DOMAIN anahtarıdır ve o panelden yönetilir.\n\n /**\n * Gömme jetonu — Signalbird ekranını KENDİ panelinizde göstermek için.\n *\n * 120 saniye yaşar ve TEK KULLANIMLIKTIR: dönen `url`'i doğrudan bir\n * iframe'e verin, saklamayın. Anahtarın `can_issue_embed` onayı ŞARTTIR —\n * scope sisteminden geriye kalan tek kapı, çünkü jeton 60 dakikalık bir\n * panel oturumuna çevriliyor.\n */\n embedToken(input: TeamEmbedTokenInput): Promise<SbResult<EmbedToken>> {\n return this.http.request('POST', '/v1/embed/tokens', input);\n }\n\n /** Push kanalına kayıtlı son kullanıcı cihazları (token MASKELİ döner). */\n listModuleKeyDevices(\n module: KeyedModule,\n id: number | string,\n query?: ListAppDevicesQuery\n ): Promise<SbResult<Paginated<AppDevice>>> {\n return this.http.request('GET', `/v1/modules/${seg(module)}/keys/${seg(id)}/devices`, undefined, query);\n }\n}\n","/**\n * Partner istemcisi — BEŞİNCİ yüzey.\n *\n * Signalbird'ü kendi ürününün içinde satan sözleşmeli platform (veribenim,\n * submitcms) müşterisini bununla sağlar ve yetkilendirir: company + takım +\n * owner açar, domain ekler ve izlemeye alır, uptime okur, modül açar/kapatır,\n * gömme jetonu üretir.\n *\n * **Bu, CLAUDE.md'deki \"Admin yüzeyi OLMAYACAK\" kuralının bilinçli\n * istisnasıdır** ve istisna olduğu için ayrı anahtar türü taşır. Kural,\n * müşterinin kendi anahtarıyla (`sb_`) şirket açamaması içindi; o kural aynen\n * duruyor. Sözleşmeli partner farklı bir taraftır.\n *\n * Gizli anahtar **asla tarayıcıya inmez**: gömme jetonunu partner'ın\n * kendi sunucusu üretir, tarayıcı yalnız o kısa ömürlü jetonu görür.\n *\n * Sözleşme: docs/CONTRACT.md § 12\n */\nimport { SbTransport, seg, type SbResult } from './http';\nimport { DEFAULT_BASE_URL, SignalbirdError } from './types';\nimport type {\n AddDomainInput,\n AddDomainResult,\n CreateCompanyInput,\n CreateCompanyResult,\n EmbedToken,\n EmbedTokenInput,\n GrantModuleInput,\n ModuleEntitlement,\n PartnerCompany,\n PartnerConfig,\n PartnerDomain,\n PartnerUser,\n PartnerUserInput,\n UptimeRange,\n UptimeReport,\n VerifyDomainResult,\n} from './partner-types';\n\nexport class SignalbirdPartner {\n private readonly http: SbTransport;\n\n constructor(config: PartnerConfig) {\n if (!config.domainKey) {\n throw new SignalbirdError('Signalbird: domainKey zorunlu.', 0, 'NO_KEY');\n }\n /*\n * Açık anahtar (`sb_public_live_…`) buraya verilirse her istek 403 döner\n * (`SECRET_KEY_REQUIRED`). Kurulumda söylemek, haftalar sonra bulunacak\n * bir hatayı önler.\n */\n if (!config.domainKey.startsWith('sb_secret_live_')) {\n throw new SignalbirdError(\n 'Signalbird: bu istemci GİZLİ domain anahtarı ister (sb_secret_live_…). ' +\n 'Açık anahtar (sb_public_live_…) yalnız tarayıcı ve mobil içindir.',\n 0,\n 'WRONG_KEY_TYPE'\n );\n }\n\n this.http = new SbTransport({\n domainKey: config.domainKey,\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, ''),\n timeout: config.timeout ?? 15000,\n throwOnError: config.throwOnError ?? false,\n debug: config.debug ?? false,\n });\n }\n\n // ── Müşteri ───────────────────────────────────────────────────────────\n\n /**\n * Company + takım + owner açar. **Idempotenttir**: aynı `external_id` ile\n * ikinci çağrı yeni kayıt açmaz, `created:false` ile var olanı döner.\n * Anahtarlar (`keys`) yalnız ilk oluşturmada gelir.\n */\n createCompany(input: CreateCompanyInput): Promise<SbResult<CreateCompanyResult>> {\n return this.http.request('POST', '/v1/partner/companies', input);\n }\n\n listCompanies(query?: { page?: number; q?: string; per_page?: number }): Promise<\n SbResult<{ data: PartnerCompany[]; meta: Record<string, number> }>\n > {\n return this.http.request('GET', '/v1/partner/companies', undefined, query);\n }\n\n getCompany(externalId: string): Promise<SbResult<{ company: PartnerCompany }>> {\n return this.http.request('GET', `/v1/partner/companies/${seg(externalId)}`);\n }\n\n updateCompany(\n externalId: string,\n input: { name?: string; is_active?: boolean }\n ): Promise<SbResult<{ company: PartnerCompany }>> {\n return this.http.request('PATCH', `/v1/partner/companies/${seg(externalId)}`, input);\n }\n\n /** Askıya alır — SİLMEZ. Müşterinin izleme ve mesaj geçmişi durur. */\n suspendCompany(externalId: string): Promise<SbResult<{ company: PartnerCompany }>> {\n return this.http.request('DELETE', `/v1/partner/companies/${seg(externalId)}`);\n }\n\n rotateKey(externalId: string, type: 'api' | 'app'): Promise<SbResult<{ type: string; key: string }>> {\n return this.http.request('POST', `/v1/partner/companies/${seg(externalId)}/keys/rotate`, { type });\n }\n\n // ── Domain ────────────────────────────────────────────────────────────\n\n /**\n * Domain ekler ve (istenirse) izlemeye alır. Kayıt `verified_via:'partner'`\n * ile doğar: izleme, sohbet ve push için yeter — **e-posta/SMS kampanyası\n * için TXT şarttır**. Yanıttaki `dns` kaydını yayınlayıp `verifyDomain`\n * çağırmak kapıyı açar.\n */\n addDomain(companyExternalId: string, input: AddDomainInput): Promise<SbResult<AddDomainResult>> {\n return this.http.request('POST', `/v1/partner/companies/${seg(companyExternalId)}/domains`, input);\n }\n\n listDomains(companyExternalId: string): Promise<SbResult<{ data: PartnerDomain[] }>> {\n return this.http.request('GET', `/v1/partner/companies/${seg(companyExternalId)}/domains`);\n }\n\n getDomain(externalId: string): Promise<SbResult<{ domain: PartnerDomain }>> {\n return this.http.request('GET', `/v1/partner/domains/${seg(externalId)}`);\n }\n\n /** TXT'yi hemen sorgular; eşleşirse domain kampanya kapısından geçer olur. */\n verifyDomain(externalId: string): Promise<SbResult<VerifyDomainResult>> {\n return this.http.request('POST', `/v1/partner/domains/${seg(externalId)}/verify`);\n }\n\n removeDomain(externalId: string): Promise<SbResult<{ deleted: boolean }>> {\n return this.http.request('DELETE', `/v1/partner/domains/${seg(externalId)}`);\n }\n\n domainUptime(externalId: string, range: UptimeRange = '24h'): Promise<SbResult<UptimeReport>> {\n return this.http.request('GET', `/v1/partner/domains/${seg(externalId)}/uptime`, undefined, { range });\n }\n\n /** Tek istekte müşterinin tüm domainleri — liste ekranı N+1 atmasın. */\n companyUptime(\n companyExternalId: string,\n range: UptimeRange = '24h'\n ): Promise<SbResult<{ range: string; data: UptimeReport[] }>> {\n return this.http.request(\n 'GET',\n `/v1/partner/companies/${seg(companyExternalId)}/uptime`,\n undefined,\n { range }\n );\n }\n\n // ── Mesaj günlüğü ─────────────────────────────────────────────────────\n //\n // Salt okur; alıcı maskeli, gövde yok (MESSAGING_UNIFICATION §5.1).\n\n listMessages(\n companyExternalId: string,\n query: Record<string, string | number | undefined> = {}\n ): Promise<SbResult<unknown>> {\n return this.http.request(\n 'GET',\n `/v1/partner/companies/${seg(companyExternalId)}/messages`,\n undefined,\n query\n );\n }\n\n getMessage(companyExternalId: string, messageId: string): Promise<SbResult<unknown>> {\n return this.http.request(\n 'GET',\n `/v1/partner/companies/${seg(companyExternalId)}/messages/${seg(messageId)}`\n );\n }\n\n messageSummary(companyExternalId: string, range = '7d'): Promise<SbResult<unknown>> {\n return this.http.request(\n 'GET',\n `/v1/partner/companies/${seg(companyExternalId)}/message-summary`,\n undefined,\n { range }\n );\n }\n\n // ── Modül yetkisi ─────────────────────────────────────────────────────\n\n listModules(companyExternalId: string): Promise<SbResult<{ data: ModuleEntitlement[] }>> {\n return this.http.request('GET', `/v1/partner/companies/${seg(companyExternalId)}/modules`);\n }\n\n /** \"Bu müşteri şu modül için ödeme yaptı, kullanabilir.\" */\n grantModule(companyExternalId: string, input: GrantModuleInput): Promise<SbResult<ModuleEntitlement>> {\n return this.http.request('POST', `/v1/partner/companies/${seg(companyExternalId)}/modules`, input);\n }\n\n /** Yalnız partner'ın KENDİ verdiği hakkı geri alır; plan hakkına dokunmaz. */\n revokeModule(companyExternalId: string, module: string): Promise<SbResult<{ removed: boolean }>> {\n return this.http.request(\n 'DELETE',\n `/v1/partner/companies/${seg(companyExternalId)}/modules/${seg(module)}`\n );\n }\n\n // ── Kullanıcı ─────────────────────────────────────────────────────────\n\n createUser(\n companyExternalId: string,\n input: PartnerUserInput\n ): Promise<SbResult<{ created: boolean; user: PartnerUser }>> {\n return this.http.request('POST', `/v1/partner/companies/${seg(companyExternalId)}/users`, input);\n }\n\n listUsers(companyExternalId: string): Promise<SbResult<{ data: PartnerUser[] }>> {\n return this.http.request('GET', `/v1/partner/companies/${seg(companyExternalId)}/users`);\n }\n\n /** Üyeliği kaldırır, kişinin Signalbird hesabını SİLMEZ. */\n removeUser(companyExternalId: string, userExternalId: string): Promise<SbResult<{ removed: boolean }>> {\n return this.http.request(\n 'DELETE',\n `/v1/partner/companies/${seg(companyExternalId)}/users/${seg(userExternalId)}`\n );\n }\n\n // ── Gömme ─────────────────────────────────────────────────────────────\n\n /**\n * Panel ekranını partner sayfasına gömmek için kısa ömürlü jeton üretir.\n * 120 saniye yaşar ve TEK KULLANIMLIKTIR — jeton URL'de gider, log ve\n * `Referer` başlığına düşer.\n */\n createEmbedToken(companyExternalId: string, input: EmbedTokenInput): Promise<SbResult<EmbedToken>> {\n return this.http.request('POST', `/v1/partner/companies/${seg(companyExternalId)}/embed`, input);\n }\n}\n","/**\n * Mesaj olay webhook'larının imza doğrulaması.\n *\n * Signalbird her teslimatı `X-Signalbird-Signature: sha256=<hex>` başlığıyla\n * imzalar: `hex(hmac_sha256(raw_body, secret))`. Doğrulama HAM gövde üzerinde\n * yapılmalıdır — JSON'u ayrıştırıp yeniden serileştirmek anahtar sırasını\n * değiştirir ve imzayı bozar. Express'te `express.raw()` ya da `verify`\n * kancasıyla ham gövdeyi saklayın.\n */\nimport { createHmac, timingSafeEqual } from 'node:crypto';\n\nexport function verifyWebhook(\n rawBody: string | Uint8Array,\n signatureHeader: string | null | undefined,\n secret: string\n): boolean {\n if (!signatureHeader || !secret) return false;\n\n // \"sha256=abcd…\" — başka algoritma ya da biçim kabul edilmez.\n const match = /^\\s*sha256=([a-f0-9]+)\\s*$/i.exec(signatureHeader);\n if (!match) return false;\n\n const expected = createHmac('sha256', secret).update(rawBody).digest('hex');\n const provided = match[1].toLowerCase();\n\n // Uzunluk farkı, `timingSafeEqual`in fırlatmaması için önce elenir; uzunluk\n // zaten sabit (64) olduğundan zamanlama sızıntısı yaratmaz.\n if (provided.length !== expected.length) return false;\n\n return timingSafeEqual(Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8'));\n}\n","/**\n * signalbird — sunucu tarafı giriş noktası.\n *\n * Next.js sunucu bileşenleri, API route'ları, Express/Fastify/NestJS ve düz\n * Node betikleri buradan alır. TARAYICI için `signalbird/browser`\n * kullanılır — gizli anahtar istemciye inmez.\n *\n * Üç sunucu istemcisi vardır; anahtarları ve kapıları farklıdır:\n * - `SignalbirdClient` → Telsiz (log yazma), `sb_secret_live_…`\n * - `SignalbirdMessaging` → Gönderim (e-posta/SMS/push/kişi/kampanya), `sb_…`\n * - `SignalbirdManagement` → Yönetim (Telsiz projesi, sohbet gelen kutusu,\n * uygulama kaydı), `sb_…` + `radio|chat|apps` scope'ları\n * - `SignalbirdPartner` → Partner (müşteri sağlama, modül yetkisi, gömme),\n * gizli anahtar — yalnız sözleşmeli platformlar\n *\n * Son kullanıcı (ziyaretçi) yüzeyi ayrı giriş noktasındadır:\n * `signalbird/app` — ve onun çatı uyarlamaları `/react`, `/vue`,\n * `/angular`, `/react-native`.\n */\nexport { SignalbirdClient } from './client';\nexport { SignalbirdMessaging } from './messaging';\nexport { SignalbirdManagement } from './management';\nexport { SignalbirdPartner } from './partner';\nexport { verifyWebhook } from './webhook';\nexport type {\n TeamEmbedTokenInput,\n ManagementConfig,\n AppDevice,\n AppPlatform,\n CannedReply,\n CannedReplyInput,\n ChatConversation,\n ChatMessage,\n ChatVisitor,\n ConversationStatus,\n ListAppDevicesQuery,\n ListChatMessagesQuery,\n ListConversationsQuery,\n ListRadioEventsQuery,\n RadioEvent,\n RadioLevel,\n ReplyInput,\n StartConversationInput,\n UpdateConversationInput,\n UpdateVisitorInput,\n} from './management-types';\nexport type {\n MessagingConfig,\n SbResult,\n MessageClass,\n Channel,\n SendEmailInput,\n SendSmsInput,\n SendPushInput,\n SendResult,\n SmsPreview,\n ContactInput,\n Contact,\n ListContactsQuery,\n BulkContactsInput,\n BulkContactsResult,\n ContactList,\n CreateContactListInput,\n CreateCampaignInput,\n Batch,\n CampaignCreateResult,\n CampaignDetail,\n ListCampaignsQuery,\n Message,\n ListMessagesQuery,\n ListCampaignMessagesQuery,\n Paginated,\n MessagingErrorCode,\n} from './messaging-types';\nexport type {\n PartnerConfig,\n AddDomainInput,\n AddDomainResult,\n CreateCompanyInput,\n CreateCompanyResult,\n DnsRecord,\n EmbedModule,\n EmbedToken,\n EmbedTokenInput,\n GrantModuleInput,\n ModuleEntitlement,\n PartnerCompany,\n PartnerDomain,\n PartnerOwnerInput,\n PartnerUser,\n PartnerUserInput,\n UptimeIncident,\n UptimeRange,\n UptimeReport,\n VerifyDomainResult,\n} from './partner-types';\nexport {\n SignalbirdError,\n DEFAULT_BASE_URL,\n type BatchResult,\n type Level,\n type LogInput,\n type LogResult,\n type SignalbirdConfig,\n} from './types';\n\nimport { SignalbirdClient } from './client';\nimport { SignalbirdManagement } from './management';\nimport type { ManagementConfig } from './management-types';\nimport type { SignalbirdConfig } from './types';\n\nlet singleton: SignalbirdClient | null = null;\n\n/**\n * Ortam değişkeninden kurulan paylaşımlı istemci.\n *\n * `SIGNALBIRD_DOMAIN_KEY` okunur. Uygulamanın her köşesinde istemci kurup\n * anahtarı elden ele taşımak yerine tek çağrı yeter:\n *\n * import { signalbird } from 'signalbird'\n * await signalbird().critical('kritikApiHatasi', 'ödeme servisi öldü')\n */\nexport function signalbird(config?: Partial<SignalbirdConfig>): SignalbirdClient {\n if (singleton && !config) {\n return singleton;\n }\n\n const domainKey = config?.domainKey ?? process.env.SIGNALBIRD_DOMAIN_KEY ?? '';\n\n const client = new SignalbirdClient({\n domainKey,\n baseUrl: config?.baseUrl ?? process.env.SIGNALBIRD_URL,\n source: config?.source ?? process.env.SIGNALBIRD_SOURCE,\n ...config,\n });\n\n if (!config) {\n singleton = client;\n }\n\n return client;\n}\n\n/** Test ve sıcak yeniden yükleme için tekil istemciyi sıfırlar. */\nexport function resetSignalbird(): void {\n singleton = null;\n}\n\nlet managementSingleton: SignalbirdManagement | null = null;\n\n/**\n * Ortam değişkeninden kurulan paylaşımlı yönetim istemcisi.\n *\n * `SIGNALBIRD_DOMAIN_KEY` okunur (yoksa `SIGNALBIRD_DOMAIN_KEY` — ikisi de aynı\n * takım anahtarı ailesidir ve çoğu kurulumda tek anahtar kullanılır).\n *\n * import { management } from 'signalbird'\n * await management().createModuleKey('logger', { title: 'Kritik API hatası' })\n */\nexport function management(config?: Partial<ManagementConfig>): SignalbirdManagement {\n if (managementSingleton && !config) {\n return managementSingleton;\n }\n\n const client = new SignalbirdManagement({\n domainKey:\n config?.domainKey ??\n process.env.SIGNALBIRD_DOMAIN_KEY ??\n process.env.SIGNALBIRD_DOMAIN_KEY ??\n '',\n baseUrl: config?.baseUrl ?? process.env.SIGNALBIRD_URL,\n ...config,\n });\n\n if (!config) {\n managementSingleton = client;\n }\n\n return client;\n}\n\n/** Test ve sıcak yeniden yükleme için yönetim istemcisini sıfırlar. */\nexport function resetManagement(): void {\n managementSingleton = null;\n}\n"]}
|