@intercom/cli 0.3.0 → 0.3.1

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/api.ts","../src/api/timeouts.ts","../src/version.ts","../src/api/fetch.ts","../src/api/client.ts","../src/auth/store.ts","../src/utils/fs.ts","../src/auth/config.ts","../src/commands/helpers.ts","../src/output/render.ts","../src/utils/fields.ts","../src/commands/auth/login.ts","../src/auth/cookies.ts","../src/auth/signup.ts","../src/auth/devhub.ts","../src/auth/password.ts","../src/commands/auth/bootstrap.ts","../src/output/formatter.ts","../src/commands/auth/status.ts","../src/commands/auth/logout.ts","../src/commands/auth/signup.ts","../src/commands/auth/verify-email.ts","../src/commands/auth/list.ts","../src/commands/auth/switch.ts","../src/commands/auth/index.ts","../src/commands/me.ts","../src/output/html.ts","../src/commands/articles.ts","../src/commands/contacts.ts","../src/commands/conversations.ts","../src/commands/help-center.ts","../src/commands/messenger.ts","../src/commands/fin.ts","../src/commands/fin/procedures.ts","../src/commands/fin/data-connectors.ts","../src/commands/fin/guidance.ts","../src/commands/fin/attributes.ts","../src/commands/fin/audiences.ts","../src/commands/fin/workflows.ts","../src/commands/fin/simulations.ts","../src/auth/ember-session.ts","../src/commands/fin/enable.ts","../src/commands/setup.ts","../src/commands/completion.ts","../src/commands/pricing.ts","../src/commands/config.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { CLIError, AuthError, RateLimitError, NotFoundError, PermissionError, TimeoutError } from \"./types.js\";\nimport { formatJson } from \"./output/json.js\";\nimport { registerApiCommand } from \"./commands/api.js\";\nimport { registerAuthCommand } from \"./commands/auth/index.js\";\nimport { registerMeCommand } from \"./commands/me.js\";\nimport { registerArticlesCommand } from \"./commands/articles.js\";\nimport { registerContactsCommand } from \"./commands/contacts.js\";\nimport { registerConversationsCommand } from \"./commands/conversations.js\";\nimport { registerHelpCenterCommand } from \"./commands/help-center.js\";\nimport { registerMessengerCommand } from \"./commands/messenger.js\";\nimport { registerFinCommand } from \"./commands/fin.js\";\nimport { registerSetupCommand } from \"./commands/setup.js\";\nimport { registerCompletionCommand } from \"./commands/completion.js\";\nimport { registerPricingCommand } from \"./commands/pricing.js\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { VERSION } from \"./version.js\";\nimport { setCliCommand } from \"./api/fetch.js\";\n\n/** Detect whether the CLI was invoked as `fin` or `intercom`. */\nfunction detectBinaryName(): string {\n const argv1 = process.argv[1] ?? \"\";\n if (argv1.endsWith(\"/fin\") || argv1.endsWith(\"\\\\fin\")) return \"fin\";\n return \"intercom\";\n}\n\nfunction fullCommandName(cmd: Command): string {\n const parts: string[] = [];\n const rootNames = new Set([\"intercom\", \"fin\"]);\n let current: Command | null = cmd;\n while (current) {\n const name = current.name();\n if (name && !rootNames.has(name)) parts.unshift(name);\n current = current.parent;\n }\n return parts.join(\" \");\n}\n\nexport function createProgram(): Command {\n const program = new Command();\n const binName = detectBinaryName();\n\n program\n .name(binName)\n .description(\"CLI tool for managing Intercom workspaces\")\n .version(VERSION)\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output\")\n .option(\"--workspace <id>\", \"Override default workspace\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .option(\"--no-retry\", \"Disable automatic rate limit retry\")\n .option(\"--timeout <seconds>\", \"Request timeout in seconds\")\n .option(\"--agent\", \"Force machine-readable output (JSON/NDJSON)\")\n .option(\"--human\", \"Force human-readable output even when piped\")\n .option(\"--wide\", \"Show all columns with wider truncation\")\n .addHelpText(\n \"after\",\n `\nQuick start:\n $ intercom auth login --token <your-api-token>\n $ intercom me\n $ intercom articles list --json\n $ intercom setup --company-name \"Acme\" --articles-from ./docs\n\nEnvironment: Set INTERCOM_TOKEN to skip login entirely.`,\n );\n\n registerApiCommand(program);\n registerAuthCommand(program);\n registerMeCommand(program);\n registerArticlesCommand(program);\n registerContactsCommand(program);\n registerConversationsCommand(program);\n registerHelpCenterCommand(program);\n registerMessengerCommand(program);\n registerFinCommand(program);\n registerSetupCommand(program);\n registerPricingCommand(program);\n registerCompletionCommand(program);\n registerConfigCommand(program);\n\n program.hook(\"preAction\", (thisCommand, actionCommand) => {\n const rootOpts = thisCommand.opts();\n if (rootOpts.agent && rootOpts.human) {\n throw new CLIError(\"--agent and --human are mutually exclusive\");\n }\n setCliCommand(fullCommandName(actionCommand));\n });\n\n return program;\n}\n\nexport function handleError(err: unknown): never {\n const isJson = process.argv.includes(\"--json\") || process.argv.includes(\"--agent\");\n\n if (err instanceof CLIError) {\n if (isJson) {\n console.error(formatJson({\n error: {\n code: err instanceof AuthError ? \"auth_error\"\n : err instanceof PermissionError ? \"permission_denied\"\n : err instanceof RateLimitError ? \"rate_limited\"\n : err instanceof NotFoundError ? \"not_found\"\n : err instanceof TimeoutError ? \"timeout\"\n : \"error\",\n message: err.message,\n ...(err instanceof RateLimitError ? { retry_after: err.retryAfter } : {}),\n },\n }));\n } else {\n console.error(`Error: ${err.message}`);\n }\n process.exit(err.exitCode);\n }\n\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n}\n\nconst isMainModule = process.argv[1]?.endsWith(\"index.js\") || process.argv[1]?.endsWith(\"intercom\") || process.argv[1]?.endsWith(\"fin\");\n\nif (isMainModule) {\n const program = createProgram();\n try {\n await program.parseAsync();\n } catch (err) {\n handleError(err);\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport { resolveClient } from \"./helpers.js\";\nimport { formatJson } from \"../output/json.js\";\nimport { render } from \"../output/render.js\";\nimport { parseTypedFields } from \"../utils/fields.js\";\nimport { CLIError } from \"../types.js\";\n\ntype ApiOpts = {\n method?: string;\n field?: string[];\n typedField?: string[];\n input?: string;\n jq?: string;\n json?: boolean;\n paginate?: boolean;\n verbose?: boolean;\n retry?: boolean;\n};\n\nfunction readInput(input: string): Record<string, unknown> {\n let raw: string;\n if (input === \"-\") {\n const fd = readFileSync(0, \"utf-8\");\n raw = fd;\n } else {\n raw = readFileSync(input, \"utf-8\");\n }\n try {\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n throw new CLIError(`Failed to parse JSON from ${input === \"-\" ? \"stdin\" : input}`);\n }\n}\n\nexport function registerApiCommand(program: Command): void {\n program\n .command(\"api\")\n .description(\"Make an authenticated API request (like gh api)\")\n .argument(\"<endpoint>\", \"API endpoint path (e.g., /articles)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom api /me\n intercom api /articles --paginate\n intercom api /contacts -X POST -f email=test@example.com -f role=user\n intercom api /articles/123 --jq '.title'`,\n )\n .option(\"-X, --method <method>\", \"HTTP method\")\n .option(\"-f, --field <key=value...>\", \"String field\")\n .option(\n \"-F, --typed-field <key=value...>\",\n \"Typed field (bools, numbers, file reads)\",\n )\n .option(\"--jq <expr>\", \"Filter response with jq expression\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--input <file>\", \"Read JSON body from file (use - for stdin)\")\n .option(\"--paginate\", \"Auto-paginate through all pages\")\n .option(\"--verbose\", \"Show full HTTP request/response\")\n .action(async function (endpoint: string) {\n const options = (\n this as unknown as { optsWithGlobals: () => ApiOpts }\n ).optsWithGlobals();\n const client = await resolveClient(options);\n\n const stringFields = options.field ?? [];\n const typedFields = options.typedField ?? [];\n const inputBody = options.input ? readInput(options.input) : {};\n const body = {\n ...inputBody,\n ...parseTypedFields(stringFields, false),\n ...parseTypedFields(typedFields, true),\n };\n const hasBody =\n stringFields.length > 0 ||\n typedFields.length > 0 ||\n !!options.input;\n const method = options.method ?? (hasBody ? \"POST\" : \"GET\");\n\n let result: unknown;\n if (options.paginate && method.toUpperCase() === \"GET\") {\n result = await client.paginate(\n endpoint,\n hasBody ? (body as Record<string, string>) : undefined,\n );\n } else {\n switch (method.toUpperCase()) {\n case \"GET\":\n result = await client.get(\n endpoint,\n hasBody ? (body as Record<string, string>) : undefined,\n );\n break;\n case \"POST\":\n result = await client.post(endpoint, hasBody ? body : undefined);\n break;\n case \"PUT\":\n result = await client.put(endpoint, hasBody ? body : undefined);\n break;\n case \"PATCH\":\n result = await client.patch(endpoint, hasBody ? body : undefined);\n break;\n case \"DELETE\":\n result = await client.delete(endpoint);\n break;\n default:\n throw new CLIError(`Unsupported method: ${method}`);\n }\n }\n\n // Detect list items for NDJSON streaming when piped\n let listItems: unknown[] | undefined;\n if (Array.isArray(result)) {\n listItems = result;\n } else if (\n result &&\n typeof result === \"object\" &&\n Array.isArray((result as Record<string, unknown>).data)\n ) {\n listItems = (result as Record<string, unknown>).data as unknown[];\n }\n\n render(result, options, () => formatJson(result), listItems);\n });\n}\n","export const API_TIMEOUT_MS = 30_000;\nexport const DOWNLOAD_TIMEOUT_MS = 120_000;\nexport const UPLOAD_TIMEOUT_MS = 120_000;\nexport const OAUTH_CALLBACK_TIMEOUT_MS = 300_000;\nexport const SIMULATION_POLL_TIMEOUT_MS = 600_000;\n","import { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\") as { version: string };\n\nexport const VERSION = pkg.version;\n","import { TimeoutError } from \"../types.js\";\nimport { VERSION } from \"../version.js\";\n\nexport const USER_AGENT = `IntercomCLI/${VERSION}`;\n\nlet _cliCommand = \"\";\n\nexport function setCliCommand(name: string): void {\n _cliCommand = name;\n}\n\nexport async function fetchWithTimeout(\n url: string,\n init: RequestInit,\n options: { timeoutMs: number; verbose?: boolean },\n): Promise<Response> {\n // Inject User-Agent into all requests so Intercom can identify CLI-created workspaces\n const headers = new Headers(init.headers);\n if (!headers.has(\"User-Agent\")) {\n headers.set(\"User-Agent\", USER_AGENT);\n }\n if (_cliCommand) {\n headers.set(\"X-CLI-Command\", _cliCommand);\n }\n\n if (options.verbose) {\n console.error(`> ${init.method ?? \"GET\"} ${url}`);\n }\n let response: Response;\n try {\n response = await fetch(url, { ...init, headers, signal: AbortSignal.timeout(options.timeoutMs) });\n } catch (err: unknown) {\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n throw new TimeoutError(`Request timed out after ${options.timeoutMs / 1000}s: ${init.method ?? \"GET\"} ${url}`);\n }\n throw err;\n }\n if (options.verbose) {\n console.error(`< ${response.status} ${response.statusText}`);\n }\n return response;\n}\n","import {\n AuthError,\n RateLimitError,\n NotFoundError,\n PermissionError,\n CLIError,\n} from \"../types.js\";\nimport type { AuthType } from \"../types.js\";\nimport { API_TIMEOUT_MS } from \"./timeouts.js\";\nimport { fetchWithTimeout } from \"./fetch.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.intercom.io\";\n\nexport interface ClientOptions {\n token: string;\n authType: AuthType;\n appId?: string;\n baseUrl?: string;\n maxRetries?: number;\n verbose?: boolean;\n timeoutMs?: number;\n}\n\nexport class IntercomClient {\n private token: string;\n private authType: AuthType;\n private appId: string;\n private baseUrl: string;\n private maxRetries: number;\n private verbose: boolean;\n private timeoutMs: number;\n\n constructor(options: ClientOptions) {\n this.token = options.token;\n this.authType = options.authType;\n this.appId = options.appId ?? \"\";\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.maxRetries = options.maxRetries ?? 3;\n this.verbose = options.verbose ?? false;\n this.timeoutMs = options.timeoutMs ?? API_TIMEOUT_MS;\n }\n\n private authHeader(): string {\n if (this.authType === \"api_key\") {\n return `Basic ${Buffer.from(`${this.appId}:${this.token}`).toString(\"base64\")}`;\n }\n return `Bearer ${this.token}`;\n }\n\n private async request(\n method: string,\n path: string,\n body?: unknown,\n responseType: \"json\" | \"text\" | \"buffer\" = \"json\",\n extraHeaders?: Record<string, string>,\n ): Promise<unknown> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Authorization: this.authHeader(),\n };\n\n const isFormData = body instanceof FormData;\n\n if (responseType === \"json\") {\n headers.Accept = \"application/json\";\n }\n\n if (!isFormData) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n if (extraHeaders) {\n Object.assign(headers, extraHeaders);\n }\n\n const maxAttempts = this.maxRetries + 1;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const options: RequestInit = { method, headers };\n if (body && method !== \"GET\") {\n if (isFormData) {\n options.body = body as BodyInit;\n } else {\n options.body = JSON.stringify(body);\n }\n }\n\n if (this.verbose) {\n console.error(`> ${method} ${url}`);\n if (body) {\n console.error(\n `> Body: ${body instanceof FormData ? \"[FormData]\" : JSON.stringify(body)}`,\n );\n }\n }\n\n const response = await fetchWithTimeout(url, options, {\n timeoutMs: this.timeoutMs,\n });\n\n if (this.verbose) {\n console.error(`< ${response.status} ${response.statusText}`);\n }\n\n if (response.ok) {\n if (response.status === 204) return {};\n switch (responseType) {\n case \"text\":\n return response.text();\n case \"buffer\":\n return Buffer.from(await response.arrayBuffer());\n default:\n return response.json();\n }\n }\n\n const errorBody = (await response.json().catch(() => ({}))) as {\n errors?: { message?: string; code?: string }[];\n };\n const errorMsg =\n errorBody?.errors?.[0]?.message ?? `HTTP ${response.status}`;\n\n if (response.status === 401) {\n throw new AuthError(\n `Authentication expired or invalid: ${errorMsg}. Run \"intercom auth login\" to re-authenticate.`,\n );\n }\n\n if (response.status === 403) {\n throw new PermissionError(`Permission denied: ${errorMsg}`);\n }\n\n if (response.status === 404) {\n throw new NotFoundError(errorMsg);\n }\n\n if (response.status === 429) {\n const retryAfter = parseInt(\n response.headers.get(\"Retry-After\") ?? \"5\",\n 10,\n );\n if (attempt < this.maxRetries) {\n if (this.verbose) {\n console.error(\n `Rate limited. Retrying in ${retryAfter}s (attempt ${attempt + 1}/${this.maxRetries})...`,\n );\n }\n await new Promise((r) => setTimeout(r, retryAfter * 1000));\n continue;\n }\n throw new RateLimitError(\n `Rate limit exceeded. Retry after ${retryAfter} seconds.`,\n retryAfter,\n );\n }\n\n // Retry on 5xx server errors (502, 503, 504) with exponential backoff\n const RETRYABLE_5XX = [502, 503, 504];\n if (RETRYABLE_5XX.includes(response.status)) {\n if (attempt < this.maxRetries) {\n const backoffMs = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s\n if (this.verbose) {\n console.error(\n `Server error ${response.status}. Retrying in ${backoffMs / 1000}s (attempt ${attempt + 1}/${this.maxRetries})...`,\n );\n }\n await new Promise((r) => setTimeout(r, backoffMs));\n continue;\n }\n throw new CLIError(\n `Server error ${response.status} after ${this.maxRetries} retries: ${errorMsg}`,\n );\n }\n\n throw new CLIError(errorMsg);\n }\n\n throw new CLIError(\"Request failed after retries\");\n }\n\n async get(\n path: string,\n params?: Record<string, string>,\n headers?: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n let url = path;\n if (params && Object.keys(params).length > 0) {\n const qs = new URLSearchParams(params).toString();\n url = `${path}?${qs}`;\n }\n return this.request(\"GET\", url, undefined, \"json\", headers) as Promise<\n Record<string, unknown>\n >;\n }\n\n async post(\n path: string,\n body?: unknown,\n headers?: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n return this.request(\"POST\", path, body, \"json\", headers) as Promise<\n Record<string, unknown>\n >;\n }\n\n async put(\n path: string,\n body?: unknown,\n headers?: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n return this.request(\"PUT\", path, body, \"json\", headers) as Promise<\n Record<string, unknown>\n >;\n }\n\n async patch(\n path: string,\n body?: unknown,\n headers?: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n return this.request(\"PATCH\", path, body, \"json\", headers) as Promise<\n Record<string, unknown>\n >;\n }\n\n async delete(\n path: string,\n headers?: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n return this.request(\"DELETE\", path, undefined, \"json\", headers) as Promise<\n Record<string, unknown>\n >;\n }\n\n async getText(\n path: string,\n params?: Record<string, string>,\n ): Promise<string> {\n let url = path;\n if (params && Object.keys(params).length > 0) {\n const qs = new URLSearchParams(params).toString();\n url = `${path}?${qs}`;\n }\n return this.request(\"GET\", url, undefined, \"text\") as Promise<string>;\n }\n\n async getBuffer(\n path: string,\n params?: Record<string, string>,\n ): Promise<Buffer> {\n let url = path;\n if (params && Object.keys(params).length > 0) {\n const qs = new URLSearchParams(params).toString();\n url = `${path}?${qs}`;\n }\n return this.request(\"GET\", url, undefined, \"buffer\") as Promise<Buffer>;\n }\n\n async postFormData(\n path: string,\n formData: FormData,\n ): Promise<Record<string, unknown>> {\n return this.request(\"POST\", path, formData) as Promise<\n Record<string, unknown>\n >;\n }\n\n async paginate(\n path: string,\n params?: Record<string, string>,\n dataKey: string = \"data\",\n ): Promise<Record<string, unknown>[]> {\n const allData: Record<string, unknown>[] = [];\n\n // First request — used to detect pagination style\n const firstResponse = await this.get(path, { ...params });\n const firstData = firstResponse[dataKey] as\n | Record<string, unknown>[]\n | undefined;\n if (firstData) allData.push(...firstData);\n\n const pages = firstResponse.pages as\n | {\n next?: { starting_after?: string } | null;\n total_pages?: number;\n }\n | undefined;\n\n // Cursor-based pagination (contacts, conversations)\n const startingAfter =\n pages?.next && typeof pages.next === \"object\"\n ? pages.next.starting_after\n : undefined;\n\n if (startingAfter) {\n let cursor: string | undefined = startingAfter;\n while (cursor) {\n const response = await this.get(path, {\n ...params,\n starting_after: cursor,\n });\n const data = response[dataKey] as Record<string, unknown>[] | undefined;\n if (data) allData.push(...data);\n const p = response.pages as\n | { next?: { starting_after?: string } | null }\n | undefined;\n cursor =\n p?.next && typeof p.next === \"object\"\n ? p.next.starting_after\n : undefined;\n }\n return allData;\n }\n\n // Page-based pagination (articles, help-center collections)\n const totalPages = pages?.total_pages ?? 1;\n for (let page = 2; page <= totalPages; page++) {\n const response = await this.get(path, { ...params, page: String(page) });\n const data = response[dataKey] as Record<string, unknown>[] | undefined;\n if (data) allData.push(...data);\n }\n\n return allData;\n }\n}\n","import { readFileSync, mkdirSync } from \"node:fs\";\nimport { atomicWriteFileSync } from \"../utils/fs.js\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { randomBytes, createCipheriv, createDecipheriv } from \"node:crypto\";\nimport { detectAuthType } from \"../types.js\";\nimport type { StoredCredential } from \"../types.js\";\n\nconst SERVICE_NAME = \"intercom-cli\";\n\nexport interface KeychainBackend {\n get(service: string, account: string): Promise<string | undefined>;\n set(service: string, account: string, value: string): Promise<void>;\n delete(service: string, account: string): Promise<void>;\n}\n\n// --- In-memory backend (for tests) ---\n\nexport class InMemoryBackend implements KeychainBackend {\n private store = new Map<string, string>();\n private key(service: string, account: string) {\n return `${service}:${account}`;\n }\n async get(service: string, account: string) {\n return this.store.get(this.key(service, account));\n }\n async set(service: string, account: string, value: string) {\n this.store.set(this.key(service, account), value);\n }\n async delete(service: string, account: string) {\n this.store.delete(this.key(service, account));\n }\n}\n\n// --- Native keyring backend (@napi-rs/keyring) ---\n\nexport class NativeKeychainBackend implements KeychainBackend {\n async get(service: string, account: string): Promise<string | undefined> {\n const { Entry } = await import(\"@napi-rs/keyring\");\n const entry = new Entry(service, account);\n return entry.getPassword() ?? undefined;\n }\n\n async set(service: string, account: string, value: string): Promise<void> {\n const { Entry } = await import(\"@napi-rs/keyring\");\n const entry = new Entry(service, account);\n entry.setPassword(value);\n }\n\n async delete(service: string, account: string): Promise<void> {\n const { Entry } = await import(\"@napi-rs/keyring\");\n const entry = new Entry(service, account);\n try {\n entry.deletePassword();\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n if (/not found|no matching/i.test(msg)) return;\n throw err;\n }\n }\n}\n\n// --- Encrypted file backend (fallback, zero native deps) ---\n\nconst CREDENTIALS_FILE = \"credentials\";\nconst KEY_FILE = \".key\";\nconst ALGORITHM = \"aes-256-gcm\";\n\nexport class EncryptedFileBackend implements KeychainBackend {\n private dir: string;\n\n constructor(dir?: string) {\n this.dir = dir ?? join(homedir(), \".intercom\");\n }\n\n private getEncryptionKey(): Buffer {\n const keyPath = join(this.dir, KEY_FILE);\n try {\n return Buffer.from(readFileSync(keyPath, \"utf-8\").trim(), \"hex\");\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n // Key file doesn't exist — generate new key\n mkdirSync(this.dir, { recursive: true });\n const key = randomBytes(32);\n atomicWriteFileSync(keyPath, key.toString(\"hex\") + \"\\n\");\n return key;\n }\n }\n\n private readStore(): Record<string, string> {\n const filePath = join(this.dir, CREDENTIALS_FILE);\n let raw: string;\n try {\n raw = readFileSync(filePath, \"utf-8\");\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return {};\n }\n const { iv, tag, data } = JSON.parse(raw) as {\n iv: string;\n tag: string;\n data: string;\n };\n const key = this.getEncryptionKey();\n const decipher = createDecipheriv(ALGORITHM, key, Buffer.from(iv, \"hex\"));\n decipher.setAuthTag(Buffer.from(tag, \"hex\"));\n let decrypted = decipher.update(data, \"hex\", \"utf-8\");\n decrypted += decipher.final(\"utf-8\");\n return JSON.parse(decrypted) as Record<string, string>;\n }\n\n private writeStore(store: Record<string, string>): void {\n mkdirSync(this.dir, { recursive: true });\n const key = this.getEncryptionKey();\n const iv = randomBytes(16);\n const cipher = createCipheriv(ALGORITHM, key, iv);\n let encrypted = cipher.update(JSON.stringify(store), \"utf-8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n const tag = cipher.getAuthTag();\n const filePath = join(this.dir, CREDENTIALS_FILE);\n atomicWriteFileSync(\n filePath,\n JSON.stringify({ iv: iv.toString(\"hex\"), tag: tag.toString(\"hex\"), data: encrypted }) + \"\\n\",\n );\n }\n\n private storeKey(service: string, account: string): string {\n return `${service}:${account}`;\n }\n\n async get(service: string, account: string): Promise<string | undefined> {\n const store = this.readStore();\n return store[this.storeKey(service, account)];\n }\n\n async set(service: string, account: string, value: string): Promise<void> {\n const store = this.readStore();\n store[this.storeKey(service, account)] = value;\n this.writeStore(store);\n }\n\n async delete(service: string, account: string): Promise<void> {\n const store = this.readStore();\n delete store[this.storeKey(service, account)];\n this.writeStore(store);\n }\n}\n\n// --- Fallback wrapper (native keyring → encrypted file) ---\n\nexport class FallbackBackend implements KeychainBackend {\n private active: KeychainBackend;\n private fallen = false;\n\n constructor(\n private primary: KeychainBackend,\n private secondary: KeychainBackend,\n ) {\n this.active = primary;\n }\n\n private fallback(err: unknown): void {\n if (this.fallen) throw err;\n this.fallen = true;\n this.active = this.secondary;\n console.error(\n `Warning: System keyring unavailable (${err instanceof Error ? err.message : String(err)}). Falling back to encrypted file storage.`,\n );\n }\n\n async get(service: string, account: string): Promise<string | undefined> {\n try {\n return await this.active.get(service, account);\n } catch (err) {\n this.fallback(err);\n return this.active.get(service, account);\n }\n }\n\n async set(service: string, account: string, value: string): Promise<void> {\n try {\n return await this.active.set(service, account, value);\n } catch (err) {\n this.fallback(err);\n return this.active.set(service, account, value);\n }\n }\n\n async delete(service: string, account: string): Promise<void> {\n try {\n return await this.active.delete(service, account);\n } catch (err) {\n this.fallback(err);\n return this.active.delete(service, account);\n }\n }\n}\n\n// --- Backend selection ---\n\n/**\n * Select the best available backend:\n * 1. If configDir is set (tests, user override), use EncryptedFileBackend in that dir.\n * 2. Otherwise, try NativeKeychainBackend first and fall back to EncryptedFileBackend\n * with a stderr warning if the native keyring is unavailable.\n */\nexport function createDefaultBackend(configDir?: string): KeychainBackend {\n if (configDir) {\n return new EncryptedFileBackend(configDir);\n }\n return new FallbackBackend(\n new NativeKeychainBackend(),\n new EncryptedFileBackend(),\n );\n}\n\n// --- Credential store (consumer-facing API) ---\n\nexport class CredentialStore {\n constructor(private backend: KeychainBackend) {}\n\n async get(appId: string): Promise<StoredCredential | undefined> {\n const raw = await this.backend.get(SERVICE_NAME, appId);\n if (!raw) return undefined;\n return JSON.parse(raw) as StoredCredential;\n }\n\n async set(appId: string, credential: StoredCredential): Promise<void> {\n await this.backend.set(SERVICE_NAME, appId, JSON.stringify(credential));\n }\n\n async delete(appId: string): Promise<void> {\n await this.backend.delete(SERVICE_NAME, appId);\n }\n\n resolveFromEnv(envToken: string): StoredCredential {\n return {\n token: envToken,\n auth_type: detectAuthType(envToken),\n app_id: \"env\",\n };\n }\n}\n","import { writeFile, rename } from \"node:fs/promises\";\nimport { writeFileSync, renameSync } from \"node:fs\";\n\n/**\n * Atomically write a file: writes to a temp file in the same directory,\n * sets permissions, then renames over the target path.\n */\nexport async function atomicWriteFile(filePath: string, data: string, mode: number = 0o600): Promise<void> {\n const tmpPath = filePath + \".tmp\";\n await writeFile(tmpPath, data, { mode });\n await rename(tmpPath, filePath);\n}\n\n/**\n * Synchronous atomic write: same write-then-rename pattern.\n */\nexport function atomicWriteFileSync(filePath: string, data: string, mode: number = 0o600): void {\n const tmpPath = filePath + \".tmp\";\n writeFileSync(tmpPath, data, { mode });\n renameSync(tmpPath, filePath);\n}\n","import { readFile, mkdir } from \"node:fs/promises\";\nimport { atomicWriteFile } from \"../utils/fs.js\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Config, WorkspaceConfig } from \"../types.js\";\n\nconst CONFIG_FILE = \"config.json\";\n\nexport function defaultConfigDir(): string {\n return join(homedir(), \".intercom\");\n}\n\nexport async function readConfig(configDir?: string): Promise<Config> {\n const dir = configDir ?? defaultConfigDir();\n try {\n const raw = await readFile(join(dir, CONFIG_FILE), \"utf-8\");\n return JSON.parse(raw) as Config;\n } catch {\n return { workspaces: {} };\n }\n}\n\nexport async function writeConfig(config: Config, configDir?: string): Promise<void> {\n const dir = configDir ?? defaultConfigDir();\n await mkdir(dir, { recursive: true });\n await atomicWriteFile(join(dir, CONFIG_FILE), JSON.stringify(config, null, 2) + \"\\n\");\n}\n\nexport async function addWorkspace(\n configDir: string | undefined,\n workspace: WorkspaceConfig,\n): Promise<void> {\n const config = await readConfig(configDir);\n config.workspaces[workspace.app_id] = workspace;\n if (!config.default) {\n config.default = workspace.app_id;\n }\n await writeConfig(config, configDir);\n}\n\nexport async function removeWorkspace(\n configDir: string | undefined,\n appId: string,\n): Promise<void> {\n const config = await readConfig(configDir);\n delete config.workspaces[appId];\n if (config.default === appId) {\n const remaining = Object.keys(config.workspaces);\n config.default = remaining.length > 0 ? remaining[0] : undefined;\n }\n await writeConfig(config, configDir);\n}\n\nexport async function getDefaultWorkspace(\n configDir?: string,\n): Promise<WorkspaceConfig | undefined> {\n const config = await readConfig(configDir);\n if (!config.default) return undefined;\n return config.workspaces[config.default];\n}\n","import { IntercomClient } from \"../api/client.js\";\nimport { CredentialStore, createDefaultBackend } from \"../auth/store.js\";\nimport { readConfig } from \"../auth/config.js\";\nimport { AuthError, CLIError, detectAuthType } from \"../types.js\";\n\nexport { detectAuthType };\n\ninterface GlobalOptions {\n workspace?: string;\n verbose?: boolean;\n retry?: boolean;\n timeout?: string;\n}\n\nexport async function resolveClient(\n options: GlobalOptions = {},\n): Promise<IntercomClient> {\n const envToken = process.env.INTERCOM_TOKEN;\n if (envToken) {\n return new IntercomClient({\n token: envToken,\n authType: detectAuthType(envToken),\n appId: process.env.INTERCOM_APP_ID ?? \"\",\n baseUrl: process.env.INTERCOM_API_BASE_URL || undefined,\n verbose: options.verbose,\n maxRetries: options.retry === false ? 0 : undefined,\n timeoutMs: options.timeout\n ? parseInt(options.timeout, 10) * 1000\n : undefined,\n });\n }\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n const appId = options.workspace ?? config.default;\n if (!appId) {\n throw new AuthError(\n 'Not authenticated. Run \"intercom auth login\" to get started.',\n );\n }\n\n if (!options.workspace && config.default && !config.workspaces[appId]) {\n throw new AuthError(\n `Default workspace \"${appId}\" is not in configured workspaces. Run \"intercom auth bootstrap\" or \"intercom auth login --token <token>\" to re-authenticate.`,\n );\n }\n\n const store = new CredentialStore(createDefaultBackend(configDir));\n const cred = await store.get(appId);\n if (!cred) {\n throw new AuthError(\n `No credentials found for workspace \"${appId}\". Run \"intercom auth bootstrap\" or \"intercom auth login --token <token>\" to authenticate.`,\n );\n }\n\n return new IntercomClient({\n token: cred.token,\n authType: cred.auth_type,\n appId: cred.app_id,\n baseUrl: process.env.INTERCOM_API_BASE_URL || undefined,\n verbose: options.verbose,\n maxRetries: options.retry === false ? 0 : undefined,\n timeoutMs: options.timeout\n ? parseInt(options.timeout, 10) * 1000\n : undefined,\n });\n}\n\nexport function parseFieldArgs(fields: string[]): Record<string, string> {\n return Object.fromEntries(\n fields.map((f) => {\n const eq = f.indexOf(\"=\");\n if (eq === -1) {\n throw new CLIError(\n `Invalid field argument \"${f}\": expected format key=value`,\n );\n }\n return [f.slice(0, eq), f.slice(eq + 1)];\n }),\n );\n}\n\nexport function formatTimestamp(ts: unknown): string {\n if (!ts) return \"\";\n const n = typeof ts === \"number\" ? ts : Number(ts);\n if (isNaN(n)) return String(ts);\n return new Date(n * 1000).toISOString().slice(0, 10);\n}\n","/**\n * Centralized output rendering.\n *\n * Decides format based on:\n * 1. --jq flag → apply filter, output compact NDJSON\n * 2. --json flag → full pretty-printed JSON (for human inspection)\n * 3. No TTY (piped/agent) → compact NDJSON (one JSON object per line)\n * 4. TTY (human) → human-readable (caller provides the formatter)\n *\n * JSON is the canonical format. Human output is a lossy rendering.\n * NDJSON is used for all non-TTY output because agents can process\n * line-by-line without buffering.\n */\n\nimport { formatJson, applyJq } from \"./json.js\";\n\ninterface RenderOptions {\n json?: boolean;\n jq?: string;\n agent?: boolean;\n human?: boolean;\n}\n\n/**\n * Render output with automatic format detection.\n *\n * @param data - The canonical data (what --json would return)\n * @param opts - Command options (includes json, jq flags)\n * @param humanRenderer - Function that renders human-readable output (only called for TTY)\n * @param listItems - Optional: if this is a list response, the array of items for NDJSON.\n * Each item is emitted as one compact JSON line when piped.\n */\nexport function render(\n data: unknown,\n opts: RenderOptions,\n humanRenderer: () => string,\n listItems?: unknown[],\n): void {\n // --jq always wins — explicit structured query\n if (opts.jq) {\n const filtered = applyJq(data, opts.jq);\n if (Array.isArray(filtered)) {\n for (const item of filtered) {\n console.log(JSON.stringify(item));\n }\n } else {\n console.log(JSON.stringify(filtered));\n }\n return;\n }\n\n // --json explicitly passed — pretty-printed for human inspection\n if (opts.json) {\n console.log(formatJson(data));\n return;\n }\n\n // --agent forces machine-readable NDJSON (same as non-TTY)\n if (opts.agent) {\n if (listItems) {\n for (const item of listItems) {\n console.log(JSON.stringify(item));\n }\n } else {\n console.log(JSON.stringify(data));\n }\n return;\n }\n\n // --human forces human-readable output even when piped\n if (opts.human) {\n console.log(humanRenderer());\n return;\n }\n\n // No TTY (piped to agent/script) — compact NDJSON\n if (!process.stdout.isTTY) {\n if (listItems) {\n for (const item of listItems) {\n console.log(JSON.stringify(item));\n }\n } else {\n console.log(JSON.stringify(data));\n }\n return;\n }\n\n // TTY — human-readable\n console.log(humanRenderer());\n}\n","import { readFileSync } from \"node:fs\";\nimport { CLIError } from \"../types.js\";\n\nexport function parseTypedFields(\n fields: string[],\n typed: boolean,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const field of fields) {\n const eqIndex = field.indexOf(\"=\");\n if (eqIndex === -1) {\n throw new CLIError(\n `Invalid field argument \"${field}\": expected format key=value`,\n );\n }\n const key = field.slice(0, eqIndex);\n const rawValue = field.slice(eqIndex + 1);\n\n if (typed) {\n if (rawValue === \"true\") result[key] = true;\n else if (rawValue === \"false\") result[key] = false;\n else if (rawValue === \"null\") result[key] = null;\n else if (rawValue.startsWith(\"@\")) {\n const filePath = rawValue.slice(1);\n result[key] = readFileSync(filePath, \"utf-8\");\n } else if (/^\\d+$/.test(rawValue)) result[key] = parseInt(rawValue, 10);\n else result[key] = rawValue;\n } else {\n result[key] = rawValue;\n }\n }\n return result;\n}\n","import { Command } from \"commander\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { addWorkspace } from \"../../auth/config.js\";\nimport { IntercomClient } from \"../../api/client.js\";\nimport { detectAuthType } from \"../helpers.js\";\nimport { CLIError } from \"../../types.js\";\n\nexport function registerLoginCommand(auth: Command): void {\n auth\n .command(\"login\")\n .description(\"Authenticate with Intercom\")\n .option(\"--token <token>\", \"Authenticate with an API key or token directly\")\n .option(\"--device\", \"Use device flow (for headless environments)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom auth login --token <your-api-token>\n\nEnvironment: Set INTERCOM_TOKEN to skip login entirely.`,\n )\n .action(async (options) => {\n if (options.token) {\n await loginWithToken(options.token);\n } else if (options.device) {\n throw new CLIError(\"Device flow not yet available. Server-side endpoints required. Use --token for now, or run the browser flow without --device.\", 1);\n } else {\n throw new CLIError(\n \"OAuth login is not yet available. Use --token <token> or set the INTERCOM_TOKEN environment variable.\",\n 1,\n );\n }\n });\n}\n\nasync function loginWithToken(token: string): Promise<void> {\n const authType = detectAuthType(token);\n const client = new IntercomClient({\n token,\n authType,\n baseUrl: process.env.INTERCOM_API_BASE_URL || undefined,\n });\n\n const me = await client.get(\"/me\");\n const app = me.app as Record<string, unknown> | undefined;\n const appId = (app?.id_code as string) ?? (me.id as string);\n const name = (app?.name as string) ?? \"Unknown\";\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const store = new CredentialStore(createDefaultBackend(configDir));\n await store.set(appId, { token, auth_type: authType, app_id: appId });\n await addWorkspace(configDir, { app_id: appId, name });\n\n console.log(`Authenticated to ${name} (${appId})`);\n}\n","/**\n * Shared cookie utilities for auth flows that interact with Ember/Devise.\n */\n\n// Extract cookies from a response's set-cookie headers\nexport function extractCookies(response: Response): string {\n const setCookies: string[] =\n typeof (response.headers as unknown as { getSetCookie?: () => string[] })\n .getSetCookie === \"function\"\n ? (\n response.headers as unknown as { getSetCookie: () => string[] }\n ).getSetCookie()\n : (response.headers.get(\"set-cookie\") ?? \"\")\n .split(/,(?=[^ ])/)\n .filter(Boolean);\n\n return setCookies.map((c) => c.split(\";\")[0]).join(\"; \");\n}\n\n// Merge new cookies on top of existing ones (new values win)\nexport function mergeCookies(existing: string, newCookies: string): string {\n const map = new Map<string, string>();\n for (const cookie of [...existing.split(\"; \"), ...newCookies.split(\"; \")]) {\n const eqIdx = cookie.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const name = cookie.slice(0, eqIdx).trim();\n const value = cookie.slice(eqIdx + 1);\n if (name) map.set(name, value);\n }\n return Array.from(map.entries())\n .map(([k, v]) => `${k}=${v}`)\n .join(\"; \");\n}\n","import { fetchWithTimeout } from \"../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../api/timeouts.js\";\nimport { extractCookies } from \"./cookies.js\";\n\nconst DEFAULT_APP_BASE_URL = \"https://app.intercom.com\";\n\nexport function getAppBaseUrl(): string {\n return process.env.INTERCOM_APP_BASE_URL ?? DEFAULT_APP_BASE_URL;\n}\n\nconst PLAN_SOLUTION_IDS: Record<string, number> = {\n essential: 28,\n advanced: 29,\n expert: 30,\n};\n\nconst CSRF_TOKEN_PATTERN = /<meta\\s+name=\"csrf-token\"\\s+content=\"([^\"]+)\"/;\n\nexport async function fetchCsrfToken(\n url: string,\n timeoutMs: number = API_TIMEOUT_MS,\n init?: RequestInit,\n): Promise<{ token: string; cookies: string }> {\n const response = await fetchWithTimeout(url, init ?? {}, { timeoutMs });\n if (!response.ok)\n throw new Error(`Failed to fetch ${url}: ${response.status}`);\n const html = await response.text();\n const match = CSRF_TOKEN_PATTERN.exec(html);\n if (!match) throw new Error(\"Could not find CSRF token\");\n return { token: match[1], cookies: extractCookies(response) };\n}\n\nexport interface SignupOptions {\n baseUrl: string;\n email: string;\n name: string;\n password: string;\n companyName: string;\n plan?: string; // \"essential\" | \"advanced\" | \"expert\"\n timeoutMs?: number;\n}\n\nexport interface SignupResult {\n id: string;\n name: string;\n}\n\nexport async function signup(options: SignupOptions): Promise<SignupResult> {\n const {\n baseUrl,\n email,\n name,\n password,\n companyName,\n plan = \"advanced\",\n timeoutMs = API_TIMEOUT_MS,\n } = options;\n\n const csrfUrl = `${baseUrl}/admins/sign_up/email`;\n const { token: csrfToken, cookies } = await fetchCsrfToken(\n csrfUrl,\n timeoutMs,\n );\n\n const solutionId = PLAN_SOLUTION_IDS[plan] ?? PLAN_SOLUTION_IDS[\"advanced\"];\n\n const body = {\n admin: {\n name,\n email,\n password,\n terms_of_service: true,\n },\n app: {\n name: companyName,\n solution_id: solutionId,\n },\n pageview: {},\n email_submission: {},\n sign_up_locale: \"en\",\n new_app_feature_flags: [\n \"fin-sdk\",\n \"messenger-public-api\",\n ],\n };\n\n const response = await fetchWithTimeout(\n `${baseUrl}/ember/signups`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-CSRF-Token\": csrfToken,\n Accept: \"application/json\",\n ...(cookies ? { Cookie: cookies } : {}),\n },\n body: JSON.stringify(body),\n },\n { timeoutMs },\n );\n\n if (response.status === 409) {\n throw new Error(\"An account with that email address already exists.\");\n }\n\n if (response.status === 422) {\n const data = (await response.json()) as { errors?: string[] };\n const msg = data.errors?.join(\", \") ?? \"Validation error\";\n throw new Error(`Signup validation failed: ${msg}`);\n }\n\n if (response.status === 403) {\n throw new Error(\n \"Signup blocked (403 Forbidden). The request may have been blocked by WAF.\",\n );\n }\n\n if (!response.ok) {\n throw new Error(`Signup failed with status ${response.status}`);\n }\n\n const workspace = (await response.json()) as { id: string; name: string };\n return { id: workspace.id, name: workspace.name };\n}\n","import { fetchCsrfToken } from \"./signup.js\";\nimport { fetchWithTimeout } from \"../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../api/timeouts.js\";\nimport { extractCookies, mergeCookies } from \"./cookies.js\";\n\nexport interface DevHubOptions {\n baseUrl: string;\n email: string;\n password: string;\n appId: string;\n appPackageId?: string; // skip discovery if provided\n timeoutMs?: number;\n}\n\n/**\n * Sign in via Devise, returns the session cookie string to use in subsequent requests.\n */\nexport async function deviseSignIn(\n baseUrl: string,\n email: string,\n password: string,\n timeoutMs: number = API_TIMEOUT_MS,\n): Promise<string> {\n // Step 1: Fetch CSRF token from sign-in page\n const signInUrl = `${baseUrl}/admins/sign_in`;\n const { token: csrfToken, cookies: initialCookies } = await fetchCsrfToken(\n signInUrl,\n timeoutMs,\n { redirect: \"manual\" },\n );\n\n let cookies = initialCookies;\n\n // Step 2: POST credentials\n const body = new URLSearchParams({\n \"admin[email]\": email,\n \"admin[password]\": password,\n \"admin[remember_me]\": \"1\",\n authenticity_token: csrfToken,\n });\n\n const signInResponse = await fetchWithTimeout(\n signInUrl,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"text/html\",\n ...(cookies ? { Cookie: cookies } : {}),\n },\n body: body.toString(),\n redirect: \"manual\",\n },\n { timeoutMs },\n );\n\n // Successful sign-in is a 302 redirect NOT back to /admins/sign_in\n if (signInResponse.status !== 302 && signInResponse.status !== 301) {\n throw new Error(\n `Sign-in returned unexpected status ${signInResponse.status}`,\n );\n }\n\n const location = signInResponse.headers.get(\"location\") ?? \"\";\n\n if (location.includes(\"/admins/sign_in\")) {\n throw new Error(\"Invalid credentials\");\n }\n\n if (location.includes(\"two_factor\")) {\n throw new Error(\n \"Two-factor authentication is required. Please use an API key instead.\",\n );\n }\n\n // Merge the session cookies from the POST response\n cookies = mergeCookies(cookies, extractCookies(signInResponse));\n return cookies;\n}\n\n/**\n * Find an existing Developer Hub app package or create one.\n * Returns the app package ID and whether it was newly created.\n */\nexport async function findOrCreateAppPackage(\n baseUrl: string,\n cookies: string,\n appId: string,\n appPackageId?: string,\n timeoutMs: number = API_TIMEOUT_MS,\n): Promise<{ id: string; name: string; created: boolean }> {\n if (appPackageId) {\n return { id: appPackageId, name: \"CLI Access Token\", created: false };\n }\n\n // List existing app packages\n const listUrl = `${baseUrl}/ember/developer_home/app_packages?app_id=${appId}`;\n const listResponse = await fetchWithTimeout(\n listUrl,\n {\n headers: {\n Accept: \"application/json\",\n Cookie: cookies,\n },\n },\n { timeoutMs },\n );\n\n if (!listResponse.ok) {\n if (listResponse.status === 403) {\n throw new Error(\n `Developer Hub access denied (403). This usually means the admin email has not been verified.\\n` +\n ` Verify your email first: intercom auth verify-email --url <url-from-verification-email>\\n` +\n ` Then retry this command.`,\n );\n }\n throw new Error(`Failed to list app packages: ${listResponse.status}`);\n }\n\n const data = (await listResponse.json()) as {\n app_packages?: Array<{ id: string; name: string }>;\n };\n const packages =\n data.app_packages ??\n (Array.isArray(data) ? (data as Array<{ id: string; name: string }>) : []);\n\n if (packages.length > 0) {\n return {\n id: String(packages[0].id),\n name: packages[0].name ?? \"CLI Access Token\",\n created: false,\n };\n }\n\n // No packages — create one. First get a fresh CSRF token.\n // Use the sign-in page with existing cookies to get a CSRF token\n // that belongs to our authenticated session.\n let freshCsrf = \"\";\n try {\n const { token, cookies: csrfCookies } = await fetchCsrfToken(\n `${baseUrl}/admins/sign_in`,\n timeoutMs,\n { headers: { Cookie: cookies } },\n );\n freshCsrf = token;\n if (csrfCookies) cookies = mergeCookies(cookies, csrfCookies);\n } catch {\n // Continue without CSRF token — the create request may still work with session cookies\n }\n\n const createResponse = await fetchWithTimeout(\n `${baseUrl}/ember/developer_home/app_packages`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n Cookie: cookies,\n ...(freshCsrf ? { \"X-CSRF-Token\": freshCsrf } : {}),\n },\n body: JSON.stringify({\n name: \"CLI Access Token\",\n owner_app_id: appId,\n app_id: appId,\n }),\n },\n { timeoutMs },\n );\n\n if (!createResponse.ok) {\n if (createResponse.status === 403) {\n throw new Error(\n `Developer Hub access denied (403). This usually means the admin email has not been verified.\\n` +\n ` Verify your email first: intercom auth verify-email --url <url-from-verification-email>\\n` +\n ` Then retry this command.`,\n );\n }\n throw new Error(`Failed to create app package: ${createResponse.status}`);\n }\n\n const created = (await createResponse.json()) as {\n id: string;\n name: string;\n app_package?: { id: string; name: string };\n };\n // Some API shapes nest under app_package\n const pkg = (created.app_package ?? created) as { id: string; name: string };\n return {\n id: String(pkg.id),\n name: pkg.name ?? \"CLI Access Token\",\n created: true,\n };\n}\n\n/**\n * Fetch the OAuth access token from a Developer Hub app package install.\n */\nexport async function fetchAccessToken(\n baseUrl: string,\n cookies: string,\n appPackageId: string,\n appId: string,\n timeoutMs: number = API_TIMEOUT_MS,\n): Promise<string> {\n const url = `${baseUrl}/ember/developer_home/app_package_installs?app_package_id=${appPackageId}&only_owner_app=true&app_id=${appId}`;\n const response = await fetchWithTimeout(\n url,\n {\n headers: {\n Accept: \"application/json\",\n Cookie: cookies,\n },\n },\n { timeoutMs },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch app package installs: ${response.status}`);\n }\n\n const data = (await response.json()) as\n | {\n access_token?: string;\n app_package_installs?: Array<{ access_token?: string }>;\n }\n | Array<{ access_token?: string }>;\n\n // Handle various response shapes\n if (Array.isArray(data)) {\n const token = data[0]?.access_token;\n if (token) return token;\n } else if (data.access_token) {\n return data.access_token;\n } else if (data.app_package_installs?.[0]?.access_token) {\n return data.app_package_installs[0].access_token;\n }\n\n throw new Error(\"No access token found in app package installs response\");\n}\n\n/**\n * Full flow: sign in → find/create package → get token.\n */\nexport async function getToken(options: DevHubOptions): Promise<{\n token: string;\n appId: string;\n appPackage: { id: string; name: string; created: boolean };\n}> {\n const { baseUrl, email, password, appId, appPackageId, timeoutMs } = options;\n\n const cookies = await deviseSignIn(baseUrl, email, password, timeoutMs);\n const appPackage = await findOrCreateAppPackage(\n baseUrl,\n cookies,\n appId,\n appPackageId,\n timeoutMs,\n );\n const token = await fetchAccessToken(\n baseUrl,\n cookies,\n appPackage.id,\n appId,\n timeoutMs,\n );\n\n return { token, appId, appPackage };\n}\n","import { CLIError } from \"../types.js\";\n\nexport async function resolvePassword(options: { passwordStdin?: boolean }): Promise<string> {\n const envPassword = process.env.INTERCOM_PASSWORD;\n if (envPassword) return envPassword;\n\n if (options.passwordStdin) {\n return readStdin();\n }\n\n throw new CLIError(\n \"Password required. Set INTERCOM_PASSWORD env var or pass --password-stdin.\\n\" +\n ' Example: INTERCOM_PASSWORD=secret intercom auth bootstrap --email admin@co.com --app-id abc123\\n' +\n ' Example: echo \"$PASSWORD\" | intercom auth bootstrap --password-stdin --email admin@co.com --app-id abc123',\n );\n}\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n throw new CLIError(\n \"--password-stdin requires piped input. Stdin is a TTY.\\n\" +\n ' Example: echo \"$PASSWORD\" | intercom auth bootstrap --password-stdin ...',\n );\n }\n\n return new Promise<string>((resolve, reject) => {\n let data = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (chunk: string) => { data += chunk; });\n process.stdin.on(\"end\", () => resolve(data.trim()));\n process.stdin.on(\"error\", reject);\n });\n}\n","import { Command } from \"commander\";\nimport { getToken } from \"../../auth/devhub.js\";\nimport { resolvePassword } from \"../../auth/password.js\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { addWorkspace } from \"../../auth/config.js\";\nimport { getAppBaseUrl } from \"../../auth/signup.js\";\nimport { CLIError } from \"../../types.js\";\n\nexport function registerBootstrapCommand(auth: Command): void {\n auth\n .command(\"bootstrap\")\n .description(\"Acquire a Developer Hub access token for a workspace\")\n .requiredOption(\"--email <email>\", \"Admin email address\")\n .requiredOption(\"--app-id <appId>\", \"Workspace app ID (e.g. abc123de)\")\n .option(\"--app-package-id <id>\", \"Skip package discovery and use this app package ID\")\n .option(\"--password-stdin\", \"Read password from stdin (or set INTERCOM_PASSWORD env var)\")\n .action(async (options) => {\n const baseUrl = getAppBaseUrl();\n\n try {\n const password = await resolvePassword({ passwordStdin: options.passwordStdin as boolean | undefined });\n\n const { token, appId, appPackage } = await getToken({\n baseUrl,\n email: options.email as string,\n password,\n appId: options.appId as string,\n appPackageId: options.appPackageId as string | undefined,\n });\n\n console.log(\"Signed in to Intercom\");\n\n if (appPackage.created) {\n console.log(`Created app package: ${appPackage.name} (id: ${appPackage.id})`);\n } else {\n console.log(`Found app package: ${appPackage.name} (id: ${appPackage.id})`);\n }\n\n console.log(\"Access token acquired\");\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const store = new CredentialStore(createDefaultBackend(configDir));\n await store.set(appId, { token, auth_type: \"oauth\", app_id: appId });\n await addWorkspace(configDir, { app_id: appId, name: appId });\n\n console.log(`\\nAuthenticated to workspace ${appId}`);\n } catch (err: unknown) {\n if (err instanceof CLIError) throw err;\n const message = err instanceof Error ? err.message : String(err);\n throw new CLIError(message);\n }\n });\n}\n","import pc from \"picocolors\";\n\nfunction isColorEnabled(): boolean {\n return !!process.stdout.isTTY && !process.env.NO_COLOR;\n}\n\nfunction c(fn: (s: string) => string, s: string): string {\n return isColorEnabled() ? fn(s) : s;\n}\n\nconst STATUS_COLORS: Record<string, (s: string) => string> = {\n // green\n active: pc.green,\n open: pc.green,\n published: pc.green,\n enabled: pc.green,\n verified: pc.green,\n true: pc.green,\n // red\n error: pc.red,\n closed: pc.red,\n deleted: pc.red,\n disabled: pc.red,\n false: pc.red,\n // yellow\n pending: pc.yellow,\n draft: pc.yellow,\n snoozed: pc.yellow,\n};\n\nfunction colorizeStatus(value: string): string {\n if (!isColorEnabled()) return value;\n const fn = STATUS_COLORS[value.toLowerCase()];\n return fn ? fn(value) : value;\n}\n\nfunction truncate(value: string, max: number): string {\n if (value.length <= max) return value;\n return value.slice(0, max - 1) + \"\\u2026\";\n}\n\nconst DEFAULT_MAX_COLUMNS = 8;\nconst DEFAULT_TRUNCATION = 50;\nconst WIDE_TRUNCATION = 200;\n\nconst STATUS_KEYS = new Set([\n \"STATE\",\n \"STATUS\",\n \"OPEN\",\n \"ROLE\",\n \"ENABLED\",\n]);\n\nfunction isWide(): boolean {\n return process.argv.includes(\"--wide\");\n}\n\ninterface TableOptions {\n columns: string[];\n rows: Record<string, string>[];\n}\n\nexport function table({ columns, rows }: TableOptions): string {\n if (rows.length === 0) return \"\";\n\n const wide = isWide();\n const maxTrunc = wide ? WIDE_TRUNCATION : DEFAULT_TRUNCATION;\n const displayColumns = wide\n ? columns\n : columns.slice(0, DEFAULT_MAX_COLUMNS);\n\n const truncatedRows = rows.map((row) => {\n const out: Record<string, string> = {};\n for (const col of displayColumns) {\n out[col] = truncate(row[col] ?? \"\", maxTrunc);\n }\n return out;\n });\n\n const widths = displayColumns.map((col) =>\n Math.max(\n col.length,\n ...truncatedRows.map((row) => (row[col] ?? \"\").length),\n ),\n );\n\n const formatRow = (values: string[], isHeader: boolean) =>\n values\n .map((val, i) => {\n const col = displayColumns[i];\n const padded =\n i < values.length - 1 ? val.padEnd(widths[i]) : val;\n if (isHeader) return c(pc.bold, padded);\n if (STATUS_KEYS.has(col)) return colorizeStatus(padded);\n return padded;\n })\n .join(\" \");\n\n const header = formatRow(displayColumns, true);\n const body = truncatedRows.map((row) =>\n formatRow(\n displayColumns.map((col) => row[col] ?? \"\"),\n false,\n ),\n );\n\n return [header, ...body].join(\"\\n\");\n}\n\nexport function detail(\n data: Record<string, string | number | undefined | null>,\n): string {\n const entries = Object.entries(data).filter(\n ([, v]) => v !== null && v !== undefined,\n );\n if (entries.length === 0) return \"\";\n\n const maxKeyLen = Math.max(...entries.map(([k]) => k.length));\n\n return entries\n .map(([key, value]) => {\n const label = c(pc.bold, key.padEnd(maxKeyLen));\n const strVal = String(value);\n const isStatus = STATUS_KEYS.has(key.toUpperCase());\n const colored = isStatus ? colorizeStatus(strVal) : strVal;\n return `${label}: ${colored}`;\n })\n .join(\"\\n\");\n}\n","import { Command } from \"commander\";\nimport { readConfig } from \"../../auth/config.js\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { detail } from \"../../output/formatter.js\";\nimport { formatJson } from \"../../output/json.js\";\nimport { AuthError } from \"../../types.js\";\n\nexport function registerStatusCommand(auth: Command): void {\n auth\n .command(\"status\")\n .description(\"Show current authentication status\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n const appId = config.default;\n\n if (!appId) {\n throw new AuthError('Not authenticated. Run \"intercom auth login\" to get started.');\n }\n\n const store = new CredentialStore(createDefaultBackend(configDir));\n const cred = await store.get(appId);\n\n if (!cred) {\n throw new AuthError('Not authenticated. Run \"intercom auth login\" to get started.');\n }\n\n const workspace = config.workspaces[appId];\n\n if (options.json) {\n console.log(formatJson({\n app_id: cred.app_id,\n workspace_name: workspace?.name ?? cred.workspace_name,\n auth_type: cred.auth_type,\n expires_at: cred.expires_at ?? null,\n }));\n } else {\n console.log(detail({\n \"Workspace\": workspace?.name ?? cred.workspace_name ?? cred.app_id,\n \"App ID\": cred.app_id,\n \"Auth type\": cred.auth_type,\n \"Expires\": cred.expires_at ?? undefined,\n }));\n }\n });\n}\n","import { Command } from \"commander\";\nimport { readConfig, removeWorkspace } from \"../../auth/config.js\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { AuthError } from \"../../types.js\";\n\nexport function registerLogoutCommand(auth: Command): void {\n auth\n .command(\"logout\")\n .description(\"Remove stored credentials\")\n .option(\"--workspace <id>\", \"Workspace app_id to log out of\")\n .action(async (options) => {\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n const appId = options.workspace ?? config.default;\n\n if (!appId) {\n throw new AuthError(\"Not authenticated.\");\n }\n\n const store = new CredentialStore(createDefaultBackend(configDir));\n await store.delete(appId);\n await removeWorkspace(configDir, appId);\n\n const name = config.workspaces[appId]?.name ?? appId;\n console.log(`Logged out of ${name} (${appId})`);\n });\n}\n","import { Command } from \"commander\";\nimport { getToken } from \"../../auth/devhub.js\";\nimport { resolvePassword } from \"../../auth/password.js\";\nimport { signup, getAppBaseUrl } from \"../../auth/signup.js\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { addWorkspace } from \"../../auth/config.js\";\nimport { detail } from \"../../output/formatter.js\";\nimport { CLIError } from \"../../types.js\";\n\nexport function registerSignupCommand(auth: Command): void {\n auth\n .command(\"signup\")\n .description(\"Create a new Intercom workspace\")\n .requiredOption(\"--email <email>\", \"Admin email address\")\n .requiredOption(\"--name <name>\", \"Admin full name\")\n .requiredOption(\"--company <company>\", \"Workspace/company name\")\n .option(\"--password-stdin\", \"Read password from stdin (or set INTERCOM_PASSWORD env var)\")\n .option(\"--plan <plan>\", \"Trial plan: essential, advanced, or expert\", \"advanced\")\n .action(async (options) => {\n const validPlans = [\"essential\", \"advanced\", \"expert\"];\n if (!validPlans.includes(options.plan as string)) {\n throw new CLIError(`Unknown plan \"${options.plan as string}\". Valid options: ${validPlans.join(\", \")}`);\n }\n\n const baseUrl = getAppBaseUrl();\n\n try {\n const password = await resolvePassword({ passwordStdin: options.passwordStdin as boolean | undefined });\n\n const workspace = await signup({\n baseUrl,\n email: options.email as string,\n name: options.name as string,\n password,\n companyName: options.company as string,\n plan: options.plan as string,\n });\n\n console.log(\"Workspace created successfully!\");\n console.log(\n detail({\n Name: workspace.name,\n \"Workspace ID\": workspace.id,\n URL: `${baseUrl}/a/apps/${workspace.id}`,\n }),\n );\n\n // Auto-bootstrap: acquire OAuth token and persist credentials\n try {\n const { token, appId } = await getToken({\n baseUrl,\n email: options.email as string,\n password,\n appId: workspace.id,\n });\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const store = new CredentialStore(createDefaultBackend(configDir));\n await store.set(appId, { token, auth_type: \"oauth\", app_id: appId });\n await addWorkspace(configDir, { app_id: appId, name: workspace.name });\n\n console.log(`\\nAuthenticated to workspace ${appId}`);\n } catch {\n console.error(\n `\\nWarning: Workspace created but auto-login failed. Run \"intercom auth bootstrap --email ${options.email as string} --app-id ${workspace.id}\" to authenticate.`,\n );\n }\n } catch (err: unknown) {\n if (err instanceof CLIError) throw err;\n const message = err instanceof Error ? err.message : String(err);\n throw new CLIError(message);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchWithTimeout } from \"../../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../../api/timeouts.js\";\nimport { CLIError } from \"../../types.js\";\n\nexport function registerVerifyEmailCommand(auth: Command): void {\n auth\n .command(\"verify-email\")\n .description(\n \"Verify workspace email address. After signup, Intercom sends a verification email.\\n\" +\n \"Provide the verification URL from that email, or verify manually in your browser.\\n\\n\" +\n \"Option 1 — Manual verification (recommended for humans):\\n\" +\n \" 1. Open the inbox for the email address you signed up with\\n\" +\n \" 2. Find the email from Intercom (team@intercom.io) with subject\\n\" +\n ' \"Verify your email address on Intercom\" (check spam if not found)\\n' +\n ' 3. Click the \"Verify your email\" button in the email\\n' +\n \" 4. You should see a redirect to the Intercom getting-started page\\n\" +\n \" 5. Once verified, you can skip this command entirely\\n\\n\" +\n \"Option 2 — Provide the verification URL to this command:\\n\" +\n \" intercom auth verify-email --url <url>\\n\\n\" +\n \"Option 3 — Retrieve the URL automatically with a mail CLI:\\n\" +\n \" Google Workspace (gog): gog gmail messages search \\\"from:team@intercom.io verify email\\\"\\n\" +\n \" Then: gog gmail get <message_id> | grep verify_email\\n\" +\n \" Google Workspace (gws): gws gmail search \\\"from:team@intercom.io verify email\\\"\\n\" +\n \" Any tool that can read the inbox will work — the URL looks like:\\n\" +\n \" https://app.intercom.com/admins/<uuid>/verify_email?...\"\n )\n .requiredOption(\"--url <url>\", \"Verification URL from the email\")\n .action(async (options) => {\n const url = options.url as string;\n\n if (!url.includes(\"verify_email\")) {\n throw new CLIError(\n \"URL does not look like a verification link. Expected format:\\n\" +\n \" https://app.intercom.com/admins/<uuid>/verify_email?...\"\n );\n }\n\n const response = await fetchWithTimeout(url, { redirect: \"manual\" }, { timeoutMs: API_TIMEOUT_MS });\n\n if (response.status === 302 || response.status === 301) {\n const location = response.headers.get(\"location\") ?? \"\";\n if (location.includes(\"sign_in\") || location.includes(\"getting-started\") || location.includes(\"apps/\")) {\n console.log(\"Email verified successfully!\");\n return;\n }\n }\n\n if (response.status === 200) {\n console.log(\"Email verified successfully!\");\n return;\n }\n\n throw new CLIError(\n `Email verification returned unexpected status ${response.status}. ` +\n \"The link may have expired — check for a newer verification email.\"\n );\n });\n}\n","import { Command } from \"commander\";\nimport { readConfig } from \"../../auth/config.js\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { table } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n};\n\nexport function registerListCommand(auth: Command): void {\n auth\n .command(\"list\")\n .description(\"List all configured workspaces\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n const store = new CredentialStore(createDefaultBackend(configDir));\n\n const workspaces = await Promise.all(\n Object.values(config.workspaces).map(async (ws) => {\n const cred = await store.get(ws.app_id);\n return {\n app_id: ws.app_id,\n name: ws.name,\n auth_type: cred?.auth_type ?? \"unknown\",\n default: ws.app_id === config.default,\n };\n }),\n );\n\n render(\n workspaces,\n opts,\n () => {\n if (workspaces.length === 0) {\n return 'No workspaces configured. Run \"intercom auth login\" to get started.';\n }\n const rows = workspaces.map((ws) => ({\n DEFAULT: ws.default ? \"*\" : \"\",\n APP_ID: ws.app_id,\n NAME: ws.name,\n AUTH_TYPE: ws.auth_type,\n }));\n return table({\n columns: [\"DEFAULT\", \"APP_ID\", \"NAME\", \"AUTH_TYPE\"],\n rows,\n });\n },\n workspaces,\n );\n });\n}\n","import { Command } from \"commander\";\nimport { readConfig, writeConfig } from \"../../auth/config.js\";\nimport { CLIError } from \"../../types.js\";\n\nexport function registerSwitchCommand(auth: Command): void {\n auth\n .command(\"switch <app_id>\")\n .description(\"Switch the default workspace\")\n .action(async (appId: string) => {\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n\n if (!config.workspaces[appId]) {\n const available = Object.keys(config.workspaces);\n const hint =\n available.length > 0\n ? ` Available: ${available.join(\", \")}`\n : ' Run \"intercom auth login\" to add a workspace.';\n throw new CLIError(`Workspace \"${appId}\" not found.${hint}`);\n }\n\n config.default = appId;\n await writeConfig(config, configDir);\n\n const name = config.workspaces[appId].name;\n console.log(`Switched to ${name} (${appId})`);\n });\n}\n","import { Command } from \"commander\";\nimport { registerLoginCommand } from \"./login.js\";\nimport { registerBootstrapCommand } from \"./bootstrap.js\";\nimport { registerStatusCommand } from \"./status.js\";\nimport { registerLogoutCommand } from \"./logout.js\";\nimport { registerSignupCommand } from \"./signup.js\";\nimport { registerVerifyEmailCommand } from \"./verify-email.js\";\nimport { registerListCommand } from \"./list.js\";\nimport { registerSwitchCommand } from \"./switch.js\";\n\nexport function registerAuthCommand(program: Command): void {\n const auth = program\n .command(\"auth\")\n .description(\"Manage authentication credentials\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom auth login --token <api-token>\n intercom auth status\n intercom auth logout\n\nEnvironment: Set INTERCOM_TOKEN to skip login entirely.`,\n );\n\n registerLoginCommand(auth);\n registerBootstrapCommand(auth);\n registerStatusCommand(auth);\n registerLogoutCommand(auth);\n registerSignupCommand(auth);\n registerVerifyEmailCommand(auth);\n registerListCommand(auth);\n registerSwitchCommand(auth);\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"./helpers.js\";\nimport { detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\n\nexport function registerMeCommand(program: Command): void {\n program\n .command(\"me\")\n .description(\"Show current authenticated admin and workspace info\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .action(async function(options) {\n // optsWithGlobals() merges parent options (e.g. --json defined at root level)\n const opts = (this as unknown as { optsWithGlobals: () => typeof options }).optsWithGlobals();\n const client = await resolveClient(opts);\n const me = await client.get(\"/me\");\n\n const app = me.app as Record<string, unknown> | undefined;\n render(me, opts, () =>\n detail({\n \"Name\": me.name as string | undefined,\n \"Email\": me.email as string | undefined,\n \"App ID\": (app?.id_code as string | undefined) ?? (me.app_id as string | undefined),\n \"Type\": me.type as string | undefined,\n })\n );\n });\n}\n","import TurndownService from \"turndown\";\n\nconst turndown = new TurndownService({\n headingStyle: \"atx\",\n bulletListMarker: \"-\",\n});\n\n/**\n * Convert HTML to readable Markdown text.\n * Uses turndown to preserve links, bold, and structure from Intercom API HTML.\n */\nexport function htmlToText(html: string | null | undefined): string {\n if (!html) return \"\";\n return turndown.turndown(html).trim();\n}\n","import { Command } from \"commander\";\nimport { resolveClient, parseFieldArgs, formatTimestamp } from \"./helpers.js\";\nimport { parseTypedFields } from \"../utils/fields.js\";\nimport { table, detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\nimport { htmlToText } from \"../output/html.js\";\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n limit?: string;\n all?: boolean;\n field?: string[];\n typedField?: string[];\n};\n\nexport function registerArticlesCommand(program: Command): void {\n const articles = program\n .command(\"articles\")\n .description(\"Manage help center articles (list, get, create, update, delete)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom articles list\n intercom articles get 123\n intercom articles create -f title=\"Getting Started\" -F body=@article.md\n intercom articles update 123 -f state=published\n intercom articles delete 123`,\n );\n\n // list\n articles\n .command(\"list\")\n .description(\"List help center articles\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .option(\"--limit <n>\", \"Max results to return\", \"25\")\n .option(\"--all\", \"Auto-paginate all pages\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom articles list --json\n $ intercom articles list --all --jq '.[].title'`,\n )\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result: unknown;\n\n if (opts.all) {\n const allItems = await client.paginate(\"/articles\", { per_page: \"25\" });\n result = { type: \"list\", data: allItems };\n } else {\n const limit = opts.limit ?? \"25\";\n result = await client.get(\"/articles\", { per_page: limit });\n }\n\n const response = result as { data?: Record<string, unknown>[] };\n const items = (response.data ?? []) as Record<string, unknown>[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((a) => ({\n ID: String(a.id ?? \"\"),\n TITLE: String(a.title ?? \"\"),\n STATE: String(a.state ?? \"\"),\n UPDATED: formatTimestamp(a.updated_at),\n }));\n return table({ columns: [\"ID\", \"TITLE\", \"STATE\", \"UPDATED\"], rows });\n },\n items,\n );\n });\n\n // get\n articles\n .command(\"get <id>\")\n .description(\"Get a help center article by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/articles/${id}`);\n\n render(result, opts, () => {\n const meta = detail({\n ID: String(result.id ?? \"\"),\n Title: String(result.title ?? \"\"),\n State: String(result.state ?? \"\"),\n \"Author ID\":\n result.author_id != null ? String(result.author_id) : undefined,\n Updated: formatTimestamp(result.updated_at),\n Created: formatTimestamp(result.created_at),\n });\n const body =\n typeof result.body === \"string\" ? htmlToText(result.body) : \"\";\n return body ? `${meta}\\n\\n${body}` : meta;\n });\n });\n\n // create\n articles\n .command(\"create\")\n .description(\"Create a help center article\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\n \"-F, --typed-field <key=value>\",\n \"Typed field: bools, numbers, @file reads (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom articles create -f title='Getting Started' -f body='<p>Hello</p>'\n $ intercom articles create -F body=@article.html -f title='Guide'\n\nCommon fields: title, body, author_id, state, parent_id, parent_type\nUse -F for typed values (numbers, booleans) and @file reads.`,\n )\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body: Record<string, unknown> = {\n ...parseFieldArgs(opts.field ?? []),\n ...parseTypedFields(opts.typedField ?? [], true),\n };\n // author_id must be sent as an integer, not a string (for -f users)\n if (body.author_id && typeof body.author_id === \"string\") {\n const parsed = parseInt(body.author_id as string, 10);\n if (!isNaN(parsed)) body.author_id = parsed;\n }\n const result = await client.post(\"/articles\", body);\n\n render(result, opts, () =>\n detail({\n ID: String((result as Record<string, unknown>).id ?? \"\"),\n Title: String((result as Record<string, unknown>).title ?? \"\"),\n State: String((result as Record<string, unknown>).state ?? \"\"),\n }),\n );\n });\n\n // update\n articles\n .command(\"update <id>\")\n .description(\"Update a help center article\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\n \"-F, --typed-field <key=value>\",\n \"Typed field: bools, numbers, @file reads (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body: Record<string, unknown> = {\n ...parseFieldArgs(opts.field ?? []),\n ...parseTypedFields(opts.typedField ?? [], true),\n };\n if (body.author_id && typeof body.author_id === \"string\") {\n const parsed = parseInt(body.author_id as string, 10);\n if (!isNaN(parsed)) body.author_id = parsed;\n }\n const result = await client.put(`/articles/${id}`, body);\n\n render(result, opts, () =>\n detail({\n ID: String((result as Record<string, unknown>).id ?? \"\"),\n Title: String((result as Record<string, unknown>).title ?? \"\"),\n State: String((result as Record<string, unknown>).state ?? \"\"),\n }),\n );\n });\n\n // delete\n articles\n .command(\"delete <id>\")\n .description(\"Delete a help center article\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.delete(`/articles/${id}`);\n\n const deleted = result as { id?: unknown; deleted?: unknown };\n render(result, opts, () => `Deleted article ${deleted.id ?? id}`);\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient, parseFieldArgs, formatTimestamp } from \"./helpers.js\";\nimport { table, detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\nimport { parseTypedFields } from \"../utils/fields.js\";\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n limit?: string;\n all?: boolean;\n field?: string[];\n typedField?: string[];\n};\n\nexport function registerContactsCommand(program: Command): void {\n const contacts = program\n .command(\"contacts\")\n .description(\"Manage contacts (list, get, create, update, delete, search)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom contacts list --limit 10\n intercom contacts get abc123\n intercom contacts create -f email=user@example.com -f role=user\n intercom contacts delete abc123`,\n );\n\n // list\n contacts\n .command(\"list\")\n .description(\"List contacts\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .option(\"--limit <n>\", \"Max results to return\", \"25\")\n .option(\"--all\", \"Auto-paginate all pages\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result: unknown;\n\n if (opts.all) {\n const allItems = await client.paginate(\"/contacts\", { per_page: \"25\" });\n result = { type: \"list\", data: allItems };\n } else {\n const limit = opts.limit ?? \"25\";\n result = await client.get(\"/contacts\", { per_page: limit });\n }\n\n const response = result as { data?: Record<string, unknown>[] };\n const items = (response.data ?? []) as Record<string, unknown>[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((c) => ({\n ID: String(c.id ?? \"\"),\n EMAIL: String(c.email ?? \"\"),\n NAME: String(c.name ?? \"\"),\n ROLE: String(c.role ?? \"\"),\n UPDATED: formatTimestamp(c.updated_at),\n }));\n return table({\n columns: [\"ID\", \"EMAIL\", \"NAME\", \"ROLE\", \"UPDATED\"],\n rows,\n });\n },\n items,\n );\n });\n\n // get\n contacts\n .command(\"get <id>\")\n .description(\"Get a contact by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/contacts/${id}`);\n\n render(result, opts, () =>\n detail({\n ID: String(result.id ?? \"\"),\n Name: result.name != null ? String(result.name) : undefined,\n Email: result.email != null ? String(result.email) : undefined,\n Role: String(result.role ?? \"\"),\n Created: formatTimestamp(result.created_at),\n Updated: formatTimestamp(result.updated_at),\n }),\n );\n });\n\n // create\n contacts\n .command(\"create\")\n .description(\"Create a contact\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = parseFieldArgs(opts.field ?? []);\n const result = await client.post(\"/contacts\", body);\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n ID: String(r.id ?? \"\"),\n Name: r.name != null ? String(r.name) : undefined,\n Email: r.email != null ? String(r.email) : undefined,\n Role: String(r.role ?? \"\"),\n }),\n );\n });\n\n // update\n contacts\n .command(\"update <id>\")\n .description(\"Update a contact\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = parseFieldArgs(opts.field ?? []);\n const result = await client.put(`/contacts/${id}`, body);\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n ID: String(r.id ?? \"\"),\n Name: r.name != null ? String(r.name) : undefined,\n Email: r.email != null ? String(r.email) : undefined,\n Role: String(r.role ?? \"\"),\n }),\n );\n });\n\n // delete\n contacts\n .command(\"delete <id>\")\n .description(\"Delete a contact\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.delete(`/contacts/${id}`);\n\n const deleted = result as { id?: unknown; deleted?: unknown };\n render(result, opts, () => `Deleted contact ${deleted.id ?? id}`);\n });\n\n // search\n contacts\n .command(\"search\")\n .description(\"Search contacts (POST /contacts/search)\")\n .option(\n \"-f, --field <key=value>\",\n \"String field (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\n \"-F, --typed-field <key=value>\",\n \"Typed field (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = {\n ...parseTypedFields(opts.field ?? [], false),\n ...parseTypedFields(opts.typedField ?? [], true),\n };\n const result = await client.post(\"/contacts/search\", body);\n const response = result as { data?: Record<string, unknown>[] };\n const items = (response.data ?? []) as Record<string, unknown>[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((c) => ({\n ID: String(c.id ?? \"\"),\n EMAIL: String(c.email ?? \"\"),\n NAME: String(c.name ?? \"\"),\n ROLE: String(c.role ?? \"\"),\n UPDATED: formatTimestamp(c.updated_at),\n }));\n return table({\n columns: [\"ID\", \"EMAIL\", \"NAME\", \"ROLE\", \"UPDATED\"],\n rows,\n });\n },\n items,\n );\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient, parseFieldArgs, formatTimestamp } from \"./helpers.js\";\nimport { table, detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\nimport { htmlToText } from \"../output/html.js\";\nimport { parseTypedFields } from \"../utils/fields.js\";\n\nfunction formatDatetime(ts: unknown): string {\n if (!ts) return \"\";\n const n = typeof ts === \"number\" ? ts : Number(ts);\n if (isNaN(n)) return String(ts);\n return new Date(n * 1000).toISOString().slice(0, 16).replace(\"T\", \" \");\n}\n\nfunction renderConversationStream(result: Record<string, unknown>): string {\n const parts: string[] = [];\n\n parts.push(\n detail({\n ID: String(result.id ?? \"\"),\n State: String(result.state ?? \"\"),\n Open: String(result.open ?? \"\"),\n Created: formatTimestamp(result.created_at),\n Updated: formatTimestamp(result.updated_at),\n }),\n );\n\n const source = result.source as\n | { body?: string; author?: { name?: string; type?: string } }\n | undefined;\n const partsData = result.conversation_parts as\n | { conversation_parts?: unknown[] }\n | undefined;\n const convParts = (partsData?.conversation_parts ?? []) as Record<\n string,\n unknown\n >[];\n\n if (!source && convParts.length === 0) return parts.join(\"\\n\");\n\n parts.push(\"\");\n parts.push(\"── Conversation ─────────────────────────────────\");\n\n if (source) {\n const authorName = source.author?.name ?? \"Unknown\";\n const authorType = source.author?.type ?? \"user\";\n const body = htmlToText(source.body);\n parts.push(\"\");\n parts.push(\n `${authorName} (${authorType}) · ${formatDatetime(result.created_at)}`,\n );\n if (body) parts.push(body);\n }\n\n for (const part of convParts) {\n const author = part.author as { name?: string; type?: string } | undefined;\n const authorName = author?.name ?? \"System\";\n const authorType = author?.type ?? \"bot\";\n const partType = String(part.part_type ?? \"unknown\");\n const body = htmlToText(part.body as string | null | undefined);\n const ts = formatDatetime(part.created_at);\n\n parts.push(\"\");\n\n switch (partType) {\n case \"comment\":\n parts.push(`${authorName} (${authorType}) · ${ts}`);\n if (body) parts.push(body);\n break;\n case \"note\":\n parts.push(`[note] ${authorName} (${authorType}) · ${ts}`);\n if (body) parts.push(body);\n break;\n case \"assignment\": {\n const assignedTo = part.assigned_to as { name?: string } | undefined;\n parts.push(`[assignment] ${authorName} (${authorType}) · ${ts}`);\n if (assignedTo?.name) parts.push(`Assigned to ${assignedTo.name}`);\n break;\n }\n case \"close\":\n parts.push(`[closed] ${authorName} (${authorType}) · ${ts}`);\n if (body) parts.push(body);\n break;\n case \"open\":\n parts.push(`[opened] ${authorName} (${authorType}) · ${ts}`);\n if (body) parts.push(body);\n break;\n default:\n parts.push(`[${partType}] ${authorName} (${authorType}) · ${ts}`);\n if (body) parts.push(body);\n break;\n }\n }\n\n return parts.join(\"\\n\");\n}\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n limit?: string;\n all?: boolean;\n field?: string[];\n typedField?: string[];\n};\n\nexport function registerConversationsCommand(program: Command): void {\n const conversations = program\n .command(\"conversations\")\n .description(\"Manage conversations (list, get, reply, search)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom conversations list\n intercom conversations get 123\n intercom conversations reply 123 -f body=\"Thanks!\" -f message_type=comment -f type=admin -f admin_id=456`,\n );\n\n // list\n conversations\n .command(\"list\")\n .description(\"List conversations\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .option(\"--limit <n>\", \"Max results to return\", \"25\")\n .option(\"--all\", \"Auto-paginate all pages\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result: unknown;\n\n if (opts.all) {\n const allItems = await client.paginate(\n \"/conversations\",\n { per_page: \"25\" },\n \"conversations\",\n );\n result = { type: \"conversation.list\", conversations: allItems };\n } else {\n const limit = opts.limit ?? \"25\";\n result = await client.get(\"/conversations\", { per_page: limit });\n }\n\n // Conversations API returns `conversations` array, not `data`\n const response = result as { conversations?: Record<string, unknown>[] };\n const items = (response.conversations ?? []) as Record<string, unknown>[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((c) => ({\n ID: String(c.id ?? \"\"),\n STATE: String(c.state ?? \"\"),\n OPEN: String(c.open ?? \"\"),\n CREATED: formatTimestamp(c.created_at),\n UPDATED: formatTimestamp(c.updated_at),\n }));\n return table({\n columns: [\"ID\", \"STATE\", \"OPEN\", \"CREATED\", \"UPDATED\"],\n rows,\n });\n },\n items,\n );\n });\n\n // get\n conversations\n .command(\"get <id>\")\n .description(\"Get a conversation by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/conversations/${id}`);\n\n render(result, opts, () => {\n const r = result as Record<string, unknown>;\n return renderConversationStream(r);\n });\n });\n\n // reply\n conversations\n .command(\"reply <id>\")\n .description(\"Reply to a conversation\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom conversations reply 123 -f type=admin -f body='Thanks!'\n\nRequired fields: body, type (admin or user). Also: admin_id, message_type.`,\n )\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = parseFieldArgs(opts.field ?? []);\n const result = await client.post(`/conversations/${id}/reply`, body);\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n ID: String(r.id ?? \"\"),\n Type: String(r.type ?? \"\"),\n Body: r.body != null ? String(r.body) : undefined,\n }),\n );\n });\n\n // search\n conversations\n .command(\"search\")\n .description(\"Search conversations (POST /conversations/search)\")\n .option(\n \"-f, --field <key=value>\",\n \"String field (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\n \"-F, --typed-field <key=value>\",\n \"Typed field (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = {\n ...parseTypedFields(opts.field ?? [], false),\n ...parseTypedFields(opts.typedField ?? [], true),\n };\n const result = await client.post(\"/conversations/search\", body);\n const response = result as { conversations?: Record<string, unknown>[] };\n const items = (response.conversations ?? []) as Record<\n string,\n unknown\n >[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((c) => ({\n ID: String(c.id ?? \"\"),\n STATE: String(c.state ?? \"\"),\n OPEN: String(c.open ?? \"\"),\n CREATED: formatTimestamp(c.created_at),\n UPDATED: formatTimestamp(c.updated_at),\n }));\n return table({\n columns: [\"ID\", \"STATE\", \"OPEN\", \"CREATED\", \"UPDATED\"],\n rows,\n });\n },\n items,\n );\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient, parseFieldArgs, formatTimestamp } from \"./helpers.js\";\nimport { table, detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n limit?: string;\n all?: boolean;\n field?: string[];\n};\n\nexport function registerHelpCenterCommand(program: Command): void {\n const helpCenter = program\n .command(\"help-center\")\n .description(\"Manage help center collections\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom help-center list\n intercom help-center get 123\n intercom help-center create -f name=\"FAQ\"`,\n );\n\n // list\n helpCenter\n .command(\"list\")\n .description(\"List help center collections\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .option(\"--limit <n>\", \"Max results to return\", \"25\")\n .option(\"--all\", \"Auto-paginate all pages\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result: unknown;\n\n if (opts.all) {\n const allItems = await client.paginate(\"/help_center/collections\", {\n per_page: \"25\",\n });\n result = { type: \"list\", data: allItems };\n } else {\n const limit = opts.limit ?? \"25\";\n result = await client.get(\"/help_center/collections\", {\n per_page: limit,\n });\n }\n\n const response = result as { data?: Record<string, unknown>[] };\n const items = (response.data ?? []) as Record<string, unknown>[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((c) => ({\n ID: String(c.id ?? \"\"),\n NAME: String(c.name ?? \"\"),\n DESCRIPTION: String(c.description ?? \"\"),\n UPDATED: formatTimestamp(c.updated_at),\n }));\n return table({\n columns: [\"ID\", \"NAME\", \"DESCRIPTION\", \"UPDATED\"],\n rows,\n });\n },\n items,\n );\n });\n\n // get\n helpCenter\n .command(\"get <id>\")\n .description(\"Get a help center collection by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/help_center/collections/${id}`);\n\n render(result, opts, () =>\n detail({\n ID: String(result.id ?? \"\"),\n Name: String(result.name ?? \"\"),\n Description:\n result.description != null ? String(result.description) : undefined,\n Updated: formatTimestamp(result.updated_at),\n Created: formatTimestamp(result.created_at),\n }),\n );\n });\n\n // create\n helpCenter\n .command(\"create\")\n .description(\"Create a help center collection\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = parseFieldArgs(opts.field ?? []);\n const result = await client.post(\"/help_center/collections\", body);\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n ID: String(r.id ?? \"\"),\n Name: String(r.name ?? \"\"),\n Description:\n r.description != null ? String(r.description) : undefined,\n }),\n );\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient, parseFieldArgs } from \"./helpers.js\";\nimport { detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\n\nconst UNSTABLE_HEADERS = { \"Intercom-Version\": \"Unstable\" };\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n field?: string[];\n format?: string;\n};\n\nfunction generateHtmlSnippet(appId: string): string {\n return `<script>\n window.intercomSettings = { api_base: \"https://api-iam.intercom.io\", app_id: \"${appId}\" };\n (function(){var w=window;var ic=w.Intercom;if(typeof ic===\"function\"){ic('reattach_activator');ic('update',w.intercomSettings);}else{var d=document;var i=function(){i.c(arguments);};i.q=[];i.c=function(args){i.q.push(args);};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/${appId}';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);};if(document.readyState==='complete'){l();}else if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})();\n</script>`;\n}\n\nfunction generateReactSnippet(appId: string): string {\n return `import { useEffect } from \"react\";\n\nexport function IntercomWidget() {\n useEffect(() => {\n window.intercomSettings = { api_base: \"https://api-iam.intercom.io\", app_id: \"${appId}\" };\n (function(){var w=window;var ic=w.Intercom;if(typeof ic===\"function\"){ic('reattach_activator');ic('update',w.intercomSettings);}else{var d=document;var i=function(){i.c(arguments);};i.q=[];i.c=function(args){i.q.push(args);};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/${appId}';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);};if(document.readyState==='complete'){l();}else if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})();\n }, []);\n return null;\n}`;\n}\n\nexport function registerMessengerCommand(program: Command): void {\n const messenger = program\n .command(\"messenger\")\n .description(\"Manage Intercom Messenger settings (get, update, snippet)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom messenger get\n intercom messenger update -f alignment=right -f theme_mode=dark\n intercom messenger snippet --format react`,\n );\n\n // get\n messenger\n .command(\"get\")\n .description(\"Get Messenger settings\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom messenger get --json\n $ intercom messenger get --jq '.alignment'`,\n )\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/messenger\", undefined, UNSTABLE_HEADERS);\n\n const r = result as Record<string, unknown>;\n render(result, opts, () =>\n detail({\n \"Color\": r.secondary_color != null ? String(r.secondary_color) : undefined,\n \"Alignment\": r.alignment != null ? String(r.alignment) : undefined,\n \"Theme\": r.theme_mode != null ? String(r.theme_mode) : undefined,\n \"Background\": r.background_type != null ? String(r.background_type) : undefined,\n \"Launcher (Users)\": r.messenger_enabled_for_users != null ? String(r.messenger_enabled_for_users) : undefined,\n \"Launcher (Visitors)\": r.messenger_enabled_for_visitors != null ? String(r.messenger_enabled_for_visitors) : undefined,\n \"Launcher (Mobile)\": r.messenger_enabled_for_mobile_users != null ? String(r.messenger_enabled_for_mobile_users) : undefined,\n \"Inbound (Users)\": r.inbound_conversations_enabled_for_users != null ? String(r.inbound_conversations_enabled_for_users) : undefined,\n \"Inbound (Visitors)\": r.inbound_conversations_enabled_for_visitors != null ? String(r.inbound_conversations_enabled_for_visitors) : undefined,\n }),\n );\n });\n\n // update\n messenger\n .command(\"update\")\n .description(\"Update Messenger settings\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = parseFieldArgs(opts.field ?? []);\n const result = await client.put(\"/messenger\", body, UNSTABLE_HEADERS);\n\n const r = result as Record<string, unknown>;\n render(result, opts, () =>\n detail({\n \"Color\": r.secondary_color != null ? String(r.secondary_color) : undefined,\n \"Alignment\": r.alignment != null ? String(r.alignment) : undefined,\n \"Theme\": r.theme_mode != null ? String(r.theme_mode) : undefined,\n \"Background\": r.background_type != null ? String(r.background_type) : undefined,\n \"Launcher (Users)\": r.messenger_enabled_for_users != null ? String(r.messenger_enabled_for_users) : undefined,\n \"Launcher (Visitors)\": r.messenger_enabled_for_visitors != null ? String(r.messenger_enabled_for_visitors) : undefined,\n \"Launcher (Mobile)\": r.messenger_enabled_for_mobile_users != null ? String(r.messenger_enabled_for_mobile_users) : undefined,\n \"Inbound (Users)\": r.inbound_conversations_enabled_for_users != null ? String(r.inbound_conversations_enabled_for_users) : undefined,\n \"Inbound (Visitors)\": r.inbound_conversations_enabled_for_visitors != null ? String(r.inbound_conversations_enabled_for_visitors) : undefined,\n }),\n );\n });\n\n // snippet — outputs raw HTML/JS, not structured data\n messenger\n .command(\"snippet\")\n .description(\"Generate the Intercom Messenger JavaScript install snippet\")\n .option(\n \"--format <format>\",\n \"Output format: html (default) or react\",\n \"html\",\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const me = (await client.get(\"/me\")) as Record<string, unknown>;\n const app = me.app as Record<string, unknown> | undefined;\n const appId = String(app?.id_code ?? \"\");\n\n const snippet =\n opts.format === \"react\"\n ? generateReactSnippet(appId)\n : generateHtmlSnippet(appId);\n const format = opts.format ?? \"html\";\n render({ format, snippet }, opts, () => snippet);\n });\n}\n","import { Command } from \"commander\";\nimport { writeFile } from \"fs/promises\";\nimport { resolveClient } from \"./helpers.js\";\nimport { table, detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\nimport { registerProceduresCommand } from \"./fin/procedures.js\";\nimport { registerDataConnectorsCommand } from \"./fin/data-connectors.js\";\nimport { registerGuidanceCommand } from \"./fin/guidance.js\";\nimport { registerAttributesCommand } from \"./fin/attributes.js\";\nimport { registerAudiencesCommand } from \"./fin/audiences.js\";\nimport { registerWorkflowsCommand } from \"./fin/workflows.js\";\nimport { registerSimulationsCommand } from \"./fin/simulations.js\";\nimport { registerFinEnableCommand } from \"./fin/enable.js\";\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n output?: string;\n timeout?: string;\n};\n\ntype ManifestWorkspace = {\n app_id?: number;\n app_id_code?: string;\n name?: string;\n};\n\ntype ManifestResource = {\n id?: string;\n name?: string;\n};\n\ntype ManifestResponse = {\n workspace?: ManifestWorkspace;\n procedures?: ManifestResource[];\n tasks?: ManifestResource[];\n data_connectors?: ManifestResource[];\n guidance?: ManifestResource[];\n};\n\nfunction renderResourceTable(label: string, items: ManifestResource[]): string {\n if (items.length === 0) {\n return `${label}:\\n (none)`;\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n NAME: String(item.name ?? \"\"),\n }));\n return `${label}:\\n${table({ columns: [\"ID\", \"NAME\"], rows })}`;\n}\n\nexport function registerFinCommand(program: Command): void {\n const fin = program\n .command(\"fin\")\n .description(\"Manage Fin AI Agent and SDK resources\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom fin manifest\n intercom fin enable --email admin@company.com\n intercom fin guidance list`,\n );\n\n // manifest\n fin\n .command(\"manifest\")\n .description(\"Show the Fin SDK manifest for this workspace\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom fin manifest\n $ intercom fin manifest --json`,\n )\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/manifest\");\n\n const manifest = result as ManifestResponse;\n render(result, opts, () => {\n const ws = manifest.workspace ?? {};\n const lines: string[] = [];\n lines.push(detail({\n \"Workspace\": ws.name,\n \"App ID\": ws.app_id != null ? String(ws.app_id) : undefined,\n \"App ID Code\": ws.app_id_code,\n }));\n lines.push(\"\");\n lines.push(renderResourceTable(\"Procedures\", manifest.procedures ?? []));\n lines.push(\"\");\n lines.push(renderResourceTable(\"Tasks\", manifest.tasks ?? []));\n lines.push(\"\");\n lines.push(renderResourceTable(\"Data Connectors\", manifest.data_connectors ?? []));\n lines.push(\"\");\n lines.push(renderResourceTable(\"Guidance\", manifest.guidance ?? []));\n return lines.join(\"\\n\");\n });\n });\n\n registerFinEnableCommand(fin);\n registerProceduresCommand(fin);\n registerDataConnectorsCommand(fin);\n registerGuidanceCommand(fin);\n registerAttributesCommand(fin);\n registerAudiencesCommand(fin);\n registerWorkflowsCommand(fin);\n registerSimulationsCommand(fin);\n\n // download\n fin\n .command(\"download\")\n .description(\"Download Fin SDK resources as a ZIP file\")\n .option(\"-o, --output <path>\", \"Output file path\", \"./fin-resources.zip\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const outputPath = opts.output ?? \"./fin-resources.zip\";\n const client = await resolveClient(opts);\n const buffer = await client.getBuffer(\"/fin-sdk/download\");\n await writeFile(outputPath, buffer);\n console.log(`Downloaded ${buffer.length} bytes to ${outputPath}`);\n });\n}\n","import { Command } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport AdmZip from \"adm-zip\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table } from \"../../output/formatter.js\";\nimport { formatJson } from \"../../output/json.js\";\nimport { render } from \"../../output/render.js\";\n\ntype ManifestResource = {\n id?: string;\n name?: string;\n};\n\ntype ManifestResponse = {\n procedures?: ManifestResource[];\n};\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n timeout?: string;\n};\n\nexport function registerProceduresCommand(fin: Command): void {\n const procedures = fin\n .command(\"procedures\")\n .description(\"Manage Fin SDK procedures\");\n\n // list\n procedures\n .command(\"list\")\n .description(\"List procedures from the Fin SDK manifest\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/manifest\");\n const manifest = result as ManifestResponse;\n const items = manifest.procedures ?? [];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No procedures found.\";\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n NAME: String(item.name ?? \"\"),\n }));\n return table({ columns: [\"ID\", \"NAME\"], rows });\n }, items);\n });\n\n // get — outputs raw YAML, not structured data; no render()\n procedures\n .command(\"get <id>\")\n .description(\"Download a procedure by ID and print its YAML content\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const buffer = await client.getBuffer(`/fin-sdk/procedures/${id}/download`);\n const zip = new AdmZip(buffer);\n const entry = zip.getEntries().find((e) => e.entryName.endsWith(\"procedure.yaml\"));\n\n if (!entry) {\n throw new Error(\"procedure.yaml not found in downloaded ZIP\");\n }\n\n console.log(zip.readAsText(entry));\n });\n\n // upload\n procedures\n .command(\"upload <file>\")\n .description(\"Upload a procedure file to Fin SDK\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (filePath: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const fileContent = await readFile(filePath);\n const formData = new FormData();\n const blob = new Blob([fileContent], { type: \"application/x-yaml\" });\n formData.append(\"file_data\", blob, basename(filePath));\n const result = await client.postFormData(\"/fin-sdk/upload\", formData);\n render(result, opts, () => formatJson(result));\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table, detail } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype ManifestResource = {\n id?: string;\n name?: string;\n};\n\ntype ManifestResponse = {\n data_connectors?: ManifestResource[];\n};\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n field?: string[];\n timeout?: string;\n};\n\nexport function registerDataConnectorsCommand(fin: Command): void {\n const dataConnectors = fin\n .command(\"data-connectors\")\n .description(\"Manage Fin SDK data connectors\");\n\n // list\n dataConnectors\n .command(\"list\")\n .description(\"List data connectors from the Fin SDK manifest\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/manifest\");\n const manifest = result as ManifestResponse;\n const items = manifest.data_connectors ?? [];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No data connectors found.\";\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n NAME: String(item.name ?? \"\"),\n }));\n return table({ columns: [\"ID\", \"NAME\"], rows });\n }, items);\n });\n\n // create\n dataConnectors\n .command(\"create\")\n .description(\"Create a data connector\")\n .requiredOption(\"-f, --field <key=value>\", \"Field to set (e.g. name=<name>)\", (v: string, acc: string[]) => [...acc, v], [] as string[])\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n\n const fields = opts.field ?? [];\n const body: Record<string, string> = {};\n for (const f of fields) {\n const eq = f.indexOf(\"=\");\n if (eq === -1) throw new Error(`Invalid field format: ${f}. Expected key=value`);\n body[f.slice(0, eq)] = f.slice(eq + 1);\n }\n\n const result = await client.post(\"/fin-sdk/data-connectors\", body) as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n \"ID\": String(result.id ?? \"\"),\n \"Name\": String(result.name ?? \"\"),\n \"Status\": result.status != null ? String(result.status) : undefined,\n })\n );\n });\n\n // get\n dataConnectors\n .command(\"get <id>\")\n .description(\"Download a data connector by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/fin-sdk/data-connectors/${id}/download`);\n\n render(result, opts, () =>\n detail({\n \"ID\": String(result.id ?? \"\"),\n \"Name\": String(result.name ?? \"\"),\n })\n );\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype ManifestResource = {\n id?: string;\n name?: string;\n};\n\ntype ManifestResponse = {\n guidance?: ManifestResource[];\n};\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n agent?: boolean;\n verbose?: boolean;\n timeout?: string;\n};\n\nexport function registerGuidanceCommand(fin: Command): void {\n const guidance = fin\n .command(\"guidance\")\n .description(\"Manage Fin SDK guidance\");\n\n // list\n guidance\n .command(\"list\")\n .description(\"List guidance from the Fin SDK manifest\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/manifest\");\n const manifest = result as ManifestResponse;\n const items = manifest.guidance ?? [];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No guidance found.\";\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n NAME: String(item.name ?? \"\"),\n }));\n return table({ columns: [\"ID\", \"NAME\"], rows });\n }, items);\n });\n\n guidance\n .command(\"get <id>\")\n .description(\"Download a guidance item by ID and print its YAML content\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const text = await client.getText(`/fin-sdk/guidance/${id}/download`);\n render({ format: \"yaml\", content: text }, opts, () => text);\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype Attribute = {\n name?: string;\n type?: string;\n description?: string;\n};\n\ntype Opts = {\n json?: boolean;\n verbose?: boolean;\n};\n\nexport function registerAttributesCommand(fin: Command): void {\n const attributes = fin\n .command(\"attributes\")\n .description(\"Manage Fin SDK attributes\");\n\n // list\n attributes\n .command(\"list\")\n .description(\"List Fin SDK attributes\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/attributes\");\n const items = (Array.isArray(result) ? result : (result as { attributes?: Attribute[] }).attributes ?? []) as Attribute[];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No attributes found.\";\n }\n const rows = items.map((item) => ({\n NAME: String(item.name ?? \"\"),\n TYPE: String(item.type ?? \"\"),\n DESCRIPTION: String(item.description ?? \"\"),\n }));\n return table({ columns: [\"NAME\", \"TYPE\", \"DESCRIPTION\"], rows });\n }, items);\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype Audience = {\n id?: string;\n name?: string;\n description?: string;\n};\n\ntype Opts = {\n json?: boolean;\n verbose?: boolean;\n};\n\nexport function registerAudiencesCommand(fin: Command): void {\n const audiences = fin\n .command(\"audiences\")\n .description(\"Manage Fin SDK audiences\");\n\n // list\n audiences\n .command(\"list\")\n .description(\"List Fin SDK audiences\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/audiences\");\n const items = (Array.isArray(result) ? result : (result as { audiences?: Audience[] }).audiences ?? []) as Audience[];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No audiences found.\";\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n NAME: String(item.name ?? \"\"),\n }));\n return table({ columns: [\"ID\", \"NAME\"], rows });\n }, items);\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table, detail } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype Workflow = {\n id?: string | number;\n title?: string;\n state?: string | number;\n trigger_type?: string | null;\n};\n\ntype Opts = {\n json?: boolean;\n verbose?: boolean;\n};\n\nexport function registerWorkflowsCommand(fin: Command): void {\n const workflows = fin\n .command(\"workflows\")\n .description(\"Manage Fin SDK workflows\");\n\n // list\n workflows\n .command(\"list\")\n .description(\"List Fin SDK workflows\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/workflows\");\n const items = (Array.isArray(result) ? result : (result as { workflows?: Workflow[] }).workflows ?? []) as Workflow[];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No workflows found.\";\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n TITLE: String(item.title ?? \"\"),\n STATE: String(item.state ?? \"\"),\n TRIGGER: String(item.trigger_type ?? \"\"),\n }));\n return table({ columns: [\"ID\", \"TITLE\", \"STATE\", \"TRIGGER\"], rows });\n }, items);\n });\n\n // get\n workflows\n .command(\"get <id>\")\n .description(\"Get a workflow by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/fin-sdk/workflows/${id}`);\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n \"ID\": String(r.id ?? \"\"),\n \"Title\": String(r.title ?? \"\"),\n \"State\": String(r.state ?? \"\"),\n \"Trigger\": r.trigger_type != null ? String(r.trigger_type) : undefined,\n })\n );\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table, detail } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\nimport { SIMULATION_POLL_TIMEOUT_MS } from \"../../api/timeouts.js\";\nimport { TimeoutError } from \"../../types.js\";\n\ntype EnqueuedRun = {\n run_id?: string | number;\n test_id?: string | number;\n simulation_name?: string;\n status?: string;\n};\n\ntype RunResponse = {\n procedure_id?: string | number;\n enqueued?: EnqueuedRun[];\n skipped?: unknown[];\n run_id?: string | number;\n [key: string]: unknown;\n};\n\ntype RunResult = {\n run_id?: string | number;\n id?: string | number;\n status?: string;\n [key: string]: unknown;\n};\n\ntype Opts = {\n json?: boolean;\n verbose?: boolean;\n wait?: boolean;\n timeout?: string;\n};\n\nexport function registerSimulationsCommand(fin: Command): void {\n const simulations = fin\n .command(\"simulations\")\n .description(\"Manage Fin SDK simulations\");\n\n // list — returns YAML text, not JSON; no render()\n simulations\n .command(\"list <procedure_id>\")\n .description(\"List simulations for a procedure (displays YAML)\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (procedureId: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const text = await client.getText(`/fin-sdk/procedures/${procedureId}/simulations`);\n console.log(text);\n });\n\n // run\n simulations\n .command(\"run <procedure_id> [test_id]\")\n .description(\"Run one or all simulations for a procedure\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (procedureId: string, testId: string | undefined) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result: unknown;\n if (testId) {\n result = await client.post(`/fin-sdk/procedures/${procedureId}/simulations/${testId}/run`, {});\n } else {\n result = await client.post(`/fin-sdk/procedures/${procedureId}/simulations/run`, {});\n }\n\n const r = result as RunResponse;\n\n render(result, opts, () => {\n // The response may have an `enqueued` array with run IDs, or a single run_id\n if (r.enqueued && Array.isArray(r.enqueued) && r.enqueued.length > 0) {\n const rows = r.enqueued.map((e) => ({\n RUN_ID: String(e.run_id ?? \"\"),\n TEST_ID: String(e.test_id ?? \"\"),\n NAME: String(e.simulation_name ?? \"\"),\n STATUS: String(e.status ?? \"\"),\n }));\n return table({ columns: [\"RUN_ID\", \"TEST_ID\", \"NAME\", \"STATUS\"], rows });\n } else {\n const runId = r.run_id;\n if (runId !== undefined) {\n return `run_id: ${runId}`;\n } else {\n return detail({\n \"Procedure ID\": String(r.procedure_id ?? \"\"),\n });\n }\n }\n });\n });\n\n // result\n simulations\n .command(\"result <run_id>\")\n .description(\"Get the result of a simulation run\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--wait\", \"Poll until run completes\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (runId: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result = await client.get(`/fin-sdk/runs/${runId}`) as RunResult;\n\n if (opts.wait) {\n const deadline = Date.now() + SIMULATION_POLL_TIMEOUT_MS;\n while (result.status === \"pending\" || result.status === \"running\") {\n if (Date.now() > deadline) {\n throw new TimeoutError(\n `Simulation polling timed out after ${SIMULATION_POLL_TIMEOUT_MS / 1000}s. ` +\n `Last status: ${result.status}. Run \"intercom fin simulations result ${runId}\" to check later.`,\n );\n }\n await new Promise(r => setTimeout(r, 2000));\n result = await client.get(`/fin-sdk/runs/${runId}`) as RunResult;\n }\n }\n\n render(result, opts, () =>\n detail({\n \"Run ID\": String(result.run_id ?? \"\"),\n \"Status\": String(result.status ?? \"\"),\n })\n );\n });\n\n // generate\n simulations\n .command(\"generate <procedure_id>\")\n .description(\"Generate simulations for a procedure\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (procedureId: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.post(`/fin-sdk/procedures/${procedureId}/simulations/generate`, {});\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n \"Status\": String(r.status ?? \"\"),\n \"Procedure ID\": String(r.procedure_id ?? \"\"),\n })\n );\n });\n}\n","/**\n * Shared utilities for ember session-based operations.\n *\n * Some Intercom features (Fin activation, email verification) require\n * authenticated ember session cookies rather than OAuth API tokens.\n * This module provides a helper to get an authenticated session.\n */\n\nimport { deviseSignIn } from \"./devhub.js\";\nimport { getAppBaseUrl } from \"./signup.js\";\nimport { fetchWithTimeout } from \"../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../api/timeouts.js\";\n\nexport interface EmberSession {\n cookies: string;\n csrf: string;\n appId: string;\n}\n\n/**\n * Establish an authenticated ember session:\n * 1. Sign in via Devise (gets session cookies)\n * 2. Load the app page (sets app context + provides fresh CSRF token)\n */\nexport async function getEmberSession(options: {\n email: string;\n password: string;\n appId: string;\n verifyEmailUrl?: string;\n timeoutMs?: number;\n}): Promise<EmberSession> {\n const { email, password, appId, verifyEmailUrl, timeoutMs = API_TIMEOUT_MS } = options;\n const baseUrl = getAppBaseUrl();\n\n // Step 1: Sign in via Devise\n let cookies = await deviseSignIn(baseUrl, email, password, timeoutMs);\n\n // Step 2: Verify email if URL provided\n if (verifyEmailUrl) {\n const verifyResponse = await fetchWithTimeout(verifyEmailUrl, {\n headers: { Cookie: cookies },\n redirect: \"manual\",\n }, { timeoutMs });\n const newCookies = extractCookies(verifyResponse);\n if (newCookies) cookies = mergeCookies(cookies, newCookies);\n }\n\n // Step 3: Load the app page to set session context and get CSRF\n const appResponse = await fetchWithTimeout(`${baseUrl}/a/apps/${appId}`, {\n headers: { Cookie: cookies },\n }, { timeoutMs });\n const appCookies = extractCookies(appResponse);\n if (appCookies) cookies = mergeCookies(cookies, appCookies);\n\n const html = await appResponse.text();\n const csrfMatch = /<meta\\s+name=\"csrf-token\"\\s+content=\"([^\"]+)\"/.exec(html);\n if (!csrfMatch) {\n throw new Error(\"Failed to get CSRF token from app page. Email may not be verified.\");\n }\n\n return { cookies, csrf: csrfMatch[1], appId };\n}\n\n/**\n * Make an authenticated ember API request using session cookies.\n */\nexport async function emberRequest(\n session: EmberSession,\n path: string,\n options: {\n method?: string;\n body?: unknown;\n timeoutMs?: number;\n } = {},\n): Promise<{ status: number; data: unknown }> {\n const { method = \"GET\", body, timeoutMs = API_TIMEOUT_MS } = options;\n const baseUrl = getAppBaseUrl();\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"X-CSRF-Token\": session.csrf,\n Cookie: session.cookies,\n };\n\n const fetchOptions: RequestInit = { method, headers };\n\n if (body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n fetchOptions.body = JSON.stringify(body);\n }\n\n const response = await fetchWithTimeout(\n `${baseUrl}${path}`,\n fetchOptions,\n { timeoutMs },\n );\n\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n data = text;\n }\n\n return { status: response.status, data };\n}\n\nfunction extractCookies(response: Response): string {\n const setCookies: string[] =\n typeof (response.headers as unknown as { getSetCookie?: () => string[] }).getSetCookie === \"function\"\n ? (response.headers as unknown as { getSetCookie: () => string[] }).getSetCookie()\n : (response.headers.get(\"set-cookie\") ?? \"\").split(/,(?=[^ ])/).filter(Boolean);\n return setCookies.map((c: string) => c.split(\";\")[0]).join(\"; \");\n}\n\nfunction mergeCookies(existing: string, newCookies: string): string {\n const map = new Map<string, string>();\n for (const cookie of [...existing.split(\"; \"), ...newCookies.split(\"; \")]) {\n const eqIdx = cookie.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const name = cookie.slice(0, eqIdx).trim();\n const value = cookie.slice(eqIdx + 1);\n if (name) map.set(name, value);\n }\n return Array.from(map.entries())\n .map(([k, v]) => `${k}=${v}`)\n .join(\"; \");\n}\n","import { Command } from \"commander\";\nimport { resolvePassword } from \"../../auth/password.js\";\nimport { getEmberSession, emberRequest } from \"../../auth/ember-session.js\";\nimport { readConfig } from \"../../auth/config.js\";\nimport { CLIError } from \"../../types.js\";\n\ntype Opts = {\n email?: string;\n passwordStdin?: boolean;\n verifyEmailUrl?: string;\n verbose?: boolean;\n workspace?: string;\n};\n\nexport function registerFinEnableCommand(fin: Command): void {\n fin\n .command(\"enable\")\n .description(\n \"Enable Fin AI Agent on the workspace.\\n\\n\" +\n \"This opts the workspace into Fin and activates it to answer conversations.\\n\" +\n \"Requires email/password authentication (ember session).\"\n )\n .requiredOption(\"--email <email>\", \"Admin email address\")\n .option(\"--password-stdin\", \"Read password from stdin (or set INTERCOM_PASSWORD)\")\n .option(\"--verify-email-url <url>\", \"Email verification URL (if email not yet verified)\")\n .option(\"--verbose\", \"Show detailed output\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const password = await resolvePassword({ passwordStdin: opts.passwordStdin });\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n const appId = opts.workspace ?? config.default;\n if (!appId) {\n throw new CLIError(\n 'No workspace configured. Run \"intercom auth signup\" or \"intercom auth login\" first.'\n );\n }\n\n if (opts.verbose) {\n console.log(`Workspace: ${appId}`);\n console.log(`Email: ${opts.email}`);\n }\n\n // Get ember session\n console.log(\"Signing in...\");\n const session = await getEmberSession({\n email: opts.email!,\n password,\n appId,\n verifyEmailUrl: opts.verifyEmailUrl,\n });\n\n // Step 1: Opt in to Fin\n console.log(\"Enabling Fin...\");\n const optIn = await emberRequest(session, \"/ember/fin_opt_in\", {\n method: \"POST\",\n body: { app_id: appId },\n });\n\n if (optIn.status === 200) {\n console.log(\"✓ Fin opted in\");\n } else if (optIn.status === 409) {\n console.log(\"✓ Fin already opted in\");\n } else {\n throw new CLIError(\n `Fin opt-in failed (${optIn.status}). ` +\n (optIn.status === 403\n ? \"Email may not be verified — use --verify-email-url.\"\n : JSON.stringify(optIn.data))\n );\n }\n\n // Step 2: Get the Fin setup profile to find the ruleset ID\n console.log(\"Checking Fin configuration...\");\n const profile = await emberRequest(\n session,\n `/ember/operator_workflows/fin_setup_behavior?app_id=${appId}`,\n );\n\n if (profile.status === 204) {\n throw new CLIError(\n \"Fin setup profile not found. The workspace may not have Fin available on this plan.\"\n );\n }\n\n if (profile.status !== 200) {\n throw new CLIError(\n `Failed to get Fin profile (${profile.status}): ${JSON.stringify(profile.data)}`\n );\n }\n\n const profileData = profile.data as { id: string; state: number };\n const rulesetId = profileData.id;\n const state = profileData.state;\n\n if (opts.verbose) {\n console.log(` Ruleset ID: ${rulesetId}, current state: ${state}`);\n }\n\n // Step 3: Activate the ruleset if not already live\n if (state === 1) {\n console.log(\"✓ Fin already active\");\n } else {\n console.log(\"Activating Fin...\");\n const activate = await emberRequest(\n session,\n `/ember/matching_system/rulesets/${rulesetId}/activate?app_id=${appId}`,\n { method: \"PUT\", body: {} },\n );\n\n if (activate.status === 200) {\n const result = activate.data as { state: number };\n if (result.state === 1) {\n console.log(\"✓ Fin activated!\");\n } else {\n console.log(`⚠ Activation returned state ${result.state}`);\n }\n } else {\n throw new CLIError(\n `Fin activation failed (${activate.status}): ${JSON.stringify(activate.data)}`\n );\n }\n }\n\n console.log(`\\nFin is live on workspace ${appId}`);\n });\n}\n","import { Command } from \"commander\";\nimport { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport { resolveClient } from \"./helpers.js\";\nimport { formatJson } from \"../output/json.js\";\nimport { resolvePassword } from \"../auth/password.js\";\nimport { signup, getAppBaseUrl } from \"../auth/signup.js\";\nimport { getToken } from \"../auth/devhub.js\";\nimport { IntercomClient } from \"../api/client.js\";\nimport { CLIError, PermissionError, NotFoundError } from \"../types.js\";\nimport { CredentialStore, createDefaultBackend } from \"../auth/store.js\";\nimport { addWorkspace, readConfig } from \"../auth/config.js\";\nimport { getEmberSession, emberRequest } from \"../auth/ember-session.js\";\nimport { fetchWithTimeout } from \"../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../api/timeouts.js\";\n\ntype Opts = {\n companyName?: string;\n articlesFrom?: string;\n plan?: boolean;\n dryRun?: boolean;\n json?: boolean;\n verbose?: boolean;\n // Signup/bootstrap flags\n email?: string;\n passwordStdin?: boolean;\n name?: string;\n planTier?: string;\n // Fin enablement\n enableFin?: boolean;\n verifyEmailUrl?: string;\n};\n\ntype PlanStep = {\n step: number;\n description: string;\n commands: string[];\n};\n\nfunction isGreenfield(opts: Opts): boolean {\n return !!(opts.email && opts.name && (process.env.INTERCOM_PASSWORD || opts.passwordStdin));\n}\n\nfunction hasPartialGreenfieldFlags(opts: Opts): boolean {\n const hasPassword = !!(process.env.INTERCOM_PASSWORD || opts.passwordStdin);\n return !!(opts.email && hasPassword && !opts.name);\n}\n\n/**\n * Check if there are already stored credentials for any workspace.\n * When auth exists, we skip signup even if greenfield flags are present —\n * the user is re-running setup on an existing workspace.\n */\nasync function hasExistingAuth(): Promise<boolean> {\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n return !!config.default;\n}\n\nfunction buildPlan(opts: Opts): PlanStep[] {\n const steps: PlanStep[] = [];\n let stepNum = 1;\n const greenfield = isGreenfield(opts);\n\n if (greenfield) {\n const company = opts.companyName ?? \"<company-name>\";\n\n // Step 1: Signup\n steps.push({\n step: stepNum++,\n description: \"Create a new Intercom workspace\",\n commands: [\n `INTERCOM_PASSWORD=*** intercom auth signup --email \"${opts.email}\" --name \"${opts.name}\" --company \"${company}\"`,\n ],\n });\n\n // Step 2: Bootstrap (auth token)\n steps.push({\n step: stepNum++,\n description: \"Bootstrap authentication token\",\n commands: [\n `INTERCOM_PASSWORD=*** intercom auth bootstrap --email \"${opts.email}\" --app-id <workspace_id>`,\n ],\n });\n }\n\n // Messenger snippet\n steps.push({\n step: stepNum++,\n description: \"Get Messenger install snippet\",\n commands: [\n `intercom messenger snippet --format html`,\n ],\n });\n\n // Help center\n const helpCenterName = opts.companyName ? `${opts.companyName} Help` : \"<your-company-name> Help\";\n steps.push({\n step: stepNum++,\n description: \"Create help center collection\",\n commands: [\n `intercom help-center create -f name=\"${helpCenterName}\"`,\n ],\n });\n\n // Articles (if --articles-from provided)\n if (opts.articlesFrom) {\n let mdFiles: string[] = [];\n try {\n mdFiles = readdirSync(opts.articlesFrom).filter((f) => f.endsWith(\".md\"));\n } catch {\n // Directory might not exist in plan mode — show a generic placeholder\n mdFiles = [];\n }\n\n if (mdFiles.length > 0) {\n const articleCommands = mdFiles.map((file) => {\n const title = basename(file, \".md\")\n .replace(/-/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n return `intercom articles create -f title=\"${title}\" -F body=@${join(opts.articlesFrom!, file)} -f author_id=$(intercom me --json | jq -r .id)`;\n });\n steps.push({\n step: stepNum++,\n description: `Create ${mdFiles.length} article(s) from ${opts.articlesFrom}`,\n commands: articleCommands,\n });\n } else {\n steps.push({\n step: stepNum++,\n description: `Create articles from ${opts.articlesFrom}`,\n commands: [\n `intercom articles create -f title=\"<article-title>\" -F body=@${opts.articlesFrom}/<file>.md -f author_id=$(intercom me --json | jq -r .id)`,\n ],\n });\n }\n }\n\n // Fin SDK manifest\n steps.push({\n step: stepNum++,\n description: \"Verify Fin SDK access and view configuration\",\n commands: [\n `intercom fin manifest`,\n ],\n });\n\n return steps;\n}\n\nfunction formatPlanText(steps: PlanStep[]): string {\n const lines: string[] = [\"Steps to complete Intercom setup:\"];\n for (const step of steps) {\n lines.push(`${step.step}. ${step.commands[0]}`);\n for (let i = 1; i < step.commands.length; i++) {\n lines.push(` ${step.commands[i]}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\nasync function runPostAuthSteps(\n client: IntercomClient,\n opts: Opts,\n results: string[],\n appId?: string,\n): Promise<void> {\n // Messenger settings are pre-configured with defaults on workspace creation.\n // The company name is set on the App during signup, not via PUT /messenger.\n // The PUT /messenger endpoint accepts theming/visibility fields only.\n results.push(`✓ Messenger configured`);\n\n // Fetch admin ID for article authorship\n const me = await client.get(\"/me\") as { id?: string | number };\n const authorId = me.id != null ? Number(me.id) : undefined;\n\n // Help center — check idempotency\n const helpCenterName = opts.companyName ? `${opts.companyName} Help` : \"Help Center\";\n const collections = await client.paginate(\"/help_center/collections\");\n const existingCollection = collections.find(\n (c) => String(c.name ?? \"\") === helpCenterName,\n );\n\n let collectionId: string | undefined;\n if (existingCollection) {\n collectionId = String(existingCollection.id);\n results.push(`✓ Help center already exists (${helpCenterName})`);\n } else {\n const created = await client.post(\"/help_center/collections\", { name: helpCenterName }) as { id?: string | number };\n collectionId = created.id != null ? String(created.id) : undefined;\n results.push(`✓ Help center created (${helpCenterName})`);\n }\n\n // Articles (if --articles-from provided)\n if (opts.articlesFrom) {\n let mdFiles: string[] = [];\n try {\n mdFiles = readdirSync(opts.articlesFrom).filter((f) => f.endsWith(\".md\"));\n } catch (err) {\n throw err instanceof CLIError ? err : new CLIError(`Failed to read --articles-from directory: ${(err as Error).message}`);\n }\n\n // Fetch existing articles to check idempotency by title\n const existingArticles = await client.paginate(\"/articles\");\n const existingTitles = new Set(existingArticles.map((a) => String(a.title ?? \"\")));\n\n let created = 0;\n let skipped = 0;\n\n for (const file of mdFiles) {\n const title = basename(file, \".md\")\n .replace(/-/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n const body = readFileSync(join(opts.articlesFrom, file), \"utf-8\");\n\n if (existingTitles.has(title)) {\n skipped++;\n } else {\n const articleBody: Record<string, unknown> = { title, body, state: \"published\" };\n if (authorId != null) articleBody.author_id = authorId;\n if (collectionId != null) {\n articleBody.parent_id = collectionId;\n articleBody.parent_type = \"collection\";\n }\n await client.post(\"/articles\", articleBody);\n created++;\n }\n }\n\n if (created > 0 && skipped > 0) {\n results.push(`✓ ${created} article(s) published, ${skipped} skipped (already exist)`);\n } else if (created > 0) {\n results.push(`✓ ${created} article(s) published`);\n } else {\n results.push(`✓ All ${skipped} article(s) already exist`);\n }\n }\n\n // Check article count — warn if Fin would have nothing to answer from\n const articleCount = (await client.paginate(\"/articles\")).length;\n if (articleCount === 0) {\n results.push(`⚠ No help center articles found!`);\n console.error(results.join(\"\\n\"));\n console.error(\"\");\n console.error(\"WARNING: Fin needs help center articles to answer questions.\");\n console.error(\"Without articles, Fin will have nothing to draw from and cannot help visitors.\\n\");\n console.error(\"To add articles, either:\");\n console.error(\" 1. Re-run with: intercom setup --articles-from <directory-of-markdown-files>\");\n console.error(\" 2. Create articles manually: intercom articles create -f title=\\\"...\\\" -f body=\\\"...\\\" -F author_id=<id>\");\n console.error(\"\");\n console.error(\"Tip for AI agents: if no articles directory exists, consider creating one by\");\n console.error(\" analyzing the project's source code, README, documentation, or any available\");\n console.error(\" context about the product. Write markdown files covering key topics that\");\n console.error(\" customers would ask about, then re-run setup with --articles-from.\\n\");\n console.error(\"Skipping Fin enablement — enable Fin after adding articles with: intercom fin enable --email <email>\");\n return;\n }\n\n results.push(`✓ ${articleCount} article(s) in help center`);\n\n // Enable Fin (if we have email/password for ember session)\n if (opts.enableFin !== false && opts.email) {\n try {\n const password = await resolvePassword({ passwordStdin: opts.passwordStdin });\n const finAppId = appId ?? \"\";\n\n const session = await getEmberSession({\n email: opts.email,\n password,\n appId: finAppId,\n verifyEmailUrl: opts.verifyEmailUrl,\n });\n\n // Opt in to Fin\n const optIn = await emberRequest(session, \"/ember/fin_opt_in\", {\n method: \"POST\",\n body: { app_id: finAppId },\n });\n\n if (optIn.status === 200) {\n results.push(`✓ Fin opted in`);\n } else if (optIn.status === 409) {\n results.push(`✓ Fin already opted in`);\n } else {\n results.push(`⚠ Fin opt-in failed (${optIn.status}) — enable manually with: intercom fin enable --email <email>`);\n console.error(results.join(\"\\n\"));\n console.error(\"Setup complete (Fin requires manual enablement).\");\n return;\n }\n\n // Get Fin setup profile and activate\n const profile = await emberRequest(\n session,\n `/ember/operator_workflows/fin_setup_behavior?app_id=${finAppId}`,\n );\n\n if (profile.status === 200) {\n const profileData = profile.data as { id: string; state: number };\n if (profileData.state === 1) {\n results.push(`✓ Fin already active`);\n } else {\n const activate = await emberRequest(\n session,\n `/ember/matching_system/rulesets/${profileData.id}/activate?app_id=${finAppId}`,\n { method: \"PUT\", body: {} },\n );\n if (activate.status === 200) {\n results.push(`✓ Fin activated — answering conversations now`);\n } else {\n results.push(`⚠ Fin activation failed (${activate.status})`);\n }\n }\n } else {\n results.push(`⚠ Could not get Fin profile (${profile.status})`);\n }\n } catch {\n results.push(`⚠ Fin enablement failed — enable manually with: intercom fin enable --email <email>`);\n }\n } else if (opts.enableFin !== false) {\n results.push(`⚠ Fin not enabled (--email required for Fin activation)`);\n console.error(\" Tip: Re-run with --email to enable Fin, or use: intercom fin enable --email <email>\");\n }\n\n // Fin SDK manifest — show configuration summary\n try {\n const manifest = await client.get(\"/fin-sdk/manifest\");\n const procedures = (manifest.procedures as unknown[]) ?? [];\n const connectors = (manifest.data_connectors as unknown[]) ?? [];\n const guidance = (manifest.guidance as unknown[]) ?? [];\n\n if (procedures.length > 0 || connectors.length > 0 || guidance.length > 0) {\n results.push(`✓ Fin configured (${procedures.length} procedures, ${connectors.length} data connectors, ${guidance.length} guidance)`);\n }\n } catch (err) {\n if (!(err instanceof PermissionError) && !(err instanceof NotFoundError)) {\n throw err;\n }\n }\n\n console.error(results.join(\"\\n\"));\n console.error(\"Setup complete!\");\n}\n\nexport function registerSetupCommand(program: Command): void {\n program\n .command(\"setup\")\n .description(\"Set up a complete Intercom installation\")\n .addHelpText(\n \"after\",\n `\nExamples:\n # Existing workspace (already authenticated)\n intercom setup --company-name \"Acme Inc\" --articles-from ./docs\n\n # New workspace (greenfield)\n INTERCOM_PASSWORD=*** intercom setup --email admin@acme.com --name \"Admin\" --company-name \"Acme Inc\"\n\n # Preview steps without executing\n intercom setup --plan\n\nFlow: signup → auth → messenger → help center → articles → fin`,\n )\n .option(\"--company-name <name>\", \"Company name for Messenger branding\")\n .option(\"--articles-from <dir>\", \"Directory of markdown files to create as articles\")\n .option(\"--plan\", \"Output setup steps as CLI commands without executing\")\n .option(\"--dry-run\", \"Show what would happen without executing\")\n .option(\"--json\", \"Output as JSON (for --plan mode)\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n // Greenfield (new workspace) flags\n .option(\"--email <email>\", \"Admin email address (for new workspace signup)\")\n .option(\"--password-stdin\", \"Read password from stdin (or set INTERCOM_PASSWORD env var)\")\n .option(\"--name <name>\", \"Admin name (for new workspace signup)\")\n .option(\"--plan-tier <tier>\", \"Trial plan tier: essential, advanced, expert (default: advanced)\")\n // Fin enablement\n .option(\"--enable-fin\", \"Enable Fin AI Agent (default: true for greenfield setup)\", true)\n .option(\"--no-enable-fin\", \"Skip Fin enablement\")\n .option(\"--verify-email-url <url>\", \"Email verification URL (needed for Fin on fresh workspaces)\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n\n // Validate: email + password without --name is an error\n if (hasPartialGreenfieldFlags(opts)) {\n throw new CLIError(\n \"The --name flag is required for new workspace setup.\\n\" +\n \" Usage: intercom setup --email <email> --name <name> --password-stdin ...\",\n 1,\n );\n }\n\n // --plan mode: output steps without executing\n if (opts.plan) {\n const steps = buildPlan(opts);\n\n if (opts.json) {\n console.log(formatJson({ steps }));\n } else {\n console.log(formatPlanText(steps));\n }\n return;\n }\n\n // Validate --articles-from directory exists (skip in --plan mode which already returned)\n if (opts.articlesFrom) {\n try {\n const stat = statSync(opts.articlesFrom);\n if (!stat.isDirectory()) {\n throw new CLIError(`--articles-from path is not a directory: ${opts.articlesFrom}`);\n }\n } catch (err) {\n if (err instanceof CLIError) throw err;\n throw new CLIError(`--articles-from directory not found: ${opts.articlesFrom}`);\n }\n }\n\n // --dry-run mode: show what would happen\n if (opts.dryRun) {\n const helpCenterName = opts.companyName ? `${opts.companyName} Help` : \"Help Center\";\n const lines: string[] = [];\n if (isGreenfield(opts)) {\n lines.push(`[dry-run] Would create workspace via signup (${opts.email})`);\n lines.push(`[dry-run] Would bootstrap authentication token`);\n }\n lines.push(`[dry-run] Would configure Messenger${opts.companyName ? ` with name \"${opts.companyName}\"` : \"\"}`);\n lines.push(`[dry-run] Would check for existing help center collection \"${helpCenterName}\"`);\n if (opts.articlesFrom) {\n let mdFiles: string[] = [];\n try {\n mdFiles = readdirSync(opts.articlesFrom).filter((f) => f.endsWith(\".md\"));\n } catch (err) {\n throw err instanceof CLIError ? err : new CLIError(`Failed to read --articles-from directory: ${(err as Error).message}`);\n }\n lines.push(`[dry-run] Would create ${mdFiles.length} article(s) from ${opts.articlesFrom}`);\n }\n lines.push(`[dry-run] Would check Fin SDK manifest and show configuration summary`);\n console.log(lines.join(\"\\n\"));\n return;\n }\n\n const results: string[] = [];\n\n // Check if we already have stored credentials\n const alreadyAuthed = await hasExistingAuth();\n\n // Greenfield: signup + bootstrap, then run post-auth steps\n // Skip signup if we already have auth — the user is re-running setup\n if (isGreenfield(opts) && !alreadyAuthed) {\n const password = await resolvePassword({ passwordStdin: opts.passwordStdin });\n const baseUrl = getAppBaseUrl();\n const planTier = opts.planTier ?? \"advanced\";\n const companyName = opts.companyName ?? opts.name!;\n\n // Step 1: Signup\n const workspace = await signup({\n baseUrl,\n email: opts.email!,\n name: opts.name!,\n password,\n companyName,\n plan: planTier,\n });\n results.push(`✓ Workspace created: ${workspace.name} (${workspace.id})`);\n\n // Step 2: Verify email before bootstrap (Developer Hub requires it)\n if (opts.verifyEmailUrl) {\n try {\n await fetchWithTimeout(opts.verifyEmailUrl, { redirect: \"manual\" }, { timeoutMs: API_TIMEOUT_MS });\n results.push(`✓ Email verified`);\n } catch {\n // Non-fatal — bootstrap may still work if email was verified externally\n }\n }\n\n // Step 3: Get auth token via Developer Hub\n let token: string;\n try {\n const result = await getToken({\n baseUrl,\n email: opts.email!,\n password,\n appId: workspace.id,\n });\n token = result.token;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`✓ Workspace created: ${workspace.name} (${workspace.id})`);\n console.error(`\\nAuthentication failed after workspace creation: ${message}`);\n if (message.includes(\"403\")) {\n console.error(`\\nThis is likely because the email has not been verified.`);\n console.error(`Verify your email first, then bootstrap:`);\n console.error(` intercom auth verify-email --url <url-from-verification-email>`);\n } else {\n console.error(`\\nYour workspace exists but credentials were not saved.`);\n }\n console.error(`\\nTo complete setup, run:\\n`);\n console.error(` INTERCOM_PASSWORD=*** intercom auth bootstrap --email ${opts.email} --app-id ${workspace.id}`);\n console.error(`\\nThen re-run setup without signup flags:\\n`);\n console.error(` intercom setup --company-name \"${companyName}\"`);\n throw new CLIError(\n `Authentication failed after workspace creation. Run \"intercom auth bootstrap --email ${opts.email} --app-id ${workspace.id}\" to recover.`,\n 1,\n );\n }\n results.push(`✓ Authentication token obtained`);\n\n // Step 4: Persist credentials (same as auth bootstrap)\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const store = new CredentialStore(createDefaultBackend(configDir));\n await store.set(workspace.id, { token, auth_type: \"oauth\", app_id: workspace.id });\n await addWorkspace(configDir, { app_id: workspace.id, name: workspace.name });\n\n // Build a client using the new token\n const client = new IntercomClient({\n token,\n authType: \"oauth\",\n appId: workspace.id,\n baseUrl: process.env.INTERCOM_API_BASE_URL || undefined,\n verbose: opts.verbose,\n });\n\n await runPostAuthSteps(client, opts, results, workspace.id);\n return;\n }\n\n // Already authenticated: use existing credentials\n const client = await resolveClient(opts);\n // Get appId from the me endpoint\n const me = await client.get(\"/me\") as { app?: { id_code?: string } };\n const resolvedAppId = me.app?.id_code;\n await runPostAuthSteps(client, opts, results, resolvedAppId);\n });\n}\n","import { Command } from \"commander\";\n\n/** Detect whether the CLI was invoked as `fin` or `intercom`. */\nfunction binName(): string {\n const argv1 = process.argv[1] ?? \"\";\n if (argv1.endsWith(\"/fin\") || argv1.endsWith(\"\\\\fin\")) return \"fin\";\n return \"intercom\";\n}\n\nconst COMMANDS: Record<string, string[]> = {\n api: [],\n auth: [\"login\", \"logout\", \"status\", \"bootstrap\", \"signup\", \"verify-email\"],\n me: [],\n articles: [\"list\", \"get\", \"create\", \"update\", \"delete\"],\n contacts: [\"list\", \"get\", \"create\", \"update\", \"delete\"],\n conversations: [\"list\", \"get\", \"reply\"],\n \"help-center\": [\"list\", \"get\", \"create\"],\n messenger: [\"get\", \"update\", \"snippet\"],\n fin: [\"manifest\", \"enable\", \"guidance\"],\n setup: [],\n pricing: [],\n completion: [\"bash\", \"zsh\", \"fish\"],\n};\n\nconst GLOBAL_FLAGS = [\n \"--json\",\n \"--jq\",\n \"--workspace\",\n \"--verbose\",\n \"--no-retry\",\n \"--timeout\",\n \"--agent\",\n \"--human\",\n \"--help\",\n \"--version\",\n];\n\nfunction bashScript(name: string = binName()): string {\n const commandNames = Object.keys(COMMANDS).join(\" \");\n const fnName = `_${name}`;\n const subcommandCases = Object.entries(COMMANDS)\n .filter(([, subs]) => subs.length > 0)\n .map(([cmd, subs]) => ` ${cmd}) COMPREPLY=( $(compgen -W \"${subs.join(\" \")}\" -- \"$cur\") ) ;;`)\n .join(\"\\n\");\n\n return `# bash completion for ${name} CLI\n# Add to ~/.bashrc: eval \"$(${name} completion bash)\"\n\n${fnName}() {\n local cur prev commands\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n commands=\"${commandNames}\"\n\n if [[ \"$cur\" == -* ]]; then\n COMPREPLY=( $(compgen -W \"${GLOBAL_FLAGS.join(\" \")}\" -- \"$cur\") )\n return 0\n fi\n\n case \"\\${COMP_WORDS[1]}\" in\n${subcommandCases}\n *)\n if [[ \\${COMP_CWORD} -eq 1 ]]; then\n COMPREPLY=( $(compgen -W \"$commands\" -- \"$cur\") )\n fi\n ;;\n esac\n return 0\n}\n\ncomplete -F ${fnName} ${name}\n`;\n}\n\nfunction zshScript(name: string = binName()): string {\n const fnName = `_${name}`;\n const commandDescs = [\n \"api:'Make an authenticated API request'\",\n \"auth:'Manage authentication credentials'\",\n \"me:'Show current admin and workspace info'\",\n \"articles:'Manage help center articles'\",\n \"contacts:'Manage contacts'\",\n \"conversations:'Manage conversations'\",\n \"help-center:'Manage help center collections'\",\n \"messenger:'Manage Messenger settings'\",\n \"fin:'Manage Fin AI Agent'\",\n \"setup:'Set up a complete Intercom installation'\",\n \"pricing:'Show current Intercom pricing information'\",\n \"completion:'Generate shell completion scripts'\",\n ];\n\n const subcommandFunctions = Object.entries(COMMANDS)\n .filter(([, subs]) => subs.length > 0)\n .map(([cmd, subs]) => {\n const subFnName = cmd.replace(/-/g, \"_\");\n const subLines = subs.map((s) => `'${s}'`).join(\" \");\n return `${fnName}_${subFnName}() {\n local -a subcommands\n subcommands=(${subLines})\n _describe 'subcommand' subcommands\n}`;\n })\n .join(\"\\n\\n\");\n\n return `#compdef ${name}\n# zsh completion for ${name} CLI\n# Add to ~/.zshrc: eval \"$(${name} completion zsh)\"\n\n${fnName}() {\n local -a commands global_flags\n commands=(\n ${commandDescs.join(\"\\n \")}\n )\n global_flags=(\n ${GLOBAL_FLAGS.map((f) => `'${f}'`).join(\"\\n \")}\n )\n\n _arguments -C \\\\\n '1:command:->command' \\\\\n '*::arg:->args'\n\n case $state in\n command)\n _describe 'command' commands\n ;;\n args)\n case $words[1] in\n${Object.entries(COMMANDS)\n .filter(([, subs]) => subs.length > 0)\n .map(([cmd]) => ` ${cmd}) ${fnName}_${cmd.replace(/-/g, \"_\")} ;;`)\n .join(\"\\n\")}\n esac\n ;;\n esac\n}\n\n${subcommandFunctions}\n\n${fnName} \"$@\"\n`;\n}\n\nfunction fishScript(name: string = binName()): string {\n const lines = [\n `# fish completion for ${name} CLI`,\n `# Add to fish config: ${name} completion fish | source`,\n \"\",\n \"# Disable file completions\",\n `complete -c ${name} -f`,\n \"\",\n \"# Top-level commands\",\n ];\n\n const commandDescs: Record<string, string> = {\n api: \"Make an authenticated API request\",\n auth: \"Manage authentication credentials\",\n me: \"Show current admin and workspace info\",\n articles: \"Manage help center articles\",\n contacts: \"Manage contacts\",\n conversations: \"Manage conversations\",\n \"help-center\": \"Manage help center collections\",\n messenger: \"Manage Messenger settings\",\n fin: \"Manage Fin AI Agent\",\n setup: \"Set up a complete Intercom installation\",\n pricing: \"Show current Intercom pricing information\",\n completion: \"Generate shell completion scripts\",\n };\n\n for (const [cmd, desc] of Object.entries(commandDescs)) {\n lines.push(\n `complete -c ${name} -n '__fish_use_subcommand' -a '${cmd}' -d '${desc}'`,\n );\n }\n\n lines.push(\"\");\n lines.push(\"# Subcommands\");\n\n for (const [cmd, subs] of Object.entries(COMMANDS)) {\n for (const sub of subs) {\n lines.push(\n `complete -c ${name} -n '__fish_seen_subcommand_from ${cmd}' -a '${sub}'`,\n );\n }\n }\n\n lines.push(\"\");\n lines.push(\"# Global flags\");\n for (const flag of GLOBAL_FLAGS) {\n lines.push(`complete -c ${name} -l '${flag.replace(/^--/, \"\")}'`);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function registerCompletionCommand(program: Command): void {\n const name = binName();\n const completion = program\n .command(\"completion\")\n .description(\"Generate shell completion scripts\")\n .addHelpText(\n \"after\",\n `\nExamples:\n # Bash (add to ~/.bashrc)\n eval \"$(${name} completion bash)\"\n\n # Zsh (add to ~/.zshrc)\n eval \"$(${name} completion zsh)\"\n\n # Fish (add to fish config)\n ${name} completion fish | source`,\n );\n\n completion\n .command(\"bash\")\n .description(\"Generate bash completion script\")\n .action(() => {\n console.log(bashScript());\n });\n\n completion\n .command(\"zsh\")\n .description(\"Generate zsh completion script\")\n .action(() => {\n console.log(zshScript());\n });\n\n completion\n .command(\"fish\")\n .description(\"Generate fish completion script\")\n .action(() => {\n console.log(fishScript());\n });\n}\n\n// Exported for testing\nexport { bashScript, zshScript, fishScript };\n","import { Command } from \"commander\";\nimport { fetchWithTimeout } from \"../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../api/timeouts.js\";\nimport { CLIError } from \"../types.js\";\n\nconst PRICING_URL = \"https://www.intercom.com/pricing.md\";\n\nexport function registerPricingCommand(program: Command): void {\n program\n .command(\"pricing\")\n .description(\"Show current Intercom pricing information\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => { json?: boolean; jq?: string; verbose?: boolean } }).optsWithGlobals();\n\n const response = await fetchWithTimeout(\n PRICING_URL,\n { headers: { Accept: \"text/markdown, text/plain, */*\" } },\n { timeoutMs: API_TIMEOUT_MS, verbose: opts.verbose },\n );\n\n if (!response.ok) {\n throw new CLIError(`Failed to fetch pricing: ${response.status} ${response.statusText}`);\n }\n\n const markdown = await response.text();\n\n if (opts.json) {\n const { formatJson } = await import(\"../output/json.js\");\n console.log(formatJson({ url: PRICING_URL, content: markdown }));\n } else {\n console.log(markdown);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { readConfig, writeConfig, defaultConfigDir } from \"../auth/config.js\";\nimport { CLIError } from \"../types.js\";\nimport { render } from \"../output/render.js\";\nimport { detail, table } from \"../output/formatter.js\";\nimport { join } from \"node:path\";\n\nconst SUPPORTED_KEYS = [\"default_workspace\", \"timeout\"] as const;\ntype ConfigKey = (typeof SUPPORTED_KEYS)[number];\n\nfunction configDir(): string {\n return process.env.INTERCOM_CONFIG_DIR ?? defaultConfigDir();\n}\n\nfunction validateKey(key: string): ConfigKey {\n if (!SUPPORTED_KEYS.includes(key as ConfigKey)) {\n throw new CLIError(\n `Unknown config key \"${key}\". Supported keys: ${SUPPORTED_KEYS.join(\", \")}`,\n );\n }\n return key as ConfigKey;\n}\n\nasync function getValue(key: ConfigKey): Promise<string | undefined> {\n const config = await readConfig(configDir());\n switch (key) {\n case \"default_workspace\":\n return config.default;\n case \"timeout\":\n return config.timeout !== undefined ? String(config.timeout) : undefined;\n }\n}\n\nfunction resolveSource(key: ConfigKey): string {\n switch (key) {\n case \"default_workspace\":\n return process.env.INTERCOM_WORKSPACE\n ? \"INTERCOM_WORKSPACE\"\n : \"config\";\n case \"timeout\":\n return \"config\";\n }\n}\n\nasync function setValue(key: ConfigKey, value: string): Promise<void> {\n const dir = configDir();\n const config = await readConfig(dir);\n switch (key) {\n case \"default_workspace\":\n config.default = value;\n break;\n case \"timeout\": {\n const n = parseInt(value, 10);\n if (isNaN(n) || n <= 0) {\n throw new CLIError(\"timeout must be a positive integer (seconds)\");\n }\n config.timeout = n;\n break;\n }\n }\n await writeConfig(config, dir);\n}\n\nexport function registerConfigCommand(program: Command): void {\n const cmd = program\n .command(\"config\")\n .description(\"Manage CLI configuration\");\n\n cmd\n .command(\"list\")\n .description(\"List all configuration settings\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Record<string, unknown> }\n ).optsWithGlobals();\n const config = await readConfig(configDir());\n\n const entries: Record<string, { value: string; source: string }> = {};\n for (const key of SUPPORTED_KEYS) {\n const val = await getValue(key);\n entries[key] = {\n value: val ?? \"\",\n source: val !== undefined ? resolveSource(key) : \"\",\n };\n }\n\n render(entries, opts, () =>\n table({\n columns: [\"KEY\", \"VALUE\", \"SOURCE\"],\n rows: SUPPORTED_KEYS.map((key) => ({\n KEY: key,\n VALUE: entries[key].value,\n SOURCE: entries[key].source,\n })),\n }),\n );\n });\n\n cmd\n .command(\"get <key>\")\n .description(\"Get a configuration value\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .action(async function (key: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Record<string, unknown> }\n ).optsWithGlobals();\n const validKey = validateKey(key);\n const value = await getValue(validKey);\n\n if (value === undefined) {\n throw new CLIError(`Key \"${key}\" is not set`);\n }\n\n render({ key, value }, opts, () => value);\n });\n\n cmd\n .command(\"set <key> <value>\")\n .description(\"Set a configuration value\")\n .action(async function (key: string, value: string) {\n const validKey = validateKey(key);\n await setValue(validKey, value);\n console.log(`Set ${key} = ${value}`);\n });\n\n cmd\n .command(\"path\")\n .description(\"Show configuration file path\")\n .action(async function () {\n console.log(join(configDir(), \"config.json\"));\n });\n}\n"],"mappings":"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","names":["readFileSync","require","configDir","join","homedir","configDir","configDir","readFileSync","readFileSync","readFileSync","configDir","c","pkg","configDir","configDir","configDir","configDir","configDir","configDir","c","c","c","writeFile","readFile","readFile","extractCookies","mergeCookies","c","configDir","writeFile","readFileSync","join","basename","configDir","basename","c","join","readFileSync","client","formatJson","join","binName"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/api.ts","../src/api/timeouts.ts","../src/version.ts","../src/api/fetch.ts","../src/api/client.ts","../src/auth/store.ts","../src/utils/fs.ts","../src/auth/config.ts","../src/commands/helpers.ts","../src/output/render.ts","../src/utils/fields.ts","../src/commands/auth/login.ts","../src/auth/cookies.ts","../src/auth/signup.ts","../src/auth/devhub.ts","../src/auth/password.ts","../src/commands/auth/bootstrap.ts","../src/output/formatter.ts","../src/commands/auth/status.ts","../src/commands/auth/logout.ts","../src/commands/auth/signup.ts","../src/commands/auth/verify-email.ts","../src/commands/auth/list.ts","../src/commands/auth/switch.ts","../src/commands/auth/index.ts","../src/commands/me.ts","../src/output/html.ts","../src/commands/articles.ts","../src/commands/contacts.ts","../src/commands/conversations.ts","../src/commands/help-center.ts","../src/commands/messenger.ts","../src/commands/fin.ts","../src/commands/fin/procedures.ts","../src/commands/fin/data-connectors.ts","../src/commands/fin/guidance.ts","../src/commands/fin/attributes.ts","../src/commands/fin/audiences.ts","../src/commands/fin/workflows.ts","../src/commands/fin/simulations.ts","../src/auth/ember-session.ts","../src/commands/fin/enable.ts","../src/commands/setup.ts","../src/commands/completion.ts","../src/commands/pricing.ts","../src/commands/config.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { CLIError, AuthError, RateLimitError, NotFoundError, PermissionError, TimeoutError } from \"./types.js\";\nimport { formatJson } from \"./output/json.js\";\nimport { registerApiCommand } from \"./commands/api.js\";\nimport { registerAuthCommand } from \"./commands/auth/index.js\";\nimport { registerMeCommand } from \"./commands/me.js\";\nimport { registerArticlesCommand } from \"./commands/articles.js\";\nimport { registerContactsCommand } from \"./commands/contacts.js\";\nimport { registerConversationsCommand } from \"./commands/conversations.js\";\nimport { registerHelpCenterCommand } from \"./commands/help-center.js\";\nimport { registerMessengerCommand } from \"./commands/messenger.js\";\nimport { registerFinCommand } from \"./commands/fin.js\";\nimport { registerSetupCommand } from \"./commands/setup.js\";\nimport { registerCompletionCommand } from \"./commands/completion.js\";\nimport { registerPricingCommand } from \"./commands/pricing.js\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { VERSION } from \"./version.js\";\nimport { setCliCommand } from \"./api/fetch.js\";\n\n/** Detect whether the CLI was invoked as `fin` or `intercom`. */\nfunction detectBinaryName(): string {\n const argv1 = process.argv[1] ?? \"\";\n if (argv1.endsWith(\"/fin\") || argv1.endsWith(\"\\\\fin\")) return \"fin\";\n return \"intercom\";\n}\n\nfunction fullCommandName(cmd: Command): string {\n const parts: string[] = [];\n const rootNames = new Set([\"intercom\", \"fin\"]);\n let current: Command | null = cmd;\n while (current) {\n const name = current.name();\n if (name && !rootNames.has(name)) parts.unshift(name);\n current = current.parent;\n }\n return parts.join(\" \");\n}\n\nexport function createProgram(): Command {\n const program = new Command();\n const binName = detectBinaryName();\n\n program\n .name(binName)\n .description(\"CLI tool for managing Intercom workspaces\")\n .version(VERSION)\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output\")\n .option(\"--workspace <id>\", \"Override default workspace\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .option(\"--no-retry\", \"Disable automatic rate limit retry\")\n .option(\"--timeout <seconds>\", \"Request timeout in seconds\")\n .option(\"--agent\", \"Force machine-readable output (JSON/NDJSON)\")\n .option(\"--human\", \"Force human-readable output even when piped\")\n .option(\"--wide\", \"Show all columns with wider truncation\")\n .addHelpText(\n \"after\",\n `\nQuick start:\n $ intercom auth login --token <your-api-token>\n $ intercom me\n $ intercom articles list --json\n $ intercom setup --company-name \"Acme\" --articles-from ./docs\n\nEnvironment: Set INTERCOM_TOKEN to skip login entirely.`,\n );\n\n registerApiCommand(program);\n registerAuthCommand(program);\n registerMeCommand(program);\n registerArticlesCommand(program);\n registerContactsCommand(program);\n registerConversationsCommand(program);\n registerHelpCenterCommand(program);\n registerMessengerCommand(program);\n registerFinCommand(program);\n registerSetupCommand(program);\n registerPricingCommand(program);\n registerCompletionCommand(program);\n registerConfigCommand(program);\n\n program.hook(\"preAction\", (thisCommand, actionCommand) => {\n const rootOpts = thisCommand.opts();\n if (rootOpts.agent && rootOpts.human) {\n throw new CLIError(\"--agent and --human are mutually exclusive\");\n }\n setCliCommand(fullCommandName(actionCommand));\n });\n\n return program;\n}\n\nexport function handleError(err: unknown): never {\n const isJson = process.argv.includes(\"--json\") || process.argv.includes(\"--agent\");\n\n if (err instanceof CLIError) {\n if (isJson) {\n console.error(formatJson({\n error: {\n code: err instanceof AuthError ? \"auth_error\"\n : err instanceof PermissionError ? \"permission_denied\"\n : err instanceof RateLimitError ? \"rate_limited\"\n : err instanceof NotFoundError ? \"not_found\"\n : err instanceof TimeoutError ? \"timeout\"\n : \"error\",\n message: err.message,\n ...(err instanceof RateLimitError ? { retry_after: err.retryAfter } : {}),\n },\n }));\n } else {\n console.error(`Error: ${err.message}`);\n }\n process.exit(err.exitCode);\n }\n\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n}\n\nconst isMainModule = process.argv[1]?.endsWith(\"index.js\") || process.argv[1]?.endsWith(\"intercom\") || process.argv[1]?.endsWith(\"fin\");\n\nif (isMainModule) {\n const program = createProgram();\n try {\n await program.parseAsync();\n } catch (err) {\n handleError(err);\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport { resolveClient } from \"./helpers.js\";\nimport { formatJson } from \"../output/json.js\";\nimport { render } from \"../output/render.js\";\nimport { parseTypedFields } from \"../utils/fields.js\";\nimport { CLIError } from \"../types.js\";\n\ntype ApiOpts = {\n method?: string;\n field?: string[];\n typedField?: string[];\n input?: string;\n jq?: string;\n json?: boolean;\n paginate?: boolean;\n verbose?: boolean;\n retry?: boolean;\n};\n\nfunction readInput(input: string): Record<string, unknown> {\n let raw: string;\n if (input === \"-\") {\n const fd = readFileSync(0, \"utf-8\");\n raw = fd;\n } else {\n raw = readFileSync(input, \"utf-8\");\n }\n try {\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n throw new CLIError(`Failed to parse JSON from ${input === \"-\" ? \"stdin\" : input}`);\n }\n}\n\nexport function registerApiCommand(program: Command): void {\n program\n .command(\"api\")\n .description(\"Make an authenticated API request (like gh api)\")\n .argument(\"<endpoint>\", \"API endpoint path (e.g., /articles)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom api /me\n intercom api /articles --paginate\n intercom api /contacts -X POST -f email=test@example.com -f role=user\n intercom api /articles/123 --jq '.title'`,\n )\n .option(\"-X, --method <method>\", \"HTTP method\")\n .option(\"-f, --field <key=value...>\", \"String field\")\n .option(\n \"-F, --typed-field <key=value...>\",\n \"Typed field (bools, numbers, file reads)\",\n )\n .option(\"--jq <expr>\", \"Filter response with jq expression\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--input <file>\", \"Read JSON body from file (use - for stdin)\")\n .option(\"--paginate\", \"Auto-paginate through all pages\")\n .option(\"--verbose\", \"Show full HTTP request/response\")\n .action(async function (endpoint: string) {\n const options = (\n this as unknown as { optsWithGlobals: () => ApiOpts }\n ).optsWithGlobals();\n const client = await resolveClient(options);\n\n const stringFields = options.field ?? [];\n const typedFields = options.typedField ?? [];\n const inputBody = options.input ? readInput(options.input) : {};\n const body = {\n ...inputBody,\n ...parseTypedFields(stringFields, false),\n ...parseTypedFields(typedFields, true),\n };\n const hasBody =\n stringFields.length > 0 ||\n typedFields.length > 0 ||\n !!options.input;\n const method = options.method ?? (hasBody ? \"POST\" : \"GET\");\n\n let result: unknown;\n if (options.paginate && method.toUpperCase() === \"GET\") {\n result = await client.paginate(\n endpoint,\n hasBody ? (body as Record<string, string>) : undefined,\n );\n } else {\n switch (method.toUpperCase()) {\n case \"GET\":\n result = await client.get(\n endpoint,\n hasBody ? (body as Record<string, string>) : undefined,\n );\n break;\n case \"POST\":\n result = await client.post(endpoint, hasBody ? body : undefined);\n break;\n case \"PUT\":\n result = await client.put(endpoint, hasBody ? body : undefined);\n break;\n case \"PATCH\":\n result = await client.patch(endpoint, hasBody ? body : undefined);\n break;\n case \"DELETE\":\n result = await client.delete(endpoint);\n break;\n default:\n throw new CLIError(`Unsupported method: ${method}`);\n }\n }\n\n // Detect list items for NDJSON streaming when piped\n let listItems: unknown[] | undefined;\n if (Array.isArray(result)) {\n listItems = result;\n } else if (\n result &&\n typeof result === \"object\" &&\n Array.isArray((result as Record<string, unknown>).data)\n ) {\n listItems = (result as Record<string, unknown>).data as unknown[];\n }\n\n render(result, options, () => formatJson(result), listItems);\n });\n}\n","export const API_TIMEOUT_MS = 30_000;\nexport const DOWNLOAD_TIMEOUT_MS = 120_000;\nexport const UPLOAD_TIMEOUT_MS = 120_000;\nexport const OAUTH_CALLBACK_TIMEOUT_MS = 300_000;\nexport const SIMULATION_POLL_TIMEOUT_MS = 600_000;\n","import { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\") as { version: string };\n\nexport const VERSION = pkg.version;\n","import { TimeoutError } from \"../types.js\";\nimport { VERSION } from \"../version.js\";\n\nexport const USER_AGENT = `IntercomCLI/${VERSION}`;\n\nlet _cliCommand = \"\";\n\nexport function setCliCommand(name: string): void {\n _cliCommand = name;\n}\n\nexport async function fetchWithTimeout(\n url: string,\n init: RequestInit,\n options: { timeoutMs: number; verbose?: boolean },\n): Promise<Response> {\n // Inject User-Agent into all requests so Intercom can identify CLI-created workspaces\n const headers = new Headers(init.headers);\n if (!headers.has(\"User-Agent\")) {\n headers.set(\"User-Agent\", USER_AGENT);\n }\n if (_cliCommand) {\n headers.set(\"X-CLI-Command\", _cliCommand);\n }\n\n if (options.verbose) {\n console.error(`> ${init.method ?? \"GET\"} ${url}`);\n }\n let response: Response;\n try {\n response = await fetch(url, { ...init, headers, signal: AbortSignal.timeout(options.timeoutMs) });\n } catch (err: unknown) {\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n throw new TimeoutError(`Request timed out after ${options.timeoutMs / 1000}s: ${init.method ?? \"GET\"} ${url}`);\n }\n throw err;\n }\n if (options.verbose) {\n console.error(`< ${response.status} ${response.statusText}`);\n }\n return response;\n}\n","import {\n AuthError,\n RateLimitError,\n NotFoundError,\n PermissionError,\n CLIError,\n} from \"../types.js\";\nimport type { AuthType } from \"../types.js\";\nimport { API_TIMEOUT_MS } from \"./timeouts.js\";\nimport { fetchWithTimeout } from \"./fetch.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.intercom.io\";\n\nexport interface ClientOptions {\n token: string;\n authType: AuthType;\n appId?: string;\n baseUrl?: string;\n maxRetries?: number;\n verbose?: boolean;\n timeoutMs?: number;\n}\n\nexport class IntercomClient {\n private token: string;\n private authType: AuthType;\n private appId: string;\n private baseUrl: string;\n private maxRetries: number;\n private verbose: boolean;\n private timeoutMs: number;\n\n constructor(options: ClientOptions) {\n this.token = options.token;\n this.authType = options.authType;\n this.appId = options.appId ?? \"\";\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.maxRetries = options.maxRetries ?? 3;\n this.verbose = options.verbose ?? false;\n this.timeoutMs = options.timeoutMs ?? API_TIMEOUT_MS;\n }\n\n private authHeader(): string {\n if (this.authType === \"api_key\") {\n return `Basic ${Buffer.from(`${this.appId}:${this.token}`).toString(\"base64\")}`;\n }\n return `Bearer ${this.token}`;\n }\n\n private async request(\n method: string,\n path: string,\n body?: unknown,\n responseType: \"json\" | \"text\" | \"buffer\" = \"json\",\n extraHeaders?: Record<string, string>,\n ): Promise<unknown> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Authorization: this.authHeader(),\n };\n\n const isFormData = body instanceof FormData;\n\n if (responseType === \"json\") {\n headers.Accept = \"application/json\";\n }\n\n if (!isFormData) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n if (extraHeaders) {\n Object.assign(headers, extraHeaders);\n }\n\n const maxAttempts = this.maxRetries + 1;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const options: RequestInit = { method, headers };\n if (body && method !== \"GET\") {\n if (isFormData) {\n options.body = body as BodyInit;\n } else {\n options.body = JSON.stringify(body);\n }\n }\n\n if (this.verbose) {\n console.error(`> ${method} ${url}`);\n if (body) {\n console.error(\n `> Body: ${body instanceof FormData ? \"[FormData]\" : JSON.stringify(body)}`,\n );\n }\n }\n\n const response = await fetchWithTimeout(url, options, {\n timeoutMs: this.timeoutMs,\n });\n\n if (this.verbose) {\n console.error(`< ${response.status} ${response.statusText}`);\n }\n\n if (response.ok) {\n if (response.status === 204) return {};\n switch (responseType) {\n case \"text\":\n return response.text();\n case \"buffer\":\n return Buffer.from(await response.arrayBuffer());\n default:\n return response.json();\n }\n }\n\n const errorBody = (await response.json().catch(() => ({}))) as {\n errors?: { message?: string; code?: string }[];\n };\n const errorMsg =\n errorBody?.errors?.[0]?.message ?? `HTTP ${response.status}`;\n\n if (response.status === 401) {\n throw new AuthError(\n `Authentication expired or invalid: ${errorMsg}. Run \"intercom auth login\" to re-authenticate.`,\n );\n }\n\n if (response.status === 403) {\n throw new PermissionError(`Permission denied: ${errorMsg}`);\n }\n\n if (response.status === 404) {\n throw new NotFoundError(errorMsg);\n }\n\n if (response.status === 429) {\n const retryAfter = parseInt(\n response.headers.get(\"Retry-After\") ?? \"5\",\n 10,\n );\n if (attempt < this.maxRetries) {\n if (this.verbose) {\n console.error(\n `Rate limited. Retrying in ${retryAfter}s (attempt ${attempt + 1}/${this.maxRetries})...`,\n );\n }\n await new Promise((r) => setTimeout(r, retryAfter * 1000));\n continue;\n }\n throw new RateLimitError(\n `Rate limit exceeded. Retry after ${retryAfter} seconds.`,\n retryAfter,\n );\n }\n\n // Retry on 5xx server errors (502, 503, 504) with exponential backoff\n const RETRYABLE_5XX = [502, 503, 504];\n if (RETRYABLE_5XX.includes(response.status)) {\n if (attempt < this.maxRetries) {\n const backoffMs = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s\n if (this.verbose) {\n console.error(\n `Server error ${response.status}. Retrying in ${backoffMs / 1000}s (attempt ${attempt + 1}/${this.maxRetries})...`,\n );\n }\n await new Promise((r) => setTimeout(r, backoffMs));\n continue;\n }\n throw new CLIError(\n `Server error ${response.status} after ${this.maxRetries} retries: ${errorMsg}`,\n );\n }\n\n throw new CLIError(errorMsg);\n }\n\n throw new CLIError(\"Request failed after retries\");\n }\n\n async get(\n path: string,\n params?: Record<string, string>,\n headers?: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n let url = path;\n if (params && Object.keys(params).length > 0) {\n const qs = new URLSearchParams(params).toString();\n url = `${path}?${qs}`;\n }\n return this.request(\"GET\", url, undefined, \"json\", headers) as Promise<\n Record<string, unknown>\n >;\n }\n\n async post(\n path: string,\n body?: unknown,\n headers?: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n return this.request(\"POST\", path, body, \"json\", headers) as Promise<\n Record<string, unknown>\n >;\n }\n\n async put(\n path: string,\n body?: unknown,\n headers?: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n return this.request(\"PUT\", path, body, \"json\", headers) as Promise<\n Record<string, unknown>\n >;\n }\n\n async patch(\n path: string,\n body?: unknown,\n headers?: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n return this.request(\"PATCH\", path, body, \"json\", headers) as Promise<\n Record<string, unknown>\n >;\n }\n\n async delete(\n path: string,\n headers?: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n return this.request(\"DELETE\", path, undefined, \"json\", headers) as Promise<\n Record<string, unknown>\n >;\n }\n\n async getText(\n path: string,\n params?: Record<string, string>,\n ): Promise<string> {\n let url = path;\n if (params && Object.keys(params).length > 0) {\n const qs = new URLSearchParams(params).toString();\n url = `${path}?${qs}`;\n }\n return this.request(\"GET\", url, undefined, \"text\") as Promise<string>;\n }\n\n async getBuffer(\n path: string,\n params?: Record<string, string>,\n ): Promise<Buffer> {\n let url = path;\n if (params && Object.keys(params).length > 0) {\n const qs = new URLSearchParams(params).toString();\n url = `${path}?${qs}`;\n }\n return this.request(\"GET\", url, undefined, \"buffer\") as Promise<Buffer>;\n }\n\n async postFormData(\n path: string,\n formData: FormData,\n ): Promise<Record<string, unknown>> {\n return this.request(\"POST\", path, formData) as Promise<\n Record<string, unknown>\n >;\n }\n\n async paginate(\n path: string,\n params?: Record<string, string>,\n dataKey: string = \"data\",\n ): Promise<Record<string, unknown>[]> {\n const allData: Record<string, unknown>[] = [];\n\n // First request — used to detect pagination style\n const firstResponse = await this.get(path, { ...params });\n const firstData = firstResponse[dataKey] as\n | Record<string, unknown>[]\n | undefined;\n if (firstData) allData.push(...firstData);\n\n const pages = firstResponse.pages as\n | {\n next?: { starting_after?: string } | null;\n total_pages?: number;\n }\n | undefined;\n\n // Cursor-based pagination (contacts, conversations)\n const startingAfter =\n pages?.next && typeof pages.next === \"object\"\n ? pages.next.starting_after\n : undefined;\n\n if (startingAfter) {\n let cursor: string | undefined = startingAfter;\n while (cursor) {\n const response = await this.get(path, {\n ...params,\n starting_after: cursor,\n });\n const data = response[dataKey] as Record<string, unknown>[] | undefined;\n if (data) allData.push(...data);\n const p = response.pages as\n | { next?: { starting_after?: string } | null }\n | undefined;\n cursor =\n p?.next && typeof p.next === \"object\"\n ? p.next.starting_after\n : undefined;\n }\n return allData;\n }\n\n // Page-based pagination (articles, help-center collections)\n const totalPages = pages?.total_pages ?? 1;\n for (let page = 2; page <= totalPages; page++) {\n const response = await this.get(path, { ...params, page: String(page) });\n const data = response[dataKey] as Record<string, unknown>[] | undefined;\n if (data) allData.push(...data);\n }\n\n return allData;\n }\n}\n","import { readFileSync, mkdirSync } from \"node:fs\";\nimport { atomicWriteFileSync } from \"../utils/fs.js\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { randomBytes, createCipheriv, createDecipheriv } from \"node:crypto\";\nimport { detectAuthType } from \"../types.js\";\nimport type { StoredCredential } from \"../types.js\";\n\nconst SERVICE_NAME = \"intercom-cli\";\n\nexport interface KeychainBackend {\n get(service: string, account: string): Promise<string | undefined>;\n set(service: string, account: string, value: string): Promise<void>;\n delete(service: string, account: string): Promise<void>;\n}\n\n// --- In-memory backend (for tests) ---\n\nexport class InMemoryBackend implements KeychainBackend {\n private store = new Map<string, string>();\n private key(service: string, account: string) {\n return `${service}:${account}`;\n }\n async get(service: string, account: string) {\n return this.store.get(this.key(service, account));\n }\n async set(service: string, account: string, value: string) {\n this.store.set(this.key(service, account), value);\n }\n async delete(service: string, account: string) {\n this.store.delete(this.key(service, account));\n }\n}\n\n// --- Native keyring backend (@napi-rs/keyring) ---\n\nexport class NativeKeychainBackend implements KeychainBackend {\n async get(service: string, account: string): Promise<string | undefined> {\n const { Entry } = await import(\"@napi-rs/keyring\");\n const entry = new Entry(service, account);\n return entry.getPassword() ?? undefined;\n }\n\n async set(service: string, account: string, value: string): Promise<void> {\n const { Entry } = await import(\"@napi-rs/keyring\");\n const entry = new Entry(service, account);\n entry.setPassword(value);\n }\n\n async delete(service: string, account: string): Promise<void> {\n const { Entry } = await import(\"@napi-rs/keyring\");\n const entry = new Entry(service, account);\n try {\n entry.deletePassword();\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n if (/not found|no matching/i.test(msg)) return;\n throw err;\n }\n }\n}\n\n// --- Encrypted file backend (fallback, zero native deps) ---\n\nconst CREDENTIALS_FILE = \"credentials\";\nconst KEY_FILE = \".key\";\nconst ALGORITHM = \"aes-256-gcm\";\n\nexport class EncryptedFileBackend implements KeychainBackend {\n private dir: string;\n\n constructor(dir?: string) {\n this.dir = dir ?? join(homedir(), \".intercom\");\n }\n\n private getEncryptionKey(): Buffer {\n const keyPath = join(this.dir, KEY_FILE);\n try {\n return Buffer.from(readFileSync(keyPath, \"utf-8\").trim(), \"hex\");\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n // Key file doesn't exist — generate new key\n mkdirSync(this.dir, { recursive: true });\n const key = randomBytes(32);\n atomicWriteFileSync(keyPath, key.toString(\"hex\") + \"\\n\");\n return key;\n }\n }\n\n private readStore(): Record<string, string> {\n const filePath = join(this.dir, CREDENTIALS_FILE);\n let raw: string;\n try {\n raw = readFileSync(filePath, \"utf-8\");\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return {};\n }\n const { iv, tag, data } = JSON.parse(raw) as {\n iv: string;\n tag: string;\n data: string;\n };\n const key = this.getEncryptionKey();\n const decipher = createDecipheriv(ALGORITHM, key, Buffer.from(iv, \"hex\"));\n decipher.setAuthTag(Buffer.from(tag, \"hex\"));\n let decrypted = decipher.update(data, \"hex\", \"utf-8\");\n decrypted += decipher.final(\"utf-8\");\n return JSON.parse(decrypted) as Record<string, string>;\n }\n\n private writeStore(store: Record<string, string>): void {\n mkdirSync(this.dir, { recursive: true });\n const key = this.getEncryptionKey();\n const iv = randomBytes(16);\n const cipher = createCipheriv(ALGORITHM, key, iv);\n let encrypted = cipher.update(JSON.stringify(store), \"utf-8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n const tag = cipher.getAuthTag();\n const filePath = join(this.dir, CREDENTIALS_FILE);\n atomicWriteFileSync(\n filePath,\n JSON.stringify({ iv: iv.toString(\"hex\"), tag: tag.toString(\"hex\"), data: encrypted }) + \"\\n\",\n );\n }\n\n private storeKey(service: string, account: string): string {\n return `${service}:${account}`;\n }\n\n async get(service: string, account: string): Promise<string | undefined> {\n const store = this.readStore();\n return store[this.storeKey(service, account)];\n }\n\n async set(service: string, account: string, value: string): Promise<void> {\n const store = this.readStore();\n store[this.storeKey(service, account)] = value;\n this.writeStore(store);\n }\n\n async delete(service: string, account: string): Promise<void> {\n const store = this.readStore();\n delete store[this.storeKey(service, account)];\n this.writeStore(store);\n }\n}\n\n// --- Fallback wrapper (native keyring → encrypted file) ---\n\nexport class FallbackBackend implements KeychainBackend {\n private active: KeychainBackend;\n private fallen = false;\n\n constructor(\n private primary: KeychainBackend,\n private secondary: KeychainBackend,\n ) {\n this.active = primary;\n }\n\n private fallback(err: unknown): void {\n if (this.fallen) throw err;\n this.fallen = true;\n this.active = this.secondary;\n console.error(\n `Warning: System keyring unavailable (${err instanceof Error ? err.message : String(err)}). Falling back to encrypted file storage.`,\n );\n }\n\n async get(service: string, account: string): Promise<string | undefined> {\n try {\n return await this.active.get(service, account);\n } catch (err) {\n this.fallback(err);\n return this.active.get(service, account);\n }\n }\n\n async set(service: string, account: string, value: string): Promise<void> {\n try {\n return await this.active.set(service, account, value);\n } catch (err) {\n this.fallback(err);\n return this.active.set(service, account, value);\n }\n }\n\n async delete(service: string, account: string): Promise<void> {\n try {\n return await this.active.delete(service, account);\n } catch (err) {\n this.fallback(err);\n return this.active.delete(service, account);\n }\n }\n}\n\n// --- Backend selection ---\n\n/**\n * Select the best available backend:\n * 1. If configDir is set (tests, user override), use EncryptedFileBackend in that dir.\n * 2. Otherwise, try NativeKeychainBackend first and fall back to EncryptedFileBackend\n * with a stderr warning if the native keyring is unavailable.\n */\nexport function createDefaultBackend(configDir?: string): KeychainBackend {\n if (configDir) {\n return new EncryptedFileBackend(configDir);\n }\n return new FallbackBackend(\n new NativeKeychainBackend(),\n new EncryptedFileBackend(),\n );\n}\n\n// --- Credential store (consumer-facing API) ---\n\nexport class CredentialStore {\n constructor(private backend: KeychainBackend) {}\n\n async get(appId: string): Promise<StoredCredential | undefined> {\n const raw = await this.backend.get(SERVICE_NAME, appId);\n if (!raw) return undefined;\n return JSON.parse(raw) as StoredCredential;\n }\n\n async set(appId: string, credential: StoredCredential): Promise<void> {\n await this.backend.set(SERVICE_NAME, appId, JSON.stringify(credential));\n }\n\n async delete(appId: string): Promise<void> {\n await this.backend.delete(SERVICE_NAME, appId);\n }\n\n resolveFromEnv(envToken: string): StoredCredential {\n return {\n token: envToken,\n auth_type: detectAuthType(envToken),\n app_id: \"env\",\n };\n }\n}\n","import { writeFile, rename } from \"node:fs/promises\";\nimport { writeFileSync, renameSync } from \"node:fs\";\n\n/**\n * Atomically write a file: writes to a temp file in the same directory,\n * sets permissions, then renames over the target path.\n */\nexport async function atomicWriteFile(filePath: string, data: string, mode: number = 0o600): Promise<void> {\n const tmpPath = filePath + \".tmp\";\n await writeFile(tmpPath, data, { mode });\n await rename(tmpPath, filePath);\n}\n\n/**\n * Synchronous atomic write: same write-then-rename pattern.\n */\nexport function atomicWriteFileSync(filePath: string, data: string, mode: number = 0o600): void {\n const tmpPath = filePath + \".tmp\";\n writeFileSync(tmpPath, data, { mode });\n renameSync(tmpPath, filePath);\n}\n","import { readFile, mkdir } from \"node:fs/promises\";\nimport { atomicWriteFile } from \"../utils/fs.js\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Config, WorkspaceConfig } from \"../types.js\";\n\nconst CONFIG_FILE = \"config.json\";\n\nexport function defaultConfigDir(): string {\n return join(homedir(), \".intercom\");\n}\n\nexport async function readConfig(configDir?: string): Promise<Config> {\n const dir = configDir ?? defaultConfigDir();\n try {\n const raw = await readFile(join(dir, CONFIG_FILE), \"utf-8\");\n return JSON.parse(raw) as Config;\n } catch {\n return { workspaces: {} };\n }\n}\n\nexport async function writeConfig(config: Config, configDir?: string): Promise<void> {\n const dir = configDir ?? defaultConfigDir();\n await mkdir(dir, { recursive: true });\n await atomicWriteFile(join(dir, CONFIG_FILE), JSON.stringify(config, null, 2) + \"\\n\");\n}\n\nexport async function addWorkspace(\n configDir: string | undefined,\n workspace: WorkspaceConfig,\n): Promise<void> {\n const config = await readConfig(configDir);\n config.workspaces[workspace.app_id] = workspace;\n if (!config.default) {\n config.default = workspace.app_id;\n }\n await writeConfig(config, configDir);\n}\n\nexport async function removeWorkspace(\n configDir: string | undefined,\n appId: string,\n): Promise<void> {\n const config = await readConfig(configDir);\n delete config.workspaces[appId];\n if (config.default === appId) {\n const remaining = Object.keys(config.workspaces);\n config.default = remaining.length > 0 ? remaining[0] : undefined;\n }\n await writeConfig(config, configDir);\n}\n\nexport async function getDefaultWorkspace(\n configDir?: string,\n): Promise<WorkspaceConfig | undefined> {\n const config = await readConfig(configDir);\n if (!config.default) return undefined;\n return config.workspaces[config.default];\n}\n","import { IntercomClient } from \"../api/client.js\";\nimport { CredentialStore, createDefaultBackend } from \"../auth/store.js\";\nimport { readConfig } from \"../auth/config.js\";\nimport { AuthError, CLIError, detectAuthType } from \"../types.js\";\n\nexport { detectAuthType };\n\ninterface GlobalOptions {\n workspace?: string;\n verbose?: boolean;\n retry?: boolean;\n timeout?: string;\n}\n\nexport async function resolveClient(\n options: GlobalOptions = {},\n): Promise<IntercomClient> {\n const envToken = process.env.INTERCOM_TOKEN;\n if (envToken) {\n return new IntercomClient({\n token: envToken,\n authType: detectAuthType(envToken),\n appId: process.env.INTERCOM_APP_ID ?? \"\",\n baseUrl: process.env.INTERCOM_API_BASE_URL || undefined,\n verbose: options.verbose,\n maxRetries: options.retry === false ? 0 : undefined,\n timeoutMs: options.timeout\n ? parseInt(options.timeout, 10) * 1000\n : undefined,\n });\n }\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n const appId = options.workspace ?? config.default;\n if (!appId) {\n throw new AuthError(\n 'Not authenticated. Run \"intercom auth login\" to get started.',\n );\n }\n\n if (!options.workspace && config.default && !config.workspaces[appId]) {\n throw new AuthError(\n `Default workspace \"${appId}\" is not in configured workspaces. Run \"intercom auth bootstrap\" or \"intercom auth login --token <token>\" to re-authenticate.`,\n );\n }\n\n const store = new CredentialStore(createDefaultBackend(configDir));\n const cred = await store.get(appId);\n if (!cred) {\n throw new AuthError(\n `No credentials found for workspace \"${appId}\". Run \"intercom auth bootstrap\" or \"intercom auth login --token <token>\" to authenticate.`,\n );\n }\n\n return new IntercomClient({\n token: cred.token,\n authType: cred.auth_type,\n appId: cred.app_id,\n baseUrl: process.env.INTERCOM_API_BASE_URL || undefined,\n verbose: options.verbose,\n maxRetries: options.retry === false ? 0 : undefined,\n timeoutMs: options.timeout\n ? parseInt(options.timeout, 10) * 1000\n : undefined,\n });\n}\n\nexport function parseFieldArgs(fields: string[]): Record<string, string> {\n return Object.fromEntries(\n fields.map((f) => {\n const eq = f.indexOf(\"=\");\n if (eq === -1) {\n throw new CLIError(\n `Invalid field argument \"${f}\": expected format key=value`,\n );\n }\n return [f.slice(0, eq), f.slice(eq + 1)];\n }),\n );\n}\n\nexport function formatTimestamp(ts: unknown): string {\n if (!ts) return \"\";\n const n = typeof ts === \"number\" ? ts : Number(ts);\n if (isNaN(n)) return String(ts);\n return new Date(n * 1000).toISOString().slice(0, 10);\n}\n","/**\n * Centralized output rendering.\n *\n * Decides format based on:\n * 1. --jq flag → apply filter, output compact NDJSON\n * 2. --json flag → full pretty-printed JSON (for human inspection)\n * 3. No TTY (piped/agent) → compact NDJSON (one JSON object per line)\n * 4. TTY (human) → human-readable (caller provides the formatter)\n *\n * JSON is the canonical format. Human output is a lossy rendering.\n * NDJSON is used for all non-TTY output because agents can process\n * line-by-line without buffering.\n */\n\nimport { formatJson, applyJq } from \"./json.js\";\n\ninterface RenderOptions {\n json?: boolean;\n jq?: string;\n agent?: boolean;\n human?: boolean;\n}\n\n/**\n * Render output with automatic format detection.\n *\n * @param data - The canonical data (what --json would return)\n * @param opts - Command options (includes json, jq flags)\n * @param humanRenderer - Function that renders human-readable output (only called for TTY)\n * @param listItems - Optional: if this is a list response, the array of items for NDJSON.\n * Each item is emitted as one compact JSON line when piped.\n */\nexport function render(\n data: unknown,\n opts: RenderOptions,\n humanRenderer: () => string,\n listItems?: unknown[],\n): void {\n // --jq always wins — explicit structured query\n if (opts.jq) {\n const filtered = applyJq(data, opts.jq);\n if (Array.isArray(filtered)) {\n for (const item of filtered) {\n console.log(JSON.stringify(item));\n }\n } else {\n console.log(JSON.stringify(filtered));\n }\n return;\n }\n\n // --json explicitly passed — pretty-printed for human inspection\n if (opts.json) {\n console.log(formatJson(data));\n return;\n }\n\n // --agent forces machine-readable NDJSON (same as non-TTY)\n if (opts.agent) {\n if (listItems) {\n for (const item of listItems) {\n console.log(JSON.stringify(item));\n }\n } else {\n console.log(JSON.stringify(data));\n }\n return;\n }\n\n // --human forces human-readable output even when piped\n if (opts.human) {\n console.log(humanRenderer());\n return;\n }\n\n // No TTY (piped to agent/script) — compact NDJSON\n if (!process.stdout.isTTY) {\n if (listItems) {\n for (const item of listItems) {\n console.log(JSON.stringify(item));\n }\n } else {\n console.log(JSON.stringify(data));\n }\n return;\n }\n\n // TTY — human-readable\n console.log(humanRenderer());\n}\n","import { readFileSync } from \"node:fs\";\nimport { CLIError } from \"../types.js\";\n\nexport function parseTypedFields(\n fields: string[],\n typed: boolean,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const field of fields) {\n const eqIndex = field.indexOf(\"=\");\n if (eqIndex === -1) {\n throw new CLIError(\n `Invalid field argument \"${field}\": expected format key=value`,\n );\n }\n const key = field.slice(0, eqIndex);\n const rawValue = field.slice(eqIndex + 1);\n\n if (typed) {\n if (rawValue === \"true\") result[key] = true;\n else if (rawValue === \"false\") result[key] = false;\n else if (rawValue === \"null\") result[key] = null;\n else if (rawValue.startsWith(\"@\")) {\n const filePath = rawValue.slice(1);\n result[key] = readFileSync(filePath, \"utf-8\");\n } else if (/^\\d+$/.test(rawValue)) result[key] = parseInt(rawValue, 10);\n else result[key] = rawValue;\n } else {\n result[key] = rawValue;\n }\n }\n return result;\n}\n","import { Command } from \"commander\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { addWorkspace } from \"../../auth/config.js\";\nimport { IntercomClient } from \"../../api/client.js\";\nimport { detectAuthType } from \"../helpers.js\";\nimport { CLIError } from \"../../types.js\";\n\nexport function registerLoginCommand(auth: Command): void {\n auth\n .command(\"login\")\n .description(\"Authenticate with Intercom\")\n .option(\"--token <token>\", \"Authenticate with an API key or token directly\")\n .option(\"--device\", \"Use device flow (for headless environments)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom auth login --token <your-api-token>\n\nEnvironment: Set INTERCOM_TOKEN to skip login entirely.`,\n )\n .action(async (options) => {\n if (options.token) {\n await loginWithToken(options.token);\n } else if (options.device) {\n throw new CLIError(\"Device flow not yet available. Server-side endpoints required. Use --token for now, or run the browser flow without --device.\", 1);\n } else {\n throw new CLIError(\n \"OAuth login is not yet available. Use --token <token> or set the INTERCOM_TOKEN environment variable.\",\n 1,\n );\n }\n });\n}\n\nasync function loginWithToken(token: string): Promise<void> {\n const authType = detectAuthType(token);\n const client = new IntercomClient({\n token,\n authType,\n baseUrl: process.env.INTERCOM_API_BASE_URL || undefined,\n });\n\n const me = await client.get(\"/me\");\n const app = me.app as Record<string, unknown> | undefined;\n const appId = (app?.id_code as string) ?? (me.id as string);\n const name = (app?.name as string) ?? \"Unknown\";\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const store = new CredentialStore(createDefaultBackend(configDir));\n await store.set(appId, { token, auth_type: authType, app_id: appId });\n await addWorkspace(configDir, { app_id: appId, name });\n\n console.log(`Authenticated to ${name} (${appId})`);\n}\n","/**\n * Shared cookie utilities for auth flows that interact with Ember/Devise.\n */\n\n// Extract cookies from a response's set-cookie headers\nexport function extractCookies(response: Response): string {\n const setCookies: string[] =\n typeof (response.headers as unknown as { getSetCookie?: () => string[] })\n .getSetCookie === \"function\"\n ? (\n response.headers as unknown as { getSetCookie: () => string[] }\n ).getSetCookie()\n : (response.headers.get(\"set-cookie\") ?? \"\")\n .split(/,(?=[^ ])/)\n .filter(Boolean);\n\n return setCookies.map((c) => c.split(\";\")[0]).join(\"; \");\n}\n\n// Merge new cookies on top of existing ones (new values win)\nexport function mergeCookies(existing: string, newCookies: string): string {\n const map = new Map<string, string>();\n for (const cookie of [...existing.split(\"; \"), ...newCookies.split(\"; \")]) {\n const eqIdx = cookie.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const name = cookie.slice(0, eqIdx).trim();\n const value = cookie.slice(eqIdx + 1);\n if (name) map.set(name, value);\n }\n return Array.from(map.entries())\n .map(([k, v]) => `${k}=${v}`)\n .join(\"; \");\n}\n","import { fetchWithTimeout } from \"../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../api/timeouts.js\";\nimport { extractCookies } from \"./cookies.js\";\n\nconst DEFAULT_APP_BASE_URL = \"https://app.intercom.com\";\n\nexport function getAppBaseUrl(): string {\n return process.env.INTERCOM_APP_BASE_URL ?? DEFAULT_APP_BASE_URL;\n}\n\nconst PLAN_SOLUTION_IDS: Record<string, number> = {\n essential: 28,\n advanced: 29,\n expert: 30,\n};\n\nconst CSRF_TOKEN_PATTERN = /<meta\\s+name=\"csrf-token\"\\s+content=\"([^\"]+)\"/;\n\nexport async function fetchCsrfToken(\n url: string,\n timeoutMs: number = API_TIMEOUT_MS,\n init?: RequestInit,\n): Promise<{ token: string; cookies: string }> {\n const response = await fetchWithTimeout(url, init ?? {}, { timeoutMs });\n if (!response.ok)\n throw new Error(`Failed to fetch ${url}: ${response.status}`);\n const html = await response.text();\n const match = CSRF_TOKEN_PATTERN.exec(html);\n if (!match) throw new Error(\"Could not find CSRF token\");\n return { token: match[1], cookies: extractCookies(response) };\n}\n\nexport interface SignupOptions {\n baseUrl: string;\n email: string;\n name: string;\n password: string;\n companyName: string;\n plan?: string; // \"essential\" | \"advanced\" | \"expert\"\n timeoutMs?: number;\n}\n\nexport interface SignupResult {\n id: string;\n name: string;\n}\n\nexport async function signup(options: SignupOptions): Promise<SignupResult> {\n const {\n baseUrl,\n email,\n name,\n password,\n companyName,\n plan = \"advanced\",\n timeoutMs = API_TIMEOUT_MS,\n } = options;\n\n const csrfUrl = `${baseUrl}/admins/sign_up/email`;\n const { token: csrfToken, cookies } = await fetchCsrfToken(\n csrfUrl,\n timeoutMs,\n );\n\n const solutionId = PLAN_SOLUTION_IDS[plan] ?? PLAN_SOLUTION_IDS[\"advanced\"];\n\n const body = {\n admin: {\n name,\n email,\n password,\n terms_of_service: true,\n },\n app: {\n name: companyName,\n solution_id: solutionId,\n },\n pageview: {},\n email_submission: {},\n sign_up_locale: \"en\",\n new_app_feature_flags: [\n \"fin-sdk\",\n \"messenger-public-api\",\n ],\n };\n\n const response = await fetchWithTimeout(\n `${baseUrl}/ember/signups`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-CSRF-Token\": csrfToken,\n Accept: \"application/json\",\n ...(cookies ? { Cookie: cookies } : {}),\n },\n body: JSON.stringify(body),\n },\n { timeoutMs },\n );\n\n if (response.status === 409) {\n throw new Error(\"An account with that email address already exists.\");\n }\n\n if (response.status === 422) {\n const data = (await response.json()) as { errors?: string[] };\n const msg = data.errors?.join(\", \") ?? \"Validation error\";\n throw new Error(`Signup validation failed: ${msg}`);\n }\n\n if (response.status === 403) {\n throw new Error(\n \"Signup blocked (403 Forbidden). The request may have been blocked by WAF.\",\n );\n }\n\n if (!response.ok) {\n throw new Error(`Signup failed with status ${response.status}`);\n }\n\n const workspace = (await response.json()) as { id: string; name: string };\n return { id: workspace.id, name: workspace.name };\n}\n","import { fetchCsrfToken } from \"./signup.js\";\nimport { fetchWithTimeout } from \"../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../api/timeouts.js\";\nimport { extractCookies, mergeCookies } from \"./cookies.js\";\n\nexport interface DevHubOptions {\n baseUrl: string;\n email: string;\n password: string;\n appId: string;\n appPackageId?: string; // skip discovery if provided\n timeoutMs?: number;\n}\n\n/**\n * Sign in via Devise, returns the session cookie string to use in subsequent requests.\n */\nexport async function deviseSignIn(\n baseUrl: string,\n email: string,\n password: string,\n timeoutMs: number = API_TIMEOUT_MS,\n): Promise<string> {\n // Step 1: Fetch CSRF token from sign-in page\n const signInUrl = `${baseUrl}/admins/sign_in`;\n const { token: csrfToken, cookies: initialCookies } = await fetchCsrfToken(\n signInUrl,\n timeoutMs,\n { redirect: \"manual\" },\n );\n\n let cookies = initialCookies;\n\n // Step 2: POST credentials\n const body = new URLSearchParams({\n \"admin[email]\": email,\n \"admin[password]\": password,\n \"admin[remember_me]\": \"1\",\n authenticity_token: csrfToken,\n });\n\n const signInResponse = await fetchWithTimeout(\n signInUrl,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"text/html\",\n ...(cookies ? { Cookie: cookies } : {}),\n },\n body: body.toString(),\n redirect: \"manual\",\n },\n { timeoutMs },\n );\n\n // Successful sign-in is a 302 redirect NOT back to /admins/sign_in\n if (signInResponse.status !== 302 && signInResponse.status !== 301) {\n throw new Error(\n `Sign-in returned unexpected status ${signInResponse.status}`,\n );\n }\n\n const location = signInResponse.headers.get(\"location\") ?? \"\";\n\n if (location.includes(\"/admins/sign_in\")) {\n throw new Error(\"Invalid credentials\");\n }\n\n if (location.includes(\"two_factor\")) {\n throw new Error(\n \"Two-factor authentication is required. Please use an API key instead.\",\n );\n }\n\n // Merge the session cookies from the POST response\n cookies = mergeCookies(cookies, extractCookies(signInResponse));\n return cookies;\n}\n\n/**\n * Find an existing Developer Hub app package or create one.\n * Returns the app package ID and whether it was newly created.\n */\nexport async function findOrCreateAppPackage(\n baseUrl: string,\n cookies: string,\n appId: string,\n appPackageId?: string,\n timeoutMs: number = API_TIMEOUT_MS,\n): Promise<{ id: string; name: string; created: boolean }> {\n if (appPackageId) {\n return { id: appPackageId, name: \"CLI Access Token\", created: false };\n }\n\n // List existing app packages\n const listUrl = `${baseUrl}/ember/developer_home/app_packages?app_id=${appId}`;\n const listResponse = await fetchWithTimeout(\n listUrl,\n {\n headers: {\n Accept: \"application/json\",\n Cookie: cookies,\n },\n },\n { timeoutMs },\n );\n\n if (!listResponse.ok) {\n if (listResponse.status === 403) {\n throw new Error(\n `Developer Hub access denied (403). This usually means the admin email has not been verified.\\n` +\n ` Verify your email first: intercom auth verify-email --url <url-from-verification-email>\\n` +\n ` Then retry this command.`,\n );\n }\n throw new Error(`Failed to list app packages: ${listResponse.status}`);\n }\n\n const data = (await listResponse.json()) as {\n app_packages?: Array<{ id: string; name: string }>;\n };\n const packages =\n data.app_packages ??\n (Array.isArray(data) ? (data as Array<{ id: string; name: string }>) : []);\n\n if (packages.length > 0) {\n return {\n id: String(packages[0].id),\n name: packages[0].name ?? \"CLI Access Token\",\n created: false,\n };\n }\n\n // No packages — create one. First get a fresh CSRF token.\n // Use the sign-in page with existing cookies to get a CSRF token\n // that belongs to our authenticated session.\n let freshCsrf = \"\";\n try {\n const { token, cookies: csrfCookies } = await fetchCsrfToken(\n `${baseUrl}/admins/sign_in`,\n timeoutMs,\n { headers: { Cookie: cookies } },\n );\n freshCsrf = token;\n if (csrfCookies) cookies = mergeCookies(cookies, csrfCookies);\n } catch {\n // Continue without CSRF token — the create request may still work with session cookies\n }\n\n const createResponse = await fetchWithTimeout(\n `${baseUrl}/ember/developer_home/app_packages`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n Cookie: cookies,\n ...(freshCsrf ? { \"X-CSRF-Token\": freshCsrf } : {}),\n },\n body: JSON.stringify({\n name: \"CLI Access Token\",\n owner_app_id: appId,\n app_id: appId,\n }),\n },\n { timeoutMs },\n );\n\n if (!createResponse.ok) {\n if (createResponse.status === 403) {\n throw new Error(\n `Developer Hub access denied (403). This usually means the admin email has not been verified.\\n` +\n ` Verify your email first: intercom auth verify-email --url <url-from-verification-email>\\n` +\n ` Then retry this command.`,\n );\n }\n throw new Error(`Failed to create app package: ${createResponse.status}`);\n }\n\n const created = (await createResponse.json()) as {\n id: string;\n name: string;\n app_package?: { id: string; name: string };\n };\n // Some API shapes nest under app_package\n const pkg = (created.app_package ?? created) as { id: string; name: string };\n return {\n id: String(pkg.id),\n name: pkg.name ?? \"CLI Access Token\",\n created: true,\n };\n}\n\n/**\n * Fetch the OAuth access token from a Developer Hub app package install.\n */\nexport async function fetchAccessToken(\n baseUrl: string,\n cookies: string,\n appPackageId: string,\n appId: string,\n timeoutMs: number = API_TIMEOUT_MS,\n): Promise<string> {\n const url = `${baseUrl}/ember/developer_home/app_package_installs?app_package_id=${appPackageId}&only_owner_app=true&app_id=${appId}`;\n const response = await fetchWithTimeout(\n url,\n {\n headers: {\n Accept: \"application/json\",\n Cookie: cookies,\n },\n },\n { timeoutMs },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch app package installs: ${response.status}`);\n }\n\n const data = (await response.json()) as\n | {\n access_token?: string;\n app_package_installs?: Array<{ access_token?: string }>;\n }\n | Array<{ access_token?: string }>;\n\n // Handle various response shapes\n if (Array.isArray(data)) {\n const token = data[0]?.access_token;\n if (token) return token;\n } else if (data.access_token) {\n return data.access_token;\n } else if (data.app_package_installs?.[0]?.access_token) {\n return data.app_package_installs[0].access_token;\n }\n\n throw new Error(\"No access token found in app package installs response\");\n}\n\n/**\n * Full flow: sign in → find/create package → get token.\n */\nexport async function getToken(options: DevHubOptions): Promise<{\n token: string;\n appId: string;\n appPackage: { id: string; name: string; created: boolean };\n}> {\n const { baseUrl, email, password, appId, appPackageId, timeoutMs } = options;\n\n const cookies = await deviseSignIn(baseUrl, email, password, timeoutMs);\n const appPackage = await findOrCreateAppPackage(\n baseUrl,\n cookies,\n appId,\n appPackageId,\n timeoutMs,\n );\n const token = await fetchAccessToken(\n baseUrl,\n cookies,\n appPackage.id,\n appId,\n timeoutMs,\n );\n\n return { token, appId, appPackage };\n}\n","import { CLIError } from \"../types.js\";\n\nexport async function resolvePassword(options: { passwordStdin?: boolean }): Promise<string> {\n const envPassword = process.env.INTERCOM_PASSWORD;\n if (envPassword) return envPassword;\n\n if (options.passwordStdin) {\n return readStdin();\n }\n\n throw new CLIError(\n \"Password required. Set INTERCOM_PASSWORD env var or pass --password-stdin.\\n\" +\n ' Example: INTERCOM_PASSWORD=secret intercom auth bootstrap --email admin@co.com --app-id abc123\\n' +\n ' Example: echo \"$PASSWORD\" | intercom auth bootstrap --password-stdin --email admin@co.com --app-id abc123',\n );\n}\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n throw new CLIError(\n \"--password-stdin requires piped input. Stdin is a TTY.\\n\" +\n ' Example: echo \"$PASSWORD\" | intercom auth bootstrap --password-stdin ...',\n );\n }\n\n return new Promise<string>((resolve, reject) => {\n let data = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (chunk: string) => { data += chunk; });\n process.stdin.on(\"end\", () => resolve(data.trim()));\n process.stdin.on(\"error\", reject);\n });\n}\n","import { Command } from \"commander\";\nimport { getToken } from \"../../auth/devhub.js\";\nimport { resolvePassword } from \"../../auth/password.js\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { addWorkspace } from \"../../auth/config.js\";\nimport { getAppBaseUrl } from \"../../auth/signup.js\";\nimport { CLIError } from \"../../types.js\";\n\nexport function registerBootstrapCommand(auth: Command): void {\n auth\n .command(\"bootstrap\")\n .description(\"Acquire a Developer Hub access token for a workspace\")\n .requiredOption(\"--email <email>\", \"Admin email address\")\n .requiredOption(\"--app-id <appId>\", \"Workspace app ID (e.g. abc123de)\")\n .option(\"--app-package-id <id>\", \"Skip package discovery and use this app package ID\")\n .option(\"--password-stdin\", \"Read password from stdin (or set INTERCOM_PASSWORD env var)\")\n .action(async (options) => {\n const baseUrl = getAppBaseUrl();\n\n try {\n const password = await resolvePassword({ passwordStdin: options.passwordStdin as boolean | undefined });\n\n const { token, appId, appPackage } = await getToken({\n baseUrl,\n email: options.email as string,\n password,\n appId: options.appId as string,\n appPackageId: options.appPackageId as string | undefined,\n });\n\n console.log(\"Signed in to Intercom\");\n\n if (appPackage.created) {\n console.log(`Created app package: ${appPackage.name} (id: ${appPackage.id})`);\n } else {\n console.log(`Found app package: ${appPackage.name} (id: ${appPackage.id})`);\n }\n\n console.log(\"Access token acquired\");\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const store = new CredentialStore(createDefaultBackend(configDir));\n await store.set(appId, { token, auth_type: \"oauth\", app_id: appId });\n await addWorkspace(configDir, { app_id: appId, name: appId });\n\n console.log(`\\nAuthenticated to workspace ${appId}`);\n } catch (err: unknown) {\n if (err instanceof CLIError) throw err;\n const message = err instanceof Error ? err.message : String(err);\n throw new CLIError(message);\n }\n });\n}\n","import pc from \"picocolors\";\n\nfunction isColorEnabled(): boolean {\n return !!process.stdout.isTTY && !process.env.NO_COLOR;\n}\n\nfunction c(fn: (s: string) => string, s: string): string {\n return isColorEnabled() ? fn(s) : s;\n}\n\nconst STATUS_COLORS: Record<string, (s: string) => string> = {\n // green\n active: pc.green,\n open: pc.green,\n published: pc.green,\n enabled: pc.green,\n verified: pc.green,\n true: pc.green,\n // red\n error: pc.red,\n closed: pc.red,\n deleted: pc.red,\n disabled: pc.red,\n false: pc.red,\n // yellow\n pending: pc.yellow,\n draft: pc.yellow,\n snoozed: pc.yellow,\n};\n\nfunction colorizeStatus(value: string): string {\n if (!isColorEnabled()) return value;\n const fn = STATUS_COLORS[value.toLowerCase()];\n return fn ? fn(value) : value;\n}\n\nfunction truncate(value: string, max: number): string {\n if (value.length <= max) return value;\n return value.slice(0, max - 1) + \"\\u2026\";\n}\n\nconst DEFAULT_MAX_COLUMNS = 8;\nconst DEFAULT_TRUNCATION = 50;\nconst WIDE_TRUNCATION = 200;\n\nconst STATUS_KEYS = new Set([\n \"STATE\",\n \"STATUS\",\n \"OPEN\",\n \"ROLE\",\n \"ENABLED\",\n]);\n\nfunction isWide(): boolean {\n return process.argv.includes(\"--wide\");\n}\n\ninterface TableOptions {\n columns: string[];\n rows: Record<string, string>[];\n}\n\nexport function table({ columns, rows }: TableOptions): string {\n if (rows.length === 0) return \"\";\n\n const wide = isWide();\n const maxTrunc = wide ? WIDE_TRUNCATION : DEFAULT_TRUNCATION;\n const displayColumns = wide\n ? columns\n : columns.slice(0, DEFAULT_MAX_COLUMNS);\n\n const truncatedRows = rows.map((row) => {\n const out: Record<string, string> = {};\n for (const col of displayColumns) {\n out[col] = truncate(row[col] ?? \"\", maxTrunc);\n }\n return out;\n });\n\n const widths = displayColumns.map((col) =>\n Math.max(\n col.length,\n ...truncatedRows.map((row) => (row[col] ?? \"\").length),\n ),\n );\n\n const formatRow = (values: string[], isHeader: boolean) =>\n values\n .map((val, i) => {\n const col = displayColumns[i];\n const padded =\n i < values.length - 1 ? val.padEnd(widths[i]) : val;\n if (isHeader) return c(pc.bold, padded);\n if (STATUS_KEYS.has(col)) return colorizeStatus(padded);\n return padded;\n })\n .join(\" \");\n\n const header = formatRow(displayColumns, true);\n const body = truncatedRows.map((row) =>\n formatRow(\n displayColumns.map((col) => row[col] ?? \"\"),\n false,\n ),\n );\n\n return [header, ...body].join(\"\\n\");\n}\n\nexport function detail(\n data: Record<string, string | number | undefined | null>,\n): string {\n const entries = Object.entries(data).filter(\n ([, v]) => v !== null && v !== undefined,\n );\n if (entries.length === 0) return \"\";\n\n const maxKeyLen = Math.max(...entries.map(([k]) => k.length));\n\n return entries\n .map(([key, value]) => {\n const label = c(pc.bold, key.padEnd(maxKeyLen));\n const strVal = String(value);\n const isStatus = STATUS_KEYS.has(key.toUpperCase());\n const colored = isStatus ? colorizeStatus(strVal) : strVal;\n return `${label}: ${colored}`;\n })\n .join(\"\\n\");\n}\n","import { Command } from \"commander\";\nimport { readConfig } from \"../../auth/config.js\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { detail } from \"../../output/formatter.js\";\nimport { formatJson } from \"../../output/json.js\";\nimport { AuthError } from \"../../types.js\";\n\nexport function registerStatusCommand(auth: Command): void {\n auth\n .command(\"status\")\n .description(\"Show current authentication status\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n const appId = config.default;\n\n if (!appId) {\n throw new AuthError('Not authenticated. Run \"intercom auth login\" to get started.');\n }\n\n const store = new CredentialStore(createDefaultBackend(configDir));\n const cred = await store.get(appId);\n\n if (!cred) {\n throw new AuthError('Not authenticated. Run \"intercom auth login\" to get started.');\n }\n\n const workspace = config.workspaces[appId];\n\n if (options.json) {\n console.log(formatJson({\n app_id: cred.app_id,\n workspace_name: workspace?.name ?? cred.workspace_name,\n auth_type: cred.auth_type,\n expires_at: cred.expires_at ?? null,\n }));\n } else {\n console.log(detail({\n \"Workspace\": workspace?.name ?? cred.workspace_name ?? cred.app_id,\n \"App ID\": cred.app_id,\n \"Auth type\": cred.auth_type,\n \"Expires\": cred.expires_at ?? undefined,\n }));\n }\n });\n}\n","import { Command } from \"commander\";\nimport { readConfig, removeWorkspace } from \"../../auth/config.js\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { AuthError } from \"../../types.js\";\n\nexport function registerLogoutCommand(auth: Command): void {\n auth\n .command(\"logout\")\n .description(\"Remove stored credentials\")\n .option(\"--workspace <id>\", \"Workspace app_id to log out of\")\n .action(async (options) => {\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n const appId = options.workspace ?? config.default;\n\n if (!appId) {\n throw new AuthError(\"Not authenticated.\");\n }\n\n const store = new CredentialStore(createDefaultBackend(configDir));\n await store.delete(appId);\n await removeWorkspace(configDir, appId);\n\n const name = config.workspaces[appId]?.name ?? appId;\n console.log(`Logged out of ${name} (${appId})`);\n });\n}\n","import { Command } from \"commander\";\nimport { getToken } from \"../../auth/devhub.js\";\nimport { resolvePassword } from \"../../auth/password.js\";\nimport { signup, getAppBaseUrl } from \"../../auth/signup.js\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { addWorkspace } from \"../../auth/config.js\";\nimport { detail } from \"../../output/formatter.js\";\nimport { CLIError } from \"../../types.js\";\n\nexport function registerSignupCommand(auth: Command): void {\n auth\n .command(\"signup\")\n .description(\"Create a new Intercom workspace\")\n .requiredOption(\"--email <email>\", \"Admin email address\")\n .requiredOption(\"--name <name>\", \"Admin full name\")\n .requiredOption(\"--company <company>\", \"Workspace/company name\")\n .option(\"--password-stdin\", \"Read password from stdin (or set INTERCOM_PASSWORD env var)\")\n .option(\"--plan <plan>\", \"Trial plan: essential, advanced, or expert\", \"advanced\")\n .action(async (options) => {\n const validPlans = [\"essential\", \"advanced\", \"expert\"];\n if (!validPlans.includes(options.plan as string)) {\n throw new CLIError(`Unknown plan \"${options.plan as string}\". Valid options: ${validPlans.join(\", \")}`);\n }\n\n const baseUrl = getAppBaseUrl();\n\n try {\n const password = await resolvePassword({ passwordStdin: options.passwordStdin as boolean | undefined });\n\n const workspace = await signup({\n baseUrl,\n email: options.email as string,\n name: options.name as string,\n password,\n companyName: options.company as string,\n plan: options.plan as string,\n });\n\n console.log(\"Workspace created successfully!\");\n console.log(\n detail({\n Name: workspace.name,\n \"Workspace ID\": workspace.id,\n URL: `${baseUrl}/a/apps/${workspace.id}`,\n }),\n );\n\n // Auto-bootstrap: acquire OAuth token and persist credentials\n try {\n const { token, appId } = await getToken({\n baseUrl,\n email: options.email as string,\n password,\n appId: workspace.id,\n });\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const store = new CredentialStore(createDefaultBackend(configDir));\n await store.set(appId, { token, auth_type: \"oauth\", app_id: appId });\n await addWorkspace(configDir, { app_id: appId, name: workspace.name });\n\n console.log(`\\nAuthenticated to workspace ${appId}`);\n } catch {\n console.error(\n `\\nWarning: Workspace created but auto-login failed. Run \"intercom auth bootstrap --email ${options.email as string} --app-id ${workspace.id}\" to authenticate.`,\n );\n }\n } catch (err: unknown) {\n if (err instanceof CLIError) throw err;\n const message = err instanceof Error ? err.message : String(err);\n throw new CLIError(message);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchWithTimeout } from \"../../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../../api/timeouts.js\";\nimport { CLIError } from \"../../types.js\";\n\nexport function registerVerifyEmailCommand(auth: Command): void {\n auth\n .command(\"verify-email\")\n .description(\n \"Verify workspace email address. After signup, Intercom sends a verification email.\\n\" +\n \"Provide the verification URL from that email, or verify manually in your browser.\\n\\n\" +\n \"Option 1 — Manual verification (recommended for humans):\\n\" +\n \" 1. Open the inbox for the email address you signed up with\\n\" +\n \" 2. Find the email from Intercom (team@intercom.io) with subject\\n\" +\n ' \"Verify your email address on Intercom\" (check spam if not found)\\n' +\n ' 3. Click the \"Verify your email\" button in the email\\n' +\n \" 4. You should see a redirect to the Intercom getting-started page\\n\" +\n \" 5. Once verified, you can skip this command entirely\\n\\n\" +\n \"Option 2 — Provide the verification URL to this command:\\n\" +\n \" intercom auth verify-email --url <url>\\n\\n\" +\n \"Option 3 — Retrieve the URL automatically with a mail CLI:\\n\" +\n \" Google Workspace (gog): gog gmail messages search \\\"from:team@intercom.io verify email\\\"\\n\" +\n \" Then: gog gmail get <message_id> | grep verify_email\\n\" +\n \" Google Workspace (gws): gws gmail search \\\"from:team@intercom.io verify email\\\"\\n\" +\n \" Any tool that can read the inbox will work — the URL looks like:\\n\" +\n \" https://app.intercom.com/admins/<uuid>/verify_email?...\"\n )\n .requiredOption(\"--url <url>\", \"Verification URL from the email\")\n .action(async (options) => {\n const url = options.url as string;\n\n if (!url.includes(\"verify_email\")) {\n throw new CLIError(\n \"URL does not look like a verification link. Expected format:\\n\" +\n \" https://app.intercom.com/admins/<uuid>/verify_email?...\"\n );\n }\n\n const response = await fetchWithTimeout(url, { redirect: \"manual\" }, { timeoutMs: API_TIMEOUT_MS });\n\n if (response.status === 302 || response.status === 301) {\n const location = response.headers.get(\"location\") ?? \"\";\n if (location.includes(\"sign_in\") || location.includes(\"getting-started\") || location.includes(\"apps/\")) {\n console.log(\"Email verified successfully!\");\n return;\n }\n }\n\n if (response.status === 200) {\n console.log(\"Email verified successfully!\");\n return;\n }\n\n throw new CLIError(\n `Email verification returned unexpected status ${response.status}. ` +\n \"The link may have expired — check for a newer verification email.\"\n );\n });\n}\n","import { Command } from \"commander\";\nimport { readConfig } from \"../../auth/config.js\";\nimport { CredentialStore, createDefaultBackend } from \"../../auth/store.js\";\nimport { table } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n};\n\nexport function registerListCommand(auth: Command): void {\n auth\n .command(\"list\")\n .description(\"List all configured workspaces\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n const store = new CredentialStore(createDefaultBackend(configDir));\n\n const workspaces = await Promise.all(\n Object.values(config.workspaces).map(async (ws) => {\n const cred = await store.get(ws.app_id);\n return {\n app_id: ws.app_id,\n name: ws.name,\n auth_type: cred?.auth_type ?? \"unknown\",\n default: ws.app_id === config.default,\n };\n }),\n );\n\n render(\n workspaces,\n opts,\n () => {\n if (workspaces.length === 0) {\n return 'No workspaces configured. Run \"intercom auth login\" to get started.';\n }\n const rows = workspaces.map((ws) => ({\n DEFAULT: ws.default ? \"*\" : \"\",\n APP_ID: ws.app_id,\n NAME: ws.name,\n AUTH_TYPE: ws.auth_type,\n }));\n return table({\n columns: [\"DEFAULT\", \"APP_ID\", \"NAME\", \"AUTH_TYPE\"],\n rows,\n });\n },\n workspaces,\n );\n });\n}\n","import { Command } from \"commander\";\nimport { readConfig, writeConfig } from \"../../auth/config.js\";\nimport { CLIError } from \"../../types.js\";\n\nexport function registerSwitchCommand(auth: Command): void {\n auth\n .command(\"switch <app_id>\")\n .description(\"Switch the default workspace\")\n .action(async (appId: string) => {\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n\n if (!config.workspaces[appId]) {\n const available = Object.keys(config.workspaces);\n const hint =\n available.length > 0\n ? ` Available: ${available.join(\", \")}`\n : ' Run \"intercom auth login\" to add a workspace.';\n throw new CLIError(`Workspace \"${appId}\" not found.${hint}`);\n }\n\n config.default = appId;\n await writeConfig(config, configDir);\n\n const name = config.workspaces[appId].name;\n console.log(`Switched to ${name} (${appId})`);\n });\n}\n","import { Command } from \"commander\";\nimport { registerLoginCommand } from \"./login.js\";\nimport { registerBootstrapCommand } from \"./bootstrap.js\";\nimport { registerStatusCommand } from \"./status.js\";\nimport { registerLogoutCommand } from \"./logout.js\";\nimport { registerSignupCommand } from \"./signup.js\";\nimport { registerVerifyEmailCommand } from \"./verify-email.js\";\nimport { registerListCommand } from \"./list.js\";\nimport { registerSwitchCommand } from \"./switch.js\";\n\nexport function registerAuthCommand(program: Command): void {\n const auth = program\n .command(\"auth\")\n .description(\"Manage authentication credentials\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom auth login --token <api-token>\n intercom auth status\n intercom auth logout\n\nEnvironment: Set INTERCOM_TOKEN to skip login entirely.`,\n );\n\n registerLoginCommand(auth);\n registerBootstrapCommand(auth);\n registerStatusCommand(auth);\n registerLogoutCommand(auth);\n registerSignupCommand(auth);\n registerVerifyEmailCommand(auth);\n registerListCommand(auth);\n registerSwitchCommand(auth);\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"./helpers.js\";\nimport { detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\n\nexport function registerMeCommand(program: Command): void {\n program\n .command(\"me\")\n .description(\"Show current authenticated admin and workspace info\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .action(async function(options) {\n // optsWithGlobals() merges parent options (e.g. --json defined at root level)\n const opts = (this as unknown as { optsWithGlobals: () => typeof options }).optsWithGlobals();\n const client = await resolveClient(opts);\n const me = await client.get(\"/me\");\n\n const app = me.app as Record<string, unknown> | undefined;\n render(me, opts, () =>\n detail({\n \"Name\": me.name as string | undefined,\n \"Email\": me.email as string | undefined,\n \"App ID\": (app?.id_code as string | undefined) ?? (me.app_id as string | undefined),\n \"Type\": me.type as string | undefined,\n })\n );\n });\n}\n","import TurndownService from \"turndown\";\n\nconst turndown = new TurndownService({\n headingStyle: \"atx\",\n bulletListMarker: \"-\",\n});\n\n/**\n * Convert HTML to readable Markdown text.\n * Uses turndown to preserve links, bold, and structure from Intercom API HTML.\n */\nexport function htmlToText(html: string | null | undefined): string {\n if (!html) return \"\";\n return turndown.turndown(html).trim();\n}\n","import { Command } from \"commander\";\nimport { resolveClient, parseFieldArgs, formatTimestamp } from \"./helpers.js\";\nimport { parseTypedFields } from \"../utils/fields.js\";\nimport { table, detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\nimport { htmlToText } from \"../output/html.js\";\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n limit?: string;\n all?: boolean;\n field?: string[];\n typedField?: string[];\n};\n\nexport function registerArticlesCommand(program: Command): void {\n const articles = program\n .command(\"articles\")\n .description(\"Manage help center articles (list, get, create, update, delete)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom articles list\n intercom articles get 123\n intercom articles create -f title=\"Getting Started\" -F body=@article.md\n intercom articles update 123 -f state=published\n intercom articles delete 123`,\n );\n\n // list\n articles\n .command(\"list\")\n .description(\"List help center articles\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .option(\"--limit <n>\", \"Max results to return\", \"25\")\n .option(\"--all\", \"Auto-paginate all pages\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom articles list --json\n $ intercom articles list --all --jq '.[].title'`,\n )\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result: unknown;\n\n if (opts.all) {\n const allItems = await client.paginate(\"/articles\", { per_page: \"25\" });\n result = { type: \"list\", data: allItems };\n } else {\n const limit = opts.limit ?? \"25\";\n result = await client.get(\"/articles\", { per_page: limit });\n }\n\n const response = result as { data?: Record<string, unknown>[] };\n const items = (response.data ?? []) as Record<string, unknown>[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((a) => ({\n ID: String(a.id ?? \"\"),\n TITLE: String(a.title ?? \"\"),\n STATE: String(a.state ?? \"\"),\n UPDATED: formatTimestamp(a.updated_at),\n }));\n return table({ columns: [\"ID\", \"TITLE\", \"STATE\", \"UPDATED\"], rows });\n },\n items,\n );\n });\n\n // get\n articles\n .command(\"get <id>\")\n .description(\"Get a help center article by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/articles/${id}`);\n\n render(result, opts, () => {\n const meta = detail({\n ID: String(result.id ?? \"\"),\n Title: String(result.title ?? \"\"),\n State: String(result.state ?? \"\"),\n \"Author ID\":\n result.author_id != null ? String(result.author_id) : undefined,\n Updated: formatTimestamp(result.updated_at),\n Created: formatTimestamp(result.created_at),\n });\n const body =\n typeof result.body === \"string\" ? htmlToText(result.body) : \"\";\n return body ? `${meta}\\n\\n${body}` : meta;\n });\n });\n\n // create\n articles\n .command(\"create\")\n .description(\"Create a help center article\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\n \"-F, --typed-field <key=value>\",\n \"Typed field: bools, numbers, @file reads (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom articles create -f title='Getting Started' -f body='<p>Hello</p>'\n $ intercom articles create -F body=@article.html -f title='Guide'\n\nCommon fields: title, body, author_id, state, parent_id, parent_type\nUse -F for typed values (numbers, booleans) and @file reads.`,\n )\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body: Record<string, unknown> = {\n ...parseFieldArgs(opts.field ?? []),\n ...parseTypedFields(opts.typedField ?? [], true),\n };\n // author_id must be sent as an integer, not a string (for -f users)\n if (body.author_id && typeof body.author_id === \"string\") {\n const parsed = parseInt(body.author_id as string, 10);\n if (!isNaN(parsed)) body.author_id = parsed;\n }\n const result = await client.post(\"/articles\", body);\n\n render(result, opts, () =>\n detail({\n ID: String((result as Record<string, unknown>).id ?? \"\"),\n Title: String((result as Record<string, unknown>).title ?? \"\"),\n State: String((result as Record<string, unknown>).state ?? \"\"),\n }),\n );\n });\n\n // update\n articles\n .command(\"update <id>\")\n .description(\"Update a help center article\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\n \"-F, --typed-field <key=value>\",\n \"Typed field: bools, numbers, @file reads (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body: Record<string, unknown> = {\n ...parseFieldArgs(opts.field ?? []),\n ...parseTypedFields(opts.typedField ?? [], true),\n };\n if (body.author_id && typeof body.author_id === \"string\") {\n const parsed = parseInt(body.author_id as string, 10);\n if (!isNaN(parsed)) body.author_id = parsed;\n }\n const result = await client.put(`/articles/${id}`, body);\n\n render(result, opts, () =>\n detail({\n ID: String((result as Record<string, unknown>).id ?? \"\"),\n Title: String((result as Record<string, unknown>).title ?? \"\"),\n State: String((result as Record<string, unknown>).state ?? \"\"),\n }),\n );\n });\n\n // delete\n articles\n .command(\"delete <id>\")\n .description(\"Delete a help center article\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.delete(`/articles/${id}`);\n\n const deleted = result as { id?: unknown; deleted?: unknown };\n render(result, opts, () => `Deleted article ${deleted.id ?? id}`);\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient, parseFieldArgs, formatTimestamp } from \"./helpers.js\";\nimport { table, detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\nimport { parseTypedFields } from \"../utils/fields.js\";\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n limit?: string;\n all?: boolean;\n field?: string[];\n typedField?: string[];\n};\n\nexport function registerContactsCommand(program: Command): void {\n const contacts = program\n .command(\"contacts\")\n .description(\"Manage contacts (list, get, create, update, delete, search)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom contacts list --limit 10\n intercom contacts get abc123\n intercom contacts create -f email=user@example.com -f role=user\n intercom contacts delete abc123`,\n );\n\n // list\n contacts\n .command(\"list\")\n .description(\"List contacts\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .option(\"--limit <n>\", \"Max results to return\", \"25\")\n .option(\"--all\", \"Auto-paginate all pages\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result: unknown;\n\n if (opts.all) {\n const allItems = await client.paginate(\"/contacts\", { per_page: \"25\" });\n result = { type: \"list\", data: allItems };\n } else {\n const limit = opts.limit ?? \"25\";\n result = await client.get(\"/contacts\", { per_page: limit });\n }\n\n const response = result as { data?: Record<string, unknown>[] };\n const items = (response.data ?? []) as Record<string, unknown>[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((c) => ({\n ID: String(c.id ?? \"\"),\n EMAIL: String(c.email ?? \"\"),\n NAME: String(c.name ?? \"\"),\n ROLE: String(c.role ?? \"\"),\n UPDATED: formatTimestamp(c.updated_at),\n }));\n return table({\n columns: [\"ID\", \"EMAIL\", \"NAME\", \"ROLE\", \"UPDATED\"],\n rows,\n });\n },\n items,\n );\n });\n\n // get\n contacts\n .command(\"get <id>\")\n .description(\"Get a contact by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/contacts/${id}`);\n\n render(result, opts, () =>\n detail({\n ID: String(result.id ?? \"\"),\n Name: result.name != null ? String(result.name) : undefined,\n Email: result.email != null ? String(result.email) : undefined,\n Role: String(result.role ?? \"\"),\n Created: formatTimestamp(result.created_at),\n Updated: formatTimestamp(result.updated_at),\n }),\n );\n });\n\n // create\n contacts\n .command(\"create\")\n .description(\"Create a contact\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = parseFieldArgs(opts.field ?? []);\n const result = await client.post(\"/contacts\", body);\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n ID: String(r.id ?? \"\"),\n Name: r.name != null ? String(r.name) : undefined,\n Email: r.email != null ? String(r.email) : undefined,\n Role: String(r.role ?? \"\"),\n }),\n );\n });\n\n // update\n contacts\n .command(\"update <id>\")\n .description(\"Update a contact\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = parseFieldArgs(opts.field ?? []);\n const result = await client.put(`/contacts/${id}`, body);\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n ID: String(r.id ?? \"\"),\n Name: r.name != null ? String(r.name) : undefined,\n Email: r.email != null ? String(r.email) : undefined,\n Role: String(r.role ?? \"\"),\n }),\n );\n });\n\n // delete\n contacts\n .command(\"delete <id>\")\n .description(\"Delete a contact\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.delete(`/contacts/${id}`);\n\n const deleted = result as { id?: unknown; deleted?: unknown };\n render(result, opts, () => `Deleted contact ${deleted.id ?? id}`);\n });\n\n // search\n contacts\n .command(\"search\")\n .description(\"Search contacts (POST /contacts/search)\")\n .option(\n \"-f, --field <key=value>\",\n \"String field (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\n \"-F, --typed-field <key=value>\",\n \"Typed field (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = {\n ...parseTypedFields(opts.field ?? [], false),\n ...parseTypedFields(opts.typedField ?? [], true),\n };\n const result = await client.post(\"/contacts/search\", body);\n const response = result as { data?: Record<string, unknown>[] };\n const items = (response.data ?? []) as Record<string, unknown>[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((c) => ({\n ID: String(c.id ?? \"\"),\n EMAIL: String(c.email ?? \"\"),\n NAME: String(c.name ?? \"\"),\n ROLE: String(c.role ?? \"\"),\n UPDATED: formatTimestamp(c.updated_at),\n }));\n return table({\n columns: [\"ID\", \"EMAIL\", \"NAME\", \"ROLE\", \"UPDATED\"],\n rows,\n });\n },\n items,\n );\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient, parseFieldArgs, formatTimestamp } from \"./helpers.js\";\nimport { table, detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\nimport { htmlToText } from \"../output/html.js\";\nimport { parseTypedFields } from \"../utils/fields.js\";\n\nfunction formatDatetime(ts: unknown): string {\n if (!ts) return \"\";\n const n = typeof ts === \"number\" ? ts : Number(ts);\n if (isNaN(n)) return String(ts);\n return new Date(n * 1000).toISOString().slice(0, 16).replace(\"T\", \" \");\n}\n\nfunction renderConversationStream(result: Record<string, unknown>): string {\n const parts: string[] = [];\n\n parts.push(\n detail({\n ID: String(result.id ?? \"\"),\n State: String(result.state ?? \"\"),\n Open: String(result.open ?? \"\"),\n Created: formatTimestamp(result.created_at),\n Updated: formatTimestamp(result.updated_at),\n }),\n );\n\n const source = result.source as\n | { body?: string; author?: { name?: string; type?: string } }\n | undefined;\n const partsData = result.conversation_parts as\n | { conversation_parts?: unknown[] }\n | undefined;\n const convParts = (partsData?.conversation_parts ?? []) as Record<\n string,\n unknown\n >[];\n\n if (!source && convParts.length === 0) return parts.join(\"\\n\");\n\n parts.push(\"\");\n parts.push(\"── Conversation ─────────────────────────────────\");\n\n if (source) {\n const authorName = source.author?.name ?? \"Unknown\";\n const authorType = source.author?.type ?? \"user\";\n const body = htmlToText(source.body);\n parts.push(\"\");\n parts.push(\n `${authorName} (${authorType}) · ${formatDatetime(result.created_at)}`,\n );\n if (body) parts.push(body);\n }\n\n for (const part of convParts) {\n const author = part.author as { name?: string; type?: string } | undefined;\n const authorName = author?.name ?? \"System\";\n const authorType = author?.type ?? \"bot\";\n const partType = String(part.part_type ?? \"unknown\");\n const body = htmlToText(part.body as string | null | undefined);\n const ts = formatDatetime(part.created_at);\n\n parts.push(\"\");\n\n switch (partType) {\n case \"comment\":\n parts.push(`${authorName} (${authorType}) · ${ts}`);\n if (body) parts.push(body);\n break;\n case \"note\":\n parts.push(`[note] ${authorName} (${authorType}) · ${ts}`);\n if (body) parts.push(body);\n break;\n case \"assignment\": {\n const assignedTo = part.assigned_to as { name?: string } | undefined;\n parts.push(`[assignment] ${authorName} (${authorType}) · ${ts}`);\n if (assignedTo?.name) parts.push(`Assigned to ${assignedTo.name}`);\n break;\n }\n case \"close\":\n parts.push(`[closed] ${authorName} (${authorType}) · ${ts}`);\n if (body) parts.push(body);\n break;\n case \"open\":\n parts.push(`[opened] ${authorName} (${authorType}) · ${ts}`);\n if (body) parts.push(body);\n break;\n default:\n parts.push(`[${partType}] ${authorName} (${authorType}) · ${ts}`);\n if (body) parts.push(body);\n break;\n }\n }\n\n return parts.join(\"\\n\");\n}\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n limit?: string;\n all?: boolean;\n field?: string[];\n typedField?: string[];\n};\n\nexport function registerConversationsCommand(program: Command): void {\n const conversations = program\n .command(\"conversations\")\n .description(\"Manage conversations (list, get, reply, search)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom conversations list\n intercom conversations get 123\n intercom conversations reply 123 -f body=\"Thanks!\" -f message_type=comment -f type=admin -f admin_id=456`,\n );\n\n // list\n conversations\n .command(\"list\")\n .description(\"List conversations\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .option(\"--limit <n>\", \"Max results to return\", \"25\")\n .option(\"--all\", \"Auto-paginate all pages\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result: unknown;\n\n if (opts.all) {\n const allItems = await client.paginate(\n \"/conversations\",\n { per_page: \"25\" },\n \"conversations\",\n );\n result = { type: \"conversation.list\", conversations: allItems };\n } else {\n const limit = opts.limit ?? \"25\";\n result = await client.get(\"/conversations\", { per_page: limit });\n }\n\n // Conversations API returns `conversations` array, not `data`\n const response = result as { conversations?: Record<string, unknown>[] };\n const items = (response.conversations ?? []) as Record<string, unknown>[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((c) => ({\n ID: String(c.id ?? \"\"),\n STATE: String(c.state ?? \"\"),\n OPEN: String(c.open ?? \"\"),\n CREATED: formatTimestamp(c.created_at),\n UPDATED: formatTimestamp(c.updated_at),\n }));\n return table({\n columns: [\"ID\", \"STATE\", \"OPEN\", \"CREATED\", \"UPDATED\"],\n rows,\n });\n },\n items,\n );\n });\n\n // get\n conversations\n .command(\"get <id>\")\n .description(\"Get a conversation by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/conversations/${id}`);\n\n render(result, opts, () => {\n const r = result as Record<string, unknown>;\n return renderConversationStream(r);\n });\n });\n\n // reply\n conversations\n .command(\"reply <id>\")\n .description(\"Reply to a conversation\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom conversations reply 123 -f type=admin -f body='Thanks!'\n\nRequired fields: body, type (admin or user). Also: admin_id, message_type.`,\n )\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = parseFieldArgs(opts.field ?? []);\n const result = await client.post(`/conversations/${id}/reply`, body);\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n ID: String(r.id ?? \"\"),\n Type: String(r.type ?? \"\"),\n Body: r.body != null ? String(r.body) : undefined,\n }),\n );\n });\n\n // search\n conversations\n .command(\"search\")\n .description(\"Search conversations (POST /conversations/search)\")\n .option(\n \"-f, --field <key=value>\",\n \"String field (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\n \"-F, --typed-field <key=value>\",\n \"Typed field (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = {\n ...parseTypedFields(opts.field ?? [], false),\n ...parseTypedFields(opts.typedField ?? [], true),\n };\n const result = await client.post(\"/conversations/search\", body);\n const response = result as { conversations?: Record<string, unknown>[] };\n const items = (response.conversations ?? []) as Record<\n string,\n unknown\n >[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((c) => ({\n ID: String(c.id ?? \"\"),\n STATE: String(c.state ?? \"\"),\n OPEN: String(c.open ?? \"\"),\n CREATED: formatTimestamp(c.created_at),\n UPDATED: formatTimestamp(c.updated_at),\n }));\n return table({\n columns: [\"ID\", \"STATE\", \"OPEN\", \"CREATED\", \"UPDATED\"],\n rows,\n });\n },\n items,\n );\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient, parseFieldArgs, formatTimestamp } from \"./helpers.js\";\nimport { table, detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n limit?: string;\n all?: boolean;\n field?: string[];\n};\n\nexport function registerHelpCenterCommand(program: Command): void {\n const helpCenter = program\n .command(\"help-center\")\n .description(\"Manage help center collections\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom help-center list\n intercom help-center get 123\n intercom help-center create -f name=\"FAQ\"`,\n );\n\n // list\n helpCenter\n .command(\"list\")\n .description(\"List help center collections\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .option(\"--limit <n>\", \"Max results to return\", \"25\")\n .option(\"--all\", \"Auto-paginate all pages\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result: unknown;\n\n if (opts.all) {\n const allItems = await client.paginate(\"/help_center/collections\", {\n per_page: \"25\",\n });\n result = { type: \"list\", data: allItems };\n } else {\n const limit = opts.limit ?? \"25\";\n result = await client.get(\"/help_center/collections\", {\n per_page: limit,\n });\n }\n\n const response = result as { data?: Record<string, unknown>[] };\n const items = (response.data ?? []) as Record<string, unknown>[];\n\n render(\n result,\n opts,\n () => {\n const rows = items.map((c) => ({\n ID: String(c.id ?? \"\"),\n NAME: String(c.name ?? \"\"),\n DESCRIPTION: String(c.description ?? \"\"),\n UPDATED: formatTimestamp(c.updated_at),\n }));\n return table({\n columns: [\"ID\", \"NAME\", \"DESCRIPTION\", \"UPDATED\"],\n rows,\n });\n },\n items,\n );\n });\n\n // get\n helpCenter\n .command(\"get <id>\")\n .description(\"Get a help center collection by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/help_center/collections/${id}`);\n\n render(result, opts, () =>\n detail({\n ID: String(result.id ?? \"\"),\n Name: String(result.name ?? \"\"),\n Description:\n result.description != null ? String(result.description) : undefined,\n Updated: formatTimestamp(result.updated_at),\n Created: formatTimestamp(result.created_at),\n }),\n );\n });\n\n // create\n helpCenter\n .command(\"create\")\n .description(\"Create a help center collection\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = parseFieldArgs(opts.field ?? []);\n const result = await client.post(\"/help_center/collections\", body);\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n ID: String(r.id ?? \"\"),\n Name: String(r.name ?? \"\"),\n Description:\n r.description != null ? String(r.description) : undefined,\n }),\n );\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient, parseFieldArgs } from \"./helpers.js\";\nimport { detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\n\nconst UNSTABLE_HEADERS = { \"Intercom-Version\": \"Unstable\" };\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n field?: string[];\n format?: string;\n};\n\nfunction generateHtmlSnippet(appId: string): string {\n return `<script>\n window.intercomSettings = { api_base: \"https://api-iam.intercom.io\", app_id: \"${appId}\" };\n (function(){var w=window;var ic=w.Intercom;if(typeof ic===\"function\"){ic('reattach_activator');ic('update',w.intercomSettings);}else{var d=document;var i=function(){i.c(arguments);};i.q=[];i.c=function(args){i.q.push(args);};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/${appId}';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);};if(document.readyState==='complete'){l();}else if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})();\n</script>`;\n}\n\nfunction generateReactSnippet(appId: string): string {\n return `import { useEffect } from \"react\";\n\nexport function IntercomWidget() {\n useEffect(() => {\n window.intercomSettings = { api_base: \"https://api-iam.intercom.io\", app_id: \"${appId}\" };\n (function(){var w=window;var ic=w.Intercom;if(typeof ic===\"function\"){ic('reattach_activator');ic('update',w.intercomSettings);}else{var d=document;var i=function(){i.c(arguments);};i.q=[];i.c=function(args){i.q.push(args);};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/${appId}';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);};if(document.readyState==='complete'){l();}else if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})();\n }, []);\n return null;\n}`;\n}\n\nexport function registerMessengerCommand(program: Command): void {\n const messenger = program\n .command(\"messenger\")\n .description(\"Manage Intercom Messenger settings (get, update, snippet)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom messenger get\n intercom messenger update -f alignment=right -f theme_mode=dark\n intercom messenger snippet --format react`,\n );\n\n // get\n messenger\n .command(\"get\")\n .description(\"Get Messenger settings\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom messenger get --json\n $ intercom messenger get --jq '.alignment'`,\n )\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/messenger\", undefined, UNSTABLE_HEADERS);\n\n const r = result as Record<string, unknown>;\n render(result, opts, () =>\n detail({\n \"Color\": r.secondary_color != null ? String(r.secondary_color) : undefined,\n \"Alignment\": r.alignment != null ? String(r.alignment) : undefined,\n \"Theme\": r.theme_mode != null ? String(r.theme_mode) : undefined,\n \"Background\": r.background_type != null ? String(r.background_type) : undefined,\n \"Launcher (Users)\": r.messenger_enabled_for_users != null ? String(r.messenger_enabled_for_users) : undefined,\n \"Launcher (Visitors)\": r.messenger_enabled_for_visitors != null ? String(r.messenger_enabled_for_visitors) : undefined,\n \"Launcher (Mobile)\": r.messenger_enabled_for_mobile_users != null ? String(r.messenger_enabled_for_mobile_users) : undefined,\n \"Inbound (Users)\": r.inbound_conversations_enabled_for_users != null ? String(r.inbound_conversations_enabled_for_users) : undefined,\n \"Inbound (Visitors)\": r.inbound_conversations_enabled_for_visitors != null ? String(r.inbound_conversations_enabled_for_visitors) : undefined,\n }),\n );\n });\n\n // update\n messenger\n .command(\"update\")\n .description(\"Update Messenger settings\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = parseFieldArgs(opts.field ?? []);\n const result = await client.put(\"/messenger\", body, UNSTABLE_HEADERS);\n\n const r = result as Record<string, unknown>;\n render(result, opts, () =>\n detail({\n \"Color\": r.secondary_color != null ? String(r.secondary_color) : undefined,\n \"Alignment\": r.alignment != null ? String(r.alignment) : undefined,\n \"Theme\": r.theme_mode != null ? String(r.theme_mode) : undefined,\n \"Background\": r.background_type != null ? String(r.background_type) : undefined,\n \"Launcher (Users)\": r.messenger_enabled_for_users != null ? String(r.messenger_enabled_for_users) : undefined,\n \"Launcher (Visitors)\": r.messenger_enabled_for_visitors != null ? String(r.messenger_enabled_for_visitors) : undefined,\n \"Launcher (Mobile)\": r.messenger_enabled_for_mobile_users != null ? String(r.messenger_enabled_for_mobile_users) : undefined,\n \"Inbound (Users)\": r.inbound_conversations_enabled_for_users != null ? String(r.inbound_conversations_enabled_for_users) : undefined,\n \"Inbound (Visitors)\": r.inbound_conversations_enabled_for_visitors != null ? String(r.inbound_conversations_enabled_for_visitors) : undefined,\n }),\n );\n });\n\n // snippet — outputs raw HTML/JS, not structured data\n messenger\n .command(\"snippet\")\n .description(\"Generate the Intercom Messenger JavaScript install snippet\")\n .option(\n \"--format <format>\",\n \"Output format: html (default) or react\",\n \"html\",\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Opts }\n ).optsWithGlobals();\n const client = await resolveClient(opts);\n const me = (await client.get(\"/me\")) as Record<string, unknown>;\n const app = me.app as Record<string, unknown> | undefined;\n const appId = String(app?.id_code ?? \"\");\n\n const snippet =\n opts.format === \"react\"\n ? generateReactSnippet(appId)\n : generateHtmlSnippet(appId);\n const format = opts.format ?? \"html\";\n render({ format, snippet }, opts, () => snippet);\n });\n}\n","import { Command } from \"commander\";\nimport { writeFile } from \"fs/promises\";\nimport { resolveClient } from \"./helpers.js\";\nimport { table, detail } from \"../output/formatter.js\";\nimport { render } from \"../output/render.js\";\nimport { registerProceduresCommand } from \"./fin/procedures.js\";\nimport { registerDataConnectorsCommand } from \"./fin/data-connectors.js\";\nimport { registerGuidanceCommand } from \"./fin/guidance.js\";\nimport { registerAttributesCommand } from \"./fin/attributes.js\";\nimport { registerAudiencesCommand } from \"./fin/audiences.js\";\nimport { registerWorkflowsCommand } from \"./fin/workflows.js\";\nimport { registerSimulationsCommand } from \"./fin/simulations.js\";\nimport { registerFinEnableCommand } from \"./fin/enable.js\";\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n output?: string;\n timeout?: string;\n};\n\ntype ManifestWorkspace = {\n app_id?: number;\n app_id_code?: string;\n name?: string;\n};\n\ntype ManifestResource = {\n id?: string;\n name?: string;\n};\n\ntype ManifestResponse = {\n workspace?: ManifestWorkspace;\n procedures?: ManifestResource[];\n tasks?: ManifestResource[];\n data_connectors?: ManifestResource[];\n guidance?: ManifestResource[];\n};\n\nfunction renderResourceTable(label: string, items: ManifestResource[]): string {\n if (items.length === 0) {\n return `${label}:\\n (none)`;\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n NAME: String(item.name ?? \"\"),\n }));\n return `${label}:\\n${table({ columns: [\"ID\", \"NAME\"], rows })}`;\n}\n\nexport function registerFinCommand(program: Command): void {\n const fin = program\n .command(\"fin\")\n .description(\"Manage Fin AI Agent and SDK resources\")\n .addHelpText(\n \"after\",\n `\nExamples:\n intercom fin manifest\n intercom fin enable --email admin@company.com\n intercom fin guidance list`,\n );\n\n // manifest\n fin\n .command(\"manifest\")\n .description(\"Show the Fin SDK manifest for this workspace\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom fin manifest\n $ intercom fin manifest --json`,\n )\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/manifest\");\n\n const manifest = result as ManifestResponse;\n render(result, opts, () => {\n const ws = manifest.workspace ?? {};\n const lines: string[] = [];\n lines.push(detail({\n \"Workspace\": ws.name,\n \"App ID\": ws.app_id != null ? String(ws.app_id) : undefined,\n \"App ID Code\": ws.app_id_code,\n }));\n lines.push(\"\");\n lines.push(renderResourceTable(\"Procedures\", manifest.procedures ?? []));\n lines.push(\"\");\n lines.push(renderResourceTable(\"Tasks\", manifest.tasks ?? []));\n lines.push(\"\");\n lines.push(renderResourceTable(\"Data Connectors\", manifest.data_connectors ?? []));\n lines.push(\"\");\n lines.push(renderResourceTable(\"Guidance\", manifest.guidance ?? []));\n return lines.join(\"\\n\");\n });\n });\n\n registerFinEnableCommand(fin);\n registerProceduresCommand(fin);\n registerDataConnectorsCommand(fin);\n registerGuidanceCommand(fin);\n registerAttributesCommand(fin);\n registerAudiencesCommand(fin);\n registerWorkflowsCommand(fin);\n registerSimulationsCommand(fin);\n\n // download\n fin\n .command(\"download\")\n .description(\"Download Fin SDK resources as a ZIP file\")\n .option(\"-o, --output <path>\", \"Output file path\", \"./fin-resources.zip\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const outputPath = opts.output ?? \"./fin-resources.zip\";\n const client = await resolveClient(opts);\n const buffer = await client.getBuffer(\"/fin-sdk/download\");\n await writeFile(outputPath, buffer);\n console.log(`Downloaded ${buffer.length} bytes to ${outputPath}`);\n });\n}\n","import { Command } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport AdmZip from \"adm-zip\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table } from \"../../output/formatter.js\";\nimport { formatJson } from \"../../output/json.js\";\nimport { render } from \"../../output/render.js\";\n\ntype ManifestResource = {\n id?: string;\n name?: string;\n};\n\ntype ManifestResponse = {\n procedures?: ManifestResource[];\n};\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n timeout?: string;\n};\n\nexport function registerProceduresCommand(fin: Command): void {\n const procedures = fin\n .command(\"procedures\")\n .description(\"Manage Fin SDK procedures\");\n\n // list\n procedures\n .command(\"list\")\n .description(\"List procedures from the Fin SDK manifest\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/manifest\");\n const manifest = result as ManifestResponse;\n const items = manifest.procedures ?? [];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No procedures found.\";\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n NAME: String(item.name ?? \"\"),\n }));\n return table({ columns: [\"ID\", \"NAME\"], rows });\n }, items);\n });\n\n // get — outputs raw YAML, not structured data; no render()\n procedures\n .command(\"get <id>\")\n .description(\"Download a procedure by ID and print its YAML content\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const buffer = await client.getBuffer(`/fin-sdk/procedures/${id}/download`);\n const zip = new AdmZip(buffer);\n const entry = zip.getEntries().find((e) => e.entryName.endsWith(\"procedure.yaml\"));\n\n if (!entry) {\n throw new Error(\"procedure.yaml not found in downloaded ZIP\");\n }\n\n console.log(zip.readAsText(entry));\n });\n\n // upload\n procedures\n .command(\"upload <file>\")\n .description(\"Upload a procedure file to Fin SDK\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (filePath: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const fileContent = await readFile(filePath);\n const formData = new FormData();\n const blob = new Blob([fileContent], { type: \"application/x-yaml\" });\n formData.append(\"file_data\", blob, basename(filePath));\n const result = await client.postFormData(\"/fin-sdk/upload\", formData);\n render(result, opts, () => formatJson(result));\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table, detail } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype ManifestResource = {\n id?: string;\n name?: string;\n};\n\ntype ManifestResponse = {\n data_connectors?: ManifestResource[];\n};\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n verbose?: boolean;\n field?: string[];\n timeout?: string;\n};\n\nexport function registerDataConnectorsCommand(fin: Command): void {\n const dataConnectors = fin\n .command(\"data-connectors\")\n .description(\"Manage Fin SDK data connectors\");\n\n // list\n dataConnectors\n .command(\"list\")\n .description(\"List data connectors from the Fin SDK manifest\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/manifest\");\n const manifest = result as ManifestResponse;\n const items = manifest.data_connectors ?? [];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No data connectors found.\";\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n NAME: String(item.name ?? \"\"),\n }));\n return table({ columns: [\"ID\", \"NAME\"], rows });\n }, items);\n });\n\n // create\n dataConnectors\n .command(\"create\")\n .description(\"Create a data connector\")\n .requiredOption(\"-f, --field <key=value>\", \"Field to set (e.g. name=<name>)\", (v: string, acc: string[]) => [...acc, v], [] as string[])\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n\n const fields = opts.field ?? [];\n const body: Record<string, string> = {};\n for (const f of fields) {\n const eq = f.indexOf(\"=\");\n if (eq === -1) throw new Error(`Invalid field format: ${f}. Expected key=value`);\n body[f.slice(0, eq)] = f.slice(eq + 1);\n }\n\n const result = await client.post(\"/fin-sdk/data-connectors\", body) as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n \"ID\": String(result.id ?? \"\"),\n \"Name\": String(result.name ?? \"\"),\n \"Status\": result.status != null ? String(result.status) : undefined,\n })\n );\n });\n\n // get\n dataConnectors\n .command(\"get <id>\")\n .description(\"Download a data connector by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/fin-sdk/data-connectors/${id}/download`);\n\n render(result, opts, () =>\n detail({\n \"ID\": String(result.id ?? \"\"),\n \"Name\": String(result.name ?? \"\"),\n })\n );\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient, parseFieldArgs } from \"../helpers.js\";\nimport { table, detail } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype ManifestResource = {\n id?: string;\n name?: string;\n};\n\ntype ManifestResponse = {\n guidance?: ManifestResource[];\n};\n\ntype Opts = {\n json?: boolean;\n jq?: string;\n agent?: boolean;\n verbose?: boolean;\n timeout?: string;\n field?: string[];\n};\n\nexport function registerGuidanceCommand(fin: Command): void {\n const guidance = fin\n .command(\"guidance\")\n .description(\"Manage Fin SDK guidance\");\n\n // list\n guidance\n .command(\"list\")\n .description(\"List guidance from the Fin SDK manifest\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/manifest\");\n const manifest = result as ManifestResponse;\n const items = manifest.guidance ?? [];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No guidance found.\";\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n NAME: String(item.name ?? \"\"),\n }));\n return table({ columns: [\"ID\", \"NAME\"], rows });\n }, items);\n });\n\n // create\n guidance\n .command(\"create\")\n .description(\"Create a guidance item\")\n .option(\n \"-f, --field <key=value>\",\n \"Field to set (repeatable)\",\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ intercom fin guidance create -f title=\"Brand Voice\" -f prompt=\"Be friendly and concise.\" -f category=tone\n $ intercom fin guidance create -f title=\"Escalation Rules\" -f prompt=\"Always escalate billing issues.\" -f category=behavior\n\nRequired fields: title, prompt, category\nCategories: tone, clarification, content, spam_detection, other, copilot,\n voice_tone, voice_clarification, voice_routing, voice_content\nOptional fields: state (live or paused, default: paused), audiences`,\n )\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const body = parseFieldArgs(opts.field ?? []);\n const result = await client.post(\"/fin-sdk/guidance\", body);\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n ID: String(r.id ?? \"\"),\n Title: r.title != null ? String(r.title) : undefined,\n State: r.state != null ? String(r.state) : undefined,\n Message: r.message != null ? String(r.message) : undefined,\n }),\n );\n });\n\n // get\n guidance\n .command(\"get <id>\")\n .description(\"Download a guidance item by ID and print its YAML content\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const text = await client.getText(`/fin-sdk/guidance/${id}/download`);\n render({ format: \"yaml\", content: text }, opts, () => text);\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype Attribute = {\n name?: string;\n type?: string;\n description?: string;\n};\n\ntype Opts = {\n json?: boolean;\n verbose?: boolean;\n};\n\nexport function registerAttributesCommand(fin: Command): void {\n const attributes = fin\n .command(\"attributes\")\n .description(\"Manage Fin SDK attributes\");\n\n // list\n attributes\n .command(\"list\")\n .description(\"List Fin SDK attributes\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/attributes\");\n const items = (Array.isArray(result) ? result : (result as { attributes?: Attribute[] }).attributes ?? []) as Attribute[];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No attributes found.\";\n }\n const rows = items.map((item) => ({\n NAME: String(item.name ?? \"\"),\n TYPE: String(item.type ?? \"\"),\n DESCRIPTION: String(item.description ?? \"\"),\n }));\n return table({ columns: [\"NAME\", \"TYPE\", \"DESCRIPTION\"], rows });\n }, items);\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype Audience = {\n id?: string;\n name?: string;\n description?: string;\n};\n\ntype Opts = {\n json?: boolean;\n verbose?: boolean;\n};\n\nexport function registerAudiencesCommand(fin: Command): void {\n const audiences = fin\n .command(\"audiences\")\n .description(\"Manage Fin SDK audiences\");\n\n // list\n audiences\n .command(\"list\")\n .description(\"List Fin SDK audiences\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/audiences\");\n const items = (Array.isArray(result) ? result : (result as { audiences?: Audience[] }).audiences ?? []) as Audience[];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No audiences found.\";\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n NAME: String(item.name ?? \"\"),\n }));\n return table({ columns: [\"ID\", \"NAME\"], rows });\n }, items);\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table, detail } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\n\ntype Workflow = {\n id?: string | number;\n title?: string;\n state?: string | number;\n trigger_type?: string | null;\n};\n\ntype Opts = {\n json?: boolean;\n verbose?: boolean;\n};\n\nexport function registerWorkflowsCommand(fin: Command): void {\n const workflows = fin\n .command(\"workflows\")\n .description(\"Manage Fin SDK workflows\");\n\n // list\n workflows\n .command(\"list\")\n .description(\"List Fin SDK workflows\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(\"/fin-sdk/workflows\");\n const items = (Array.isArray(result) ? result : (result as { workflows?: Workflow[] }).workflows ?? []) as Workflow[];\n\n render(items, opts, () => {\n if (items.length === 0) {\n return \"No workflows found.\";\n }\n const rows = items.map((item) => ({\n ID: String(item.id ?? \"\"),\n TITLE: String(item.title ?? \"\"),\n STATE: String(item.state ?? \"\"),\n TRIGGER: String(item.trigger_type ?? \"\"),\n }));\n return table({ columns: [\"ID\", \"TITLE\", \"STATE\", \"TRIGGER\"], rows });\n }, items);\n });\n\n // get\n workflows\n .command(\"get <id>\")\n .description(\"Get a workflow by ID\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (id: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.get(`/fin-sdk/workflows/${id}`);\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n \"ID\": String(r.id ?? \"\"),\n \"Title\": String(r.title ?? \"\"),\n \"State\": String(r.state ?? \"\"),\n \"Trigger\": r.trigger_type != null ? String(r.trigger_type) : undefined,\n })\n );\n });\n}\n","import { Command } from \"commander\";\nimport { resolveClient } from \"../helpers.js\";\nimport { table, detail } from \"../../output/formatter.js\";\nimport { render } from \"../../output/render.js\";\nimport { SIMULATION_POLL_TIMEOUT_MS } from \"../../api/timeouts.js\";\nimport { TimeoutError } from \"../../types.js\";\n\ntype EnqueuedRun = {\n run_id?: string | number;\n test_id?: string | number;\n simulation_name?: string;\n status?: string;\n};\n\ntype RunResponse = {\n procedure_id?: string | number;\n enqueued?: EnqueuedRun[];\n skipped?: unknown[];\n run_id?: string | number;\n [key: string]: unknown;\n};\n\ntype RunResult = {\n run_id?: string | number;\n id?: string | number;\n status?: string;\n [key: string]: unknown;\n};\n\ntype Opts = {\n json?: boolean;\n verbose?: boolean;\n wait?: boolean;\n timeout?: string;\n};\n\nexport function registerSimulationsCommand(fin: Command): void {\n const simulations = fin\n .command(\"simulations\")\n .description(\"Manage Fin SDK simulations\");\n\n // list — returns YAML text, not JSON; no render()\n simulations\n .command(\"list <procedure_id>\")\n .description(\"List simulations for a procedure (displays YAML)\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (procedureId: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const text = await client.getText(`/fin-sdk/procedures/${procedureId}/simulations`);\n console.log(text);\n });\n\n // run\n simulations\n .command(\"run <procedure_id> [test_id]\")\n .description(\"Run one or all simulations for a procedure\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (procedureId: string, testId: string | undefined) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result: unknown;\n if (testId) {\n result = await client.post(`/fin-sdk/procedures/${procedureId}/simulations/${testId}/run`, {});\n } else {\n result = await client.post(`/fin-sdk/procedures/${procedureId}/simulations/run`, {});\n }\n\n const r = result as RunResponse;\n\n render(result, opts, () => {\n // The response may have an `enqueued` array with run IDs, or a single run_id\n if (r.enqueued && Array.isArray(r.enqueued) && r.enqueued.length > 0) {\n const rows = r.enqueued.map((e) => ({\n RUN_ID: String(e.run_id ?? \"\"),\n TEST_ID: String(e.test_id ?? \"\"),\n NAME: String(e.simulation_name ?? \"\"),\n STATUS: String(e.status ?? \"\"),\n }));\n return table({ columns: [\"RUN_ID\", \"TEST_ID\", \"NAME\", \"STATUS\"], rows });\n } else {\n const runId = r.run_id;\n if (runId !== undefined) {\n return `run_id: ${runId}`;\n } else {\n return detail({\n \"Procedure ID\": String(r.procedure_id ?? \"\"),\n });\n }\n }\n });\n });\n\n // result\n simulations\n .command(\"result <run_id>\")\n .description(\"Get the result of a simulation run\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--wait\", \"Poll until run completes\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (runId: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n\n let result = await client.get(`/fin-sdk/runs/${runId}`) as RunResult;\n\n if (opts.wait) {\n const deadline = Date.now() + SIMULATION_POLL_TIMEOUT_MS;\n while (result.status === \"pending\" || result.status === \"running\") {\n if (Date.now() > deadline) {\n throw new TimeoutError(\n `Simulation polling timed out after ${SIMULATION_POLL_TIMEOUT_MS / 1000}s. ` +\n `Last status: ${result.status}. Run \"intercom fin simulations result ${runId}\" to check later.`,\n );\n }\n await new Promise(r => setTimeout(r, 2000));\n result = await client.get(`/fin-sdk/runs/${runId}`) as RunResult;\n }\n }\n\n render(result, opts, () =>\n detail({\n \"Run ID\": String(result.run_id ?? \"\"),\n \"Status\": String(result.status ?? \"\"),\n })\n );\n });\n\n // generate\n simulations\n .command(\"generate <procedure_id>\")\n .description(\"Generate simulations for a procedure\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function (procedureId: string) {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const client = await resolveClient(opts);\n const result = await client.post(`/fin-sdk/procedures/${procedureId}/simulations/generate`, {});\n const r = result as Record<string, unknown>;\n\n render(result, opts, () =>\n detail({\n \"Status\": String(r.status ?? \"\"),\n \"Procedure ID\": String(r.procedure_id ?? \"\"),\n })\n );\n });\n}\n","/**\n * Shared utilities for ember session-based operations.\n *\n * Some Intercom features (Fin activation, email verification) require\n * authenticated ember session cookies rather than OAuth API tokens.\n * This module provides a helper to get an authenticated session.\n */\n\nimport { deviseSignIn } from \"./devhub.js\";\nimport { getAppBaseUrl } from \"./signup.js\";\nimport { fetchWithTimeout } from \"../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../api/timeouts.js\";\n\nexport interface EmberSession {\n cookies: string;\n csrf: string;\n appId: string;\n}\n\n/**\n * Establish an authenticated ember session:\n * 1. Sign in via Devise (gets session cookies)\n * 2. Load the app page (sets app context + provides fresh CSRF token)\n */\nexport async function getEmberSession(options: {\n email: string;\n password: string;\n appId: string;\n verifyEmailUrl?: string;\n timeoutMs?: number;\n}): Promise<EmberSession> {\n const { email, password, appId, verifyEmailUrl, timeoutMs = API_TIMEOUT_MS } = options;\n const baseUrl = getAppBaseUrl();\n\n // Step 1: Sign in via Devise\n let cookies = await deviseSignIn(baseUrl, email, password, timeoutMs);\n\n // Step 2: Verify email if URL provided\n if (verifyEmailUrl) {\n const verifyResponse = await fetchWithTimeout(verifyEmailUrl, {\n headers: { Cookie: cookies },\n redirect: \"manual\",\n }, { timeoutMs });\n const newCookies = extractCookies(verifyResponse);\n if (newCookies) cookies = mergeCookies(cookies, newCookies);\n }\n\n // Step 3: Load the app page to set session context and get CSRF\n const appResponse = await fetchWithTimeout(`${baseUrl}/a/apps/${appId}`, {\n headers: { Cookie: cookies },\n }, { timeoutMs });\n const appCookies = extractCookies(appResponse);\n if (appCookies) cookies = mergeCookies(cookies, appCookies);\n\n const html = await appResponse.text();\n const csrfMatch = /<meta\\s+name=\"csrf-token\"\\s+content=\"([^\"]+)\"/.exec(html);\n if (!csrfMatch) {\n throw new Error(\"Failed to get CSRF token from app page. Email may not be verified.\");\n }\n\n return { cookies, csrf: csrfMatch[1], appId };\n}\n\n/**\n * Make an authenticated ember API request using session cookies.\n */\nexport async function emberRequest(\n session: EmberSession,\n path: string,\n options: {\n method?: string;\n body?: unknown;\n timeoutMs?: number;\n } = {},\n): Promise<{ status: number; data: unknown }> {\n const { method = \"GET\", body, timeoutMs = API_TIMEOUT_MS } = options;\n const baseUrl = getAppBaseUrl();\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"X-CSRF-Token\": session.csrf,\n Cookie: session.cookies,\n };\n\n const fetchOptions: RequestInit = { method, headers };\n\n if (body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n fetchOptions.body = JSON.stringify(body);\n }\n\n const response = await fetchWithTimeout(\n `${baseUrl}${path}`,\n fetchOptions,\n { timeoutMs },\n );\n\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n data = text;\n }\n\n return { status: response.status, data };\n}\n\nfunction extractCookies(response: Response): string {\n const setCookies: string[] =\n typeof (response.headers as unknown as { getSetCookie?: () => string[] }).getSetCookie === \"function\"\n ? (response.headers as unknown as { getSetCookie: () => string[] }).getSetCookie()\n : (response.headers.get(\"set-cookie\") ?? \"\").split(/,(?=[^ ])/).filter(Boolean);\n return setCookies.map((c: string) => c.split(\";\")[0]).join(\"; \");\n}\n\nfunction mergeCookies(existing: string, newCookies: string): string {\n const map = new Map<string, string>();\n for (const cookie of [...existing.split(\"; \"), ...newCookies.split(\"; \")]) {\n const eqIdx = cookie.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const name = cookie.slice(0, eqIdx).trim();\n const value = cookie.slice(eqIdx + 1);\n if (name) map.set(name, value);\n }\n return Array.from(map.entries())\n .map(([k, v]) => `${k}=${v}`)\n .join(\"; \");\n}\n","import { Command } from \"commander\";\nimport { resolvePassword } from \"../../auth/password.js\";\nimport { getEmberSession, emberRequest } from \"../../auth/ember-session.js\";\nimport { readConfig } from \"../../auth/config.js\";\nimport { CLIError } from \"../../types.js\";\n\ntype Opts = {\n email?: string;\n passwordStdin?: boolean;\n verifyEmailUrl?: string;\n verbose?: boolean;\n workspace?: string;\n};\n\nexport function registerFinEnableCommand(fin: Command): void {\n fin\n .command(\"enable\")\n .description(\n \"Enable Fin AI Agent on the workspace.\\n\\n\" +\n \"This opts the workspace into Fin and activates it to answer conversations.\\n\" +\n \"Requires email/password authentication (ember session).\"\n )\n .requiredOption(\"--email <email>\", \"Admin email address\")\n .option(\"--password-stdin\", \"Read password from stdin (or set INTERCOM_PASSWORD)\")\n .option(\"--verify-email-url <url>\", \"Email verification URL (if email not yet verified)\")\n .option(\"--verbose\", \"Show detailed output\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n const password = await resolvePassword({ passwordStdin: opts.passwordStdin });\n\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n const appId = opts.workspace ?? config.default;\n if (!appId) {\n throw new CLIError(\n 'No workspace configured. Run \"intercom auth signup\" or \"intercom auth login\" first.'\n );\n }\n\n if (opts.verbose) {\n console.log(`Workspace: ${appId}`);\n console.log(`Email: ${opts.email}`);\n }\n\n // Get ember session\n console.log(\"Signing in...\");\n const session = await getEmberSession({\n email: opts.email!,\n password,\n appId,\n verifyEmailUrl: opts.verifyEmailUrl,\n });\n\n // Step 1: Opt in to Fin\n console.log(\"Enabling Fin...\");\n const optIn = await emberRequest(session, \"/ember/fin_opt_in\", {\n method: \"POST\",\n body: { app_id: appId },\n });\n\n if (optIn.status === 200) {\n console.log(\"✓ Fin opted in\");\n } else if (optIn.status === 409) {\n console.log(\"✓ Fin already opted in\");\n } else {\n throw new CLIError(\n `Fin opt-in failed (${optIn.status}). ` +\n (optIn.status === 403\n ? \"Email may not be verified — use --verify-email-url.\"\n : JSON.stringify(optIn.data))\n );\n }\n\n // Step 2: Get the Fin setup profile to find the ruleset ID\n console.log(\"Checking Fin configuration...\");\n const profile = await emberRequest(\n session,\n `/ember/operator_workflows/fin_setup_behavior?app_id=${appId}`,\n );\n\n if (profile.status === 204) {\n throw new CLIError(\n \"Fin setup profile not found. The workspace may not have Fin available on this plan.\"\n );\n }\n\n if (profile.status !== 200) {\n throw new CLIError(\n `Failed to get Fin profile (${profile.status}): ${JSON.stringify(profile.data)}`\n );\n }\n\n const profileData = profile.data as { id: string; state: number };\n const rulesetId = profileData.id;\n const state = profileData.state;\n\n if (opts.verbose) {\n console.log(` Ruleset ID: ${rulesetId}, current state: ${state}`);\n }\n\n // Step 3: Activate the ruleset if not already live\n if (state === 1) {\n console.log(\"✓ Fin already active\");\n } else {\n console.log(\"Activating Fin...\");\n const activate = await emberRequest(\n session,\n `/ember/matching_system/rulesets/${rulesetId}/activate?app_id=${appId}`,\n { method: \"PUT\", body: {} },\n );\n\n if (activate.status === 200) {\n const result = activate.data as { state: number };\n if (result.state === 1) {\n console.log(\"✓ Fin activated!\");\n } else {\n console.log(`⚠ Activation returned state ${result.state}`);\n }\n } else {\n throw new CLIError(\n `Fin activation failed (${activate.status}): ${JSON.stringify(activate.data)}`\n );\n }\n }\n\n console.log(`\\nFin is live on workspace ${appId}`);\n });\n}\n","import { Command } from \"commander\";\nimport { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport { resolveClient } from \"./helpers.js\";\nimport { formatJson } from \"../output/json.js\";\nimport { resolvePassword } from \"../auth/password.js\";\nimport { signup, getAppBaseUrl } from \"../auth/signup.js\";\nimport { getToken } from \"../auth/devhub.js\";\nimport { IntercomClient } from \"../api/client.js\";\nimport { CLIError, PermissionError, NotFoundError } from \"../types.js\";\nimport { CredentialStore, createDefaultBackend } from \"../auth/store.js\";\nimport { addWorkspace, readConfig } from \"../auth/config.js\";\nimport { getEmberSession, emberRequest } from \"../auth/ember-session.js\";\nimport { fetchWithTimeout } from \"../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../api/timeouts.js\";\n\ntype Opts = {\n companyName?: string;\n articlesFrom?: string;\n plan?: boolean;\n dryRun?: boolean;\n json?: boolean;\n verbose?: boolean;\n // Signup/bootstrap flags\n email?: string;\n passwordStdin?: boolean;\n name?: string;\n planTier?: string;\n // Fin enablement\n enableFin?: boolean;\n verifyEmailUrl?: string;\n};\n\ntype PlanStep = {\n step: number;\n description: string;\n commands: string[];\n};\n\nfunction isGreenfield(opts: Opts): boolean {\n return !!(opts.email && opts.name && (process.env.INTERCOM_PASSWORD || opts.passwordStdin));\n}\n\nfunction hasPartialGreenfieldFlags(opts: Opts): boolean {\n const hasPassword = !!(process.env.INTERCOM_PASSWORD || opts.passwordStdin);\n return !!(opts.email && hasPassword && !opts.name);\n}\n\n/**\n * Check if there are already stored credentials for any workspace.\n * When auth exists, we skip signup even if greenfield flags are present —\n * the user is re-running setup on an existing workspace.\n */\nasync function hasExistingAuth(): Promise<boolean> {\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const config = await readConfig(configDir);\n return !!config.default;\n}\n\nfunction buildPlan(opts: Opts): PlanStep[] {\n const steps: PlanStep[] = [];\n let stepNum = 1;\n const greenfield = isGreenfield(opts);\n\n if (greenfield) {\n const company = opts.companyName ?? \"<company-name>\";\n\n // Step 1: Signup\n steps.push({\n step: stepNum++,\n description: \"Create a new Intercom workspace\",\n commands: [\n `INTERCOM_PASSWORD=*** intercom auth signup --email \"${opts.email}\" --name \"${opts.name}\" --company \"${company}\"`,\n ],\n });\n\n // Step 2: Bootstrap (auth token)\n steps.push({\n step: stepNum++,\n description: \"Bootstrap authentication token\",\n commands: [\n `INTERCOM_PASSWORD=*** intercom auth bootstrap --email \"${opts.email}\" --app-id <workspace_id>`,\n ],\n });\n }\n\n // Messenger snippet\n steps.push({\n step: stepNum++,\n description: \"Get Messenger install snippet\",\n commands: [\n `intercom messenger snippet --format html`,\n ],\n });\n\n // Help center\n const helpCenterName = opts.companyName ? `${opts.companyName} Help` : \"<your-company-name> Help\";\n steps.push({\n step: stepNum++,\n description: \"Create help center collection\",\n commands: [\n `intercom help-center create -f name=\"${helpCenterName}\"`,\n ],\n });\n\n // Articles (if --articles-from provided)\n if (opts.articlesFrom) {\n let mdFiles: string[] = [];\n try {\n mdFiles = readdirSync(opts.articlesFrom).filter((f) => f.endsWith(\".md\"));\n } catch {\n // Directory might not exist in plan mode — show a generic placeholder\n mdFiles = [];\n }\n\n if (mdFiles.length > 0) {\n const articleCommands = mdFiles.map((file) => {\n const title = basename(file, \".md\")\n .replace(/-/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n return `intercom articles create -f title=\"${title}\" -F body=@${join(opts.articlesFrom!, file)} -f author_id=$(intercom me --json | jq -r .id)`;\n });\n steps.push({\n step: stepNum++,\n description: `Create ${mdFiles.length} article(s) from ${opts.articlesFrom}`,\n commands: articleCommands,\n });\n } else {\n steps.push({\n step: stepNum++,\n description: `Create articles from ${opts.articlesFrom}`,\n commands: [\n `intercom articles create -f title=\"<article-title>\" -F body=@${opts.articlesFrom}/<file>.md -f author_id=$(intercom me --json | jq -r .id)`,\n ],\n });\n }\n }\n\n // Fin SDK manifest\n steps.push({\n step: stepNum++,\n description: \"Verify Fin SDK access and view configuration\",\n commands: [\n `intercom fin manifest`,\n ],\n });\n\n return steps;\n}\n\nfunction formatPlanText(steps: PlanStep[]): string {\n const lines: string[] = [\"Steps to complete Intercom setup:\"];\n for (const step of steps) {\n lines.push(`${step.step}. ${step.commands[0]}`);\n for (let i = 1; i < step.commands.length; i++) {\n lines.push(` ${step.commands[i]}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\nasync function runPostAuthSteps(\n client: IntercomClient,\n opts: Opts,\n results: string[],\n appId?: string,\n): Promise<void> {\n // Messenger settings are pre-configured with defaults on workspace creation.\n // The company name is set on the App during signup, not via PUT /messenger.\n // The PUT /messenger endpoint accepts theming/visibility fields only.\n results.push(`✓ Messenger configured`);\n\n // Fetch admin ID for article authorship\n const me = await client.get(\"/me\") as { id?: string | number };\n const authorId = me.id != null ? Number(me.id) : undefined;\n\n // Help center — check idempotency\n const helpCenterName = opts.companyName ? `${opts.companyName} Help` : \"Help Center\";\n const collections = await client.paginate(\"/help_center/collections\");\n const existingCollection = collections.find(\n (c) => String(c.name ?? \"\") === helpCenterName,\n );\n\n let collectionId: string | undefined;\n if (existingCollection) {\n collectionId = String(existingCollection.id);\n results.push(`✓ Help center already exists (${helpCenterName})`);\n } else {\n const created = await client.post(\"/help_center/collections\", { name: helpCenterName }) as { id?: string | number };\n collectionId = created.id != null ? String(created.id) : undefined;\n results.push(`✓ Help center created (${helpCenterName})`);\n }\n\n // Articles (if --articles-from provided)\n if (opts.articlesFrom) {\n let mdFiles: string[] = [];\n try {\n mdFiles = readdirSync(opts.articlesFrom).filter((f) => f.endsWith(\".md\"));\n } catch (err) {\n throw err instanceof CLIError ? err : new CLIError(`Failed to read --articles-from directory: ${(err as Error).message}`);\n }\n\n // Fetch existing articles to check idempotency by title\n const existingArticles = await client.paginate(\"/articles\");\n const existingTitles = new Set(existingArticles.map((a) => String(a.title ?? \"\")));\n\n let created = 0;\n let skipped = 0;\n\n for (const file of mdFiles) {\n const title = basename(file, \".md\")\n .replace(/-/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n const body = readFileSync(join(opts.articlesFrom, file), \"utf-8\");\n\n if (existingTitles.has(title)) {\n skipped++;\n } else {\n const articleBody: Record<string, unknown> = { title, body, state: \"published\" };\n if (authorId != null) articleBody.author_id = authorId;\n if (collectionId != null) {\n articleBody.parent_id = collectionId;\n articleBody.parent_type = \"collection\";\n }\n await client.post(\"/articles\", articleBody);\n created++;\n }\n }\n\n if (created > 0 && skipped > 0) {\n results.push(`✓ ${created} article(s) published, ${skipped} skipped (already exist)`);\n } else if (created > 0) {\n results.push(`✓ ${created} article(s) published`);\n } else {\n results.push(`✓ All ${skipped} article(s) already exist`);\n }\n }\n\n // Check article count — warn if Fin would have nothing to answer from\n const articleCount = (await client.paginate(\"/articles\")).length;\n if (articleCount === 0) {\n results.push(`⚠ No help center articles found!`);\n console.error(results.join(\"\\n\"));\n console.error(\"\");\n console.error(\"WARNING: Fin needs help center articles to answer questions.\");\n console.error(\"Without articles, Fin will have nothing to draw from and cannot help visitors.\\n\");\n console.error(\"To add articles, either:\");\n console.error(\" 1. Re-run with: intercom setup --articles-from <directory-of-markdown-files>\");\n console.error(\" 2. Create articles manually: intercom articles create -f title=\\\"...\\\" -f body=\\\"...\\\" -F author_id=<id>\");\n console.error(\"\");\n console.error(\"Tip for AI agents: if no articles directory exists, consider creating one by\");\n console.error(\" analyzing the project's source code, README, documentation, or any available\");\n console.error(\" context about the product. Write markdown files covering key topics that\");\n console.error(\" customers would ask about, then re-run setup with --articles-from.\\n\");\n console.error(\"Skipping Fin enablement — enable Fin after adding articles with: intercom fin enable --email <email>\");\n return;\n }\n\n results.push(`✓ ${articleCount} article(s) in help center`);\n\n // Enable Fin (if we have email/password for ember session)\n if (opts.enableFin !== false && opts.email) {\n try {\n const password = await resolvePassword({ passwordStdin: opts.passwordStdin });\n const finAppId = appId ?? \"\";\n\n const session = await getEmberSession({\n email: opts.email,\n password,\n appId: finAppId,\n verifyEmailUrl: opts.verifyEmailUrl,\n });\n\n // Opt in to Fin\n const optIn = await emberRequest(session, \"/ember/fin_opt_in\", {\n method: \"POST\",\n body: { app_id: finAppId },\n });\n\n if (optIn.status === 200) {\n results.push(`✓ Fin opted in`);\n } else if (optIn.status === 409) {\n results.push(`✓ Fin already opted in`);\n } else {\n results.push(`⚠ Fin opt-in failed (${optIn.status}) — enable manually with: intercom fin enable --email <email>`);\n console.error(results.join(\"\\n\"));\n console.error(\"Setup complete (Fin requires manual enablement).\");\n return;\n }\n\n // Get Fin setup profile and activate\n const profile = await emberRequest(\n session,\n `/ember/operator_workflows/fin_setup_behavior?app_id=${finAppId}`,\n );\n\n if (profile.status === 200) {\n const profileData = profile.data as { id: string; state: number };\n if (profileData.state === 1) {\n results.push(`✓ Fin already active`);\n } else {\n const activate = await emberRequest(\n session,\n `/ember/matching_system/rulesets/${profileData.id}/activate?app_id=${finAppId}`,\n { method: \"PUT\", body: {} },\n );\n if (activate.status === 200) {\n results.push(`✓ Fin activated — answering conversations now`);\n } else {\n results.push(`⚠ Fin activation failed (${activate.status})`);\n }\n }\n } else {\n results.push(`⚠ Could not get Fin profile (${profile.status})`);\n }\n } catch {\n results.push(`⚠ Fin enablement failed — enable manually with: intercom fin enable --email <email>`);\n }\n } else if (opts.enableFin !== false) {\n results.push(`⚠ Fin not enabled (--email required for Fin activation)`);\n console.error(\" Tip: Re-run with --email to enable Fin, or use: intercom fin enable --email <email>\");\n }\n\n // Fin SDK manifest — show configuration summary\n try {\n const manifest = await client.get(\"/fin-sdk/manifest\");\n const procedures = (manifest.procedures as unknown[]) ?? [];\n const connectors = (manifest.data_connectors as unknown[]) ?? [];\n const guidance = (manifest.guidance as unknown[]) ?? [];\n\n if (procedures.length > 0 || connectors.length > 0 || guidance.length > 0) {\n results.push(`✓ Fin configured (${procedures.length} procedures, ${connectors.length} data connectors, ${guidance.length} guidance)`);\n }\n } catch (err) {\n if (!(err instanceof PermissionError) && !(err instanceof NotFoundError)) {\n throw err;\n }\n }\n\n console.error(results.join(\"\\n\"));\n console.error(\"Setup complete!\");\n}\n\nexport function registerSetupCommand(program: Command): void {\n program\n .command(\"setup\")\n .description(\"Set up a complete Intercom installation\")\n .addHelpText(\n \"after\",\n `\nExamples:\n # Existing workspace (already authenticated)\n intercom setup --company-name \"Acme Inc\" --articles-from ./docs\n\n # New workspace (greenfield)\n INTERCOM_PASSWORD=*** intercom setup --email admin@acme.com --name \"Admin\" --company-name \"Acme Inc\"\n\n # Preview steps without executing\n intercom setup --plan\n\nFlow: signup → auth → messenger → help center → articles → fin`,\n )\n .option(\"--company-name <name>\", \"Company name for Messenger branding\")\n .option(\"--articles-from <dir>\", \"Directory of markdown files to create as articles\")\n .option(\"--plan\", \"Output setup steps as CLI commands without executing\")\n .option(\"--dry-run\", \"Show what would happen without executing\")\n .option(\"--json\", \"Output as JSON (for --plan mode)\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n // Greenfield (new workspace) flags\n .option(\"--email <email>\", \"Admin email address (for new workspace signup)\")\n .option(\"--password-stdin\", \"Read password from stdin (or set INTERCOM_PASSWORD env var)\")\n .option(\"--name <name>\", \"Admin name (for new workspace signup)\")\n .option(\"--plan-tier <tier>\", \"Trial plan tier: essential, advanced, expert (default: advanced)\")\n // Fin enablement\n .option(\"--enable-fin\", \"Enable Fin AI Agent (default: true for greenfield setup)\", true)\n .option(\"--no-enable-fin\", \"Skip Fin enablement\")\n .option(\"--verify-email-url <url>\", \"Email verification URL (needed for Fin on fresh workspaces)\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => Opts }).optsWithGlobals();\n\n // Validate: email + password without --name is an error\n if (hasPartialGreenfieldFlags(opts)) {\n throw new CLIError(\n \"The --name flag is required for new workspace setup.\\n\" +\n \" Usage: intercom setup --email <email> --name <name> --password-stdin ...\",\n 1,\n );\n }\n\n // --plan mode: output steps without executing\n if (opts.plan) {\n const steps = buildPlan(opts);\n\n if (opts.json) {\n console.log(formatJson({ steps }));\n } else {\n console.log(formatPlanText(steps));\n }\n return;\n }\n\n // Validate --articles-from directory exists (skip in --plan mode which already returned)\n if (opts.articlesFrom) {\n try {\n const stat = statSync(opts.articlesFrom);\n if (!stat.isDirectory()) {\n throw new CLIError(`--articles-from path is not a directory: ${opts.articlesFrom}`);\n }\n } catch (err) {\n if (err instanceof CLIError) throw err;\n throw new CLIError(`--articles-from directory not found: ${opts.articlesFrom}`);\n }\n }\n\n // --dry-run mode: show what would happen\n if (opts.dryRun) {\n const helpCenterName = opts.companyName ? `${opts.companyName} Help` : \"Help Center\";\n const lines: string[] = [];\n if (isGreenfield(opts)) {\n lines.push(`[dry-run] Would create workspace via signup (${opts.email})`);\n lines.push(`[dry-run] Would bootstrap authentication token`);\n }\n lines.push(`[dry-run] Would configure Messenger${opts.companyName ? ` with name \"${opts.companyName}\"` : \"\"}`);\n lines.push(`[dry-run] Would check for existing help center collection \"${helpCenterName}\"`);\n if (opts.articlesFrom) {\n let mdFiles: string[] = [];\n try {\n mdFiles = readdirSync(opts.articlesFrom).filter((f) => f.endsWith(\".md\"));\n } catch (err) {\n throw err instanceof CLIError ? err : new CLIError(`Failed to read --articles-from directory: ${(err as Error).message}`);\n }\n lines.push(`[dry-run] Would create ${mdFiles.length} article(s) from ${opts.articlesFrom}`);\n }\n lines.push(`[dry-run] Would check Fin SDK manifest and show configuration summary`);\n console.log(lines.join(\"\\n\"));\n return;\n }\n\n const results: string[] = [];\n\n // Check if we already have stored credentials\n const alreadyAuthed = await hasExistingAuth();\n\n // Greenfield: signup + bootstrap, then run post-auth steps\n // Skip signup if we already have auth — the user is re-running setup\n if (isGreenfield(opts) && !alreadyAuthed) {\n const password = await resolvePassword({ passwordStdin: opts.passwordStdin });\n const baseUrl = getAppBaseUrl();\n const planTier = opts.planTier ?? \"advanced\";\n const companyName = opts.companyName ?? opts.name!;\n\n // Step 1: Signup\n const workspace = await signup({\n baseUrl,\n email: opts.email!,\n name: opts.name!,\n password,\n companyName,\n plan: planTier,\n });\n results.push(`✓ Workspace created: ${workspace.name} (${workspace.id})`);\n\n // Step 2: Verify email before bootstrap (Developer Hub requires it)\n if (opts.verifyEmailUrl) {\n try {\n await fetchWithTimeout(opts.verifyEmailUrl, { redirect: \"manual\" }, { timeoutMs: API_TIMEOUT_MS });\n results.push(`✓ Email verified`);\n } catch {\n // Non-fatal — bootstrap may still work if email was verified externally\n }\n }\n\n // Step 3: Get auth token via Developer Hub\n let token: string;\n try {\n const result = await getToken({\n baseUrl,\n email: opts.email!,\n password,\n appId: workspace.id,\n });\n token = result.token;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`✓ Workspace created: ${workspace.name} (${workspace.id})`);\n console.error(`\\nAuthentication failed after workspace creation: ${message}`);\n if (message.includes(\"403\")) {\n console.error(`\\nThis is likely because the email has not been verified.`);\n console.error(`Verify your email first, then bootstrap:`);\n console.error(` intercom auth verify-email --url <url-from-verification-email>`);\n } else {\n console.error(`\\nYour workspace exists but credentials were not saved.`);\n }\n console.error(`\\nTo complete setup, run:\\n`);\n console.error(` INTERCOM_PASSWORD=*** intercom auth bootstrap --email ${opts.email} --app-id ${workspace.id}`);\n console.error(`\\nThen re-run setup without signup flags:\\n`);\n console.error(` intercom setup --company-name \"${companyName}\"`);\n throw new CLIError(\n `Authentication failed after workspace creation. Run \"intercom auth bootstrap --email ${opts.email} --app-id ${workspace.id}\" to recover.`,\n 1,\n );\n }\n results.push(`✓ Authentication token obtained`);\n\n // Step 4: Persist credentials (same as auth bootstrap)\n const configDir = process.env.INTERCOM_CONFIG_DIR;\n const store = new CredentialStore(createDefaultBackend(configDir));\n await store.set(workspace.id, { token, auth_type: \"oauth\", app_id: workspace.id });\n await addWorkspace(configDir, { app_id: workspace.id, name: workspace.name });\n\n // Build a client using the new token\n const client = new IntercomClient({\n token,\n authType: \"oauth\",\n appId: workspace.id,\n baseUrl: process.env.INTERCOM_API_BASE_URL || undefined,\n verbose: opts.verbose,\n });\n\n await runPostAuthSteps(client, opts, results, workspace.id);\n return;\n }\n\n // Already authenticated: use existing credentials\n const client = await resolveClient(opts);\n // Get appId from the me endpoint\n const me = await client.get(\"/me\") as { app?: { id_code?: string } };\n const resolvedAppId = me.app?.id_code;\n await runPostAuthSteps(client, opts, results, resolvedAppId);\n });\n}\n","import { Command } from \"commander\";\n\n/** Detect whether the CLI was invoked as `fin` or `intercom`. */\nfunction binName(): string {\n const argv1 = process.argv[1] ?? \"\";\n if (argv1.endsWith(\"/fin\") || argv1.endsWith(\"\\\\fin\")) return \"fin\";\n return \"intercom\";\n}\n\nconst COMMANDS: Record<string, string[]> = {\n api: [],\n auth: [\"login\", \"logout\", \"status\", \"bootstrap\", \"signup\", \"verify-email\"],\n me: [],\n articles: [\"list\", \"get\", \"create\", \"update\", \"delete\"],\n contacts: [\"list\", \"get\", \"create\", \"update\", \"delete\"],\n conversations: [\"list\", \"get\", \"reply\"],\n \"help-center\": [\"list\", \"get\", \"create\"],\n messenger: [\"get\", \"update\", \"snippet\"],\n fin: [\"manifest\", \"enable\", \"guidance\"],\n setup: [],\n pricing: [],\n completion: [\"bash\", \"zsh\", \"fish\"],\n};\n\nconst GLOBAL_FLAGS = [\n \"--json\",\n \"--jq\",\n \"--workspace\",\n \"--verbose\",\n \"--no-retry\",\n \"--timeout\",\n \"--agent\",\n \"--human\",\n \"--help\",\n \"--version\",\n];\n\nfunction bashScript(name: string = binName()): string {\n const commandNames = Object.keys(COMMANDS).join(\" \");\n const fnName = `_${name}`;\n const subcommandCases = Object.entries(COMMANDS)\n .filter(([, subs]) => subs.length > 0)\n .map(([cmd, subs]) => ` ${cmd}) COMPREPLY=( $(compgen -W \"${subs.join(\" \")}\" -- \"$cur\") ) ;;`)\n .join(\"\\n\");\n\n return `# bash completion for ${name} CLI\n# Add to ~/.bashrc: eval \"$(${name} completion bash)\"\n\n${fnName}() {\n local cur prev commands\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n commands=\"${commandNames}\"\n\n if [[ \"$cur\" == -* ]]; then\n COMPREPLY=( $(compgen -W \"${GLOBAL_FLAGS.join(\" \")}\" -- \"$cur\") )\n return 0\n fi\n\n case \"\\${COMP_WORDS[1]}\" in\n${subcommandCases}\n *)\n if [[ \\${COMP_CWORD} -eq 1 ]]; then\n COMPREPLY=( $(compgen -W \"$commands\" -- \"$cur\") )\n fi\n ;;\n esac\n return 0\n}\n\ncomplete -F ${fnName} ${name}\n`;\n}\n\nfunction zshScript(name: string = binName()): string {\n const fnName = `_${name}`;\n const commandDescs = [\n \"api:'Make an authenticated API request'\",\n \"auth:'Manage authentication credentials'\",\n \"me:'Show current admin and workspace info'\",\n \"articles:'Manage help center articles'\",\n \"contacts:'Manage contacts'\",\n \"conversations:'Manage conversations'\",\n \"help-center:'Manage help center collections'\",\n \"messenger:'Manage Messenger settings'\",\n \"fin:'Manage Fin AI Agent'\",\n \"setup:'Set up a complete Intercom installation'\",\n \"pricing:'Show current Intercom pricing information'\",\n \"completion:'Generate shell completion scripts'\",\n ];\n\n const subcommandFunctions = Object.entries(COMMANDS)\n .filter(([, subs]) => subs.length > 0)\n .map(([cmd, subs]) => {\n const subFnName = cmd.replace(/-/g, \"_\");\n const subLines = subs.map((s) => `'${s}'`).join(\" \");\n return `${fnName}_${subFnName}() {\n local -a subcommands\n subcommands=(${subLines})\n _describe 'subcommand' subcommands\n}`;\n })\n .join(\"\\n\\n\");\n\n return `#compdef ${name}\n# zsh completion for ${name} CLI\n# Add to ~/.zshrc: eval \"$(${name} completion zsh)\"\n\n${fnName}() {\n local -a commands global_flags\n commands=(\n ${commandDescs.join(\"\\n \")}\n )\n global_flags=(\n ${GLOBAL_FLAGS.map((f) => `'${f}'`).join(\"\\n \")}\n )\n\n _arguments -C \\\\\n '1:command:->command' \\\\\n '*::arg:->args'\n\n case $state in\n command)\n _describe 'command' commands\n ;;\n args)\n case $words[1] in\n${Object.entries(COMMANDS)\n .filter(([, subs]) => subs.length > 0)\n .map(([cmd]) => ` ${cmd}) ${fnName}_${cmd.replace(/-/g, \"_\")} ;;`)\n .join(\"\\n\")}\n esac\n ;;\n esac\n}\n\n${subcommandFunctions}\n\n${fnName} \"$@\"\n`;\n}\n\nfunction fishScript(name: string = binName()): string {\n const lines = [\n `# fish completion for ${name} CLI`,\n `# Add to fish config: ${name} completion fish | source`,\n \"\",\n \"# Disable file completions\",\n `complete -c ${name} -f`,\n \"\",\n \"# Top-level commands\",\n ];\n\n const commandDescs: Record<string, string> = {\n api: \"Make an authenticated API request\",\n auth: \"Manage authentication credentials\",\n me: \"Show current admin and workspace info\",\n articles: \"Manage help center articles\",\n contacts: \"Manage contacts\",\n conversations: \"Manage conversations\",\n \"help-center\": \"Manage help center collections\",\n messenger: \"Manage Messenger settings\",\n fin: \"Manage Fin AI Agent\",\n setup: \"Set up a complete Intercom installation\",\n pricing: \"Show current Intercom pricing information\",\n completion: \"Generate shell completion scripts\",\n };\n\n for (const [cmd, desc] of Object.entries(commandDescs)) {\n lines.push(\n `complete -c ${name} -n '__fish_use_subcommand' -a '${cmd}' -d '${desc}'`,\n );\n }\n\n lines.push(\"\");\n lines.push(\"# Subcommands\");\n\n for (const [cmd, subs] of Object.entries(COMMANDS)) {\n for (const sub of subs) {\n lines.push(\n `complete -c ${name} -n '__fish_seen_subcommand_from ${cmd}' -a '${sub}'`,\n );\n }\n }\n\n lines.push(\"\");\n lines.push(\"# Global flags\");\n for (const flag of GLOBAL_FLAGS) {\n lines.push(`complete -c ${name} -l '${flag.replace(/^--/, \"\")}'`);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function registerCompletionCommand(program: Command): void {\n const name = binName();\n const completion = program\n .command(\"completion\")\n .description(\"Generate shell completion scripts\")\n .addHelpText(\n \"after\",\n `\nExamples:\n # Bash (add to ~/.bashrc)\n eval \"$(${name} completion bash)\"\n\n # Zsh (add to ~/.zshrc)\n eval \"$(${name} completion zsh)\"\n\n # Fish (add to fish config)\n ${name} completion fish | source`,\n );\n\n completion\n .command(\"bash\")\n .description(\"Generate bash completion script\")\n .action(() => {\n console.log(bashScript());\n });\n\n completion\n .command(\"zsh\")\n .description(\"Generate zsh completion script\")\n .action(() => {\n console.log(zshScript());\n });\n\n completion\n .command(\"fish\")\n .description(\"Generate fish completion script\")\n .action(() => {\n console.log(fishScript());\n });\n}\n\n// Exported for testing\nexport { bashScript, zshScript, fishScript };\n","import { Command } from \"commander\";\nimport { fetchWithTimeout } from \"../api/fetch.js\";\nimport { API_TIMEOUT_MS } from \"../api/timeouts.js\";\nimport { CLIError } from \"../types.js\";\n\nconst PRICING_URL = \"https://www.intercom.com/pricing.md\";\n\nexport function registerPricingCommand(program: Command): void {\n program\n .command(\"pricing\")\n .description(\"Show current Intercom pricing information\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .option(\"--verbose\", \"Show HTTP request/response details\")\n .action(async function () {\n const opts = (this as unknown as { optsWithGlobals: () => { json?: boolean; jq?: string; verbose?: boolean } }).optsWithGlobals();\n\n const response = await fetchWithTimeout(\n PRICING_URL,\n { headers: { Accept: \"text/markdown, text/plain, */*\" } },\n { timeoutMs: API_TIMEOUT_MS, verbose: opts.verbose },\n );\n\n if (!response.ok) {\n throw new CLIError(`Failed to fetch pricing: ${response.status} ${response.statusText}`);\n }\n\n const markdown = await response.text();\n\n if (opts.json) {\n const { formatJson } = await import(\"../output/json.js\");\n console.log(formatJson({ url: PRICING_URL, content: markdown }));\n } else {\n console.log(markdown);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { readConfig, writeConfig, defaultConfigDir } from \"../auth/config.js\";\nimport { CLIError } from \"../types.js\";\nimport { render } from \"../output/render.js\";\nimport { detail, table } from \"../output/formatter.js\";\nimport { join } from \"node:path\";\n\nconst SUPPORTED_KEYS = [\"default_workspace\", \"timeout\"] as const;\ntype ConfigKey = (typeof SUPPORTED_KEYS)[number];\n\nfunction configDir(): string {\n return process.env.INTERCOM_CONFIG_DIR ?? defaultConfigDir();\n}\n\nfunction validateKey(key: string): ConfigKey {\n if (!SUPPORTED_KEYS.includes(key as ConfigKey)) {\n throw new CLIError(\n `Unknown config key \"${key}\". Supported keys: ${SUPPORTED_KEYS.join(\", \")}`,\n );\n }\n return key as ConfigKey;\n}\n\nasync function getValue(key: ConfigKey): Promise<string | undefined> {\n const config = await readConfig(configDir());\n switch (key) {\n case \"default_workspace\":\n return config.default;\n case \"timeout\":\n return config.timeout !== undefined ? String(config.timeout) : undefined;\n }\n}\n\nfunction resolveSource(key: ConfigKey): string {\n switch (key) {\n case \"default_workspace\":\n return process.env.INTERCOM_WORKSPACE\n ? \"INTERCOM_WORKSPACE\"\n : \"config\";\n case \"timeout\":\n return \"config\";\n }\n}\n\nasync function setValue(key: ConfigKey, value: string): Promise<void> {\n const dir = configDir();\n const config = await readConfig(dir);\n switch (key) {\n case \"default_workspace\":\n config.default = value;\n break;\n case \"timeout\": {\n const n = parseInt(value, 10);\n if (isNaN(n) || n <= 0) {\n throw new CLIError(\"timeout must be a positive integer (seconds)\");\n }\n config.timeout = n;\n break;\n }\n }\n await writeConfig(config, dir);\n}\n\nexport function registerConfigCommand(program: Command): void {\n const cmd = program\n .command(\"config\")\n .description(\"Manage CLI configuration\");\n\n cmd\n .command(\"list\")\n .description(\"List all configuration settings\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .action(async function () {\n const opts = (\n this as unknown as { optsWithGlobals: () => Record<string, unknown> }\n ).optsWithGlobals();\n const config = await readConfig(configDir());\n\n const entries: Record<string, { value: string; source: string }> = {};\n for (const key of SUPPORTED_KEYS) {\n const val = await getValue(key);\n entries[key] = {\n value: val ?? \"\",\n source: val !== undefined ? resolveSource(key) : \"\",\n };\n }\n\n render(entries, opts, () =>\n table({\n columns: [\"KEY\", \"VALUE\", \"SOURCE\"],\n rows: SUPPORTED_KEYS.map((key) => ({\n KEY: key,\n VALUE: entries[key].value,\n SOURCE: entries[key].source,\n })),\n }),\n );\n });\n\n cmd\n .command(\"get <key>\")\n .description(\"Get a configuration value\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--jq <expr>\", \"Filter JSON output with jq expression\")\n .action(async function (key: string) {\n const opts = (\n this as unknown as { optsWithGlobals: () => Record<string, unknown> }\n ).optsWithGlobals();\n const validKey = validateKey(key);\n const value = await getValue(validKey);\n\n if (value === undefined) {\n throw new CLIError(`Key \"${key}\" is not set`);\n }\n\n render({ key, value }, opts, () => value);\n });\n\n cmd\n .command(\"set <key> <value>\")\n .description(\"Set a configuration value\")\n .action(async function (key: string, value: string) {\n const validKey = validateKey(key);\n await setValue(validKey, value);\n console.log(`Set ${key} = ${value}`);\n });\n\n cmd\n .command(\"path\")\n .description(\"Show configuration file path\")\n .action(async function () {\n console.log(join(configDir(), \"config.json\"));\n });\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,eAAe;;;ACAxB,SAAS,gBAAAA,qBAAoB;;;ACAtB,IAAM,iBAAiB;AAIvB,IAAM,6BAA6B;;;ACJ1C,SAAS,qBAAqB;AAE9B,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,MAAMA,SAAQ,iBAAiB;AAE9B,IAAM,UAAU,IAAI;;;ACFpB,IAAM,aAAa,eAAe,OAAO;AAEhD,IAAI,cAAc;AAEX,SAAS,cAAc,MAAoB;AAChD,gBAAc;AAChB;AAEA,eAAsB,iBACpB,KACA,MACA,SACmB;AAEnB,QAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,MAAI,CAAC,QAAQ,IAAI,YAAY,GAAG;AAC9B,YAAQ,IAAI,cAAc,UAAU;AAAA,EACtC;AACA,MAAI,aAAa;AACf,YAAQ,IAAI,iBAAiB,WAAW;AAAA,EAC1C;AAEA,MAAI,QAAQ,SAAS;AACnB,YAAQ,MAAM,KAAK,KAAK,UAAU,KAAK,IAAI,GAAG,EAAE;AAAA,EAClD;AACA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,KAAK,EAAE,GAAG,MAAM,SAAS,QAAQ,YAAY,QAAQ,QAAQ,SAAS,EAAE,CAAC;AAAA,EAClG,SAAS,KAAc;AACrB,QAAI,eAAe,gBAAgB,IAAI,SAAS,gBAAgB;AAC9D,YAAM,IAAI,aAAa,2BAA2B,QAAQ,YAAY,GAAI,MAAM,KAAK,UAAU,KAAK,IAAI,GAAG,EAAE;AAAA,IAC/G;AACA,UAAM;AAAA,EACR;AACA,MAAI,QAAQ,SAAS;AACnB,YAAQ,MAAM,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EAC7D;AACA,SAAO;AACT;;;AC9BA,IAAM,mBAAmB;AAYlB,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAwB;AAClC,SAAK,QAAQ,QAAQ;AACrB,SAAK,WAAW,QAAQ;AACxB,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,aAAa,QAAQ,cAAc;AACxC,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,YAAY,QAAQ,aAAa;AAAA,EACxC;AAAA,EAEQ,aAAqB;AAC3B,QAAI,KAAK,aAAa,WAAW;AAC/B,aAAO,SAAS,OAAO,KAAK,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE,EAAE,SAAS,QAAQ,CAAC;AAAA,IAC/E;AACA,WAAO,UAAU,KAAK,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAc,QACZ,QACA,MACA,MACA,eAA2C,QAC3C,cACkB;AAClB,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAClC,UAAM,UAAkC;AAAA,MACtC,eAAe,KAAK,WAAW;AAAA,IACjC;AAEA,UAAM,aAAa,gBAAgB;AAEnC,QAAI,iBAAiB,QAAQ;AAC3B,cAAQ,SAAS;AAAA,IACnB;AAEA,QAAI,CAAC,YAAY;AACf,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAEA,QAAI,cAAc;AAChB,aAAO,OAAO,SAAS,YAAY;AAAA,IACrC;AAEA,UAAM,cAAc,KAAK,aAAa;AAEtC,aAAS,UAAU,GAAG,UAAU,aAAa,WAAW;AACtD,YAAM,UAAuB,EAAE,QAAQ,QAAQ;AAC/C,UAAI,QAAQ,WAAW,OAAO;AAC5B,YAAI,YAAY;AACd,kBAAQ,OAAO;AAAA,QACjB,OAAO;AACL,kBAAQ,OAAO,KAAK,UAAU,IAAI;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,KAAK,SAAS;AAChB,gBAAQ,MAAM,KAAK,MAAM,IAAI,GAAG,EAAE;AAClC,YAAI,MAAM;AACR,kBAAQ;AAAA,YACN,WAAW,gBAAgB,WAAW,eAAe,KAAK,UAAU,IAAI,CAAC;AAAA,UAC3E;AAAA,QACF;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,iBAAiB,KAAK,SAAS;AAAA,QACpD,WAAW,KAAK;AAAA,MAClB,CAAC;AAED,UAAI,KAAK,SAAS;AAChB,gBAAQ,MAAM,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,MAC7D;AAEA,UAAI,SAAS,IAAI;AACf,YAAI,SAAS,WAAW,IAAK,QAAO,CAAC;AACrC,gBAAQ,cAAc;AAAA,UACpB,KAAK;AACH,mBAAO,SAAS,KAAK;AAAA,UACvB,KAAK;AACH,mBAAO,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC;AAAA,UACjD;AACE,mBAAO,SAAS,KAAK;AAAA,QACzB;AAAA,MACF;AAEA,YAAM,YAAa,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAGzD,YAAM,WACJ,WAAW,SAAS,CAAC,GAAG,WAAW,QAAQ,SAAS,MAAM;AAE5D,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI;AAAA,UACR,sCAAsC,QAAQ;AAAA,QAChD;AAAA,MACF;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,gBAAgB,sBAAsB,QAAQ,EAAE;AAAA,MAC5D;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,cAAc,QAAQ;AAAA,MAClC;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,aAAa;AAAA,UACjB,SAAS,QAAQ,IAAI,aAAa,KAAK;AAAA,UACvC;AAAA,QACF;AACA,YAAI,UAAU,KAAK,YAAY;AAC7B,cAAI,KAAK,SAAS;AAChB,oBAAQ;AAAA,cACN,6BAA6B,UAAU,cAAc,UAAU,CAAC,IAAI,KAAK,UAAU;AAAA,YACrF;AAAA,UACF;AACA,gBAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,aAAa,GAAI,CAAC;AACzD;AAAA,QACF;AACA,cAAM,IAAI;AAAA,UACR,oCAAoC,UAAU;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AAGA,YAAM,gBAAgB,CAAC,KAAK,KAAK,GAAG;AACpC,UAAI,cAAc,SAAS,SAAS,MAAM,GAAG;AAC3C,YAAI,UAAU,KAAK,YAAY;AAC7B,gBAAM,YAAY,KAAK,IAAI,GAAG,OAAO,IAAI;AACzC,cAAI,KAAK,SAAS;AAChB,oBAAQ;AAAA,cACN,gBAAgB,SAAS,MAAM,iBAAiB,YAAY,GAAI,cAAc,UAAU,CAAC,IAAI,KAAK,UAAU;AAAA,YAC9G;AAAA,UACF;AACA,gBAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACjD;AAAA,QACF;AACA,cAAM,IAAI;AAAA,UACR,gBAAgB,SAAS,MAAM,UAAU,KAAK,UAAU,aAAa,QAAQ;AAAA,QAC/E;AAAA,MACF;AAEA,YAAM,IAAI,SAAS,QAAQ;AAAA,IAC7B;AAEA,UAAM,IAAI,SAAS,8BAA8B;AAAA,EACnD;AAAA,EAEA,MAAM,IACJ,MACA,QACA,SACkC;AAClC,QAAI,MAAM;AACV,QAAI,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAC5C,YAAM,KAAK,IAAI,gBAAgB,MAAM,EAAE,SAAS;AAChD,YAAM,GAAG,IAAI,IAAI,EAAE;AAAA,IACrB;AACA,WAAO,KAAK,QAAQ,OAAO,KAAK,QAAW,QAAQ,OAAO;AAAA,EAG5D;AAAA,EAEA,MAAM,KACJ,MACA,MACA,SACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,MAAM,MAAM,QAAQ,OAAO;AAAA,EAGzD;AAAA,EAEA,MAAM,IACJ,MACA,MACA,SACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,MAAM,MAAM,QAAQ,OAAO;AAAA,EAGxD;AAAA,EAEA,MAAM,MACJ,MACA,MACA,SACkC;AAClC,WAAO,KAAK,QAAQ,SAAS,MAAM,MAAM,QAAQ,OAAO;AAAA,EAG1D;AAAA,EAEA,MAAM,OACJ,MACA,SACkC;AAClC,WAAO,KAAK,QAAQ,UAAU,MAAM,QAAW,QAAQ,OAAO;AAAA,EAGhE;AAAA,EAEA,MAAM,QACJ,MACA,QACiB;AACjB,QAAI,MAAM;AACV,QAAI,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAC5C,YAAM,KAAK,IAAI,gBAAgB,MAAM,EAAE,SAAS;AAChD,YAAM,GAAG,IAAI,IAAI,EAAE;AAAA,IACrB;AACA,WAAO,KAAK,QAAQ,OAAO,KAAK,QAAW,MAAM;AAAA,EACnD;AAAA,EAEA,MAAM,UACJ,MACA,QACiB;AACjB,QAAI,MAAM;AACV,QAAI,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAC5C,YAAM,KAAK,IAAI,gBAAgB,MAAM,EAAE,SAAS;AAChD,YAAM,GAAG,IAAI,IAAI,EAAE;AAAA,IACrB;AACA,WAAO,KAAK,QAAQ,OAAO,KAAK,QAAW,QAAQ;AAAA,EACrD;AAAA,EAEA,MAAM,aACJ,MACA,UACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,MAAM,QAAQ;AAAA,EAG5C;AAAA,EAEA,MAAM,SACJ,MACA,QACA,UAAkB,QACkB;AACpC,UAAM,UAAqC,CAAC;AAG5C,UAAM,gBAAgB,MAAM,KAAK,IAAI,MAAM,EAAE,GAAG,OAAO,CAAC;AACxD,UAAM,YAAY,cAAc,OAAO;AAGvC,QAAI,UAAW,SAAQ,KAAK,GAAG,SAAS;AAExC,UAAM,QAAQ,cAAc;AAQ5B,UAAM,gBACJ,OAAO,QAAQ,OAAO,MAAM,SAAS,WACjC,MAAM,KAAK,iBACX;AAEN,QAAI,eAAe;AACjB,UAAI,SAA6B;AACjC,aAAO,QAAQ;AACb,cAAM,WAAW,MAAM,KAAK,IAAI,MAAM;AAAA,UACpC,GAAG;AAAA,UACH,gBAAgB;AAAA,QAClB,CAAC;AACD,cAAM,OAAO,SAAS,OAAO;AAC7B,YAAI,KAAM,SAAQ,KAAK,GAAG,IAAI;AAC9B,cAAM,IAAI,SAAS;AAGnB,iBACE,GAAG,QAAQ,OAAO,EAAE,SAAS,WACzB,EAAE,KAAK,iBACP;AAAA,MACR;AACA,aAAO;AAAA,IACT;AAGA,UAAM,aAAa,OAAO,eAAe;AACzC,aAAS,OAAO,GAAG,QAAQ,YAAY,QAAQ;AAC7C,YAAM,WAAW,MAAM,KAAK,IAAI,MAAM,EAAE,GAAG,QAAQ,MAAM,OAAO,IAAI,EAAE,CAAC;AACvE,YAAM,OAAO,SAAS,OAAO;AAC7B,UAAI,KAAM,SAAQ,KAAK,GAAG,IAAI;AAAA,IAChC;AAEA,WAAO;AAAA,EACT;AACF;;;ACpUA,SAAS,cAAc,iBAAiB;;;ACAxC,SAAS,WAAW,cAAc;AAClC,SAAS,eAAe,kBAAkB;AAM1C,eAAsB,gBAAgB,UAAkB,MAAc,OAAe,KAAsB;AACzG,QAAM,UAAU,WAAW;AAC3B,QAAM,UAAU,SAAS,MAAM,EAAE,KAAK,CAAC;AACvC,QAAM,OAAO,SAAS,QAAQ;AAChC;AAKO,SAAS,oBAAoB,UAAkB,MAAc,OAAe,KAAa;AAC9F,QAAM,UAAU,WAAW;AAC3B,gBAAc,SAAS,MAAM,EAAE,KAAK,CAAC;AACrC,aAAW,SAAS,QAAQ;AAC9B;;;ADlBA,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,aAAa,gBAAgB,wBAAwB;AAI9D,IAAM,eAAe;AA4Bd,IAAM,wBAAN,MAAuD;AAAA,EAC5D,MAAM,IAAI,SAAiB,SAA8C;AACvE,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,kBAAkB;AACjD,UAAM,QAAQ,IAAI,MAAM,SAAS,OAAO;AACxC,WAAO,MAAM,YAAY,KAAK;AAAA,EAChC;AAAA,EAEA,MAAM,IAAI,SAAiB,SAAiB,OAA8B;AACxE,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,kBAAkB;AACjD,UAAM,QAAQ,IAAI,MAAM,SAAS,OAAO;AACxC,UAAM,YAAY,KAAK;AAAA,EACzB;AAAA,EAEA,MAAM,OAAO,SAAiB,SAAgC;AAC5D,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,kBAAkB;AACjD,UAAM,QAAQ,IAAI,MAAM,SAAS,OAAO;AACxC,QAAI;AACF,YAAM,eAAe;AAAA,IACvB,SAAS,KAAc;AACrB,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAI,yBAAyB,KAAK,GAAG,EAAG;AACxC,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAIA,IAAM,mBAAmB;AACzB,IAAM,WAAW;AACjB,IAAM,YAAY;AAEX,IAAM,uBAAN,MAAsD;AAAA,EACnD;AAAA,EAER,YAAY,KAAc;AACxB,SAAK,MAAM,OAAO,KAAK,QAAQ,GAAG,WAAW;AAAA,EAC/C;AAAA,EAEQ,mBAA2B;AACjC,UAAM,UAAU,KAAK,KAAK,KAAK,QAAQ;AACvC,QAAI;AACF,aAAO,OAAO,KAAK,aAAa,SAAS,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,IACjE,SAAS,KAAc;AACrB,UAAK,IAA8B,SAAS,SAAU,OAAM;AAE5D,gBAAU,KAAK,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC,YAAM,MAAM,YAAY,EAAE;AAC1B,0BAAoB,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI;AACvD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,YAAoC;AAC1C,UAAM,WAAW,KAAK,KAAK,KAAK,gBAAgB;AAChD,QAAI;AACJ,QAAI;AACF,YAAM,aAAa,UAAU,OAAO;AAAA,IACtC,SAAS,KAAc;AACrB,UAAK,IAA8B,SAAS,SAAU,OAAM;AAC5D,aAAO,CAAC;AAAA,IACV;AACA,UAAM,EAAE,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,GAAG;AAKxC,UAAM,MAAM,KAAK,iBAAiB;AAClC,UAAM,WAAW,iBAAiB,WAAW,KAAK,OAAO,KAAK,IAAI,KAAK,CAAC;AACxE,aAAS,WAAW,OAAO,KAAK,KAAK,KAAK,CAAC;AAC3C,QAAI,YAAY,SAAS,OAAO,MAAM,OAAO,OAAO;AACpD,iBAAa,SAAS,MAAM,OAAO;AACnC,WAAO,KAAK,MAAM,SAAS;AAAA,EAC7B;AAAA,EAEQ,WAAW,OAAqC;AACtD,cAAU,KAAK,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC,UAAM,MAAM,KAAK,iBAAiB;AAClC,UAAM,KAAK,YAAY,EAAE;AACzB,UAAM,SAAS,eAAe,WAAW,KAAK,EAAE;AAChD,QAAI,YAAY,OAAO,OAAO,KAAK,UAAU,KAAK,GAAG,SAAS,KAAK;AACnE,iBAAa,OAAO,MAAM,KAAK;AAC/B,UAAM,MAAM,OAAO,WAAW;AAC9B,UAAM,WAAW,KAAK,KAAK,KAAK,gBAAgB;AAChD;AAAA,MACE;AAAA,MACA,KAAK,UAAU,EAAE,IAAI,GAAG,SAAS,KAAK,GAAG,KAAK,IAAI,SAAS,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI;AAAA,IAC1F;AAAA,EACF;AAAA,EAEQ,SAAS,SAAiB,SAAyB;AACzD,WAAO,GAAG,OAAO,IAAI,OAAO;AAAA,EAC9B;AAAA,EAEA,MAAM,IAAI,SAAiB,SAA8C;AACvE,UAAM,QAAQ,KAAK,UAAU;AAC7B,WAAO,MAAM,KAAK,SAAS,SAAS,OAAO,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,IAAI,SAAiB,SAAiB,OAA8B;AACxE,UAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,KAAK,SAAS,SAAS,OAAO,CAAC,IAAI;AACzC,SAAK,WAAW,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,OAAO,SAAiB,SAAgC;AAC5D,UAAM,QAAQ,KAAK,UAAU;AAC7B,WAAO,MAAM,KAAK,SAAS,SAAS,OAAO,CAAC;AAC5C,SAAK,WAAW,KAAK;AAAA,EACvB;AACF;AAIO,IAAM,kBAAN,MAAiD;AAAA,EAItD,YACU,SACA,WACR;AAFQ;AACA;AAER,SAAK,SAAS;AAAA,EAChB;AAAA,EARQ;AAAA,EACA,SAAS;AAAA,EAST,SAAS,KAAoB;AACnC,QAAI,KAAK,OAAQ,OAAM;AACvB,SAAK,SAAS;AACd,SAAK,SAAS,KAAK;AACnB,YAAQ;AAAA,MACN,wCAAwC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC1F;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,SAAiB,SAA8C;AACvE,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,IAAI,SAAS,OAAO;AAAA,IAC/C,SAAS,KAAK;AACZ,WAAK,SAAS,GAAG;AACjB,aAAO,KAAK,OAAO,IAAI,SAAS,OAAO;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,SAAiB,SAAiB,OAA8B;AACxE,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,IAAI,SAAS,SAAS,KAAK;AAAA,IACtD,SAAS,KAAK;AACZ,WAAK,SAAS,GAAG;AACjB,aAAO,KAAK,OAAO,IAAI,SAAS,SAAS,KAAK;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,SAAiB,SAAgC;AAC5D,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,OAAO,SAAS,OAAO;AAAA,IAClD,SAAS,KAAK;AACZ,WAAK,SAAS,GAAG;AACjB,aAAO,KAAK,OAAO,OAAO,SAAS,OAAO;AAAA,IAC5C;AAAA,EACF;AACF;AAUO,SAAS,qBAAqBC,YAAqC;AACxE,MAAIA,YAAW;AACb,WAAO,IAAI,qBAAqBA,UAAS;AAAA,EAC3C;AACA,SAAO,IAAI;AAAA,IACT,IAAI,sBAAsB;AAAA,IAC1B,IAAI,qBAAqB;AAAA,EAC3B;AACF;AAIO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAoB,SAA0B;AAA1B;AAAA,EAA2B;AAAA,EAE/C,MAAM,IAAI,OAAsD;AAC9D,UAAM,MAAM,MAAM,KAAK,QAAQ,IAAI,cAAc,KAAK;AACtD,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB;AAAA,EAEA,MAAM,IAAI,OAAe,YAA6C;AACpE,UAAM,KAAK,QAAQ,IAAI,cAAc,OAAO,KAAK,UAAU,UAAU,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,OAAO,OAA8B;AACzC,UAAM,KAAK,QAAQ,OAAO,cAAc,KAAK;AAAA,EAC/C;AAAA,EAEA,eAAe,UAAoC;AACjD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,WAAW,eAAe,QAAQ;AAAA,MAClC,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AElPA,SAAS,UAAU,aAAa;AAEhC,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAGxB,IAAM,cAAc;AAEb,SAAS,mBAA2B;AACzC,SAAOD,MAAKC,SAAQ,GAAG,WAAW;AACpC;AAEA,eAAsB,WAAWC,YAAqC;AACpE,QAAM,MAAMA,cAAa,iBAAiB;AAC1C,MAAI;AACF,UAAM,MAAM,MAAM,SAASF,MAAK,KAAK,WAAW,GAAG,OAAO;AAC1D,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO,EAAE,YAAY,CAAC,EAAE;AAAA,EAC1B;AACF;AAEA,eAAsB,YAAY,QAAgBE,YAAmC;AACnF,QAAM,MAAMA,cAAa,iBAAiB;AAC1C,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,gBAAgBF,MAAK,KAAK,WAAW,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AACtF;AAEA,eAAsB,aACpBE,YACA,WACe;AACf,QAAM,SAAS,MAAM,WAAWA,UAAS;AACzC,SAAO,WAAW,UAAU,MAAM,IAAI;AACtC,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,UAAU,UAAU;AAAA,EAC7B;AACA,QAAM,YAAY,QAAQA,UAAS;AACrC;AAEA,eAAsB,gBACpBA,YACA,OACe;AACf,QAAM,SAAS,MAAM,WAAWA,UAAS;AACzC,SAAO,OAAO,WAAW,KAAK;AAC9B,MAAI,OAAO,YAAY,OAAO;AAC5B,UAAM,YAAY,OAAO,KAAK,OAAO,UAAU;AAC/C,WAAO,UAAU,UAAU,SAAS,IAAI,UAAU,CAAC,IAAI;AAAA,EACzD;AACA,QAAM,YAAY,QAAQA,UAAS;AACrC;;;ACrCA,eAAsB,cACpB,UAAyB,CAAC,GACD;AACzB,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,UAAU;AACZ,WAAO,IAAI,eAAe;AAAA,MACxB,OAAO;AAAA,MACP,UAAU,eAAe,QAAQ;AAAA,MACjC,OAAO,QAAQ,IAAI,mBAAmB;AAAA,MACtC,SAAS,QAAQ,IAAI,yBAAyB;AAAA,MAC9C,SAAS,QAAQ;AAAA,MACjB,YAAY,QAAQ,UAAU,QAAQ,IAAI;AAAA,MAC1C,WAAW,QAAQ,UACf,SAAS,QAAQ,SAAS,EAAE,IAAI,MAChC;AAAA,IACN,CAAC;AAAA,EACH;AAEA,QAAMC,aAAY,QAAQ,IAAI;AAC9B,QAAM,SAAS,MAAM,WAAWA,UAAS;AACzC,QAAM,QAAQ,QAAQ,aAAa,OAAO;AAC1C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,aAAa,OAAO,WAAW,CAAC,OAAO,WAAW,KAAK,GAAG;AACrE,UAAM,IAAI;AAAA,MACR,sBAAsB,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,gBAAgB,qBAAqBA,UAAS,CAAC;AACjE,QAAM,OAAO,MAAM,MAAM,IAAI,KAAK;AAClC,MAAI,CAAC,MAAM;AACT,UAAM,IAAI;AAAA,MACR,uCAAuC,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO,IAAI,eAAe;AAAA,IACxB,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK;AAAA,IACf,OAAO,KAAK;AAAA,IACZ,SAAS,QAAQ,IAAI,yBAAyB;AAAA,IAC9C,SAAS,QAAQ;AAAA,IACjB,YAAY,QAAQ,UAAU,QAAQ,IAAI;AAAA,IAC1C,WAAW,QAAQ,UACf,SAAS,QAAQ,SAAS,EAAE,IAAI,MAChC;AAAA,EACN,CAAC;AACH;AAEO,SAAS,eAAe,QAA0C;AACvE,SAAO,OAAO;AAAA,IACZ,OAAO,IAAI,CAAC,MAAM;AAChB,YAAM,KAAK,EAAE,QAAQ,GAAG;AACxB,UAAI,OAAO,IAAI;AACb,cAAM,IAAI;AAAA,UACR,2BAA2B,CAAC;AAAA,QAC9B;AAAA,MACF;AACA,aAAO,CAAC,EAAE,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,CAAC;AAAA,IACzC,CAAC;AAAA,EACH;AACF;AAEO,SAAS,gBAAgB,IAAqB;AACnD,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,IAAI,OAAO,OAAO,WAAW,KAAK,OAAO,EAAE;AACjD,MAAI,MAAM,CAAC,EAAG,QAAO,OAAO,EAAE;AAC9B,SAAO,IAAI,KAAK,IAAI,GAAI,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACrD;;;ACvDO,SAAS,OACd,MACA,MACA,eACA,WACM;AAEN,MAAI,KAAK,IAAI;AACX,UAAM,WAAW,QAAQ,MAAM,KAAK,EAAE;AACtC,QAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,iBAAW,QAAQ,UAAU;AAC3B,gBAAQ,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,MAClC;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,KAAK,UAAU,QAAQ,CAAC;AAAA,IACtC;AACA;AAAA,EACF;AAGA,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,WAAW,IAAI,CAAC;AAC5B;AAAA,EACF;AAGA,MAAI,KAAK,OAAO;AACd,QAAI,WAAW;AACb,iBAAW,QAAQ,WAAW;AAC5B,gBAAQ,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,MAClC;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,IAClC;AACA;AAAA,EACF;AAGA,MAAI,KAAK,OAAO;AACd,YAAQ,IAAI,cAAc,CAAC;AAC3B;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ,OAAO,OAAO;AACzB,QAAI,WAAW;AACb,iBAAW,QAAQ,WAAW;AAC5B,gBAAQ,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,MAClC;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,IAClC;AACA;AAAA,EACF;AAGA,UAAQ,IAAI,cAAc,CAAC;AAC7B;;;ACzFA,SAAS,gBAAAC,qBAAoB;AAGtB,SAAS,iBACd,QACA,OACyB;AACzB,QAAM,SAAkC,CAAC;AACzC,aAAW,SAAS,QAAQ;AAC1B,UAAM,UAAU,MAAM,QAAQ,GAAG;AACjC,QAAI,YAAY,IAAI;AAClB,YAAM,IAAI;AAAA,QACR,2BAA2B,KAAK;AAAA,MAClC;AAAA,IACF;AACA,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO;AAClC,UAAM,WAAW,MAAM,MAAM,UAAU,CAAC;AAExC,QAAI,OAAO;AACT,UAAI,aAAa,OAAQ,QAAO,GAAG,IAAI;AAAA,eAC9B,aAAa,QAAS,QAAO,GAAG,IAAI;AAAA,eACpC,aAAa,OAAQ,QAAO,GAAG,IAAI;AAAA,eACnC,SAAS,WAAW,GAAG,GAAG;AACjC,cAAM,WAAW,SAAS,MAAM,CAAC;AACjC,eAAO,GAAG,IAAIC,cAAa,UAAU,OAAO;AAAA,MAC9C,WAAW,QAAQ,KAAK,QAAQ,EAAG,QAAO,GAAG,IAAI,SAAS,UAAU,EAAE;AAAA,UACjE,QAAO,GAAG,IAAI;AAAA,IACrB,OAAO;AACL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;;;AVZA,SAAS,UAAU,OAAwC;AACzD,MAAI;AACJ,MAAI,UAAU,KAAK;AACjB,UAAM,KAAKC,cAAa,GAAG,OAAO;AAClC,UAAM;AAAA,EACR,OAAO;AACL,UAAMA,cAAa,OAAO,OAAO;AAAA,EACnC;AACA,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,UAAM,IAAI,SAAS,6BAA6B,UAAU,MAAM,UAAU,KAAK,EAAE;AAAA,EACnF;AACF;AAEO,SAAS,mBAAmB,SAAwB;AACzD,UACG,QAAQ,KAAK,EACb,YAAY,iDAAiD,EAC7D,SAAS,cAAc,qCAAqC,EAC5D;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,EACC,OAAO,yBAAyB,aAAa,EAC7C,OAAO,8BAA8B,cAAc,EACnD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,eAAe,oCAAoC,EAC1D,OAAO,UAAU,gBAAgB,EACjC,OAAO,kBAAkB,4CAA4C,EACrE,OAAO,cAAc,iCAAiC,EACtD,OAAO,aAAa,iCAAiC,EACrD,OAAO,eAAgB,UAAkB;AACxC,UAAM,UACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,OAAO;AAE1C,UAAM,eAAe,QAAQ,SAAS,CAAC;AACvC,UAAM,cAAc,QAAQ,cAAc,CAAC;AAC3C,UAAM,YAAY,QAAQ,QAAQ,UAAU,QAAQ,KAAK,IAAI,CAAC;AAC9D,UAAM,OAAO;AAAA,MACX,GAAG;AAAA,MACH,GAAG,iBAAiB,cAAc,KAAK;AAAA,MACvC,GAAG,iBAAiB,aAAa,IAAI;AAAA,IACvC;AACA,UAAM,UACJ,aAAa,SAAS,KACtB,YAAY,SAAS,KACrB,CAAC,CAAC,QAAQ;AACZ,UAAM,SAAS,QAAQ,WAAW,UAAU,SAAS;AAErD,QAAI;AACJ,QAAI,QAAQ,YAAY,OAAO,YAAY,MAAM,OAAO;AACtD,eAAS,MAAM,OAAO;AAAA,QACpB;AAAA,QACA,UAAW,OAAkC;AAAA,MAC/C;AAAA,IACF,OAAO;AACL,cAAQ,OAAO,YAAY,GAAG;AAAA,QAC5B,KAAK;AACH,mBAAS,MAAM,OAAO;AAAA,YACpB;AAAA,YACA,UAAW,OAAkC;AAAA,UAC/C;AACA;AAAA,QACF,KAAK;AACH,mBAAS,MAAM,OAAO,KAAK,UAAU,UAAU,OAAO,MAAS;AAC/D;AAAA,QACF,KAAK;AACH,mBAAS,MAAM,OAAO,IAAI,UAAU,UAAU,OAAO,MAAS;AAC9D;AAAA,QACF,KAAK;AACH,mBAAS,MAAM,OAAO,MAAM,UAAU,UAAU,OAAO,MAAS;AAChE;AAAA,QACF,KAAK;AACH,mBAAS,MAAM,OAAO,OAAO,QAAQ;AACrC;AAAA,QACF;AACE,gBAAM,IAAI,SAAS,uBAAuB,MAAM,EAAE;AAAA,MACtD;AAAA,IACF;AAGA,QAAI;AACJ,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,kBAAY;AAAA,IACd,WACE,UACA,OAAO,WAAW,YAClB,MAAM,QAAS,OAAmC,IAAI,GACtD;AACA,kBAAa,OAAmC;AAAA,IAClD;AAEA,WAAO,QAAQ,SAAS,MAAM,WAAW,MAAM,GAAG,SAAS;AAAA,EAC7D,CAAC;AACL;;;AWtHO,SAAS,qBAAqB,MAAqB;AACxD,OACG,QAAQ,OAAO,EACf,YAAY,4BAA4B,EACxC,OAAO,mBAAmB,gDAAgD,EAC1E,OAAO,YAAY,6CAA6C,EAChE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EACC,OAAO,OAAO,YAAY;AACzB,QAAI,QAAQ,OAAO;AACjB,YAAM,eAAe,QAAQ,KAAK;AAAA,IACpC,WAAW,QAAQ,QAAQ;AACzB,YAAM,IAAI,SAAS,iIAAiI,CAAC;AAAA,IACvJ,OAAO;AACL,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACL;AAEA,eAAe,eAAe,OAA8B;AAC1D,QAAM,WAAW,eAAe,KAAK;AACrC,QAAM,SAAS,IAAI,eAAe;AAAA,IAChC;AAAA,IACA;AAAA,IACA,SAAS,QAAQ,IAAI,yBAAyB;AAAA,EAChD,CAAC;AAED,QAAM,KAAK,MAAM,OAAO,IAAI,KAAK;AACjC,QAAM,MAAM,GAAG;AACf,QAAM,QAAS,KAAK,WAAuB,GAAG;AAC9C,QAAM,OAAQ,KAAK,QAAmB;AAEtC,QAAMC,aAAY,QAAQ,IAAI;AAC9B,QAAM,QAAQ,IAAI,gBAAgB,qBAAqBA,UAAS,CAAC;AACjE,QAAM,MAAM,IAAI,OAAO,EAAE,OAAO,WAAW,UAAU,QAAQ,MAAM,CAAC;AACpE,QAAM,aAAaA,YAAW,EAAE,QAAQ,OAAO,KAAK,CAAC;AAErD,UAAQ,IAAI,oBAAoB,IAAI,KAAK,KAAK,GAAG;AACnD;;;ACjDO,SAAS,eAAe,UAA4B;AACzD,QAAM,aACJ,OAAQ,SAAS,QACd,iBAAiB,aAEd,SAAS,QACT,aAAa,KACd,SAAS,QAAQ,IAAI,YAAY,KAAK,IACpC,MAAM,WAAW,EACjB,OAAO,OAAO;AAEvB,SAAO,WAAW,IAAI,CAACC,OAAMA,GAAE,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI;AACzD;AAGO,SAAS,aAAa,UAAkB,YAA4B;AACzE,QAAM,MAAM,oBAAI,IAAoB;AACpC,aAAW,UAAU,CAAC,GAAG,SAAS,MAAM,IAAI,GAAG,GAAG,WAAW,MAAM,IAAI,CAAC,GAAG;AACzE,UAAM,QAAQ,OAAO,QAAQ,GAAG;AAChC,QAAI,UAAU,GAAI;AAClB,UAAM,OAAO,OAAO,MAAM,GAAG,KAAK,EAAE,KAAK;AACzC,UAAM,QAAQ,OAAO,MAAM,QAAQ,CAAC;AACpC,QAAI,KAAM,KAAI,IAAI,MAAM,KAAK;AAAA,EAC/B;AACA,SAAO,MAAM,KAAK,IAAI,QAAQ,CAAC,EAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAC3B,KAAK,IAAI;AACd;;;AC5BA,IAAM,uBAAuB;AAEtB,SAAS,gBAAwB;AACtC,SAAO,QAAQ,IAAI,yBAAyB;AAC9C;AAEA,IAAM,oBAA4C;AAAA,EAChD,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AACV;AAEA,IAAM,qBAAqB;AAE3B,eAAsB,eACpB,KACA,YAAoB,gBACpB,MAC6C;AAC7C,QAAM,WAAW,MAAM,iBAAiB,KAAK,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;AACtE,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,mBAAmB,GAAG,KAAK,SAAS,MAAM,EAAE;AAC9D,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAM,QAAQ,mBAAmB,KAAK,IAAI;AAC1C,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,2BAA2B;AACvD,SAAO,EAAE,OAAO,MAAM,CAAC,GAAG,SAAS,eAAe,QAAQ,EAAE;AAC9D;AAiBA,eAAsB,OAAO,SAA+C;AAC1E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,YAAY;AAAA,EACd,IAAI;AAEJ,QAAM,UAAU,GAAG,OAAO;AAC1B,QAAM,EAAE,OAAO,WAAW,QAAQ,IAAI,MAAM;AAAA,IAC1C;AAAA,IACA;AAAA,EACF;AAEA,QAAM,aAAa,kBAAkB,IAAI,KAAK,kBAAkB,UAAU;AAE1E,QAAM,OAAO;AAAA,IACX,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,IACpB;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,UAAU,CAAC;AAAA,IACX,kBAAkB,CAAC;AAAA,IACnB,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,OAAO;AAAA,IACV;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,GAAI,UAAU,EAAE,QAAQ,QAAQ,IAAI,CAAC;AAAA,MACvC;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B;AAAA,IACA,EAAE,UAAU;AAAA,EACd;AAEA,MAAI,SAAS,WAAW,KAAK;AAC3B,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,MAAI,SAAS,WAAW,KAAK;AAC3B,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,MAAM,KAAK,QAAQ,KAAK,IAAI,KAAK;AACvC,UAAM,IAAI,MAAM,6BAA6B,GAAG,EAAE;AAAA,EACpD;AAEA,MAAI,SAAS,WAAW,KAAK;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,6BAA6B,SAAS,MAAM,EAAE;AAAA,EAChE;AAEA,QAAM,YAAa,MAAM,SAAS,KAAK;AACvC,SAAO,EAAE,IAAI,UAAU,IAAI,MAAM,UAAU,KAAK;AAClD;;;AC1GA,eAAsB,aACpB,SACA,OACA,UACA,YAAoB,gBACH;AAEjB,QAAM,YAAY,GAAG,OAAO;AAC5B,QAAM,EAAE,OAAO,WAAW,SAAS,eAAe,IAAI,MAAM;AAAA,IAC1D;AAAA,IACA;AAAA,IACA,EAAE,UAAU,SAAS;AAAA,EACvB;AAEA,MAAI,UAAU;AAGd,QAAM,OAAO,IAAI,gBAAgB;AAAA,IAC/B,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,EACtB,CAAC;AAED,QAAM,iBAAiB,MAAM;AAAA,IAC3B;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,GAAI,UAAU,EAAE,QAAQ,QAAQ,IAAI,CAAC;AAAA,MACvC;AAAA,MACA,MAAM,KAAK,SAAS;AAAA,MACpB,UAAU;AAAA,IACZ;AAAA,IACA,EAAE,UAAU;AAAA,EACd;AAGA,MAAI,eAAe,WAAW,OAAO,eAAe,WAAW,KAAK;AAClE,UAAM,IAAI;AAAA,MACR,sCAAsC,eAAe,MAAM;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,KAAK;AAE3D,MAAI,SAAS,SAAS,iBAAiB,GAAG;AACxC,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAEA,MAAI,SAAS,SAAS,YAAY,GAAG;AACnC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,YAAU,aAAa,SAAS,eAAe,cAAc,CAAC;AAC9D,SAAO;AACT;AAMA,eAAsB,uBACpB,SACA,SACA,OACA,cACA,YAAoB,gBACqC;AACzD,MAAI,cAAc;AAChB,WAAO,EAAE,IAAI,cAAc,MAAM,oBAAoB,SAAS,MAAM;AAAA,EACtE;AAGA,QAAM,UAAU,GAAG,OAAO,6CAA6C,KAAK;AAC5E,QAAM,eAAe,MAAM;AAAA,IACzB;AAAA,IACA;AAAA,MACE,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,EAAE,UAAU;AAAA,EACd;AAEA,MAAI,CAAC,aAAa,IAAI;AACpB,QAAI,aAAa,WAAW,KAAK;AAC/B,YAAM,IAAI;AAAA,QACR;AAAA;AAAA;AAAA,MAGF;AAAA,IACF;AACA,UAAM,IAAI,MAAM,gCAAgC,aAAa,MAAM,EAAE;AAAA,EACvE;AAEA,QAAM,OAAQ,MAAM,aAAa,KAAK;AAGtC,QAAM,WACJ,KAAK,iBACJ,MAAM,QAAQ,IAAI,IAAK,OAA+C,CAAC;AAE1E,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO;AAAA,MACL,IAAI,OAAO,SAAS,CAAC,EAAE,EAAE;AAAA,MACzB,MAAM,SAAS,CAAC,EAAE,QAAQ;AAAA,MAC1B,SAAS;AAAA,IACX;AAAA,EACF;AAKA,MAAI,YAAY;AAChB,MAAI;AACF,UAAM,EAAE,OAAO,SAAS,YAAY,IAAI,MAAM;AAAA,MAC5C,GAAG,OAAO;AAAA,MACV;AAAA,MACA,EAAE,SAAS,EAAE,QAAQ,QAAQ,EAAE;AAAA,IACjC;AACA,gBAAY;AACZ,QAAI,YAAa,WAAU,aAAa,SAAS,WAAW;AAAA,EAC9D,QAAQ;AAAA,EAER;AAEA,QAAM,iBAAiB,MAAM;AAAA,IAC3B,GAAG,OAAO;AAAA,IACV;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,GAAI,YAAY,EAAE,gBAAgB,UAAU,IAAI,CAAC;AAAA,MACnD;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM;AAAA,QACN,cAAc;AAAA,QACd,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,IACA,EAAE,UAAU;AAAA,EACd;AAEA,MAAI,CAAC,eAAe,IAAI;AACtB,QAAI,eAAe,WAAW,KAAK;AACjC,YAAM,IAAI;AAAA,QACR;AAAA;AAAA;AAAA,MAGF;AAAA,IACF;AACA,UAAM,IAAI,MAAM,iCAAiC,eAAe,MAAM,EAAE;AAAA,EAC1E;AAEA,QAAM,UAAW,MAAM,eAAe,KAAK;AAM3C,QAAMC,OAAO,QAAQ,eAAe;AACpC,SAAO;AAAA,IACL,IAAI,OAAOA,KAAI,EAAE;AAAA,IACjB,MAAMA,KAAI,QAAQ;AAAA,IAClB,SAAS;AAAA,EACX;AACF;AAKA,eAAsB,iBACpB,SACA,SACA,cACA,OACA,YAAoB,gBACH;AACjB,QAAM,MAAM,GAAG,OAAO,6DAA6D,YAAY,+BAA+B,KAAK;AACnI,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,MACE,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,EAAE,UAAU;AAAA,EACd;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,yCAAyC,SAAS,MAAM,EAAE;AAAA,EAC5E;AAEA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAQlC,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,UAAM,QAAQ,KAAK,CAAC,GAAG;AACvB,QAAI,MAAO,QAAO;AAAA,EACpB,WAAW,KAAK,cAAc;AAC5B,WAAO,KAAK;AAAA,EACd,WAAW,KAAK,uBAAuB,CAAC,GAAG,cAAc;AACvD,WAAO,KAAK,qBAAqB,CAAC,EAAE;AAAA,EACtC;AAEA,QAAM,IAAI,MAAM,wDAAwD;AAC1E;AAKA,eAAsB,SAAS,SAI5B;AACD,QAAM,EAAE,SAAS,OAAO,UAAU,OAAO,cAAc,UAAU,IAAI;AAErE,QAAM,UAAU,MAAM,aAAa,SAAS,OAAO,UAAU,SAAS;AACtE,QAAM,aAAa,MAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,OAAO,WAAW;AACpC;;;ACzQA,eAAsB,gBAAgB,SAAuD;AAC3F,QAAM,cAAc,QAAQ,IAAI;AAChC,MAAI,YAAa,QAAO;AAExB,MAAI,QAAQ,eAAe;AACzB,WAAO,UAAU;AAAA,EACnB;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EAGF;AACF;AAEA,eAAe,YAA6B;AAC1C,MAAI,QAAQ,MAAM,OAAO;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAEA,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,QAAI,OAAO;AACX,YAAQ,MAAM,YAAY,MAAM;AAChC,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAkB;AAAE,cAAQ;AAAA,IAAO,CAAC;AAC9D,YAAQ,MAAM,GAAG,OAAO,MAAM,QAAQ,KAAK,KAAK,CAAC,CAAC;AAClD,YAAQ,MAAM,GAAG,SAAS,MAAM;AAAA,EAClC,CAAC;AACH;;;ACxBO,SAAS,yBAAyB,MAAqB;AAC5D,OACG,QAAQ,WAAW,EACnB,YAAY,sDAAsD,EAClE,eAAe,mBAAmB,qBAAqB,EACvD,eAAe,oBAAoB,kCAAkC,EACrE,OAAO,yBAAyB,oDAAoD,EACpF,OAAO,oBAAoB,6DAA6D,EACxF,OAAO,OAAO,YAAY;AACzB,UAAM,UAAU,cAAc;AAE9B,QAAI;AACF,YAAM,WAAW,MAAM,gBAAgB,EAAE,eAAe,QAAQ,cAAqC,CAAC;AAEtG,YAAM,EAAE,OAAO,OAAO,WAAW,IAAI,MAAM,SAAS;AAAA,QAClD;AAAA,QACA,OAAO,QAAQ;AAAA,QACf;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,cAAc,QAAQ;AAAA,MACxB,CAAC;AAED,cAAQ,IAAI,uBAAuB;AAEnC,UAAI,WAAW,SAAS;AACtB,gBAAQ,IAAI,wBAAwB,WAAW,IAAI,SAAS,WAAW,EAAE,GAAG;AAAA,MAC9E,OAAO;AACL,gBAAQ,IAAI,sBAAsB,WAAW,IAAI,SAAS,WAAW,EAAE,GAAG;AAAA,MAC5E;AAEA,cAAQ,IAAI,uBAAuB;AAEnC,YAAMC,aAAY,QAAQ,IAAI;AAC9B,YAAM,QAAQ,IAAI,gBAAgB,qBAAqBA,UAAS,CAAC;AACjE,YAAM,MAAM,IAAI,OAAO,EAAE,OAAO,WAAW,SAAS,QAAQ,MAAM,CAAC;AACnE,YAAM,aAAaA,YAAW,EAAE,QAAQ,OAAO,MAAM,MAAM,CAAC;AAE5D,cAAQ,IAAI;AAAA,6BAAgC,KAAK,EAAE;AAAA,IACrD,SAAS,KAAc;AACrB,UAAI,eAAe,SAAU,OAAM;AACnC,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAM,IAAI,SAAS,OAAO;AAAA,IAC5B;AAAA,EACF,CAAC;AACL;;;ACpDA,OAAO,QAAQ;AAEf,SAAS,iBAA0B;AACjC,SAAO,CAAC,CAAC,QAAQ,OAAO,SAAS,CAAC,QAAQ,IAAI;AAChD;AAEA,SAAS,EAAE,IAA2B,GAAmB;AACvD,SAAO,eAAe,IAAI,GAAG,CAAC,IAAI;AACpC;AAEA,IAAM,gBAAuD;AAAA;AAAA,EAE3D,QAAQ,GAAG;AAAA,EACX,MAAM,GAAG;AAAA,EACT,WAAW,GAAG;AAAA,EACd,SAAS,GAAG;AAAA,EACZ,UAAU,GAAG;AAAA,EACb,MAAM,GAAG;AAAA;AAAA,EAET,OAAO,GAAG;AAAA,EACV,QAAQ,GAAG;AAAA,EACX,SAAS,GAAG;AAAA,EACZ,UAAU,GAAG;AAAA,EACb,OAAO,GAAG;AAAA;AAAA,EAEV,SAAS,GAAG;AAAA,EACZ,OAAO,GAAG;AAAA,EACV,SAAS,GAAG;AACd;AAEA,SAAS,eAAe,OAAuB;AAC7C,MAAI,CAAC,eAAe,EAAG,QAAO;AAC9B,QAAM,KAAK,cAAc,MAAM,YAAY,CAAC;AAC5C,SAAO,KAAK,GAAG,KAAK,IAAI;AAC1B;AAEA,SAAS,SAAS,OAAe,KAAqB;AACpD,MAAI,MAAM,UAAU,IAAK,QAAO;AAChC,SAAO,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;AACnC;AAEA,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAC3B,IAAM,kBAAkB;AAExB,IAAM,cAAc,oBAAI,IAAI;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,SAAkB;AACzB,SAAO,QAAQ,KAAK,SAAS,QAAQ;AACvC;AAOO,SAAS,MAAM,EAAE,SAAS,KAAK,GAAyB;AAC7D,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,OAAO,OAAO;AACpB,QAAM,WAAW,OAAO,kBAAkB;AAC1C,QAAM,iBAAiB,OACnB,UACA,QAAQ,MAAM,GAAG,mBAAmB;AAExC,QAAM,gBAAgB,KAAK,IAAI,CAAC,QAAQ;AACtC,UAAM,MAA8B,CAAC;AACrC,eAAW,OAAO,gBAAgB;AAChC,UAAI,GAAG,IAAI,SAAS,IAAI,GAAG,KAAK,IAAI,QAAQ;AAAA,IAC9C;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,SAAS,eAAe;AAAA,IAAI,CAAC,QACjC,KAAK;AAAA,MACH,IAAI;AAAA,MACJ,GAAG,cAAc,IAAI,CAAC,SAAS,IAAI,GAAG,KAAK,IAAI,MAAM;AAAA,IACvD;AAAA,EACF;AAEA,QAAM,YAAY,CAAC,QAAkB,aACnC,OACG,IAAI,CAAC,KAAK,MAAM;AACf,UAAM,MAAM,eAAe,CAAC;AAC5B,UAAM,SACJ,IAAI,OAAO,SAAS,IAAI,IAAI,OAAO,OAAO,CAAC,CAAC,IAAI;AAClD,QAAI,SAAU,QAAO,EAAE,GAAG,MAAM,MAAM;AACtC,QAAI,YAAY,IAAI,GAAG,EAAG,QAAO,eAAe,MAAM;AACtD,WAAO;AAAA,EACT,CAAC,EACA,KAAK,IAAI;AAEd,QAAM,SAAS,UAAU,gBAAgB,IAAI;AAC7C,QAAM,OAAO,cAAc;AAAA,IAAI,CAAC,QAC9B;AAAA,MACE,eAAe,IAAI,CAAC,QAAQ,IAAI,GAAG,KAAK,EAAE;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,QAAQ,GAAG,IAAI,EAAE,KAAK,IAAI;AACpC;AAEO,SAAS,OACd,MACQ;AACR,QAAM,UAAU,OAAO,QAAQ,IAAI,EAAE;AAAA,IACnC,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,QAAQ,MAAM;AAAA,EACjC;AACA,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;AAE5D,SAAO,QACJ,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,UAAM,QAAQ,EAAE,GAAG,MAAM,IAAI,OAAO,SAAS,CAAC;AAC9C,UAAM,SAAS,OAAO,KAAK;AAC3B,UAAM,WAAW,YAAY,IAAI,IAAI,YAAY,CAAC;AAClD,UAAM,UAAU,WAAW,eAAe,MAAM,IAAI;AACpD,WAAO,GAAG,KAAK,MAAM,OAAO;AAAA,EAC9B,CAAC,EACA,KAAK,IAAI;AACd;;;ACzHO,SAAS,sBAAsB,MAAqB;AACzD,OACG,QAAQ,QAAQ,EAChB,YAAY,oCAAoC,EAChD,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAAY;AACzB,UAAMC,aAAY,QAAQ,IAAI;AAC9B,UAAM,SAAS,MAAM,WAAWA,UAAS;AACzC,UAAM,QAAQ,OAAO;AAErB,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,UAAU,8DAA8D;AAAA,IACpF;AAEA,UAAM,QAAQ,IAAI,gBAAgB,qBAAqBA,UAAS,CAAC;AACjE,UAAM,OAAO,MAAM,MAAM,IAAI,KAAK;AAElC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,UAAU,8DAA8D;AAAA,IACpF;AAEA,UAAM,YAAY,OAAO,WAAW,KAAK;AAEzC,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,WAAW;AAAA,QACrB,QAAQ,KAAK;AAAA,QACb,gBAAgB,WAAW,QAAQ,KAAK;AAAA,QACxC,WAAW,KAAK;AAAA,QAChB,YAAY,KAAK,cAAc;AAAA,MACjC,CAAC,CAAC;AAAA,IACJ,OAAO;AACL,cAAQ,IAAI,OAAO;AAAA,QACjB,aAAa,WAAW,QAAQ,KAAK,kBAAkB,KAAK;AAAA,QAC5D,UAAU,KAAK;AAAA,QACf,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK,cAAc;AAAA,MAChC,CAAC,CAAC;AAAA,IACJ;AAAA,EACF,CAAC;AACL;;;ACzCO,SAAS,sBAAsB,MAAqB;AACzD,OACG,QAAQ,QAAQ,EAChB,YAAY,2BAA2B,EACvC,OAAO,oBAAoB,gCAAgC,EAC3D,OAAO,OAAO,YAAY;AACzB,UAAMC,aAAY,QAAQ,IAAI;AAC9B,UAAM,SAAS,MAAM,WAAWA,UAAS;AACzC,UAAM,QAAQ,QAAQ,aAAa,OAAO;AAE1C,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,UAAU,oBAAoB;AAAA,IAC1C;AAEA,UAAM,QAAQ,IAAI,gBAAgB,qBAAqBA,UAAS,CAAC;AACjE,UAAM,MAAM,OAAO,KAAK;AACxB,UAAM,gBAAgBA,YAAW,KAAK;AAEtC,UAAM,OAAO,OAAO,WAAW,KAAK,GAAG,QAAQ;AAC/C,YAAQ,IAAI,iBAAiB,IAAI,KAAK,KAAK,GAAG;AAAA,EAChD,CAAC;AACL;;;ACjBO,SAAS,sBAAsB,MAAqB;AACzD,OACG,QAAQ,QAAQ,EAChB,YAAY,iCAAiC,EAC7C,eAAe,mBAAmB,qBAAqB,EACvD,eAAe,iBAAiB,iBAAiB,EACjD,eAAe,uBAAuB,wBAAwB,EAC9D,OAAO,oBAAoB,6DAA6D,EACxF,OAAO,iBAAiB,8CAA8C,UAAU,EAChF,OAAO,OAAO,YAAY;AACzB,UAAM,aAAa,CAAC,aAAa,YAAY,QAAQ;AACrD,QAAI,CAAC,WAAW,SAAS,QAAQ,IAAc,GAAG;AAChD,YAAM,IAAI,SAAS,iBAAiB,QAAQ,IAAc,qBAAqB,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,IACxG;AAEA,UAAM,UAAU,cAAc;AAE9B,QAAI;AACF,YAAM,WAAW,MAAM,gBAAgB,EAAE,eAAe,QAAQ,cAAqC,CAAC;AAEtG,YAAM,YAAY,MAAM,OAAO;AAAA,QAC7B;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,MAAM,QAAQ;AAAA,QACd;AAAA,QACA,aAAa,QAAQ;AAAA,QACrB,MAAM,QAAQ;AAAA,MAChB,CAAC;AAED,cAAQ,IAAI,iCAAiC;AAC7C,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,MAAM,UAAU;AAAA,UAChB,gBAAgB,UAAU;AAAA,UAC1B,KAAK,GAAG,OAAO,WAAW,UAAU,EAAE;AAAA,QACxC,CAAC;AAAA,MACH;AAGA,UAAI;AACF,cAAM,EAAE,OAAO,MAAM,IAAI,MAAM,SAAS;AAAA,UACtC;AAAA,UACA,OAAO,QAAQ;AAAA,UACf;AAAA,UACA,OAAO,UAAU;AAAA,QACnB,CAAC;AAED,cAAMC,aAAY,QAAQ,IAAI;AAC9B,cAAM,QAAQ,IAAI,gBAAgB,qBAAqBA,UAAS,CAAC;AACjE,cAAM,MAAM,IAAI,OAAO,EAAE,OAAO,WAAW,SAAS,QAAQ,MAAM,CAAC;AACnE,cAAM,aAAaA,YAAW,EAAE,QAAQ,OAAO,MAAM,UAAU,KAAK,CAAC;AAErE,gBAAQ,IAAI;AAAA,6BAAgC,KAAK,EAAE;AAAA,MACrD,QAAQ;AACN,gBAAQ;AAAA,UACN;AAAA,yFAA4F,QAAQ,KAAe,aAAa,UAAU,EAAE;AAAA,QAC9I;AAAA,MACF;AAAA,IACF,SAAS,KAAc;AACrB,UAAI,eAAe,SAAU,OAAM;AACnC,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAM,IAAI,SAAS,OAAO;AAAA,IAC5B;AAAA,EACF,CAAC;AACL;;;ACpEO,SAAS,2BAA2B,MAAqB;AAC9D,OACG,QAAQ,cAAc,EACtB;AAAA,IACC;AAAA,EAiBF,EACC,eAAe,eAAe,iCAAiC,EAC/D,OAAO,OAAO,YAAY;AACzB,UAAM,MAAM,QAAQ;AAEpB,QAAI,CAAC,IAAI,SAAS,cAAc,GAAG;AACjC,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,iBAAiB,KAAK,EAAE,UAAU,SAAS,GAAG,EAAE,WAAW,eAAe,CAAC;AAElG,QAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,YAAM,WAAW,SAAS,QAAQ,IAAI,UAAU,KAAK;AACrD,UAAI,SAAS,SAAS,SAAS,KAAK,SAAS,SAAS,iBAAiB,KAAK,SAAS,SAAS,OAAO,GAAG;AACtG,gBAAQ,IAAI,8BAA8B;AAC1C;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,cAAQ,IAAI,8BAA8B;AAC1C;AAAA,IACF;AAEA,UAAM,IAAI;AAAA,MACR,iDAAiD,SAAS,MAAM;AAAA,IAElE;AAAA,EACF,CAAC;AACL;;;AC/CO,SAAS,oBAAoB,MAAqB;AACvD,OACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAElB,UAAMC,aAAY,QAAQ,IAAI;AAC9B,UAAM,SAAS,MAAM,WAAWA,UAAS;AACzC,UAAM,QAAQ,IAAI,gBAAgB,qBAAqBA,UAAS,CAAC;AAEjE,UAAM,aAAa,MAAM,QAAQ;AAAA,MAC/B,OAAO,OAAO,OAAO,UAAU,EAAE,IAAI,OAAO,OAAO;AACjD,cAAM,OAAO,MAAM,MAAM,IAAI,GAAG,MAAM;AACtC,eAAO;AAAA,UACL,QAAQ,GAAG;AAAA,UACX,MAAM,GAAG;AAAA,UACT,WAAW,MAAM,aAAa;AAAA,UAC9B,SAAS,GAAG,WAAW,OAAO;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH;AAEA;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM;AACJ,YAAI,WAAW,WAAW,GAAG;AAC3B,iBAAO;AAAA,QACT;AACA,cAAM,OAAO,WAAW,IAAI,CAAC,QAAQ;AAAA,UACnC,SAAS,GAAG,UAAU,MAAM;AAAA,UAC5B,QAAQ,GAAG;AAAA,UACX,MAAM,GAAG;AAAA,UACT,WAAW,GAAG;AAAA,QAChB,EAAE;AACF,eAAO,MAAM;AAAA,UACX,SAAS,CAAC,WAAW,UAAU,QAAQ,WAAW;AAAA,UAClD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACL;;;ACvDO,SAAS,sBAAsB,MAAqB;AACzD,OACG,QAAQ,iBAAiB,EACzB,YAAY,8BAA8B,EAC1C,OAAO,OAAO,UAAkB;AAC/B,UAAMC,aAAY,QAAQ,IAAI;AAC9B,UAAM,SAAS,MAAM,WAAWA,UAAS;AAEzC,QAAI,CAAC,OAAO,WAAW,KAAK,GAAG;AAC7B,YAAM,YAAY,OAAO,KAAK,OAAO,UAAU;AAC/C,YAAM,OACJ,UAAU,SAAS,IACf,eAAe,UAAU,KAAK,IAAI,CAAC,KACnC;AACN,YAAM,IAAI,SAAS,cAAc,KAAK,eAAe,IAAI,EAAE;AAAA,IAC7D;AAEA,WAAO,UAAU;AACjB,UAAM,YAAY,QAAQA,UAAS;AAEnC,UAAM,OAAO,OAAO,WAAW,KAAK,EAAE;AACtC,YAAQ,IAAI,eAAe,IAAI,KAAK,KAAK,GAAG;AAAA,EAC9C,CAAC;AACL;;;ACjBO,SAAS,oBAAoB,SAAwB;AAC1D,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,mCAAmC,EAC/C;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF;AAEF,uBAAqB,IAAI;AACzB,2BAAyB,IAAI;AAC7B,wBAAsB,IAAI;AAC1B,wBAAsB,IAAI;AAC1B,wBAAsB,IAAI;AAC1B,6BAA2B,IAAI;AAC/B,sBAAoB,IAAI;AACxB,wBAAsB,IAAI;AAC5B;;;AC5BO,SAAS,kBAAkB,SAAwB;AACxD,UACG,QAAQ,IAAI,EACZ,YAAY,qDAAqD,EACjE,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,eAAe,SAAS;AAE9B,UAAM,OAAQ,KAA8D,gBAAgB;AAC5F,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,KAAK,MAAM,OAAO,IAAI,KAAK;AAEjC,UAAM,MAAM,GAAG;AACf;AAAA,MAAO;AAAA,MAAI;AAAA,MAAM,MACf,OAAO;AAAA,QACL,QAAQ,GAAG;AAAA,QACX,SAAS,GAAG;AAAA,QACZ,UAAW,KAAK,WAAmC,GAAG;AAAA,QACtD,QAAQ,GAAG;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACL;;;AC3BA,OAAO,qBAAqB;AAE5B,IAAM,WAAW,IAAI,gBAAgB;AAAA,EACnC,cAAc;AAAA,EACd,kBAAkB;AACpB,CAAC;AAMM,SAAS,WAAW,MAAyC;AAClE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,SAAS,SAAS,IAAI,EAAE,KAAK;AACtC;;;ACGO,SAAS,wBAAwB,SAAwB;AAC9D,QAAM,WAAW,QACd,QAAQ,UAAU,EAClB,YAAY,iEAAiE,EAC7E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF;AAGF,WACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAe,yBAAyB,IAAI,EACnD,OAAO,SAAS,yBAAyB,EACzC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AAEvC,QAAI;AAEJ,QAAI,KAAK,KAAK;AACZ,YAAM,WAAW,MAAM,OAAO,SAAS,aAAa,EAAE,UAAU,KAAK,CAAC;AACtE,eAAS,EAAE,MAAM,QAAQ,MAAM,SAAS;AAAA,IAC1C,OAAO;AACL,YAAM,QAAQ,KAAK,SAAS;AAC5B,eAAS,MAAM,OAAO,IAAI,aAAa,EAAE,UAAU,MAAM,CAAC;AAAA,IAC5D;AAEA,UAAM,WAAW;AACjB,UAAM,QAAS,SAAS,QAAQ,CAAC;AAEjC;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM;AACJ,cAAM,OAAO,MAAM,IAAI,CAAC,OAAO;AAAA,UAC7B,IAAI,OAAO,EAAE,MAAM,EAAE;AAAA,UACrB,OAAO,OAAO,EAAE,SAAS,EAAE;AAAA,UAC3B,OAAO,OAAO,EAAE,SAAS,EAAE;AAAA,UAC3B,SAAS,gBAAgB,EAAE,UAAU;AAAA,QACvC,EAAE;AACF,eAAO,MAAM,EAAE,SAAS,CAAC,MAAM,SAAS,SAAS,SAAS,GAAG,KAAK,CAAC;AAAA,MACrE;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAGH,WACG,QAAQ,UAAU,EAClB,YAAY,iCAAiC,EAC7C,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,aAAa,EAAE,EAAE;AAEjD,WAAO,QAAQ,MAAM,MAAM;AACzB,YAAM,OAAO,OAAO;AAAA,QAClB,IAAI,OAAO,OAAO,MAAM,EAAE;AAAA,QAC1B,OAAO,OAAO,OAAO,SAAS,EAAE;AAAA,QAChC,OAAO,OAAO,OAAO,SAAS,EAAE;AAAA,QAChC,aACE,OAAO,aAAa,OAAO,OAAO,OAAO,SAAS,IAAI;AAAA,QACxD,SAAS,gBAAgB,OAAO,UAAU;AAAA,QAC1C,SAAS,gBAAgB,OAAO,UAAU;AAAA,MAC5C,CAAC;AACD,YAAM,OACJ,OAAO,OAAO,SAAS,WAAW,WAAW,OAAO,IAAI,IAAI;AAC9D,aAAO,OAAO,GAAG,IAAI;AAAA;AAAA,EAAO,IAAI,KAAK;AAAA,IACvC,CAAC;AAAA,EACH,CAAC;AAGH,WACG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,EACC,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAgC;AAAA,MACpC,GAAG,eAAe,KAAK,SAAS,CAAC,CAAC;AAAA,MAClC,GAAG,iBAAiB,KAAK,cAAc,CAAC,GAAG,IAAI;AAAA,IACjD;AAEA,QAAI,KAAK,aAAa,OAAO,KAAK,cAAc,UAAU;AACxD,YAAM,SAAS,SAAS,KAAK,WAAqB,EAAE;AACpD,UAAI,CAAC,MAAM,MAAM,EAAG,MAAK,YAAY;AAAA,IACvC;AACA,UAAM,SAAS,MAAM,OAAO,KAAK,aAAa,IAAI;AAElD;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,IAAI,OAAQ,OAAmC,MAAM,EAAE;AAAA,QACvD,OAAO,OAAQ,OAAmC,SAAS,EAAE;AAAA,QAC7D,OAAO,OAAQ,OAAmC,SAAS,EAAE;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,WACG,QAAQ,aAAa,EACrB,YAAY,8BAA8B,EAC1C;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAgC;AAAA,MACpC,GAAG,eAAe,KAAK,SAAS,CAAC,CAAC;AAAA,MAClC,GAAG,iBAAiB,KAAK,cAAc,CAAC,GAAG,IAAI;AAAA,IACjD;AACA,QAAI,KAAK,aAAa,OAAO,KAAK,cAAc,UAAU;AACxD,YAAM,SAAS,SAAS,KAAK,WAAqB,EAAE;AACpD,UAAI,CAAC,MAAM,MAAM,EAAG,MAAK,YAAY;AAAA,IACvC;AACA,UAAM,SAAS,MAAM,OAAO,IAAI,aAAa,EAAE,IAAI,IAAI;AAEvD;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,IAAI,OAAQ,OAAmC,MAAM,EAAE;AAAA,QACvD,OAAO,OAAQ,OAAmC,SAAS,EAAE;AAAA,QAC7D,OAAO,OAAQ,OAAmC,SAAS,EAAE;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,WACG,QAAQ,aAAa,EACrB,YAAY,8BAA8B,EAC1C,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,OAAO,aAAa,EAAE,EAAE;AAEpD,UAAM,UAAU;AAChB,WAAO,QAAQ,MAAM,MAAM,mBAAmB,QAAQ,MAAM,EAAE,EAAE;AAAA,EAClE,CAAC;AACL;;;ACnNO,SAAS,wBAAwB,SAAwB;AAC9D,QAAM,WAAW,QACd,QAAQ,UAAU,EAClB,YAAY,6DAA6D,EACzE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF;AAGF,WACG,QAAQ,MAAM,EACd,YAAY,eAAe,EAC3B,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAe,yBAAyB,IAAI,EACnD,OAAO,SAAS,yBAAyB,EACzC,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AAEvC,QAAI;AAEJ,QAAI,KAAK,KAAK;AACZ,YAAM,WAAW,MAAM,OAAO,SAAS,aAAa,EAAE,UAAU,KAAK,CAAC;AACtE,eAAS,EAAE,MAAM,QAAQ,MAAM,SAAS;AAAA,IAC1C,OAAO;AACL,YAAM,QAAQ,KAAK,SAAS;AAC5B,eAAS,MAAM,OAAO,IAAI,aAAa,EAAE,UAAU,MAAM,CAAC;AAAA,IAC5D;AAEA,UAAM,WAAW;AACjB,UAAM,QAAS,SAAS,QAAQ,CAAC;AAEjC;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM;AACJ,cAAM,OAAO,MAAM,IAAI,CAACC,QAAO;AAAA,UAC7B,IAAI,OAAOA,GAAE,MAAM,EAAE;AAAA,UACrB,OAAO,OAAOA,GAAE,SAAS,EAAE;AAAA,UAC3B,MAAM,OAAOA,GAAE,QAAQ,EAAE;AAAA,UACzB,MAAM,OAAOA,GAAE,QAAQ,EAAE;AAAA,UACzB,SAAS,gBAAgBA,GAAE,UAAU;AAAA,QACvC,EAAE;AACF,eAAO,MAAM;AAAA,UACX,SAAS,CAAC,MAAM,SAAS,QAAQ,QAAQ,SAAS;AAAA,UAClD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAGH,WACG,QAAQ,UAAU,EAClB,YAAY,qBAAqB,EACjC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,aAAa,EAAE,EAAE;AAEjD;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,IAAI,OAAO,OAAO,MAAM,EAAE;AAAA,QAC1B,MAAM,OAAO,QAAQ,OAAO,OAAO,OAAO,IAAI,IAAI;AAAA,QAClD,OAAO,OAAO,SAAS,OAAO,OAAO,OAAO,KAAK,IAAI;AAAA,QACrD,MAAM,OAAO,OAAO,QAAQ,EAAE;AAAA,QAC9B,SAAS,gBAAgB,OAAO,UAAU;AAAA,QAC1C,SAAS,gBAAgB,OAAO,UAAU;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,WACG,QAAQ,QAAQ,EAChB,YAAY,kBAAkB,EAC9B;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAO,eAAe,KAAK,SAAS,CAAC,CAAC;AAC5C,UAAM,SAAS,MAAM,OAAO,KAAK,aAAa,IAAI;AAClD,UAAM,IAAI;AAEV;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,IAAI,OAAO,EAAE,MAAM,EAAE;AAAA,QACrB,MAAM,EAAE,QAAQ,OAAO,OAAO,EAAE,IAAI,IAAI;AAAA,QACxC,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,QAC3C,MAAM,OAAO,EAAE,QAAQ,EAAE;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,WACG,QAAQ,aAAa,EACrB,YAAY,kBAAkB,EAC9B;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAO,eAAe,KAAK,SAAS,CAAC,CAAC;AAC5C,UAAM,SAAS,MAAM,OAAO,IAAI,aAAa,EAAE,IAAI,IAAI;AACvD,UAAM,IAAI;AAEV;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,IAAI,OAAO,EAAE,MAAM,EAAE;AAAA,QACrB,MAAM,EAAE,QAAQ,OAAO,OAAO,EAAE,IAAI,IAAI;AAAA,QACxC,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,QAC3C,MAAM,OAAO,EAAE,QAAQ,EAAE;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,WACG,QAAQ,aAAa,EACrB,YAAY,kBAAkB,EAC9B,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,OAAO,aAAa,EAAE,EAAE;AAEpD,UAAM,UAAU;AAChB,WAAO,QAAQ,MAAM,MAAM,mBAAmB,QAAQ,MAAM,EAAE,EAAE;AAAA,EAClE,CAAC;AAGH,WACG,QAAQ,QAAQ,EAChB,YAAY,yCAAyC,EACrD;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAO;AAAA,MACX,GAAG,iBAAiB,KAAK,SAAS,CAAC,GAAG,KAAK;AAAA,MAC3C,GAAG,iBAAiB,KAAK,cAAc,CAAC,GAAG,IAAI;AAAA,IACjD;AACA,UAAM,SAAS,MAAM,OAAO,KAAK,oBAAoB,IAAI;AACzD,UAAM,WAAW;AACjB,UAAM,QAAS,SAAS,QAAQ,CAAC;AAEjC;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM;AACJ,cAAM,OAAO,MAAM,IAAI,CAACA,QAAO;AAAA,UAC7B,IAAI,OAAOA,GAAE,MAAM,EAAE;AAAA,UACrB,OAAO,OAAOA,GAAE,SAAS,EAAE;AAAA,UAC3B,MAAM,OAAOA,GAAE,QAAQ,EAAE;AAAA,UACzB,MAAM,OAAOA,GAAE,QAAQ,EAAE;AAAA,UACzB,SAAS,gBAAgBA,GAAE,UAAU;AAAA,QACvC,EAAE;AACF,eAAO,MAAM;AAAA,UACX,SAAS,CAAC,MAAM,SAAS,QAAQ,QAAQ,SAAS;AAAA,UAClD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACL;;;ACtOA,SAAS,eAAe,IAAqB;AAC3C,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,IAAI,OAAO,OAAO,WAAW,KAAK,OAAO,EAAE;AACjD,MAAI,MAAM,CAAC,EAAG,QAAO,OAAO,EAAE;AAC9B,SAAO,IAAI,KAAK,IAAI,GAAI,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AACvE;AAEA,SAAS,yBAAyB,QAAyC;AACzE,QAAM,QAAkB,CAAC;AAEzB,QAAM;AAAA,IACJ,OAAO;AAAA,MACL,IAAI,OAAO,OAAO,MAAM,EAAE;AAAA,MAC1B,OAAO,OAAO,OAAO,SAAS,EAAE;AAAA,MAChC,MAAM,OAAO,OAAO,QAAQ,EAAE;AAAA,MAC9B,SAAS,gBAAgB,OAAO,UAAU;AAAA,MAC1C,SAAS,gBAAgB,OAAO,UAAU;AAAA,IAC5C,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,OAAO;AAGtB,QAAM,YAAY,OAAO;AAGzB,QAAM,YAAa,WAAW,sBAAsB,CAAC;AAKrD,MAAI,CAAC,UAAU,UAAU,WAAW,EAAG,QAAO,MAAM,KAAK,IAAI;AAE7D,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,kOAAmD;AAE9D,MAAI,QAAQ;AACV,UAAM,aAAa,OAAO,QAAQ,QAAQ;AAC1C,UAAM,aAAa,OAAO,QAAQ,QAAQ;AAC1C,UAAM,OAAO,WAAW,OAAO,IAAI;AACnC,UAAM,KAAK,EAAE;AACb,UAAM;AAAA,MACJ,GAAG,UAAU,KAAK,UAAU,UAAO,eAAe,OAAO,UAAU,CAAC;AAAA,IACtE;AACA,QAAI,KAAM,OAAM,KAAK,IAAI;AAAA,EAC3B;AAEA,aAAW,QAAQ,WAAW;AAC5B,UAAM,SAAS,KAAK;AACpB,UAAM,aAAa,QAAQ,QAAQ;AACnC,UAAM,aAAa,QAAQ,QAAQ;AACnC,UAAM,WAAW,OAAO,KAAK,aAAa,SAAS;AACnD,UAAM,OAAO,WAAW,KAAK,IAAiC;AAC9D,UAAM,KAAK,eAAe,KAAK,UAAU;AAEzC,UAAM,KAAK,EAAE;AAEb,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,cAAM,KAAK,GAAG,UAAU,KAAK,UAAU,UAAO,EAAE,EAAE;AAClD,YAAI,KAAM,OAAM,KAAK,IAAI;AACzB;AAAA,MACF,KAAK;AACH,cAAM,KAAK,UAAU,UAAU,KAAK,UAAU,UAAO,EAAE,EAAE;AACzD,YAAI,KAAM,OAAM,KAAK,IAAI;AACzB;AAAA,MACF,KAAK,cAAc;AACjB,cAAM,aAAa,KAAK;AACxB,cAAM,KAAK,gBAAgB,UAAU,KAAK,UAAU,UAAO,EAAE,EAAE;AAC/D,YAAI,YAAY,KAAM,OAAM,KAAK,eAAe,WAAW,IAAI,EAAE;AACjE;AAAA,MACF;AAAA,MACA,KAAK;AACH,cAAM,KAAK,YAAY,UAAU,KAAK,UAAU,UAAO,EAAE,EAAE;AAC3D,YAAI,KAAM,OAAM,KAAK,IAAI;AACzB;AAAA,MACF,KAAK;AACH,cAAM,KAAK,YAAY,UAAU,KAAK,UAAU,UAAO,EAAE,EAAE;AAC3D,YAAI,KAAM,OAAM,KAAK,IAAI;AACzB;AAAA,MACF;AACE,cAAM,KAAK,IAAI,QAAQ,KAAK,UAAU,KAAK,UAAU,UAAO,EAAE,EAAE;AAChE,YAAI,KAAM,OAAM,KAAK,IAAI;AACzB;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAYO,SAAS,6BAA6B,SAAwB;AACnE,QAAM,gBAAgB,QACnB,QAAQ,eAAe,EACvB,YAAY,iDAAiD,EAC7D;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AAGF,gBACG,QAAQ,MAAM,EACd,YAAY,oBAAoB,EAChC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAe,yBAAyB,IAAI,EACnD,OAAO,SAAS,yBAAyB,EACzC,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AAEvC,QAAI;AAEJ,QAAI,KAAK,KAAK;AACZ,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,EAAE,UAAU,KAAK;AAAA,QACjB;AAAA,MACF;AACA,eAAS,EAAE,MAAM,qBAAqB,eAAe,SAAS;AAAA,IAChE,OAAO;AACL,YAAM,QAAQ,KAAK,SAAS;AAC5B,eAAS,MAAM,OAAO,IAAI,kBAAkB,EAAE,UAAU,MAAM,CAAC;AAAA,IACjE;AAGA,UAAM,WAAW;AACjB,UAAM,QAAS,SAAS,iBAAiB,CAAC;AAE1C;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM;AACJ,cAAM,OAAO,MAAM,IAAI,CAACC,QAAO;AAAA,UAC7B,IAAI,OAAOA,GAAE,MAAM,EAAE;AAAA,UACrB,OAAO,OAAOA,GAAE,SAAS,EAAE;AAAA,UAC3B,MAAM,OAAOA,GAAE,QAAQ,EAAE;AAAA,UACzB,SAAS,gBAAgBA,GAAE,UAAU;AAAA,UACrC,SAAS,gBAAgBA,GAAE,UAAU;AAAA,QACvC,EAAE;AACF,eAAO,MAAM;AAAA,UACX,SAAS,CAAC,MAAM,SAAS,QAAQ,WAAW,SAAS;AAAA,UACrD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAGH,gBACG,QAAQ,UAAU,EAClB,YAAY,0BAA0B,EACtC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,kBAAkB,EAAE,EAAE;AAEtD,WAAO,QAAQ,MAAM,MAAM;AACzB,YAAM,IAAI;AACV,aAAO,yBAAyB,CAAC;AAAA,IACnC,CAAC;AAAA,EACH,CAAC;AAGH,gBACG,QAAQ,YAAY,EACpB,YAAY,yBAAyB,EACrC;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EACC,OAAO,eAAgB,IAAY;AAClC,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAO,eAAe,KAAK,SAAS,CAAC,CAAC;AAC5C,UAAM,SAAS,MAAM,OAAO,KAAK,kBAAkB,EAAE,UAAU,IAAI;AACnE,UAAM,IAAI;AAEV;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,IAAI,OAAO,EAAE,MAAM,EAAE;AAAA,QACrB,MAAM,OAAO,EAAE,QAAQ,EAAE;AAAA,QACzB,MAAM,EAAE,QAAQ,OAAO,OAAO,EAAE,IAAI,IAAI;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,gBACG,QAAQ,QAAQ,EAChB,YAAY,mDAAmD,EAC/D;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAO;AAAA,MACX,GAAG,iBAAiB,KAAK,SAAS,CAAC,GAAG,KAAK;AAAA,MAC3C,GAAG,iBAAiB,KAAK,cAAc,CAAC,GAAG,IAAI;AAAA,IACjD;AACA,UAAM,SAAS,MAAM,OAAO,KAAK,yBAAyB,IAAI;AAC9D,UAAM,WAAW;AACjB,UAAM,QAAS,SAAS,iBAAiB,CAAC;AAK1C;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM;AACJ,cAAM,OAAO,MAAM,IAAI,CAACA,QAAO;AAAA,UAC7B,IAAI,OAAOA,GAAE,MAAM,EAAE;AAAA,UACrB,OAAO,OAAOA,GAAE,SAAS,EAAE;AAAA,UAC3B,MAAM,OAAOA,GAAE,QAAQ,EAAE;AAAA,UACzB,SAAS,gBAAgBA,GAAE,UAAU;AAAA,UACrC,SAAS,gBAAgBA,GAAE,UAAU;AAAA,QACvC,EAAE;AACF,eAAO,MAAM;AAAA,UACX,SAAS,CAAC,MAAM,SAAS,QAAQ,WAAW,SAAS;AAAA,UACrD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACL;;;AChRO,SAAS,0BAA0B,SAAwB;AAChE,QAAM,aAAa,QAChB,QAAQ,aAAa,EACrB,YAAY,gCAAgC,EAC5C;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AAGF,aACG,QAAQ,MAAM,EACd,YAAY,8BAA8B,EAC1C,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAe,yBAAyB,IAAI,EACnD,OAAO,SAAS,yBAAyB,EACzC,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AAEvC,QAAI;AAEJ,QAAI,KAAK,KAAK;AACZ,YAAM,WAAW,MAAM,OAAO,SAAS,4BAA4B;AAAA,QACjE,UAAU;AAAA,MACZ,CAAC;AACD,eAAS,EAAE,MAAM,QAAQ,MAAM,SAAS;AAAA,IAC1C,OAAO;AACL,YAAM,QAAQ,KAAK,SAAS;AAC5B,eAAS,MAAM,OAAO,IAAI,4BAA4B;AAAA,QACpD,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,UAAM,WAAW;AACjB,UAAM,QAAS,SAAS,QAAQ,CAAC;AAEjC;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM;AACJ,cAAM,OAAO,MAAM,IAAI,CAACC,QAAO;AAAA,UAC7B,IAAI,OAAOA,GAAE,MAAM,EAAE;AAAA,UACrB,MAAM,OAAOA,GAAE,QAAQ,EAAE;AAAA,UACzB,aAAa,OAAOA,GAAE,eAAe,EAAE;AAAA,UACvC,SAAS,gBAAgBA,GAAE,UAAU;AAAA,QACvC,EAAE;AACF,eAAO,MAAM;AAAA,UACX,SAAS,CAAC,MAAM,QAAQ,eAAe,SAAS;AAAA,UAChD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAGH,aACG,QAAQ,UAAU,EAClB,YAAY,oCAAoC,EAChD,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,4BAA4B,EAAE,EAAE;AAEhE;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,IAAI,OAAO,OAAO,MAAM,EAAE;AAAA,QAC1B,MAAM,OAAO,OAAO,QAAQ,EAAE;AAAA,QAC9B,aACE,OAAO,eAAe,OAAO,OAAO,OAAO,WAAW,IAAI;AAAA,QAC5D,SAAS,gBAAgB,OAAO,UAAU;AAAA,QAC1C,SAAS,gBAAgB,OAAO,UAAU;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,aACG,QAAQ,QAAQ,EAChB,YAAY,iCAAiC,EAC7C;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAO,eAAe,KAAK,SAAS,CAAC,CAAC;AAC5C,UAAM,SAAS,MAAM,OAAO,KAAK,4BAA4B,IAAI;AACjE,UAAM,IAAI;AAEV;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,IAAI,OAAO,EAAE,MAAM,EAAE;AAAA,QACrB,MAAM,OAAO,EAAE,QAAQ,EAAE;AAAA,QACzB,aACE,EAAE,eAAe,OAAO,OAAO,EAAE,WAAW,IAAI;AAAA,MACpD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACL;;;AClIA,IAAM,mBAAmB,EAAE,oBAAoB,WAAW;AAU1D,SAAS,oBAAoB,OAAuB;AAClD,SAAO;AAAA,kFACyE,KAAK;AAAA,kXAC2R,KAAK;AAAA;AAEvX;AAEA,SAAS,qBAAqB,OAAuB;AACnD,SAAO;AAAA;AAAA;AAAA;AAAA,oFAI2E,KAAK;AAAA,oXAC2R,KAAK;AAAA;AAAA;AAAA;AAIzX;AAEO,SAAS,yBAAyB,SAAwB;AAC/D,QAAM,YAAY,QACf,QAAQ,WAAW,EACnB,YAAY,2DAA2D,EACvE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AAGF,YACG,QAAQ,KAAK,EACb,YAAY,wBAAwB,EACpC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,cAAc,QAAW,gBAAgB;AAEzE,UAAM,IAAI;AACV;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,SAAS,EAAE,mBAAmB,OAAO,OAAO,EAAE,eAAe,IAAI;AAAA,QACjE,aAAa,EAAE,aAAa,OAAO,OAAO,EAAE,SAAS,IAAI;AAAA,QACzD,SAAS,EAAE,cAAc,OAAO,OAAO,EAAE,UAAU,IAAI;AAAA,QACvD,cAAc,EAAE,mBAAmB,OAAO,OAAO,EAAE,eAAe,IAAI;AAAA,QACtE,oBAAoB,EAAE,+BAA+B,OAAO,OAAO,EAAE,2BAA2B,IAAI;AAAA,QACpG,uBAAuB,EAAE,kCAAkC,OAAO,OAAO,EAAE,8BAA8B,IAAI;AAAA,QAC7G,qBAAqB,EAAE,sCAAsC,OAAO,OAAO,EAAE,kCAAkC,IAAI;AAAA,QACnH,mBAAmB,EAAE,2CAA2C,OAAO,OAAO,EAAE,uCAAuC,IAAI;AAAA,QAC3H,sBAAsB,EAAE,8CAA8C,OAAO,OAAO,EAAE,0CAA0C,IAAI;AAAA,MACtI,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,YACG,QAAQ,QAAQ,EAChB,YAAY,2BAA2B,EACvC;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAO,eAAe,KAAK,SAAS,CAAC,CAAC;AAC5C,UAAM,SAAS,MAAM,OAAO,IAAI,cAAc,MAAM,gBAAgB;AAEpE,UAAM,IAAI;AACV;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,SAAS,EAAE,mBAAmB,OAAO,OAAO,EAAE,eAAe,IAAI;AAAA,QACjE,aAAa,EAAE,aAAa,OAAO,OAAO,EAAE,SAAS,IAAI;AAAA,QACzD,SAAS,EAAE,cAAc,OAAO,OAAO,EAAE,UAAU,IAAI;AAAA,QACvD,cAAc,EAAE,mBAAmB,OAAO,OAAO,EAAE,eAAe,IAAI;AAAA,QACtE,oBAAoB,EAAE,+BAA+B,OAAO,OAAO,EAAE,2BAA2B,IAAI;AAAA,QACpG,uBAAuB,EAAE,kCAAkC,OAAO,OAAO,EAAE,8BAA8B,IAAI;AAAA,QAC7G,qBAAqB,EAAE,sCAAsC,OAAO,OAAO,EAAE,kCAAkC,IAAI;AAAA,QACnH,mBAAmB,EAAE,2CAA2C,OAAO,OAAO,EAAE,uCAAuC,IAAI;AAAA,QAC3H,sBAAsB,EAAE,8CAA8C,OAAO,OAAO,EAAE,0CAA0C,IAAI;AAAA,MACtI,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,YACG,QAAQ,SAAS,EACjB,YAAY,4DAA4D,EACxE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,KAAM,MAAM,OAAO,IAAI,KAAK;AAClC,UAAM,MAAM,GAAG;AACf,UAAM,QAAQ,OAAO,KAAK,WAAW,EAAE;AAEvC,UAAM,UACJ,KAAK,WAAW,UACZ,qBAAqB,KAAK,IAC1B,oBAAoB,KAAK;AAC/B,UAAM,SAAS,KAAK,UAAU;AAC9B,WAAO,EAAE,QAAQ,QAAQ,GAAG,MAAM,MAAM,OAAO;AAAA,EACjD,CAAC;AACL;;;ACpJA,SAAS,aAAAC,kBAAiB;;;ACA1B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,gBAAgB;AACzB,OAAO,YAAY;AAsBZ,SAAS,0BAA0B,KAAoB;AAC5D,QAAM,aAAa,IAChB,QAAQ,YAAY,EACpB,YAAY,2BAA2B;AAG1C,aACG,QAAQ,MAAM,EACd,YAAY,2CAA2C,EACvD,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,mBAAmB;AACnD,UAAM,WAAW;AACjB,UAAM,QAAQ,SAAS,cAAc,CAAC;AAEtC,WAAO,OAAO,MAAM,MAAM;AACxB,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAChC,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,QACxB,MAAM,OAAO,KAAK,QAAQ,EAAE;AAAA,MAC9B,EAAE;AACF,aAAO,MAAM,EAAE,SAAS,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;AAAA,IAChD,GAAG,KAAK;AAAA,EACV,CAAC;AAGH,aACG,QAAQ,UAAU,EAClB,YAAY,uDAAuD,EACnE,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,UAAU,uBAAuB,EAAE,WAAW;AAC1E,UAAM,MAAM,IAAI,OAAO,MAAM;AAC7B,UAAM,QAAQ,IAAI,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS,gBAAgB,CAAC;AAEjF,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAEA,YAAQ,IAAI,IAAI,WAAW,KAAK,CAAC;AAAA,EACnC,CAAC;AAGH,aACG,QAAQ,eAAe,EACvB,YAAY,oCAAoC,EAChD,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,UAAkB;AACxC,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,cAAc,MAAMC,UAAS,QAAQ;AAC3C,UAAM,WAAW,IAAI,SAAS;AAC9B,UAAM,OAAO,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,MAAM,qBAAqB,CAAC;AACnE,aAAS,OAAO,aAAa,MAAM,SAAS,QAAQ,CAAC;AACrD,UAAM,SAAS,MAAM,OAAO,aAAa,mBAAmB,QAAQ;AACpE,WAAO,QAAQ,MAAM,MAAM,WAAW,MAAM,CAAC;AAAA,EAC/C,CAAC;AACL;;;ACrEO,SAAS,8BAA8B,KAAoB;AAChE,QAAM,iBAAiB,IACpB,QAAQ,iBAAiB,EACzB,YAAY,gCAAgC;AAG/C,iBACG,QAAQ,MAAM,EACd,YAAY,gDAAgD,EAC5D,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,mBAAmB;AACnD,UAAM,WAAW;AACjB,UAAM,QAAQ,SAAS,mBAAmB,CAAC;AAE3C,WAAO,OAAO,MAAM,MAAM;AACxB,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAChC,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,QACxB,MAAM,OAAO,KAAK,QAAQ,EAAE;AAAA,MAC9B,EAAE;AACF,aAAO,MAAM,EAAE,SAAS,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;AAAA,IAChD,GAAG,KAAK;AAAA,EACV,CAAC;AAGH,iBACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,eAAe,2BAA2B,mCAAmC,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAa,EACtI,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AAEvC,UAAM,SAAS,KAAK,SAAS,CAAC;AAC9B,UAAM,OAA+B,CAAC;AACtC,eAAW,KAAK,QAAQ;AACtB,YAAM,KAAK,EAAE,QAAQ,GAAG;AACxB,UAAI,OAAO,GAAI,OAAM,IAAI,MAAM,yBAAyB,CAAC,sBAAsB;AAC/E,WAAK,EAAE,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC;AAAA,IACvC;AAEA,UAAM,SAAS,MAAM,OAAO,KAAK,4BAA4B,IAAI;AAEjE;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,MAAM,OAAO,OAAO,MAAM,EAAE;AAAA,QAC5B,QAAQ,OAAO,OAAO,QAAQ,EAAE;AAAA,QAChC,UAAU,OAAO,UAAU,OAAO,OAAO,OAAO,MAAM,IAAI;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,iBACG,QAAQ,UAAU,EAClB,YAAY,iCAAiC,EAC7C,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,4BAA4B,EAAE,WAAW;AAEzE;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,MAAM,OAAO,OAAO,MAAM,EAAE;AAAA,QAC5B,QAAQ,OAAO,OAAO,QAAQ,EAAE;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACL;;;AC/EO,SAAS,wBAAwB,KAAoB;AAC1D,QAAM,WAAW,IACd,QAAQ,UAAU,EAClB,YAAY,yBAAyB;AAGxC,WACG,QAAQ,MAAM,EACd,YAAY,yCAAyC,EACrD,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,mBAAmB;AACnD,UAAM,WAAW;AACjB,UAAM,QAAQ,SAAS,YAAY,CAAC;AAEpC,WAAO,OAAO,MAAM,MAAM;AACxB,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAChC,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,QACxB,MAAM,OAAO,KAAK,QAAQ,EAAE;AAAA,MAC9B,EAAE;AACF,aAAO,MAAM,EAAE,SAAS,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;AAAA,IAChD,GAAG,KAAK;AAAA,EACV,CAAC;AAGH,WACG,QAAQ,QAAQ,EAChB,YAAY,wBAAwB,EACpC;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,GAAW,QAAkB,CAAC,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,EACC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,EACC,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAO,eAAe,KAAK,SAAS,CAAC,CAAC;AAC5C,UAAM,SAAS,MAAM,OAAO,KAAK,qBAAqB,IAAI;AAC1D,UAAM,IAAI;AAEV;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,IAAI,OAAO,EAAE,MAAM,EAAE;AAAA,QACrB,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,QAC3C,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,QAC3C,SAAS,EAAE,WAAW,OAAO,OAAO,EAAE,OAAO,IAAI;AAAA,MACnD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,WACG,QAAQ,UAAU,EAClB,YAAY,2DAA2D,EACvE,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAO,MAAM,OAAO,QAAQ,qBAAqB,EAAE,WAAW;AACpE,WAAO,EAAE,QAAQ,QAAQ,SAAS,KAAK,GAAG,MAAM,MAAM,IAAI;AAAA,EAC5D,CAAC;AACL;;;AC3FO,SAAS,0BAA0B,KAAoB;AAC5D,QAAM,aAAa,IAChB,QAAQ,YAAY,EACpB,YAAY,2BAA2B;AAG1C,aACG,QAAQ,MAAM,EACd,YAAY,yBAAyB,EACrC,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,qBAAqB;AACrD,UAAM,QAAS,MAAM,QAAQ,MAAM,IAAI,SAAU,OAAwC,cAAc,CAAC;AAExG,WAAO,OAAO,MAAM,MAAM;AACxB,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAChC,MAAM,OAAO,KAAK,QAAQ,EAAE;AAAA,QAC5B,MAAM,OAAO,KAAK,QAAQ,EAAE;AAAA,QAC5B,aAAa,OAAO,KAAK,eAAe,EAAE;AAAA,MAC5C,EAAE;AACF,aAAO,MAAM,EAAE,SAAS,CAAC,QAAQ,QAAQ,aAAa,GAAG,KAAK,CAAC;AAAA,IACjE,GAAG,KAAK;AAAA,EACV,CAAC;AACL;;;AC7BO,SAAS,yBAAyB,KAAoB;AAC3D,QAAM,YAAY,IACf,QAAQ,WAAW,EACnB,YAAY,0BAA0B;AAGzC,YACG,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,oBAAoB;AACpD,UAAM,QAAS,MAAM,QAAQ,MAAM,IAAI,SAAU,OAAsC,aAAa,CAAC;AAErG,WAAO,OAAO,MAAM,MAAM;AACxB,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAChC,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,QACxB,MAAM,OAAO,KAAK,QAAQ,EAAE;AAAA,MAC9B,EAAE;AACF,aAAO,MAAM,EAAE,SAAS,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;AAAA,IAChD,GAAG,KAAK;AAAA,EACV,CAAC;AACL;;;AC3BO,SAAS,yBAAyB,KAAoB;AAC3D,QAAM,YAAY,IACf,QAAQ,WAAW,EACnB,YAAY,0BAA0B;AAGzC,YACG,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,oBAAoB;AACpD,UAAM,QAAS,MAAM,QAAQ,MAAM,IAAI,SAAU,OAAsC,aAAa,CAAC;AAErG,WAAO,OAAO,MAAM,MAAM;AACxB,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAChC,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,QACxB,OAAO,OAAO,KAAK,SAAS,EAAE;AAAA,QAC9B,OAAO,OAAO,KAAK,SAAS,EAAE;AAAA,QAC9B,SAAS,OAAO,KAAK,gBAAgB,EAAE;AAAA,MACzC,EAAE;AACF,aAAO,MAAM,EAAE,SAAS,CAAC,MAAM,SAAS,SAAS,SAAS,GAAG,KAAK,CAAC;AAAA,IACrE,GAAG,KAAK;AAAA,EACV,CAAC;AAGH,YACG,QAAQ,UAAU,EAClB,YAAY,sBAAsB,EAClC,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,IAAY;AAClC,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,sBAAsB,EAAE,EAAE;AAC1D,UAAM,IAAI;AAEV;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,MAAM,OAAO,EAAE,MAAM,EAAE;AAAA,QACvB,SAAS,OAAO,EAAE,SAAS,EAAE;AAAA,QAC7B,SAAS,OAAO,EAAE,SAAS,EAAE;AAAA,QAC7B,WAAW,EAAE,gBAAgB,OAAO,OAAO,EAAE,YAAY,IAAI;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACL;;;ACjCO,SAAS,2BAA2B,KAAoB;AAC7D,QAAM,cAAc,IACjB,QAAQ,aAAa,EACrB,YAAY,4BAA4B;AAG3C,cACG,QAAQ,qBAAqB,EAC7B,YAAY,kDAAkD,EAC9D,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,aAAqB;AAC3C,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,OAAO,MAAM,OAAO,QAAQ,uBAAuB,WAAW,cAAc;AAClF,YAAQ,IAAI,IAAI;AAAA,EAClB,CAAC;AAGH,cACG,QAAQ,8BAA8B,EACtC,YAAY,4CAA4C,EACxD,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,aAAqB,QAA4B;AACvE,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AAEvC,QAAI;AACJ,QAAI,QAAQ;AACV,eAAS,MAAM,OAAO,KAAK,uBAAuB,WAAW,gBAAgB,MAAM,QAAQ,CAAC,CAAC;AAAA,IAC/F,OAAO;AACL,eAAS,MAAM,OAAO,KAAK,uBAAuB,WAAW,oBAAoB,CAAC,CAAC;AAAA,IACrF;AAEA,UAAM,IAAI;AAEV,WAAO,QAAQ,MAAM,MAAM;AAEzB,UAAI,EAAE,YAAY,MAAM,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,SAAS,GAAG;AACpE,cAAM,OAAO,EAAE,SAAS,IAAI,CAAC,OAAO;AAAA,UAClC,QAAQ,OAAO,EAAE,UAAU,EAAE;AAAA,UAC7B,SAAS,OAAO,EAAE,WAAW,EAAE;AAAA,UAC/B,MAAM,OAAO,EAAE,mBAAmB,EAAE;AAAA,UACpC,QAAQ,OAAO,EAAE,UAAU,EAAE;AAAA,QAC/B,EAAE;AACF,eAAO,MAAM,EAAE,SAAS,CAAC,UAAU,WAAW,QAAQ,QAAQ,GAAG,KAAK,CAAC;AAAA,MACzE,OAAO;AACL,cAAM,QAAQ,EAAE;AAChB,YAAI,UAAU,QAAW;AACvB,iBAAO,WAAW,KAAK;AAAA,QACzB,OAAO;AACL,iBAAO,OAAO;AAAA,YACZ,gBAAgB,OAAO,EAAE,gBAAgB,EAAE;AAAA,UAC7C,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAGH,cACG,QAAQ,iBAAiB,EACzB,YAAY,oCAAoC,EAChD,OAAO,UAAU,gBAAgB,EACjC,OAAO,UAAU,0BAA0B,EAC3C,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,OAAe;AACrC,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AAEvC,QAAI,SAAS,MAAM,OAAO,IAAI,iBAAiB,KAAK,EAAE;AAEtD,QAAI,KAAK,MAAM;AACb,YAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAO,OAAO,WAAW,aAAa,OAAO,WAAW,WAAW;AACjE,YAAI,KAAK,IAAI,IAAI,UAAU;AACzB,gBAAM,IAAI;AAAA,YACR,sCAAsC,6BAA6B,GAAI,mBACvD,OAAO,MAAM,0CAA0C,KAAK;AAAA,UAC9E;AAAA,QACF;AACA,cAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,GAAI,CAAC;AAC1C,iBAAS,MAAM,OAAO,IAAI,iBAAiB,KAAK,EAAE;AAAA,MACpD;AAAA,IACF;AAEA;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,UAAU,OAAO,OAAO,UAAU,EAAE;AAAA,QACpC,UAAU,OAAO,OAAO,UAAU,EAAE;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGH,cACG,QAAQ,yBAAyB,EACjC,YAAY,sCAAsC,EAClD,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAgB,aAAqB;AAC3C,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,KAAK,uBAAuB,WAAW,yBAAyB,CAAC,CAAC;AAC9F,UAAM,IAAI;AAEV;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM,MACnB,OAAO;AAAA,QACL,UAAU,OAAO,EAAE,UAAU,EAAE;AAAA,QAC/B,gBAAgB,OAAO,EAAE,gBAAgB,EAAE;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACL;;;AC7HA,eAAsB,gBAAgB,SAMZ;AACxB,QAAM,EAAE,OAAO,UAAU,OAAO,gBAAgB,YAAY,eAAe,IAAI;AAC/E,QAAM,UAAU,cAAc;AAG9B,MAAI,UAAU,MAAM,aAAa,SAAS,OAAO,UAAU,SAAS;AAGpE,MAAI,gBAAgB;AAClB,UAAM,iBAAiB,MAAM,iBAAiB,gBAAgB;AAAA,MAC5D,SAAS,EAAE,QAAQ,QAAQ;AAAA,MAC3B,UAAU;AAAA,IACZ,GAAG,EAAE,UAAU,CAAC;AAChB,UAAM,aAAaC,gBAAe,cAAc;AAChD,QAAI,WAAY,WAAUC,cAAa,SAAS,UAAU;AAAA,EAC5D;AAGA,QAAM,cAAc,MAAM,iBAAiB,GAAG,OAAO,WAAW,KAAK,IAAI;AAAA,IACvE,SAAS,EAAE,QAAQ,QAAQ;AAAA,EAC7B,GAAG,EAAE,UAAU,CAAC;AAChB,QAAM,aAAaD,gBAAe,WAAW;AAC7C,MAAI,WAAY,WAAUC,cAAa,SAAS,UAAU;AAE1D,QAAM,OAAO,MAAM,YAAY,KAAK;AACpC,QAAM,YAAY,gDAAgD,KAAK,IAAI;AAC3E,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,oEAAoE;AAAA,EACtF;AAEA,SAAO,EAAE,SAAS,MAAM,UAAU,CAAC,GAAG,MAAM;AAC9C;AAKA,eAAsB,aACpB,SACA,MACA,UAII,CAAC,GACuC;AAC5C,QAAM,EAAE,SAAS,OAAO,MAAM,YAAY,eAAe,IAAI;AAC7D,QAAM,UAAU,cAAc;AAE9B,QAAM,UAAkC;AAAA,IACtC,QAAQ;AAAA,IACR,gBAAgB,QAAQ;AAAA,IACxB,QAAQ,QAAQ;AAAA,EAClB;AAEA,QAAM,eAA4B,EAAE,QAAQ,QAAQ;AAEpD,MAAI,SAAS,QAAW;AACtB,YAAQ,cAAc,IAAI;AAC1B,iBAAa,OAAO,KAAK,UAAU,IAAI;AAAA,EACzC;AAEA,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,OAAO,GAAG,IAAI;AAAA,IACjB;AAAA,IACA,EAAE,UAAU;AAAA,EACd;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,QAAQ,SAAS,QAAQ,KAAK;AACzC;AAEA,SAASD,gBAAe,UAA4B;AAClD,QAAM,aACJ,OAAQ,SAAS,QAAyD,iBAAiB,aACtF,SAAS,QAAwD,aAAa,KAC9E,SAAS,QAAQ,IAAI,YAAY,KAAK,IAAI,MAAM,WAAW,EAAE,OAAO,OAAO;AAClF,SAAO,WAAW,IAAI,CAACE,OAAcA,GAAE,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI;AACjE;AAEA,SAASD,cAAa,UAAkB,YAA4B;AAClE,QAAM,MAAM,oBAAI,IAAoB;AACpC,aAAW,UAAU,CAAC,GAAG,SAAS,MAAM,IAAI,GAAG,GAAG,WAAW,MAAM,IAAI,CAAC,GAAG;AACzE,UAAM,QAAQ,OAAO,QAAQ,GAAG;AAChC,QAAI,UAAU,GAAI;AAClB,UAAM,OAAO,OAAO,MAAM,GAAG,KAAK,EAAE,KAAK;AACzC,UAAM,QAAQ,OAAO,MAAM,QAAQ,CAAC;AACpC,QAAI,KAAM,KAAI,IAAI,MAAM,KAAK;AAAA,EAC/B;AACA,SAAO,MAAM,KAAK,IAAI,QAAQ,CAAC,EAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAC3B,KAAK,IAAI;AACd;;;AClHO,SAAS,yBAAyB,KAAoB;AAC3D,MACG,QAAQ,QAAQ,EAChB;AAAA,IACC;AAAA,EAGF,EACC,eAAe,mBAAmB,qBAAqB,EACvD,OAAO,oBAAoB,qDAAqD,EAChF,OAAO,4BAA4B,oDAAoD,EACvF,OAAO,aAAa,sBAAsB,EAC1C,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,WAAW,MAAM,gBAAgB,EAAE,eAAe,KAAK,cAAc,CAAC;AAE5E,UAAME,aAAY,QAAQ,IAAI;AAC9B,UAAM,SAAS,MAAM,WAAWA,UAAS;AACzC,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,cAAc,KAAK,EAAE;AACjC,cAAQ,IAAI,UAAU,KAAK,KAAK,EAAE;AAAA,IACpC;AAGA,YAAQ,IAAI,eAAe;AAC3B,UAAM,UAAU,MAAM,gBAAgB;AAAA,MACpC,OAAO,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,gBAAgB,KAAK;AAAA,IACvB,CAAC;AAGD,YAAQ,IAAI,iBAAiB;AAC7B,UAAM,QAAQ,MAAM,aAAa,SAAS,qBAAqB;AAAA,MAC7D,QAAQ;AAAA,MACR,MAAM,EAAE,QAAQ,MAAM;AAAA,IACxB,CAAC;AAED,QAAI,MAAM,WAAW,KAAK;AACxB,cAAQ,IAAI,qBAAgB;AAAA,IAC9B,WAAW,MAAM,WAAW,KAAK;AAC/B,cAAQ,IAAI,6BAAwB;AAAA,IACtC,OAAO;AACL,YAAM,IAAI;AAAA,QACR,sBAAsB,MAAM,MAAM,SACjC,MAAM,WAAW,MACd,6DACA,KAAK,UAAU,MAAM,IAAI;AAAA,MAC/B;AAAA,IACF;AAGA,YAAQ,IAAI,+BAA+B;AAC3C,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA,uDAAuD,KAAK;AAAA,IAC9D;AAEA,QAAI,QAAQ,WAAW,KAAK;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,KAAK;AAC1B,YAAM,IAAI;AAAA,QACR,8BAA8B,QAAQ,MAAM,MAAM,KAAK,UAAU,QAAQ,IAAI,CAAC;AAAA,MAChF;AAAA,IACF;AAEA,UAAM,cAAc,QAAQ;AAC5B,UAAM,YAAY,YAAY;AAC9B,UAAM,QAAQ,YAAY;AAE1B,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,iBAAiB,SAAS,oBAAoB,KAAK,EAAE;AAAA,IACnE;AAGA,QAAI,UAAU,GAAG;AACf,cAAQ,IAAI,2BAAsB;AAAA,IACpC,OAAO;AACL,cAAQ,IAAI,mBAAmB;AAC/B,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA,mCAAmC,SAAS,oBAAoB,KAAK;AAAA,QACrE,EAAE,QAAQ,OAAO,MAAM,CAAC,EAAE;AAAA,MAC5B;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,SAAS,SAAS;AACxB,YAAI,OAAO,UAAU,GAAG;AACtB,kBAAQ,IAAI,uBAAkB;AAAA,QAChC,OAAO;AACL,kBAAQ,IAAI,oCAA+B,OAAO,KAAK,EAAE;AAAA,QAC3D;AAAA,MACF,OAAO;AACL,cAAM,IAAI;AAAA,UACR,0BAA0B,SAAS,MAAM,MAAM,KAAK,UAAU,SAAS,IAAI,CAAC;AAAA,QAC9E;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI;AAAA,2BAA8B,KAAK,EAAE;AAAA,EACnD,CAAC;AACL;;;ATtFA,SAAS,oBAAoB,OAAe,OAAmC;AAC7E,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,GAAG,KAAK;AAAA;AAAA,EACjB;AACA,QAAM,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAChC,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,IACxB,MAAM,OAAO,KAAK,QAAQ,EAAE;AAAA,EAC9B,EAAE;AACF,SAAO,GAAG,KAAK;AAAA,EAAM,MAAM,EAAE,SAAS,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC;AAC/D;AAEO,SAAS,mBAAmB,SAAwB;AACzD,QAAM,MAAM,QACT,QAAQ,KAAK,EACb,YAAY,uCAAuC,EACnD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AAGF,MACG,QAAQ,UAAU,EAClB,YAAY,8CAA8C,EAC1D,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,IAAI,mBAAmB;AAEnD,UAAM,WAAW;AACjB,WAAO,QAAQ,MAAM,MAAM;AACzB,YAAM,KAAK,SAAS,aAAa,CAAC;AAClC,YAAM,QAAkB,CAAC;AACzB,YAAM,KAAK,OAAO;AAAA,QAChB,aAAa,GAAG;AAAA,QAChB,UAAU,GAAG,UAAU,OAAO,OAAO,GAAG,MAAM,IAAI;AAAA,QAClD,eAAe,GAAG;AAAA,MACpB,CAAC,CAAC;AACF,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,oBAAoB,cAAc,SAAS,cAAc,CAAC,CAAC,CAAC;AACvE,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,oBAAoB,SAAS,SAAS,SAAS,CAAC,CAAC,CAAC;AAC7D,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,oBAAoB,mBAAmB,SAAS,mBAAmB,CAAC,CAAC,CAAC;AACjF,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,oBAAoB,YAAY,SAAS,YAAY,CAAC,CAAC,CAAC;AACnE,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB,CAAC;AAAA,EACH,CAAC;AAEH,2BAAyB,GAAG;AAC5B,4BAA0B,GAAG;AAC7B,gCAA8B,GAAG;AACjC,0BAAwB,GAAG;AAC3B,4BAA0B,GAAG;AAC7B,2BAAyB,GAAG;AAC5B,2BAAyB,GAAG;AAC5B,6BAA2B,GAAG;AAG9B,MACG,QAAQ,UAAU,EAClB,YAAY,0CAA0C,EACtD,OAAO,uBAAuB,oBAAoB,qBAAqB,EACvE,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAClF,UAAM,aAAa,KAAK,UAAU;AAClC,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,SAAS,MAAM,OAAO,UAAU,mBAAmB;AACzD,UAAMC,WAAU,YAAY,MAAM;AAClC,YAAQ,IAAI,cAAc,OAAO,MAAM,aAAa,UAAU,EAAE;AAAA,EAClE,CAAC;AACL;;;AU/HA,SAAS,aAAa,gBAAAC,eAAc,gBAAgB;AACpD,SAAS,QAAAC,OAAM,YAAAC,iBAAgB;AAqC/B,SAAS,aAAa,MAAqB;AACzC,SAAO,CAAC,EAAE,KAAK,SAAS,KAAK,SAAS,QAAQ,IAAI,qBAAqB,KAAK;AAC9E;AAEA,SAAS,0BAA0B,MAAqB;AACtD,QAAM,cAAc,CAAC,EAAE,QAAQ,IAAI,qBAAqB,KAAK;AAC7D,SAAO,CAAC,EAAE,KAAK,SAAS,eAAe,CAAC,KAAK;AAC/C;AAOA,eAAe,kBAAoC;AACjD,QAAMC,aAAY,QAAQ,IAAI;AAC9B,QAAM,SAAS,MAAM,WAAWA,UAAS;AACzC,SAAO,CAAC,CAAC,OAAO;AAClB;AAEA,SAAS,UAAU,MAAwB;AACzC,QAAM,QAAoB,CAAC;AAC3B,MAAI,UAAU;AACd,QAAM,aAAa,aAAa,IAAI;AAEpC,MAAI,YAAY;AACd,UAAM,UAAU,KAAK,eAAe;AAGpC,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,QACR,uDAAuD,KAAK,KAAK,aAAa,KAAK,IAAI,gBAAgB,OAAO;AAAA,MAChH;AAAA,IACF,CAAC;AAGD,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,QACR,0DAA0D,KAAK,KAAK;AAAA,MACtE;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,iBAAiB,KAAK,cAAc,GAAG,KAAK,WAAW,UAAU;AACvE,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACR,wCAAwC,cAAc;AAAA,IACxD;AAAA,EACF,CAAC;AAGD,MAAI,KAAK,cAAc;AACrB,QAAI,UAAoB,CAAC;AACzB,QAAI;AACF,gBAAU,YAAY,KAAK,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;AAAA,IAC1E,QAAQ;AAEN,gBAAU,CAAC;AAAA,IACb;AAEA,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,kBAAkB,QAAQ,IAAI,CAAC,SAAS;AAC5C,cAAM,QAAQC,UAAS,MAAM,KAAK,EAC/B,QAAQ,MAAM,GAAG,EACjB,QAAQ,SAAS,CAACC,OAAMA,GAAE,YAAY,CAAC;AAC1C,eAAO,sCAAsC,KAAK,cAAcC,MAAK,KAAK,cAAe,IAAI,CAAC;AAAA,MAChG,CAAC;AACD,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,aAAa,UAAU,QAAQ,MAAM,oBAAoB,KAAK,YAAY;AAAA,QAC1E,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,OAAO;AACL,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,aAAa,wBAAwB,KAAK,YAAY;AAAA,QACtD,UAAU;AAAA,UACR,gEAAgE,KAAK,YAAY;AAAA,QACnF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,eAAe,OAA2B;AACjD,QAAM,QAAkB,CAAC,mCAAmC;AAC5D,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,EAAE;AAC9C,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC7C,YAAM,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC,EAAE;AAAA,IACrC;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAe,iBACb,QACA,MACA,SACA,OACe;AAIf,UAAQ,KAAK,6BAAwB;AAGrC,QAAM,KAAK,MAAM,OAAO,IAAI,KAAK;AACjC,QAAM,WAAW,GAAG,MAAM,OAAO,OAAO,GAAG,EAAE,IAAI;AAGjD,QAAM,iBAAiB,KAAK,cAAc,GAAG,KAAK,WAAW,UAAU;AACvE,QAAM,cAAc,MAAM,OAAO,SAAS,0BAA0B;AACpE,QAAM,qBAAqB,YAAY;AAAA,IACrC,CAACD,OAAM,OAAOA,GAAE,QAAQ,EAAE,MAAM;AAAA,EAClC;AAEA,MAAI;AACJ,MAAI,oBAAoB;AACtB,mBAAe,OAAO,mBAAmB,EAAE;AAC3C,YAAQ,KAAK,sCAAiC,cAAc,GAAG;AAAA,EACjE,OAAO;AACL,UAAM,UAAU,MAAM,OAAO,KAAK,4BAA4B,EAAE,MAAM,eAAe,CAAC;AACtF,mBAAe,QAAQ,MAAM,OAAO,OAAO,QAAQ,EAAE,IAAI;AACzD,YAAQ,KAAK,+BAA0B,cAAc,GAAG;AAAA,EAC1D;AAGA,MAAI,KAAK,cAAc;AACrB,QAAI,UAAoB,CAAC;AACzB,QAAI;AACF,gBAAU,YAAY,KAAK,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;AAAA,IAC1E,SAAS,KAAK;AACZ,YAAM,eAAe,WAAW,MAAM,IAAI,SAAS,6CAA8C,IAAc,OAAO,EAAE;AAAA,IAC1H;AAGA,UAAM,mBAAmB,MAAM,OAAO,SAAS,WAAW;AAC1D,UAAM,iBAAiB,IAAI,IAAI,iBAAiB,IAAI,CAAC,MAAM,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AAEjF,QAAI,UAAU;AACd,QAAI,UAAU;AAEd,eAAW,QAAQ,SAAS;AAC1B,YAAM,QAAQD,UAAS,MAAM,KAAK,EAC/B,QAAQ,MAAM,GAAG,EACjB,QAAQ,SAAS,CAACC,OAAMA,GAAE,YAAY,CAAC;AAC1C,YAAM,OAAOE,cAAaD,MAAK,KAAK,cAAc,IAAI,GAAG,OAAO;AAEhE,UAAI,eAAe,IAAI,KAAK,GAAG;AAC7B;AAAA,MACF,OAAO;AACL,cAAM,cAAuC,EAAE,OAAO,MAAM,OAAO,YAAY;AAC/E,YAAI,YAAY,KAAM,aAAY,YAAY;AAC9C,YAAI,gBAAgB,MAAM;AACxB,sBAAY,YAAY;AACxB,sBAAY,cAAc;AAAA,QAC5B;AACA,cAAM,OAAO,KAAK,aAAa,WAAW;AAC1C;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,UAAU,GAAG;AAC9B,cAAQ,KAAK,UAAK,OAAO,0BAA0B,OAAO,0BAA0B;AAAA,IACtF,WAAW,UAAU,GAAG;AACtB,cAAQ,KAAK,UAAK,OAAO,uBAAuB;AAAA,IAClD,OAAO;AACL,cAAQ,KAAK,cAAS,OAAO,2BAA2B;AAAA,IAC1D;AAAA,EACF;AAGA,QAAM,gBAAgB,MAAM,OAAO,SAAS,WAAW,GAAG;AAC1D,MAAI,iBAAiB,GAAG;AACtB,YAAQ,KAAK,uCAAkC;AAC/C,YAAQ,MAAM,QAAQ,KAAK,IAAI,CAAC;AAChC,YAAQ,MAAM,EAAE;AAChB,YAAQ,MAAM,8DAA8D;AAC5E,YAAQ,MAAM,kFAAkF;AAChG,YAAQ,MAAM,0BAA0B;AACxC,YAAQ,MAAM,gFAAgF;AAC9F,YAAQ,MAAM,wGAA4G;AAC1H,YAAQ,MAAM,EAAE;AAChB,YAAQ,MAAM,8EAA8E;AAC5F,YAAQ,MAAM,gFAAgF;AAC9F,YAAQ,MAAM,4EAA4E;AAC1F,YAAQ,MAAM,wEAAwE;AACtF,YAAQ,MAAM,2GAAsG;AACpH;AAAA,EACF;AAEA,UAAQ,KAAK,UAAK,YAAY,4BAA4B;AAG1D,MAAI,KAAK,cAAc,SAAS,KAAK,OAAO;AAC1C,QAAI;AACF,YAAM,WAAW,MAAM,gBAAgB,EAAE,eAAe,KAAK,cAAc,CAAC;AAC5E,YAAM,WAAW,SAAS;AAE1B,YAAM,UAAU,MAAM,gBAAgB;AAAA,QACpC,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,OAAO;AAAA,QACP,gBAAgB,KAAK;AAAA,MACvB,CAAC;AAGD,YAAM,QAAQ,MAAM,aAAa,SAAS,qBAAqB;AAAA,QAC7D,QAAQ;AAAA,QACR,MAAM,EAAE,QAAQ,SAAS;AAAA,MAC3B,CAAC;AAED,UAAI,MAAM,WAAW,KAAK;AACxB,gBAAQ,KAAK,qBAAgB;AAAA,MAC/B,WAAW,MAAM,WAAW,KAAK;AAC/B,gBAAQ,KAAK,6BAAwB;AAAA,MACvC,OAAO;AACL,gBAAQ,KAAK,6BAAwB,MAAM,MAAM,oEAA+D;AAChH,gBAAQ,MAAM,QAAQ,KAAK,IAAI,CAAC;AAChC,gBAAQ,MAAM,kDAAkD;AAChE;AAAA,MACF;AAGA,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA,uDAAuD,QAAQ;AAAA,MACjE;AAEA,UAAI,QAAQ,WAAW,KAAK;AAC1B,cAAM,cAAc,QAAQ;AAC5B,YAAI,YAAY,UAAU,GAAG;AAC3B,kBAAQ,KAAK,2BAAsB;AAAA,QACrC,OAAO;AACL,gBAAM,WAAW,MAAM;AAAA,YACrB;AAAA,YACA,mCAAmC,YAAY,EAAE,oBAAoB,QAAQ;AAAA,YAC7E,EAAE,QAAQ,OAAO,MAAM,CAAC,EAAE;AAAA,UAC5B;AACA,cAAI,SAAS,WAAW,KAAK;AAC3B,oBAAQ,KAAK,yDAA+C;AAAA,UAC9D,OAAO;AACL,oBAAQ,KAAK,iCAA4B,SAAS,MAAM,GAAG;AAAA,UAC7D;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,KAAK,qCAAgC,QAAQ,MAAM,GAAG;AAAA,MAChE;AAAA,IACF,QAAQ;AACN,cAAQ,KAAK,+FAAqF;AAAA,IACpG;AAAA,EACF,WAAW,KAAK,cAAc,OAAO;AACnC,YAAQ,KAAK,8DAAyD;AACtE,YAAQ,MAAM,uFAAuF;AAAA,EACvG;AAGA,MAAI;AACF,UAAM,WAAW,MAAM,OAAO,IAAI,mBAAmB;AACrD,UAAM,aAAc,SAAS,cAA4B,CAAC;AAC1D,UAAM,aAAc,SAAS,mBAAiC,CAAC;AAC/D,UAAM,WAAY,SAAS,YAA0B,CAAC;AAEtD,QAAI,WAAW,SAAS,KAAK,WAAW,SAAS,KAAK,SAAS,SAAS,GAAG;AACzE,cAAQ,KAAK,0BAAqB,WAAW,MAAM,gBAAgB,WAAW,MAAM,qBAAqB,SAAS,MAAM,YAAY;AAAA,IACtI;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,EAAE,eAAe,oBAAoB,EAAE,eAAe,gBAAgB;AACxE,YAAM;AAAA,IACR;AAAA,EACF;AAEA,UAAQ,MAAM,QAAQ,KAAK,IAAI,CAAC;AAChC,UAAQ,MAAM,iBAAiB;AACjC;AAEO,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,OAAO,EACf,YAAY,yCAAyC,EACrD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYF,EACC,OAAO,yBAAyB,qCAAqC,EACrE,OAAO,yBAAyB,mDAAmD,EACnF,OAAO,UAAU,sDAAsD,EACvE,OAAO,aAAa,0CAA0C,EAC9D,OAAO,UAAU,kCAAkC,EACnD,OAAO,aAAa,oCAAoC,EAExD,OAAO,mBAAmB,gDAAgD,EAC1E,OAAO,oBAAoB,6DAA6D,EACxF,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,sBAAsB,kEAAkE,EAE/F,OAAO,gBAAgB,4DAA4D,IAAI,EACvF,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,4BAA4B,6DAA6D,EAChG,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAoD,gBAAgB;AAGlF,QAAI,0BAA0B,IAAI,GAAG;AACnC,YAAM,IAAI;AAAA,QACR;AAAA,QAEA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,MAAM;AACb,YAAM,QAAQ,UAAU,IAAI;AAE5B,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,WAAW,EAAE,MAAM,CAAC,CAAC;AAAA,MACnC,OAAO;AACL,gBAAQ,IAAI,eAAe,KAAK,CAAC;AAAA,MACnC;AACA;AAAA,IACF;AAGA,QAAI,KAAK,cAAc;AACrB,UAAI;AACF,cAAM,OAAO,SAAS,KAAK,YAAY;AACvC,YAAI,CAAC,KAAK,YAAY,GAAG;AACvB,gBAAM,IAAI,SAAS,4CAA4C,KAAK,YAAY,EAAE;AAAA,QACpF;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,eAAe,SAAU,OAAM;AACnC,cAAM,IAAI,SAAS,wCAAwC,KAAK,YAAY,EAAE;AAAA,MAChF;AAAA,IACF;AAGA,QAAI,KAAK,QAAQ;AACf,YAAM,iBAAiB,KAAK,cAAc,GAAG,KAAK,WAAW,UAAU;AACvE,YAAM,QAAkB,CAAC;AACzB,UAAI,aAAa,IAAI,GAAG;AACtB,cAAM,KAAK,gDAAgD,KAAK,KAAK,GAAG;AACxE,cAAM,KAAK,gDAAgD;AAAA,MAC7D;AACA,YAAM,KAAK,sCAAsC,KAAK,cAAc,eAAe,KAAK,WAAW,MAAM,EAAE,EAAE;AAC7G,YAAM,KAAK,8DAA8D,cAAc,GAAG;AAC1F,UAAI,KAAK,cAAc;AACrB,YAAI,UAAoB,CAAC;AACzB,YAAI;AACF,oBAAU,YAAY,KAAK,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;AAAA,QAC1E,SAAS,KAAK;AACZ,gBAAM,eAAe,WAAW,MAAM,IAAI,SAAS,6CAA8C,IAAc,OAAO,EAAE;AAAA,QAC1H;AACA,cAAM,KAAK,0BAA0B,QAAQ,MAAM,oBAAoB,KAAK,YAAY,EAAE;AAAA,MAC5F;AACA,YAAM,KAAK,uEAAuE;AAClF,cAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AAC5B;AAAA,IACF;AAEA,UAAM,UAAoB,CAAC;AAG3B,UAAM,gBAAgB,MAAM,gBAAgB;AAI5C,QAAI,aAAa,IAAI,KAAK,CAAC,eAAe;AACxC,YAAM,WAAW,MAAM,gBAAgB,EAAE,eAAe,KAAK,cAAc,CAAC;AAC5E,YAAM,UAAU,cAAc;AAC9B,YAAM,WAAW,KAAK,YAAY;AAClC,YAAM,cAAc,KAAK,eAAe,KAAK;AAG7C,YAAM,YAAY,MAAM,OAAO;AAAA,QAC7B;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AACD,cAAQ,KAAK,6BAAwB,UAAU,IAAI,KAAK,UAAU,EAAE,GAAG;AAGvE,UAAI,KAAK,gBAAgB;AACvB,YAAI;AACF,gBAAM,iBAAiB,KAAK,gBAAgB,EAAE,UAAU,SAAS,GAAG,EAAE,WAAW,eAAe,CAAC;AACjG,kBAAQ,KAAK,uBAAkB;AAAA,QACjC,QAAQ;AAAA,QAER;AAAA,MACF;AAGA,UAAI;AACJ,UAAI;AACF,cAAM,SAAS,MAAM,SAAS;AAAA,UAC5B;AAAA,UACA,OAAO,KAAK;AAAA,UACZ;AAAA,UACA,OAAO,UAAU;AAAA,QACnB,CAAC;AACD,gBAAQ,OAAO;AAAA,MACjB,SAAS,KAAK;AACZ,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,gBAAQ,MAAM,6BAAwB,UAAU,IAAI,KAAK,UAAU,EAAE,GAAG;AACxE,gBAAQ,MAAM;AAAA,kDAAqD,OAAO,EAAE;AAC5E,YAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,kBAAQ,MAAM;AAAA,wDAA2D;AACzE,kBAAQ,MAAM,0CAA0C;AACxD,kBAAQ,MAAM,kEAAkE;AAAA,QAClF,OAAO;AACL,kBAAQ,MAAM;AAAA,sDAAyD;AAAA,QACzE;AACA,gBAAQ,MAAM;AAAA;AAAA,CAA6B;AAC3C,gBAAQ,MAAM,2DAA2D,KAAK,KAAK,aAAa,UAAU,EAAE,EAAE;AAC9G,gBAAQ,MAAM;AAAA;AAAA,CAA6C;AAC3D,gBAAQ,MAAM,oCAAoC,WAAW,GAAG;AAChE,cAAM,IAAI;AAAA,UACR,wFAAwF,KAAK,KAAK,aAAa,UAAU,EAAE;AAAA,UAC3H;AAAA,QACF;AAAA,MACF;AACA,cAAQ,KAAK,sCAAiC;AAG9C,YAAMH,aAAY,QAAQ,IAAI;AAC9B,YAAM,QAAQ,IAAI,gBAAgB,qBAAqBA,UAAS,CAAC;AACjE,YAAM,MAAM,IAAI,UAAU,IAAI,EAAE,OAAO,WAAW,SAAS,QAAQ,UAAU,GAAG,CAAC;AACjF,YAAM,aAAaA,YAAW,EAAE,QAAQ,UAAU,IAAI,MAAM,UAAU,KAAK,CAAC;AAG5E,YAAMK,UAAS,IAAI,eAAe;AAAA,QAChC;AAAA,QACA,UAAU;AAAA,QACV,OAAO,UAAU;AAAA,QACjB,SAAS,QAAQ,IAAI,yBAAyB;AAAA,QAC9C,SAAS,KAAK;AAAA,MAChB,CAAC;AAED,YAAM,iBAAiBA,SAAQ,MAAM,SAAS,UAAU,EAAE;AAC1D;AAAA,IACF;AAGA,UAAM,SAAS,MAAM,cAAc,IAAI;AAEvC,UAAM,KAAK,MAAM,OAAO,IAAI,KAAK;AACjC,UAAM,gBAAgB,GAAG,KAAK;AAC9B,UAAM,iBAAiB,QAAQ,MAAM,SAAS,aAAa;AAAA,EAC7D,CAAC;AACL;;;AC/gBA,SAAS,UAAkB;AACzB,QAAM,QAAQ,QAAQ,KAAK,CAAC,KAAK;AACjC,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,EAAG,QAAO;AAC9D,SAAO;AACT;AAEA,IAAM,WAAqC;AAAA,EACzC,KAAK,CAAC;AAAA,EACN,MAAM,CAAC,SAAS,UAAU,UAAU,aAAa,UAAU,cAAc;AAAA,EACzE,IAAI,CAAC;AAAA,EACL,UAAU,CAAC,QAAQ,OAAO,UAAU,UAAU,QAAQ;AAAA,EACtD,UAAU,CAAC,QAAQ,OAAO,UAAU,UAAU,QAAQ;AAAA,EACtD,eAAe,CAAC,QAAQ,OAAO,OAAO;AAAA,EACtC,eAAe,CAAC,QAAQ,OAAO,QAAQ;AAAA,EACvC,WAAW,CAAC,OAAO,UAAU,SAAS;AAAA,EACtC,KAAK,CAAC,YAAY,UAAU,UAAU;AAAA,EACtC,OAAO,CAAC;AAAA,EACR,SAAS,CAAC;AAAA,EACV,YAAY,CAAC,QAAQ,OAAO,MAAM;AACpC;AAEA,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,WAAW,OAAe,QAAQ,GAAW;AACpD,QAAM,eAAe,OAAO,KAAK,QAAQ,EAAE,KAAK,GAAG;AACnD,QAAM,SAAS,IAAI,IAAI;AACvB,QAAM,kBAAkB,OAAO,QAAQ,QAAQ,EAC5C,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,SAAS,CAAC,EACpC,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,SAAS,GAAG,+BAA+B,KAAK,KAAK,GAAG,CAAC,mBAAmB,EACjG,KAAK,IAAI;AAEZ,SAAO,yBAAyB,IAAI;AAAA,8BACR,IAAI;AAAA;AAAA,EAEhC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,cAKM,YAAY;AAAA;AAAA;AAAA,gCAGM,aAAa,KAAK,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpD,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAUH,MAAM,IAAI,IAAI;AAAA;AAE5B;AAEA,SAAS,UAAU,OAAe,QAAQ,GAAW;AACnD,QAAM,SAAS,IAAI,IAAI;AACvB,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,sBAAsB,OAAO,QAAQ,QAAQ,EAChD,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,SAAS,CAAC,EACpC,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM;AACpB,UAAM,YAAY,IAAI,QAAQ,MAAM,GAAG;AACvC,UAAM,WAAW,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG;AACnD,WAAO,GAAG,MAAM,IAAI,SAAS;AAAA;AAAA,iBAElB,QAAQ;AAAA;AAAA;AAAA,EAGrB,CAAC,EACA,KAAK,MAAM;AAEd,SAAO,YAAY,IAAI;AAAA,uBACF,IAAI;AAAA,6BACE,IAAI;AAAA;AAAA,EAE/B,MAAM;AAAA;AAAA;AAAA,MAGF,aAAa,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA,MAG3B,aAAa,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAapD,OAAO,QAAQ,QAAQ,EACtB,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,SAAS,CAAC,EACpC,IAAI,CAAC,CAAC,GAAG,MAAM,WAAW,GAAG,KAAK,MAAM,IAAI,IAAI,QAAQ,MAAM,GAAG,CAAC,KAAK,EACvE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,mBAAmB;AAAA;AAAA,EAEnB,MAAM;AAAA;AAER;AAEA,SAAS,WAAW,OAAe,QAAQ,GAAW;AACpD,QAAM,QAAQ;AAAA,IACZ,yBAAyB,IAAI;AAAA,IAC7B,yBAAyB,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,eAAe,IAAI;AAAA,IACnB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,eAAuC;AAAA,IAC3C,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,eAAe;AAAA,IACf,eAAe;AAAA,IACf,WAAW;AAAA,IACX,KAAK;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAEA,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,YAAY,GAAG;AACtD,UAAM;AAAA,MACJ,eAAe,IAAI,mCAAmC,GAAG,SAAS,IAAI;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,eAAe;AAE1B,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAClD,eAAW,OAAO,MAAM;AACtB,YAAM;AAAA,QACJ,eAAe,IAAI,oCAAoC,GAAG,SAAS,GAAG;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,gBAAgB;AAC3B,aAAW,QAAQ,cAAc;AAC/B,UAAM,KAAK,eAAe,IAAI,QAAQ,KAAK,QAAQ,OAAO,EAAE,CAAC,GAAG;AAAA,EAClE;AAEA,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,0BAA0B,SAAwB;AAChE,QAAM,OAAO,QAAQ;AACrB,QAAM,aAAa,QAChB,QAAQ,YAAY,EACpB,YAAY,mCAAmC,EAC/C;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA,YAGM,IAAI;AAAA;AAAA;AAAA,YAGJ,IAAI;AAAA;AAAA;AAAA,IAGZ,IAAI;AAAA,EACJ;AAEF,aACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,OAAO,MAAM;AACZ,YAAQ,IAAI,WAAW,CAAC;AAAA,EAC1B,CAAC;AAEH,aACG,QAAQ,KAAK,EACb,YAAY,gCAAgC,EAC5C,OAAO,MAAM;AACZ,YAAQ,IAAI,UAAU,CAAC;AAAA,EACzB,CAAC;AAEH,aACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,OAAO,MAAM;AACZ,YAAQ,IAAI,WAAW,CAAC;AAAA,EAC1B,CAAC;AACL;;;ACtOA,IAAM,cAAc;AAEb,SAAS,uBAAuB,SAAwB;AAC7D,UACG,QAAQ,SAAS,EACjB,YAAY,2CAA2C,EACvD,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,iBAAkB;AACxB,UAAM,OAAQ,KAAkG,gBAAgB;AAEhI,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,EAAE,SAAS,EAAE,QAAQ,iCAAiC,EAAE;AAAA,MACxD,EAAE,WAAW,gBAAgB,SAAS,KAAK,QAAQ;AAAA,IACrD;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,SAAS,4BAA4B,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,IACzF;AAEA,UAAM,WAAW,MAAM,SAAS,KAAK;AAErC,QAAI,KAAK,MAAM;AACb,YAAM,EAAE,YAAAC,YAAW,IAAI,MAAM,OAAO,oBAAmB;AACvD,cAAQ,IAAIA,YAAW,EAAE,KAAK,aAAa,SAAS,SAAS,CAAC,CAAC;AAAA,IACjE,OAAO;AACL,cAAQ,IAAI,QAAQ;AAAA,IACtB;AAAA,EACF,CAAC;AACL;;;AC/BA,SAAS,QAAAC,aAAY;AAErB,IAAM,iBAAiB,CAAC,qBAAqB,SAAS;AAGtD,SAAS,YAAoB;AAC3B,SAAO,QAAQ,IAAI,uBAAuB,iBAAiB;AAC7D;AAEA,SAAS,YAAY,KAAwB;AAC3C,MAAI,CAAC,eAAe,SAAS,GAAgB,GAAG;AAC9C,UAAM,IAAI;AAAA,MACR,uBAAuB,GAAG,sBAAsB,eAAe,KAAK,IAAI,CAAC;AAAA,IAC3E;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,SAAS,KAA6C;AACnE,QAAM,SAAS,MAAM,WAAW,UAAU,CAAC;AAC3C,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO,YAAY,SAAY,OAAO,OAAO,OAAO,IAAI;AAAA,EACnE;AACF;AAEA,SAAS,cAAc,KAAwB;AAC7C,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,QAAQ,IAAI,qBACf,uBACA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,eAAe,SAAS,KAAgB,OAA8B;AACpE,QAAM,MAAM,UAAU;AACtB,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,UAAU;AACjB;AAAA,IACF,KAAK,WAAW;AACd,YAAM,IAAI,SAAS,OAAO,EAAE;AAC5B,UAAI,MAAM,CAAC,KAAK,KAAK,GAAG;AACtB,cAAM,IAAI,SAAS,8CAA8C;AAAA,MACnE;AACA,aAAO,UAAU;AACjB;AAAA,IACF;AAAA,EACF;AACA,QAAM,YAAY,QAAQ,GAAG;AAC/B;AAEO,SAAS,sBAAsB,SAAwB;AAC5D,QAAM,MAAM,QACT,QAAQ,QAAQ,EAChB,YAAY,0BAA0B;AAEzC,MACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,iBAAkB;AACxB,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,SAAS,MAAM,WAAW,UAAU,CAAC;AAE3C,UAAM,UAA6D,CAAC;AACpE,eAAW,OAAO,gBAAgB;AAChC,YAAM,MAAM,MAAM,SAAS,GAAG;AAC9B,cAAQ,GAAG,IAAI;AAAA,QACb,OAAO,OAAO;AAAA,QACd,QAAQ,QAAQ,SAAY,cAAc,GAAG,IAAI;AAAA,MACnD;AAAA,IACF;AAEA;AAAA,MAAO;AAAA,MAAS;AAAA,MAAM,MACpB,MAAM;AAAA,QACJ,SAAS,CAAC,OAAO,SAAS,QAAQ;AAAA,QAClC,MAAM,eAAe,IAAI,CAAC,SAAS;AAAA,UACjC,KAAK;AAAA,UACL,OAAO,QAAQ,GAAG,EAAE;AAAA,UACpB,QAAQ,QAAQ,GAAG,EAAE;AAAA,QACvB,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAEH,MACG,QAAQ,WAAW,EACnB,YAAY,2BAA2B,EACvC,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,uCAAuC,EAC7D,OAAO,eAAgB,KAAa;AACnC,UAAM,OACJ,KACA,gBAAgB;AAClB,UAAM,WAAW,YAAY,GAAG;AAChC,UAAM,QAAQ,MAAM,SAAS,QAAQ;AAErC,QAAI,UAAU,QAAW;AACvB,YAAM,IAAI,SAAS,QAAQ,GAAG,cAAc;AAAA,IAC9C;AAEA,WAAO,EAAE,KAAK,MAAM,GAAG,MAAM,MAAM,KAAK;AAAA,EAC1C,CAAC;AAEH,MACG,QAAQ,mBAAmB,EAC3B,YAAY,2BAA2B,EACvC,OAAO,eAAgB,KAAa,OAAe;AAClD,UAAM,WAAW,YAAY,GAAG;AAChC,UAAM,SAAS,UAAU,KAAK;AAC9B,YAAQ,IAAI,OAAO,GAAG,MAAM,KAAK,EAAE;AAAA,EACrC,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,YAAY,8BAA8B,EAC1C,OAAO,iBAAkB;AACxB,YAAQ,IAAIA,MAAK,UAAU,GAAG,aAAa,CAAC;AAAA,EAC9C,CAAC;AACL;;;A9ClHA,SAAS,mBAA2B;AAClC,QAAM,QAAQ,QAAQ,KAAK,CAAC,KAAK;AACjC,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,EAAG,QAAO;AAC9D,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAsB;AAC7C,QAAM,QAAkB,CAAC;AACzB,QAAM,YAAY,oBAAI,IAAI,CAAC,YAAY,KAAK,CAAC;AAC7C,MAAI,UAA0B;AAC9B,SAAO,SAAS;AACd,UAAM,OAAO,QAAQ,KAAK;AAC1B,QAAI,QAAQ,CAAC,UAAU,IAAI,IAAI,EAAG,OAAM,QAAQ,IAAI;AACpD,cAAU,QAAQ;AAAA,EACpB;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEO,SAAS,gBAAyB;AACvC,QAAM,UAAU,IAAI,QAAQ;AAC5B,QAAMC,WAAU,iBAAiB;AAEjC,UACG,KAAKA,QAAO,EACZ,YAAY,2CAA2C,EACvD,QAAQ,OAAO,EACf,OAAO,UAAU,gBAAgB,EACjC,OAAO,eAAe,oBAAoB,EAC1C,OAAO,oBAAoB,4BAA4B,EACvD,OAAO,aAAa,oCAAoC,EACxD,OAAO,cAAc,oCAAoC,EACzD,OAAO,uBAAuB,4BAA4B,EAC1D,OAAO,WAAW,6CAA6C,EAC/D,OAAO,WAAW,6CAA6C,EAC/D,OAAO,UAAU,wCAAwC,EACzD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQF;AAEF,qBAAmB,OAAO;AAC1B,sBAAoB,OAAO;AAC3B,oBAAkB,OAAO;AACzB,0BAAwB,OAAO;AAC/B,0BAAwB,OAAO;AAC/B,+BAA6B,OAAO;AACpC,4BAA0B,OAAO;AACjC,2BAAyB,OAAO;AAChC,qBAAmB,OAAO;AAC1B,uBAAqB,OAAO;AAC5B,yBAAuB,OAAO;AAC9B,4BAA0B,OAAO;AACjC,wBAAsB,OAAO;AAE7B,UAAQ,KAAK,aAAa,CAAC,aAAa,kBAAkB;AACxD,UAAM,WAAW,YAAY,KAAK;AAClC,QAAI,SAAS,SAAS,SAAS,OAAO;AACpC,YAAM,IAAI,SAAS,4CAA4C;AAAA,IACjE;AACA,kBAAc,gBAAgB,aAAa,CAAC;AAAA,EAC9C,CAAC;AAED,SAAO;AACT;AAEO,SAAS,YAAY,KAAqB;AAC/C,QAAM,SAAS,QAAQ,KAAK,SAAS,QAAQ,KAAK,QAAQ,KAAK,SAAS,SAAS;AAEjF,MAAI,eAAe,UAAU;AAC3B,QAAI,QAAQ;AACV,cAAQ,MAAM,WAAW;AAAA,QACvB,OAAO;AAAA,UACL,MAAM,eAAe,YAAY,eAC7B,eAAe,kBAAkB,sBACjC,eAAe,iBAAiB,iBAChC,eAAe,gBAAgB,cAC/B,eAAe,eAAe,YAC9B;AAAA,UACJ,SAAS,IAAI;AAAA,UACb,GAAI,eAAe,iBAAiB,EAAE,aAAa,IAAI,WAAW,IAAI,CAAC;AAAA,QACzE;AAAA,MACF,CAAC,CAAC;AAAA,IACJ,OAAO;AACL,cAAQ,MAAM,UAAU,IAAI,OAAO,EAAE;AAAA,IACvC;AACA,YAAQ,KAAK,IAAI,QAAQ;AAAA,EAC3B;AAEA,UAAQ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1E,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,eAAe,QAAQ,KAAK,CAAC,GAAG,SAAS,UAAU,KAAK,QAAQ,KAAK,CAAC,GAAG,SAAS,UAAU,KAAK,QAAQ,KAAK,CAAC,GAAG,SAAS,KAAK;AAEtI,IAAI,cAAc;AAChB,QAAM,UAAU,cAAc;AAC9B,MAAI;AACF,UAAM,QAAQ,WAAW;AAAA,EAC3B,SAAS,KAAK;AACZ,gBAAY,GAAG;AAAA,EACjB;AACF;","names":["readFileSync","require","configDir","join","homedir","configDir","configDir","readFileSync","readFileSync","readFileSync","configDir","c","pkg","configDir","configDir","configDir","configDir","configDir","configDir","c","c","c","writeFile","readFile","readFile","extractCookies","mergeCookies","c","configDir","writeFile","readFileSync","join","basename","configDir","basename","c","join","readFileSync","client","formatJson","join","binName"]}