@convilyn/sdk 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/types.ts","../src/retry.ts","../src/throttle.ts","../src/internal/auth.ts","../src/version.ts","../src/internal/http.ts","../src/internal/parsers.ts","../src/resources/account.ts","../src/resources/convert.ts","../src/resources/files.ts","../src/internal/ws.ts","../src/resources/goals.ts","../src/resources/workflows.ts","../src/client.ts"],"names":["isRecord","realSleep","DEFAULT_POLL_INTERVAL","DEFAULT_POLL_TIMEOUT","MAX_POLL_INTERVAL","STALE_PROGRESS_BACKOFF_AFTER","BACKOFF_FACTOR"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Typed errors raised by the Convilyn SDK — a faithful port of the Python\n * SDK's `exceptions.py`.\n *\n * Hierarchy:\n *\n * ConvilynError base; everything the SDK throws\n * ├── AuthError missing / malformed credentials\n * ├── APIError HTTP 4xx / 5xx (envelope {code, message, details})\n * │ ├── RateLimitError HTTP 429\n * │ ├── PlanRequiredError HTTP 402 + TIER_REQUIRED-family code\n * │ ├── QuotaExceededError HTTP 402 (insufficient_balance / QUOTA_EXCEEDED)\n * │ ├── S3UploadError presigned upload PUT failed\n * │ └── RetryExhaustedError retry policy ran out of attempts\n * ├── JobFailedError conversion job status=failed\n * ├── JobTimeoutError convert.wait() timed out\n * ├── GoalJobFailedError goal job status=failed\n * ├── GoalJobTimeoutError goals.wait() timed out\n * └── WebSocketError goal-event stream failure\n *\n * Catch `ConvilynError` to handle any SDK-originated failure; branch on the\n * `code` / `statusCode` fields for typed handling.\n */\n\nexport type ErrorDetails = Record<string, unknown>\n\n/** Base class for every error this SDK throws. */\nexport class ConvilynError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ConvilynError'\n }\n}\n\n/** Authentication / authorization failed before any HTTP call. */\nexport class AuthError extends ConvilynError {\n constructor(message: string) {\n super(message)\n this.name = 'AuthError'\n }\n}\n\n/**\n * Server returned a non-success HTTP response. The Convilyn API uses the\n * envelope `{code, message, details}`; those are exposed as fields.\n *\n * `message` holds the server's raw message (matching the Python `.message`\n * attribute); branch on `code` / `statusCode` for typed handling.\n */\nexport class APIError extends ConvilynError {\n readonly statusCode: number\n readonly code: string\n readonly details: ErrorDetails\n\n constructor(statusCode: number, code: string, message: string, details?: ErrorDetails) {\n super(message)\n this.name = 'APIError'\n this.statusCode = statusCode\n this.code = code\n this.details = details ?? {}\n }\n}\n\n/** HTTP 429 — the SDK or caller exceeded the API rate limit. */\nexport class RateLimitError extends APIError {\n constructor(statusCode: number, code: string, message: string, details?: ErrorDetails) {\n super(statusCode, code, message, details)\n this.name = 'RateLimitError'\n }\n}\n\n/** HTTP 402 with a TIER_REQUIRED-family code — the caller's plan is too low. */\nexport class PlanRequiredError extends APIError {\n readonly requiredPlan: string\n readonly upgradeUrl: string | null\n\n constructor(\n statusCode: number,\n code: string,\n message: string,\n details?: ErrorDetails,\n opts: { requiredPlan?: string; upgradeUrl?: string | null } = {}\n ) {\n super(statusCode, code, message, details)\n this.name = 'PlanRequiredError'\n this.requiredPlan = opts.requiredPlan ?? 'pro'\n this.upgradeUrl = opts.upgradeUrl ?? null\n }\n}\n\n/**\n * HTTP 402 — the run would cost more **credits** than the account's balance.\n *\n * The backend currently emits code `insufficient_balance` (and intends to add\n * `QUOTA_EXCEEDED`); both decode to this error. Fields are in **credits**\n * (1 credit = $0.01) to match the vocabulary users see in the console / web /\n * docs — never internal micro-units.\n */\nexport class QuotaExceededError extends APIError {\n readonly costCredits: number | null\n readonly balanceCredits: number | null\n readonly topUpUrl: string | null\n\n constructor(\n statusCode: number,\n code: string,\n message: string,\n details?: ErrorDetails,\n opts: {\n costCredits?: number | null\n balanceCredits?: number | null\n topUpUrl?: string | null\n } = {}\n ) {\n super(statusCode, code, message, details)\n this.name = 'QuotaExceededError'\n this.costCredits = opts.costCredits ?? null\n this.balanceCredits = opts.balanceCredits ?? null\n this.topUpUrl = opts.topUpUrl ?? null\n }\n}\n\n/** The presigned upload PUT step of a file upload returned a non-success status. */\nexport class S3UploadError extends APIError {\n constructor(statusCode: number, code: string, message: string, details?: ErrorDetails) {\n super(statusCode, code, message, details)\n this.name = 'S3UploadError'\n }\n}\n\n/** The retry policy ran out of attempts before the request succeeded. */\nexport class RetryExhaustedError extends APIError {\n readonly attemptCount: number\n\n constructor(\n statusCode: number,\n code: string,\n message: string,\n details?: ErrorDetails,\n opts: { attemptCount?: number } = {}\n ) {\n super(statusCode, code, message, details)\n this.name = 'RetryExhaustedError'\n this.attemptCount = opts.attemptCount ?? 0\n }\n}\n\n/** A conversion job (`convert.wait`) finished with status `failed`. */\nexport class JobFailedError extends ConvilynError {\n readonly jobId: string\n readonly processorType: string\n readonly code: string\n\n constructor(opts: { jobId: string; processorType: string; code: string; message: string }) {\n super(opts.message)\n this.name = 'JobFailedError'\n this.jobId = opts.jobId\n this.processorType = opts.processorType\n this.code = opts.code\n }\n}\n\n/** A polling helper exceeded its `timeout` before the conversion job finished. */\nexport class JobTimeoutError extends ConvilynError {\n readonly jobId: string\n readonly elapsed: number\n readonly timeout: number\n\n constructor(opts: { jobId: string; elapsed: number; timeout: number }) {\n super(\n `Job ${opts.jobId} did not reach a terminal status within ${opts.timeout}s ` +\n `(elapsed ${opts.elapsed.toFixed(1)}s)`\n )\n this.name = 'JobTimeoutError'\n this.jobId = opts.jobId\n this.elapsed = opts.elapsed\n this.timeout = opts.timeout\n }\n}\n\n/** A goal (agentic) job finished with status `failed`. */\nexport class GoalJobFailedError extends ConvilynError {\n readonly jobSpecId: string\n readonly code: string\n\n constructor(opts: { jobSpecId: string; code: string | null; message: string | null }) {\n super(opts.message ?? 'Job failed without a structured error message')\n this.name = 'GoalJobFailedError'\n this.jobSpecId = opts.jobSpecId\n this.code = opts.code ?? 'GOAL_JOB_FAILED'\n }\n}\n\n/** A goal polling helper exceeded its `timeout` before a terminal status. */\nexport class GoalJobTimeoutError extends ConvilynError {\n readonly jobSpecId: string\n readonly elapsed: number\n readonly timeout: number\n\n constructor(opts: { jobSpecId: string; elapsed: number; timeout: number }) {\n super(\n `GoalJob ${opts.jobSpecId} did not reach a terminal status within ` +\n `${opts.timeout}s (elapsed ${opts.elapsed.toFixed(1)}s)`\n )\n this.name = 'GoalJobTimeoutError'\n this.jobSpecId = opts.jobSpecId\n this.elapsed = opts.elapsed\n this.timeout = opts.timeout\n }\n}\n\n/** Raised when the goal event stream cannot proceed. */\nexport class WebSocketError extends ConvilynError {\n readonly payload: string | null\n\n constructor(message: string, opts: { payload?: string | null } = {}) {\n super(message)\n this.name = 'WebSocketError'\n this.payload = opts.payload ?? null\n }\n}\n","/**\n * Public response types — port of `types.py`.\n *\n * Field names are the SDK's **public** names in camelCase (the TS-idiomatic\n * equivalent of the Python SDK's snake_case public surface), which already\n * differ from the raw wire in places (`fileName`→`filename`, `mimeType`→\n * `contentType`). The resource parsers (A2+) map wire → these shapes.\n *\n * Money is expressed in **credits** (1 credit = $0.01) everywhere user-facing,\n * to match the console / web / docs vocabulary — never internal micro-units.\n *\n * Types carry data only; the `is_terminal` / `needs_input` Python *properties*\n * become standalone predicate functions here (tree-shakeable, no class needed).\n */\n\n// ── File conversion ──────────────────────────────────────────────────\n\n/** Lifecycle status of a file-conversion job (`client.convert`). */\nexport type JobStatus = 'queued' | 'processing' | 'completed' | 'failed'\n\n/** A file known to the Convilyn platform. */\nexport interface File {\n readonly fileId: string\n readonly filename: string\n readonly size: number\n readonly contentType: string\n readonly createdAt: Date\n readonly jobId: string | null\n readonly isInput: boolean\n}\n\n/** A produced artifact attached to a completed job (presigned `url`, 1h TTL). */\nexport interface ResultFile {\n readonly filename: string\n readonly size: number\n readonly mimetype: string\n readonly url: string\n}\n\n/** Failure detail attached to a `failed` job. */\nexport interface JobError {\n readonly code: string\n readonly message: string\n}\n\n/** A file-conversion job (data only; actions live on the resource). */\nexport interface ConvertJob {\n readonly jobId: string\n readonly status: JobStatus\n readonly processorType: string\n readonly progress: number\n readonly progressMessage: string | null\n readonly resultFiles: ResultFile[] | null\n readonly error: JobError | null\n readonly retryCount: number\n readonly createdAt: Date\n readonly updatedAt: Date\n readonly startedAt: Date | null\n readonly completedAt: Date | null\n readonly estimatedDuration: number | null\n}\n\n/** Conversion statuses at which `wait()` stops polling. */\nexport const CONVERT_JOB_TERMINAL_STATUSES: readonly JobStatus[] = ['completed', 'failed']\n\n/** True when a conversion job has reached `completed` or `failed`. */\nexport function isConvertJobTerminal(job: Pick<ConvertJob, 'status'>): boolean {\n return CONVERT_JOB_TERMINAL_STATUSES.includes(job.status)\n}\n\n// ── Goal workflows (agentic) ─────────────────────────────────────────\n\n/** Lifecycle status of a goal (agentic) job (`client.goals`). */\nexport type GoalJobStatus =\n | 'draft'\n | 'created'\n | 'analyzing'\n | 'slots_pending'\n | 'ready'\n | 'ready_with_preview'\n | 'confirmed'\n | 'queued'\n | 'executing'\n | 'completed'\n | 'partial'\n | 'failed'\n | 'cancelled'\n\n/** Goal-lane statuses at which `wait()` stops polling. */\nexport const GOAL_JOB_TERMINAL_STATUSES: readonly GoalJobStatus[] = [\n 'completed',\n 'partial',\n 'failed',\n 'cancelled',\n]\n\n/** A piece of information the agent is asking the user to supply. */\nexport interface PendingSlot {\n readonly slotId: string\n readonly slotType: string\n readonly question: string\n readonly options: Array<string | Record<string, string>> | null\n readonly required: boolean\n readonly isDisambiguation: boolean\n readonly suggestedValue: unknown | null\n readonly suggestedConfidence: number | null\n}\n\n/** A goal (agentic) job — a \"workflow run\" in product vocabulary. */\nexport interface GoalJob {\n readonly jobSpecId: string\n readonly status: GoalJobStatus\n readonly progress: number\n readonly itemVersion: number | null\n readonly attemptId: string | null\n readonly goalText: string | null\n readonly fileIds: string[]\n readonly pendingSlots: PendingSlot[]\n readonly filledSlots: Record<string, unknown>\n readonly pendingInterrupts: Record<string, unknown>[]\n readonly agentMessage: string | null\n readonly errorMessage: string | null\n readonly errorCode: string | null\n readonly createdAt: Date\n readonly updatedAt: Date\n readonly startedAt: Date | null\n readonly completedAt: Date | null\n}\n\n/** True when the workflow run reached a stable end state (incl. `partial`). */\nexport function isGoalJobTerminal(job: Pick<GoalJob, 'status'>): boolean {\n return GOAL_JOB_TERMINAL_STATUSES.includes(job.status)\n}\n\n/** True when the agent is blocked waiting on the user (`slots_pending`). */\nexport function goalJobNeedsInput(job: Pick<GoalJob, 'status'>): boolean {\n return job.status === 'slots_pending'\n}\n\n// ── Goal event stream ────────────────────────────────────────────────\n\n/** Discriminator for a server-sent event in a goal execution stream. */\nexport type GoalEventType =\n | 'tool_started'\n | 'tool_finished'\n | 'agent_step_started'\n | 'agent_step_finished'\n | 'orchestration_transition'\n | 'status'\n | 'progress'\n | 'completed'\n | 'failed'\n | 'slot_needed'\n | 'keepalive'\n | 'agent_text'\n | 'agent_text_done'\n\n/** The known event `type` values (forward-compat: pre-listed so the SDK need\n * not be re-cut the moment the backend starts emitting a reserved one). */\nexport const GOAL_EVENT_TYPES: readonly GoalEventType[] = [\n 'tool_started',\n 'tool_finished',\n 'agent_step_started',\n 'agent_step_finished',\n 'orchestration_transition',\n 'status',\n 'progress',\n 'completed',\n 'failed',\n 'slot_needed',\n 'keepalive',\n 'agent_text',\n 'agent_text_done',\n]\n\n/** Type guard: is `value` a recognised {@link GoalEventType}? */\nexport function isGoalEventType(value: string): value is GoalEventType {\n return (GOAL_EVENT_TYPES as readonly string[]).includes(value)\n}\n\n/**\n * Event `type` values that close the WebSocket and stop iteration. `cancelled`\n * is included for a future backend that emits it directly (today it arrives as\n * a `failed` event with `data.code === \"CANCELLED\"`) — so it is a plain string,\n * not a {@link GoalEventType} member.\n */\nexport const GOAL_EVENT_TERMINAL_TYPES: readonly string[] = ['completed', 'failed', 'cancelled']\n\n/** One server-sent event in a goal execution stream. */\nexport interface GoalEvent {\n readonly type: GoalEventType\n readonly schemaVersion: number\n readonly jobSpecId: string\n readonly emittedAt: Date\n readonly seq: number\n readonly data: Record<string, unknown>\n}\n\n/** True when this event signals the end of the stream. */\nexport function isGoalEventTerminal(event: Pick<GoalEvent, 'type'>): boolean {\n return GOAL_EVENT_TERMINAL_TYPES.includes(event.type)\n}\n\n// ── Community workflows (marketplace) ────────────────────────────────\n\n/** Marketplace visibility of a community workflow. */\nexport type WorkflowVisibility = 'private' | 'public' | 'archived'\n\n/** Aggregate counters surfaced on every workflow row. */\nexport interface WorkflowStats {\n readonly runCount: number\n readonly forkCount: number\n readonly likeCount: number\n}\n\n/** A community / private workflow row. */\nexport interface Workflow {\n readonly workflowId: string\n readonly ownerId: string | null\n readonly specId: string\n readonly sourceSpecId: string | null\n readonly sourceType: string | null\n readonly name: string\n readonly description: string | null\n readonly visibility: WorkflowVisibility\n readonly tags: string[]\n readonly stats: WorkflowStats\n readonly itemVersion: number\n}\n\n/** Light-weight community-list row (no heavy spec/system-prompt fields). */\nexport interface WorkflowSummary {\n readonly workflowId: string\n readonly specId: string\n readonly ownerId: string | null\n readonly name: string\n readonly description: string | null\n readonly visibility: WorkflowVisibility\n readonly tags: string[]\n readonly stats: WorkflowStats\n}\n\n/** One page of community workflow summaries + a pagination cursor. */\nexport interface WorkflowSearchPage {\n readonly items: WorkflowSummary[]\n readonly cursor: string | null\n}\n\n/** Result of `workflows.like` — toggle state + fresh count. */\nexport interface LikeResponse {\n readonly liked: boolean\n readonly likeCount: number\n}\n\n// ── Billing / quota (credits) ────────────────────────────────────────\n\n/** Where an account sits against its quota window. */\nexport type QuotaState = 'ok' | 'soft_limit' | 'quota_exceeded'\n/** Account plan tier. */\nexport type PlanTier = 'free' | 'pro'\n\n/**\n * Caller-plan vs cost-estimate verdict. Amounts in **credits** (the A4 parser\n * converts the wire's micro-units → credits).\n */\nexport interface QuotaCheck {\n readonly state: QuotaState\n readonly tier: PlanTier\n readonly estimatedCredits: number\n readonly thresholdCredits: number\n readonly upgradeUrl: string | null\n}\n\n/** Per-tool cost breakdown row inside {@link CostEstimate}. */\nexport interface ToolCostEstimate {\n readonly toolName: string\n readonly perInvocationCredits: number\n}\n\n/**\n * Result of `account.getQuota()` — a cost-range projection (min / total / max)\n * in **credits** plus the quota verdict, in one round-trip.\n */\nexport interface CostEstimate {\n readonly estimatedCredits: number\n readonly estimatedUsd: number\n readonly estimatedTotalCredits: number\n readonly estimatedMinCredits: number\n readonly estimatedMaxCredits: number\n readonly tools: ToolCostEstimate[]\n readonly quotaCheck: QuotaCheck\n}\n\n/** The caller's current billing plan. */\nexport interface Plan {\n readonly tier: PlanTier\n}\n\n/** One past usage period for a specific metric. */\nexport interface UsageHistoryEntry {\n readonly metric: string\n readonly periodStart: Date\n readonly periodEnd: Date\n readonly used: number\n readonly limit: number | null\n}\n","/**\n * Retry/resilience seam — port of `_internal/resilience.py`.\n *\n * `RetryPolicy` is a pure decision object: it says *whether* to retry and *how\n * long* to wait, but never sleeps or loops itself — `HttpClient` owns the loop.\n * That keeps the SOLID DIP seam (the transport depends on this interface, not\n * the concrete `ExponentialBackoffRetry`).\n *\n * Delays are returned in **seconds** (matching the Python SDK); the caller\n * converts to milliseconds for `setTimeout`.\n */\n\n/** HTTP verbs that get an auto `Idempotency-Key` so retries are safe. */\nexport const MUTATING_METHODS: ReadonlySet<string> = new Set(['POST', 'PUT', 'PATCH', 'DELETE'])\n\n/** Statuses worth retrying: request timeout, rate limit, and transient 5xx. */\nexport const DEFAULT_RETRYABLE_STATUSES: ReadonlySet<number> = new Set([\n 408, 429, 500, 502, 503, 504,\n])\n\n/**\n * The minimal response shape a policy needs — so policies never depend on the\n * concrete `fetch` `Response` or on `HttpClient`. `headers.get` is the standard\n * `Headers` accessor (case-insensitive in real `fetch`).\n */\nexport interface RetryableResponse {\n readonly status: number\n readonly headers: { get(name: string): string | null }\n}\n\n/** Pluggable retry policy. Mirrors the Python `RetryPolicy` Protocol. */\nexport interface RetryPolicy {\n /** Decide whether a retry should fire for this outcome. */\n shouldRetry(response: RetryableResponse | null, error: unknown, attempt: number): boolean\n /** Seconds to wait before the next attempt. */\n nextDelay(response: RetryableResponse | null, attempt: number): number\n}\n\n/** Parse a numeric `Retry-After` header into seconds (HTTP-date form ignored). */\nexport function parseRetryAfter(response: RetryableResponse): number | null {\n const raw = response.headers.get('Retry-After') ?? response.headers.get('retry-after')\n if (raw == null) {\n return null\n }\n const trimmed = raw.trim()\n if (trimmed === '') {\n return null\n }\n const seconds = Number(trimmed)\n if (!Number.isFinite(seconds) || seconds < 0) {\n return null\n }\n return seconds\n}\n\n/** Generate a fresh idempotency key (UUID v4). */\nexport function generateIdempotencyKey(): string {\n return crypto.randomUUID()\n}\n\n/** Tunables for {@link ExponentialBackoffRetry}; all optional. */\nexport interface ExponentialBackoffOptions {\n maxAttempts?: number\n baseDelay?: number\n maxDelay?: number\n jitter?: number\n retryableStatuses?: ReadonlySet<number>\n /** Injectable RNG in [0, 1) — defaults to `Math.random` (tests pass a stub). */\n rng?: () => number\n}\n\n/**\n * Capped exponential backoff with full jitter, honouring `Retry-After`.\n *\n * Defaults match the Python SDK: 5 attempts, 0.2s base, 30s cap, ±25% jitter.\n * Retries only on a retryable **status** — never on a thrown error (mirrors the\n * Python policy, which receives `error=null` from the transport loop).\n */\nexport class ExponentialBackoffRetry implements RetryPolicy {\n readonly maxAttempts: number\n readonly baseDelay: number\n readonly maxDelay: number\n readonly jitter: number\n readonly retryableStatuses: ReadonlySet<number>\n readonly #rng: () => number\n\n constructor(options: ExponentialBackoffOptions = {}) {\n this.maxAttempts = options.maxAttempts ?? 5\n this.baseDelay = options.baseDelay ?? 0.2\n this.maxDelay = options.maxDelay ?? 30.0\n this.jitter = options.jitter ?? 0.25\n this.retryableStatuses = options.retryableStatuses ?? DEFAULT_RETRYABLE_STATUSES\n this.#rng = options.rng ?? Math.random\n }\n\n shouldRetry(response: RetryableResponse | null, error: unknown, attempt: number): boolean {\n if (attempt >= this.maxAttempts) {\n return false\n }\n if (error != null) {\n return false\n }\n if (response == null) {\n return false\n }\n return this.retryableStatuses.has(response.status)\n }\n\n nextDelay(response: RetryableResponse | null, attempt: number): number {\n const retryAfter = response ? parseRetryAfter(response) : null\n if (retryAfter != null) {\n return Math.min(retryAfter, this.maxDelay)\n }\n const capped = Math.min(this.baseDelay * 2 ** attempt, this.maxDelay)\n const spread = capped * this.jitter\n const jittered = capped + (-spread + this.#rng() * (2 * spread))\n return Math.max(0, jittered)\n }\n}\n\n/** Disables retries entirely — pass to the client to fail fast. */\nexport class NoRetry implements RetryPolicy {\n shouldRetry(): boolean {\n return false\n }\n\n nextDelay(): number {\n return 0\n }\n}\n","/**\n * Auto-throttle policy — sleep + retry on {@link QuotaExceededError}. Port of\n * the Python SDK's `_internal/throttle.py`.\n *\n * Layered *above* the transport's {@link RetryPolicy}: that policy retries\n * transient transport failures (5xx / 429 / 408), while this module targets the\n * 402 `QUOTA_EXCEEDED` envelope specifically — where the remediation is *waiting\n * for the quota window to reset*, not re-issuing the same request faster.\n *\n * Only {@link AutoThrottleConfig} is part of the public surface (re-exported\n * from the package root); the resolver / sleep math / soft-limit helpers are\n * internal wiring used by `internal/http.ts`.\n *\n * Design choices (mirroring the Python module):\n * - **Bounded retry** — defaults to `maxRetries = 1` so a misconfigured caller\n * cannot get stuck in an infinite sleep+retry loop against a permanently\n * overrun account.\n * - **Bounded sleep** — `maxSleep` caps any server-supplied delay; if the\n * server asks the SDK to wait longer, the SDK gives up immediately and\n * re-raises so the caller's UX path stays predictable.\n * - **Forward-compat reset hints** — when the backend starts emitting them, the\n * SDK reads `details.retry_after_seconds` or `details.reset_at` transparently.\n */\n\nimport type { QuotaExceededError } from './errors'\n\n/** Header the backend (will) emit to flag \"soft limit\" without blocking the call. */\nexport const SOFT_LIMIT_HEADER = 'X-Quota-State'\nexport const SOFT_LIMIT_VALUE = 'soft_limit'\n\n/** Canonical defaults — shared by {@link AutoThrottleConfig} and the tests. */\nexport const DEFAULT_MAX_RETRIES = 1\nexport const DEFAULT_MAX_SLEEP_SECONDS = 60.0\nexport const DEFAULT_FALLBACK_SLEEP_SECONDS = 5.0\n\n/** Tunables for {@link AutoThrottleConfig}; all optional (each defaults above). */\nexport interface AutoThrottleOptions {\n /** Max number of quota-retry attempts after the first 402 (default 1). */\n maxRetries?: number\n /** Hard cap (seconds) on any single sleep; over this the SDK re-raises. */\n maxSleep?: number\n /** Sleep (seconds) used when the 402 carries no reset hint. */\n fallbackSleep?: number\n}\n\n/**\n * Knobs for the {@link QuotaExceededError} retry loop. Enable on the client with\n * `new Convilyn({ autoThrottle: true })` (defaults) or\n * `new Convilyn({ autoThrottle: new AutoThrottleConfig({ maxRetries: 2 }) })`.\n */\nexport class AutoThrottleConfig {\n readonly maxRetries: number\n readonly maxSleep: number\n readonly fallbackSleep: number\n\n constructor(options: AutoThrottleOptions = {}) {\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES\n this.maxSleep = options.maxSleep ?? DEFAULT_MAX_SLEEP_SECONDS\n this.fallbackSleep = options.fallbackSleep ?? DEFAULT_FALLBACK_SLEEP_SECONDS\n if (this.maxRetries < 0) {\n throw new RangeError('autoThrottle.maxRetries must be >= 0')\n }\n if (this.maxSleep <= 0) {\n throw new RangeError('autoThrottle.maxSleep must be > 0')\n }\n if (this.fallbackSleep < 0) {\n throw new RangeError('autoThrottle.fallbackSleep must be >= 0')\n }\n }\n}\n\n/** The `autoThrottle` constructor knob: `true`/`false` shorthand or a config. */\nexport type AutoThrottleArg = boolean | AutoThrottleConfig | undefined\n\n/**\n * Normalise the ctor knob into an {@link AutoThrottleConfig} or `null`.\n *\n * - `undefined` / `false` → disabled (`null`).\n * - `true` → default config.\n * - {@link AutoThrottleConfig} → returned verbatim.\n */\nexport function resolveAutoThrottle(value: AutoThrottleArg): AutoThrottleConfig | null {\n if (value == null || value === false) {\n return null\n }\n if (value === true) {\n return new AutoThrottleConfig()\n }\n return value\n}\n\n/**\n * Seconds to sleep before retrying, or `null` to give up and re-raise.\n *\n * Resolution order (first present wins):\n * 1. `details.retry_after_seconds` — numeric seconds.\n * 2. `details.reset_at` — ISO-8601 timestamp; delta from now.\n * 3. `config.fallbackSleep` — when neither hint is present.\n *\n * A past/negative `reset_at` delta collapses to `0` (retry immediately). Any\n * computed sleep exceeding `config.maxSleep` returns `null` so the caller\n * re-raises without spinning.\n */\nexport function computeQuotaSleep(\n error: QuotaExceededError,\n config: AutoThrottleConfig\n): number | null {\n const details = error.details ?? {}\n let sleepS = sleepFromRetryAfter(details)\n if (sleepS == null) {\n sleepS = sleepFromResetAt(details)\n }\n if (sleepS == null) {\n sleepS = config.fallbackSleep\n }\n if (sleepS > config.maxSleep) {\n return null\n }\n return Math.max(0, sleepS)\n}\n\nfunction sleepFromRetryAfter(details: Record<string, unknown>): number | null {\n const raw = details.retry_after_seconds\n if (raw == null) {\n return null\n }\n const seconds = typeof raw === 'number' ? raw : Number(raw)\n return Number.isFinite(seconds) ? seconds : null\n}\n\nfunction sleepFromResetAt(details: Record<string, unknown>): number | null {\n const raw = details.reset_at\n if (typeof raw !== 'string') {\n return null\n }\n const resetMs = Date.parse(raw)\n if (Number.isNaN(resetMs)) {\n return null\n }\n return (resetMs - Date.now()) / 1000\n}\n\n/**\n * True when the headers carry `X-Quota-State: soft_limit`. The WHATWG `Headers`\n * accessor is already case-insensitive on the *name*; `.toLowerCase()` here\n * tolerates casing/whitespace in the *value*.\n */\nexport function responseHasSoftLimitHeader(headers: { get(name: string): string | null }): boolean {\n const raw = headers.get(SOFT_LIMIT_HEADER)\n if (!raw) {\n return false\n }\n return raw.trim().toLowerCase() === SOFT_LIMIT_VALUE\n}\n\n/**\n * Surface a soft-limit signal via Node's native warning channel\n * (`process.emitWarning` — the TS analogue of Python's `warnings`). No-ops in\n * runtimes without `process` (browsers), where there is no equivalent channel.\n */\nexport function emitSoftLimitWarning(opts: { source: string; details?: string }): void {\n let message = `Convilyn quota soft_limit reached (source=${opts.source})`\n if (opts.details) {\n message = `${message}: ${opts.details}`\n }\n if (typeof process !== 'undefined' && typeof process.emitWarning === 'function') {\n process.emitWarning(message)\n }\n}\n","/**\n * Authentication strategy seam — port of `_internal/auth.py`.\n *\n * `AuthStrategy` is the DIP boundary: `HttpClient` depends on this interface,\n * not the concrete `ApiKey`, so a future `JwtBearer` / OAuth strategy drops in\n * without touching the transport.\n */\n\nimport { AuthError } from '../errors'\n\n/** Environment variable the SDK reads the API key from when none is passed. */\nexport const ENV_API_KEY = 'CONVILYN_API_KEY'\n\n/**\n * The canonical consumer API-key prefix the backend mints today\n * (`app/core/security/api_key.py` `USER_API_KEY_PREFIX`). This is the key the\n * consumer SDK authenticates with; mint one under Settings → API.\n */\nexport const CONSUMER_KEY_PREFIX = 'ck_'\n\n/**\n * Author-SDK / developer-portal token prefixes. These are **not** consumer\n * keys — `cvl_` / `cvi_` belong to the Author SDK (publishing workflows /\n * tools) and the deploy flow. The consumer SDK recognises them ONLY to raise a\n * precise {@link AuthError} when one is pasted here by mistake, instead of\n * letting the API answer with an opaque 401. Unknown prefixes are still\n * accepted — forward-compat for any new consumer-key format the backend may\n * mint that this SDK has not heard of yet.\n */\nexport const AUTHOR_KEY_PREFIXES = ['cvl_', 'cvi_'] as const\n\n/** True when `key` is an Author-SDK / deploy token rather than a consumer key. */\nexport function isAuthorKey(key: string): boolean {\n return AUTHOR_KEY_PREFIXES.some((prefix) => key.startsWith(prefix))\n}\n\n/** Pluggable auth strategy. Mirrors the Python `AuthStrategy` Protocol. */\nexport interface AuthStrategy {\n /** Headers to merge into every request (e.g. `Authorization`). */\n headers(): Record<string, string>\n /** The raw bearer token — used by non-HTTP transports (WebSocket). */\n bearerToken(): string\n}\n\n/** Mask a secret for safe display: `ck_a…9f` (or `***` when too short). */\nexport function maskKey(key: string): string {\n if (key.length <= 8) {\n return '***'\n }\n return `${key.slice(0, 4)}…${key.slice(-2)}`\n}\n\n/** API-key bearer auth. The key is never logged — `toString` masks it. */\nexport class ApiKey implements AuthStrategy {\n readonly #key: string\n\n constructor(key: string) {\n if (!key || !key.trim()) {\n throw new AuthError('API key must be a non-empty string')\n }\n if (isAuthorKey(key)) {\n throw new AuthError(\n `${maskKey(key)} looks like a Convilyn Author SDK / deploy token, not a ` +\n `consumer API key. The consumer SDK authenticates with a \"${CONSUMER_KEY_PREFIX}\" ` +\n `key — mint one under Settings → API. (Author tokens publish workflows / tools; ` +\n `they do not call the data-plane API.)`\n )\n }\n this.#key = key\n }\n\n headers(): Record<string, string> {\n return { Authorization: `Bearer ${this.#key}` }\n }\n\n bearerToken(): string {\n return this.#key\n }\n\n /** Masked so the raw key never leaks via string interpolation. */\n toString(): string {\n return `ApiKey(${maskKey(this.#key)})`\n }\n\n /** Node's `util.inspect` hook so `console.log(apiKey)` is masked too. */\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.toString()\n }\n}\n\n/** Optional injection seam for `resolveAuth` (tests pass a fake env). */\nexport interface ResolveAuthOptions {\n env?: Record<string, string | undefined>\n}\n\n/**\n * Resolve an `AuthStrategy` from an explicit key or the environment.\n *\n * Precedence: explicit `apiKey` argument > `CONVILYN_API_KEY` env var.\n * Throws {@link AuthError} when neither is present.\n */\nexport function resolveAuth(\n apiKey?: string | null,\n options: ResolveAuthOptions = {}\n): AuthStrategy {\n const env = options.env ?? (typeof process !== 'undefined' ? process.env : {})\n const resolved = apiKey ?? env[ENV_API_KEY]\n if (!resolved || !resolved.trim()) {\n throw new AuthError(\n `No API key provided. Pass { apiKey } or set the ${ENV_API_KEY} environment variable.`\n )\n }\n return new ApiKey(resolved)\n}\n","/**\n * Single source of truth for the package version. Kept in lockstep with\n * package.json + CHANGELOG.md (guarded by test/packaging/version-changelog.test.ts).\n */\nexport const VERSION = '0.2.0'\n","/**\n * HTTP transport — port of `_internal/http.py` (fetch-based; Node 18+ global\n * `fetch` or any browser).\n *\n * Responsibilities (single, per SRP):\n * - inject auth + standard headers (`User-Agent`, `Accept`);\n * - normalise the Convilyn error envelope `{code, message, details}` (flat, or\n * nested under `detail` / `error`) into typed errors;\n * - apply the injected {@link RetryPolicy} on transient 408/429/5xx, reusing one\n * `Idempotency-Key` across retries of a mutating verb;\n * - presigned-URL helpers (`externalPut` / `externalGet`) that send NO auth.\n *\n * The resilience decision lives in {@link RetryPolicy} (DIP seam) — this client\n * owns only the loop. Optionally, an {@link AutoThrottleConfig} adds a higher-\n * level shim that sleeps + re-issues on the 402 `QUOTA_EXCEEDED` envelope\n * (remediation = waiting for the quota window, not retrying faster); it stays\n * OFF unless the caller opts in, so the default path decodes + throws unchanged.\n */\n\nimport {\n APIError,\n PlanRequiredError,\n QuotaExceededError,\n RateLimitError,\n RetryExhaustedError,\n S3UploadError,\n type ErrorDetails,\n} from '../errors'\nimport { VERSION } from '../version'\nimport type { AuthStrategy } from './auth'\nimport {\n ExponentialBackoffRetry,\n MUTATING_METHODS,\n generateIdempotencyKey,\n type RetryPolicy,\n type RetryableResponse,\n} from '../retry'\nimport {\n type AutoThrottleConfig,\n computeQuotaSleep,\n emitSoftLimitWarning,\n responseHasSoftLimitHeader,\n} from '../throttle'\n\nexport const DEFAULT_BASE_URL = 'https://api.convilyn.corenovus.com'\nexport const DEFAULT_TIMEOUT = 30.0\n\n/**\n * Guard external (backend-supplied) URLs to the `https` scheme. Port of the\n * Python `_require_https`: `externalPut` / `externalGet`\n * dial absolute URLs the Convilyn backend returns (presigned upload /\n * download URLs). Enforcing `https` is defence-in-depth — a compromised or\n * MITM'd backend that returned `http://` (downgrade), `file://` (local\n * read), or an internal address over plain HTTP cannot coerce the SDK into\n * following it. The scheme — not the host — is checked, so any legitimate\n * https presign host is still accepted. Unparseable URLs are rejected too.\n *\n * @throws Error when the URL scheme is not `https`.\n */\nexport function requireHttps(url: string): void {\n let scheme: string\n try {\n scheme = new URL(url).protocol.replace(/:$/, '').toLowerCase()\n } catch {\n scheme = ''\n }\n if (scheme !== 'https') {\n throw new Error(\n `Refusing to dial non-https URL (scheme=${JSON.stringify(scheme)}). ` +\n 'The Convilyn SDK only follows https presigned URLs.'\n )\n }\n}\n\n/**\n * Backend 402 codes that mean \"your plan is too low\". Listed so a new tier\n * signal is a one-line addition (OCP). The backend emits `TIER_REQUIRED` today.\n */\nconst PLAN_REQUIRED_CODES: ReadonlySet<string> = new Set([\n 'TIER_REQUIRED',\n 'PRO_TIER_REQUIRED',\n 'BUSINESS_TIER_REQUIRED',\n 'ENTERPRISE_TIER_REQUIRED',\n])\n\n/** Request body shapes the transport accepts. */\nexport type RequestBody = Uint8Array | ArrayBuffer | string | ReadableStream<Uint8Array>\n\n/** Narrow, stubbable `fetch` signature (the real global `fetch` satisfies it). */\nexport type FetchLike = (url: string, init?: RequestInit) => Promise<Response>\n\n/** Per-request options for {@link HttpClient.request} / `rawRequest`. */\nexport interface RequestOptions {\n headers?: Record<string, string>\n json?: unknown\n params?: Record<string, string | number | boolean | null | undefined>\n content?: RequestBody\n}\n\n/** Constructor options for {@link HttpClient}. */\nexport interface HttpClientOptions {\n auth: AuthStrategy\n baseUrl?: string\n /** Per-request timeout in seconds. */\n timeout?: number\n userAgent?: string\n retryPolicy?: RetryPolicy\n idempotencyEnabled?: boolean\n /** Opt-in 402-quota sleep+retry shim; omitted / null = disabled. */\n autoThrottle?: AutoThrottleConfig | null\n /** Injectable `fetch` (tests pass a stub). Defaults to the global `fetch`. */\n fetch?: FetchLike\n /** Injectable sleep in seconds (tests pass a no-op). Defaults to real timer. */\n sleep?: (seconds: number) => Promise<void>\n}\n\nconst realSleep = (seconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, seconds * 1000))\n\n/** Async HTTP client with Convilyn-specific header + error semantics. */\nexport class HttpClient {\n readonly #auth: AuthStrategy\n readonly #baseUrl: string\n readonly #timeout: number\n readonly #userAgent: string\n readonly #retryPolicy: RetryPolicy\n readonly #idempotencyEnabled: boolean\n readonly #autoThrottle: AutoThrottleConfig | null\n readonly #fetch: FetchLike\n readonly #sleep: (seconds: number) => Promise<void>\n\n constructor(options: HttpClientOptions) {\n this.#auth = options.auth\n this.#baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '')\n this.#timeout = options.timeout ?? DEFAULT_TIMEOUT\n this.#userAgent = options.userAgent ?? `convilyn-js/${VERSION}`\n this.#retryPolicy = options.retryPolicy ?? new ExponentialBackoffRetry()\n this.#idempotencyEnabled = options.idempotencyEnabled ?? true\n this.#autoThrottle = options.autoThrottle ?? null\n if (options.fetch) {\n this.#fetch = options.fetch\n } else if (typeof fetch !== 'undefined') {\n this.#fetch = (url, init) => fetch(url, init)\n } else {\n throw new Error('No global fetch available; pass options.fetch (Node 18+ or a polyfill)')\n }\n this.#sleep = options.sleep ?? realSleep\n }\n\n get baseUrl(): string {\n return this.#baseUrl\n }\n\n /** Read-only handle to the auth strategy (used by the WS transport). */\n get auth(): AuthStrategy {\n return this.#auth\n }\n\n /**\n * Issue a request, applying the retry policy on transient failures and\n * raising a typed error on a non-2xx final response.\n */\n async request(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const response = await this.#requestWithQuotaThrottle(\n method,\n path,\n options,\n this.#autoThrottle ? this.#autoThrottle.maxRetries : 0\n )\n maybeEmitSoftLimit(response)\n return response\n }\n\n /**\n * Like {@link request} but never raises on HTTP status — returns the final\n * response so callers (the `convilyn api` CLI escape hatch) can inspect it.\n */\n async rawRequest(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const { response } = await this.#doRequestWithRetry(method, path, options)\n maybeEmitSoftLimit(response)\n return response\n }\n\n /**\n * Run {@link #doRequestWithRetry}, re-issuing on a 402 {@link QuotaExceededError}\n * up to `quotaAttemptsRemaining` times, sleeping {@link computeQuotaSleep}\n * between attempts. Transport-level retries (5xx / 429 / 408) are handled\n * inside `#doRequestWithRetry`; this shim targets the 402 quota envelope only.\n */\n async #requestWithQuotaThrottle(\n method: string,\n path: string,\n options: RequestOptions,\n quotaAttemptsRemaining: number\n ): Promise<Response> {\n const { response, attempts } = await this.#doRequestWithRetry(method, path, options)\n if (response.status < 400) {\n return response\n }\n const decoded =\n attempts > 1 ? await toRetryExhausted(response, attempts) : await decodeError(response)\n if (\n this.#autoThrottle != null &&\n quotaAttemptsRemaining > 0 &&\n decoded instanceof QuotaExceededError\n ) {\n const sleepSeconds = computeQuotaSleep(decoded, this.#autoThrottle)\n if (sleepSeconds != null) {\n await this.#sleep(sleepSeconds)\n return this.#requestWithQuotaThrottle(method, path, options, quotaAttemptsRemaining - 1)\n }\n }\n throw decoded\n }\n\n async #doRequestWithRetry(\n method: string,\n path: string,\n options: RequestOptions\n ): Promise<{ response: Response; attempts: number }> {\n const headers = this.#defaultHeaders()\n if (options.headers) {\n Object.assign(headers, options.headers)\n }\n this.#applyIdempotencyKey(method.toUpperCase(), headers)\n\n let attempt = 0\n for (;;) {\n const response = await this.#fetchOnce(method, path, headers, options)\n if (response.status < 400) {\n return { response, attempts: attempt + 1 }\n }\n const view: RetryableResponse = { status: response.status, headers: response.headers }\n if (this.#retryPolicy.shouldRetry(view, null, attempt)) {\n await this.#sleep(this.#retryPolicy.nextDelay(view, attempt))\n attempt += 1\n continue\n }\n return { response, attempts: attempt + 1 }\n }\n }\n\n #defaultHeaders(): Record<string, string> {\n return {\n 'User-Agent': this.#userAgent,\n Accept: 'application/json',\n ...this.#auth.headers(),\n }\n }\n\n #applyIdempotencyKey(method: string, headers: Record<string, string>): void {\n if (!this.#idempotencyEnabled) {\n return\n }\n if (!MUTATING_METHODS.has(method)) {\n return\n }\n if ('Idempotency-Key' in headers) {\n return\n }\n headers['Idempotency-Key'] = generateIdempotencyKey()\n }\n\n async #fetchOnce(\n method: string,\n path: string,\n headers: Record<string, string>,\n options: RequestOptions\n ): Promise<Response> {\n const url = this.#buildUrl(path, options.params)\n if (options.json !== undefined) {\n headers['Content-Type'] = 'application/json'\n }\n const init: RequestInit = { method, headers }\n if (options.json !== undefined) {\n init.body = JSON.stringify(options.json)\n } else if (options.content !== undefined) {\n init.body = options.content as BodyInit\n }\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.#timeout * 1000)\n init.signal = controller.signal\n try {\n return await this.#fetch(url, init)\n } finally {\n clearTimeout(timer)\n }\n }\n\n #buildUrl(path: string, params?: RequestOptions['params']): string {\n const absolute = /^https?:\\/\\//i.test(path)\n const full = absolute ? path : `${this.#baseUrl}${path.startsWith('/') ? '' : '/'}${path}`\n if (!params) {\n return full\n }\n const url = new URL(full)\n for (const [key, value] of Object.entries(params)) {\n if (value == null) {\n continue\n }\n url.searchParams.set(key, String(value))\n }\n return url.toString()\n }\n\n /**\n * PUT to an external absolute URL (e.g. a presigned upload URL). Sends NO\n * Convilyn auth (the URL carries its own signature) and is NOT retried.\n */\n async externalPut(\n url: string,\n { content, headers }: { content: RequestBody; headers?: Record<string, string> }\n ): Promise<Response> {\n requireHttps(url)\n const response = await this.#fetch(url, {\n method: 'PUT',\n body: content as BodyInit,\n headers: headers ?? {},\n })\n if (response.status >= 400) {\n throw new S3UploadError(\n response.status,\n `S3_HTTP_${response.status}`,\n response.statusText || 'External upload failed',\n { url }\n )\n }\n return response\n }\n\n /** GET an external absolute URL (e.g. a presigned download). No auth. */\n async externalGet(\n url: string,\n { headers }: { headers?: Record<string, string> } = {}\n ): Promise<Response> {\n requireHttps(url)\n const response = await this.#fetch(url, { method: 'GET', headers: headers ?? {} })\n if (response.status >= 400) {\n throw new APIError(\n response.status,\n `DOWNLOAD_HTTP_${response.status}`,\n response.statusText || 'External download failed',\n { url }\n )\n }\n return response\n }\n\n /** No persistent connection pool with `fetch`; provided for API symmetry. */\n async close(): Promise<void> {\n // no-op\n }\n}\n\n// --- error decoding (free functions; pure + independently testable) ----------\n\n/**\n * Emit a soft-limit warning when the response carries `X-Quota-State:\n * soft_limit`. Independent of {@link AutoThrottleConfig} — soft-limit is purely\n * informational, so the SDK warns whether or not auto-throttle is enabled.\n */\nfunction maybeEmitSoftLimit(response: Response): void {\n if (responseHasSoftLimitHeader(response.headers)) {\n emitSoftLimitWarning({ source: response.url || 'request' })\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined\n}\n\n/** Best-effort numeric coercion for wire fields that may arrive as strings. */\nfunction coerceNumber(value: unknown): number | null {\n if (value == null) {\n return null\n }\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : null\n }\n if (typeof value === 'string') {\n const parsed = Number(value)\n return Number.isFinite(parsed) ? parsed : null\n }\n return null\n}\n\nasync function readJson(response: Response): Promise<Record<string, unknown>> {\n try {\n const payload: unknown = await response.json()\n return isRecord(payload) ? payload : {}\n } catch {\n return {}\n }\n}\n\n/** Return the inner error dict regardless of envelope shape (flat/detail/error). */\nexport function flattenErrorEnvelope(payload: Record<string, unknown>): Record<string, unknown> {\n for (const key of ['detail', 'error'] as const) {\n const nested = payload[key]\n if (isRecord(nested)) {\n return nested\n }\n }\n return payload\n}\n\n/**\n * Translate a non-2xx response into the appropriate {@link APIError} subclass.\n *\n * Status-aware dispatch:\n * - 429 → {@link RateLimitError}\n * - 402 + plan-required code → {@link PlanRequiredError}\n * - 402 + `insufficient_balance` / `QUOTA_EXCEEDED` → {@link QuotaExceededError}\n * (fields read in **credits**: `costCredits` / `balanceCredits` / top-up URL)\n * - otherwise → {@link APIError}\n */\nexport async function decodeError(response: Response): Promise<APIError> {\n const status = response.status\n const inner = flattenErrorEnvelope(await readJson(response))\n const code = asString(inner.code) ?? `HTTP_${status}`\n const message = asString(inner.message) ?? (response.statusText || 'Request failed')\n const details: ErrorDetails | undefined = isRecord(inner.details) ? inner.details : undefined\n\n if (status === 429) {\n return new RateLimitError(status, code, message, details)\n }\n\n if (status === 402) {\n const upgradeUrl =\n asString(inner.upgrade_url ?? inner.upgradeUrl ?? inner.topUp ?? inner.top_up) ?? null\n if (PLAN_REQUIRED_CODES.has(code)) {\n return new PlanRequiredError(status, code, message, details, { upgradeUrl })\n }\n if (code === 'insufficient_balance' || code === 'QUOTA_EXCEEDED') {\n return new QuotaExceededError(status, code, message, details, {\n costCredits: coerceNumber(inner.costCredits ?? inner.cost_credits),\n balanceCredits: coerceNumber(inner.balanceCredits ?? inner.balance_credits),\n topUpUrl: upgradeUrl,\n })\n }\n }\n\n return new APIError(status, code, message, details)\n}\n\n/** Convert the final retried response into a {@link RetryExhaustedError}. */\nexport async function toRetryExhausted(\n response: Response,\n attemptCount: number\n): Promise<RetryExhaustedError> {\n const status = response.status\n const payload = await readJson(response)\n const code = asString(payload.code) ?? `HTTP_${status}`\n const message = asString(payload.message) ?? (response.statusText || 'Request failed')\n const details: ErrorDetails | undefined = isRecord(payload.details) ? payload.details : undefined\n return new RetryExhaustedError(status, code, message, details, { attemptCount })\n}\n","/**\n * Wire → public-type parsers.\n *\n * The Python SDK gets this for free from Pydantic aliases\n * (`fileName`→`filename`, `mimeType`→`contentType`, ISO string→`datetime`).\n * In TS we hand-map the wire envelope to the public {@link File} /\n * {@link ConvertJob} shapes. Parsers trust the backend wire contract for\n * required fields (the 2xx responses always carry them) and only default the\n * genuinely-optional ones.\n */\n\nimport type {\n ConvertJob,\n CostEstimate,\n File,\n GoalEvent,\n GoalJob,\n JobError,\n LikeResponse,\n PendingSlot,\n Plan,\n QuotaCheck,\n ResultFile,\n ToolCostEstimate,\n UsageHistoryEntry,\n Workflow,\n WorkflowSearchPage,\n WorkflowStats,\n WorkflowSummary,\n} from '../types'\n\n/**\n * Micro-units per credit. 1 credit = $0.01 and 1 µU = $1e-6, so 1 credit =\n * 10,000 µU (matches the backend's `/10_000` boundary conversion). The\n * cost-preview endpoint returns µU on the wire; the SDK exposes **credits**.\n */\nexport const MICRO_U_PER_CREDIT = 10_000\n\nfunction microUToCredits(value: unknown): number {\n return Number(value ?? 0) / MICRO_U_PER_CREDIT\n}\n\nfunction toDate(value: unknown): Date {\n return new Date(value as string | number)\n}\n\nfunction toDateOrNull(value: unknown): Date | null {\n return value == null ? null : toDate(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** Map the `/upload/confirm` wire record to a {@link File}. */\nexport function parseFile(wire: Record<string, unknown>): File {\n return {\n fileId: String(wire.fileId),\n filename: String(wire.fileName),\n size: Number(wire.fileSize),\n contentType: String(wire.mimeType),\n createdAt: toDate(wire.createdAt),\n jobId: (wire.jobId as string | null | undefined) ?? null,\n isInput: wire.isInput == null ? true : Boolean(wire.isInput),\n }\n}\n\n/** Map a result-file wire record to a {@link ResultFile}. */\nexport function parseResultFile(wire: Record<string, unknown>): ResultFile {\n return {\n filename: String(wire.filename),\n size: Number(wire.size),\n mimetype: String(wire.mimetype),\n url: String(wire.url),\n }\n}\n\n/** Map a job-error wire record to a {@link JobError}. */\nexport function parseJobError(wire: Record<string, unknown>): JobError {\n return { code: String(wire.code), message: String(wire.message) }\n}\n\n/** Map a conversion job wire record to a {@link ConvertJob}. */\nexport function parseConvertJob(wire: Record<string, unknown>): ConvertJob {\n const resultFiles = wire.resultFiles\n const error = wire.error\n return {\n jobId: String(wire.jobId),\n status: wire.status as ConvertJob['status'],\n processorType: String(wire.processorType),\n progress: Number(wire.progress ?? 0),\n progressMessage: (wire.progressMessage as string | null | undefined) ?? null,\n resultFiles: Array.isArray(resultFiles)\n ? resultFiles.map((row) => parseResultFile(row as Record<string, unknown>))\n : null,\n error: error != null ? parseJobError(error as Record<string, unknown>) : null,\n retryCount: Number(wire.retryCount ?? 0),\n createdAt: toDate(wire.createdAt),\n updatedAt: toDate(wire.updatedAt),\n startedAt: toDateOrNull(wire.startedAt),\n completedAt: toDateOrNull(wire.completedAt),\n estimatedDuration: (wire.estimatedDuration as number | null | undefined) ?? null,\n }\n}\n\n/** Map a pending-slot wire record to a {@link PendingSlot}. */\nexport function parsePendingSlot(wire: Record<string, unknown>): PendingSlot {\n return {\n slotId: String(wire.slotId),\n slotType: String(wire.slotType),\n question: String(wire.question),\n options: Array.isArray(wire.options)\n ? (wire.options as Array<string | Record<string, string>>)\n : null,\n required: wire.required == null ? true : Boolean(wire.required),\n isDisambiguation: Boolean(wire.isDisambiguation ?? false),\n suggestedValue: wire.suggestedValue ?? null,\n suggestedConfidence: (wire.suggestedConfidence as number | null | undefined) ?? null,\n }\n}\n\n/** Map a goal job wire record to a {@link GoalJob}. */\nexport function parseGoalJob(wire: Record<string, unknown>): GoalJob {\n return {\n jobSpecId: String(wire.jobSpecId),\n status: wire.status as GoalJob['status'],\n progress: Number(wire.progress ?? 0),\n itemVersion: (wire.itemVersion as number | null | undefined) ?? null,\n attemptId: (wire.attemptId as string | null | undefined) ?? null,\n goalText: (wire.goalText as string | null | undefined) ?? null,\n fileIds: Array.isArray(wire.fileIds) ? wire.fileIds.map(String) : [],\n pendingSlots: Array.isArray(wire.pendingSlots)\n ? wire.pendingSlots.map((slot) => parsePendingSlot(slot as Record<string, unknown>))\n : [],\n filledSlots: isRecord(wire.filledSlots) ? wire.filledSlots : {},\n pendingInterrupts: Array.isArray(wire.pendingInterrupts)\n ? (wire.pendingInterrupts as Record<string, unknown>[])\n : [],\n agentMessage: (wire.agentMessage as string | null | undefined) ?? null,\n errorMessage: (wire.errorMessage as string | null | undefined) ?? null,\n errorCode: (wire.errorCode as string | null | undefined) ?? null,\n createdAt: toDate(wire.createdAt),\n updatedAt: toDate(wire.updatedAt),\n startedAt: toDateOrNull(wire.startedAt),\n completedAt: toDateOrNull(wire.completedAt),\n }\n}\n\n/** Map a goal event wire record to a {@link GoalEvent}. */\nexport function parseGoalEvent(wire: Record<string, unknown>): GoalEvent {\n return {\n type: wire.type as GoalEvent['type'],\n schemaVersion: Number(wire.schemaVersion ?? 0),\n jobSpecId: String(wire.jobSpecId),\n emittedAt: toDate(wire.emittedAt),\n seq: Number(wire.seq ?? 0),\n data: isRecord(wire.data) ? wire.data : {},\n }\n}\n\n// ── community workflows ──────────────────────────────────────────────\n\n/** Map a workflow-stats wire record to {@link WorkflowStats}. */\nexport function parseWorkflowStats(wire: unknown): WorkflowStats {\n const stats = isRecord(wire) ? wire : {}\n return {\n runCount: Number(stats.runCount ?? 0),\n forkCount: Number(stats.forkCount ?? 0),\n likeCount: Number(stats.likeCount ?? 0),\n }\n}\n\n/** Map a full workflow wire record to {@link Workflow}. */\nexport function parseWorkflow(wire: Record<string, unknown>): Workflow {\n return {\n workflowId: String(wire.workflowId),\n ownerId: (wire.ownerId as string | null | undefined) ?? null,\n specId: String(wire.specId),\n sourceSpecId: (wire.sourceSpecId as string | null | undefined) ?? null,\n sourceType: (wire.sourceType as string | null | undefined) ?? null,\n name: String(wire.name),\n description: (wire.description as string | null | undefined) ?? null,\n visibility: wire.visibility as Workflow['visibility'],\n tags: Array.isArray(wire.tags) ? wire.tags.map(String) : [],\n stats: parseWorkflowStats(wire.stats),\n itemVersion: Number(wire.itemVersion ?? 0),\n }\n}\n\n/** Map a community-list row to {@link WorkflowSummary}. */\nexport function parseWorkflowSummary(wire: Record<string, unknown>): WorkflowSummary {\n return {\n workflowId: String(wire.workflowId),\n specId: String(wire.specId),\n ownerId: (wire.ownerId as string | null | undefined) ?? null,\n name: String(wire.name),\n description: (wire.description as string | null | undefined) ?? null,\n visibility: wire.visibility as WorkflowSummary['visibility'],\n tags: Array.isArray(wire.tags) ? wire.tags.map(String) : [],\n stats: parseWorkflowStats(wire.stats),\n }\n}\n\n/** Map a community search page to {@link WorkflowSearchPage}. */\nexport function parseWorkflowSearchPage(wire: Record<string, unknown>): WorkflowSearchPage {\n const items = wire.items\n return {\n items: Array.isArray(items)\n ? items.map((row) => parseWorkflowSummary(row as Record<string, unknown>))\n : [],\n cursor: (wire.cursor as string | null | undefined) ?? null,\n }\n}\n\n/** Map a like-toggle wire record to {@link LikeResponse}. */\nexport function parseLikeResponse(wire: Record<string, unknown>): LikeResponse {\n return {\n liked: Boolean(wire.liked),\n likeCount: Number(wire.likeCount ?? 0),\n }\n}\n\n// ── billing / quota (µU wire → credits) ──────────────────────────────\n\n/** Map a per-tool cost row (µU wire) to {@link ToolCostEstimate} (credits). */\nexport function parseToolCostEstimate(wire: Record<string, unknown>): ToolCostEstimate {\n return {\n toolName: String(wire.toolName),\n perInvocationCredits: microUToCredits(wire.perInvocationMicroU),\n }\n}\n\n/** Map a quota-check wire record (µU) to {@link QuotaCheck} (credits). */\nexport function parseQuotaCheck(wire: Record<string, unknown>): QuotaCheck {\n return {\n state: wire.state as QuotaCheck['state'],\n tier: wire.tier as QuotaCheck['tier'],\n estimatedCredits: microUToCredits(wire.estimatedMicroU),\n thresholdCredits: microUToCredits(wire.thresholdMicroU),\n upgradeUrl: (wire.upgradeUrl as string | null | undefined) ?? null,\n }\n}\n\n/** Map a cost-preview wire record (µU) to {@link CostEstimate} (credits). */\nexport function parseCostEstimate(wire: Record<string, unknown>): CostEstimate {\n const tools = wire.tools\n return {\n estimatedCredits: microUToCredits(wire.estimatedMicroU),\n estimatedUsd: Number(wire.estimatedUsd ?? 0),\n estimatedTotalCredits: microUToCredits(wire.estimatedTotalMicroU),\n estimatedMinCredits: microUToCredits(wire.estimatedMinMicroU),\n estimatedMaxCredits: microUToCredits(wire.estimatedMaxMicroU),\n tools: Array.isArray(tools)\n ? tools.map((row) => parseToolCostEstimate(row as Record<string, unknown>))\n : [],\n quotaCheck: parseQuotaCheck(isRecord(wire.quotaCheck) ? wire.quotaCheck : {}),\n }\n}\n\n/** Build a {@link Plan} from a cost-estimate verdict's tier. */\nexport function planFromTier(tier: Plan['tier']): Plan {\n return { tier }\n}\n\n/** Map a usage-history row to {@link UsageHistoryEntry}. */\nexport function parseUsageHistoryEntry(wire: Record<string, unknown>): UsageHistoryEntry {\n return {\n metric: String(wire.metric),\n periodStart: toDate(wire.period_start ?? wire.periodStart),\n periodEnd: toDate(wire.period_end ?? wire.periodEnd),\n used: Number(wire.used ?? 0),\n limit: (wire.limit as number | null | undefined) ?? null,\n }\n}\n","/**\n * Account resource — caller-side billing plan + quota queries. Port of\n * `resources/account.py`.\n *\n * POST /api/v1/workflows/cost-preview — estimate cost (credits) + quota verdict\n * GET /api/v1/payment/usage/history — past usage periods\n *\n * Read-only — actions (upgrade, top-up) live on the website, not the SDK.\n * Money is expressed in **credits** (the µU wire is converted in the parser).\n */\n\nimport type { HttpClient } from '../internal/http'\nimport { parseCostEstimate, parseUsageHistoryEntry, planFromTier } from '../internal/parsers'\nimport type { CostEstimate, Plan, UsageHistoryEntry } from '../types'\n\n/** Options for {@link Account.getQuota}. */\nexport interface GetQuotaOptions {\n /** Fully-qualified tool ids (e.g. `pdf-mcp:extract_text`). */\n tools?: string[]\n /** Iteration cap from the draft spec. */\n maxIterations?: number\n}\n\n/** Asynchronous account-tier resource (`client.account`). */\nexport class Account {\n readonly #http: HttpClient\n\n constructor(http: HttpClient) {\n this.#http = http\n }\n\n /** Estimate a workflow's cost (credits) + check the verdict against the plan. */\n async getQuota(options: GetQuotaOptions = {}): Promise<CostEstimate> {\n const body: Record<string, unknown> = { toolNames: options.tools ?? [] }\n if (options.maxIterations != null) {\n body.maxIterations = options.maxIterations\n }\n const response = await this.#http.request('POST', '/api/v1/workflows/cost-preview', {\n json: body,\n })\n return parseCostEstimate((await response.json()) as Record<string, unknown>)\n }\n\n /** Return the caller's current billing plan (derived from the cost-preview tier). */\n async getPlan(): Promise<Plan> {\n const estimate = await this.getQuota({ tools: [], maxIterations: 1 })\n return planFromTier(estimate.quotaCheck.tier)\n }\n\n /**\n * List the caller's past usage periods (one row per metric+period). `since`\n * filters client-side to entries whose `periodStart` is on or after it\n * (the backend does not honour a query param today).\n */\n async usageHistory(options: { since?: Date } = {}): Promise<UsageHistoryEntry[]> {\n const response = await this.#http.request('GET', '/api/v1/payment/usage/history')\n const rows = await response.json()\n const entries = Array.isArray(rows)\n ? rows.map((row) => parseUsageHistoryEntry(row as Record<string, unknown>))\n : []\n if (options.since == null) {\n return entries\n }\n const since = options.since\n return entries.filter((entry) => entry.periodStart >= since)\n }\n}\n","/**\n * Convert resource — document conversion jobs. Port of\n * `resources/convert.py`.\n *\n * POST /api/v1/jobs — create a conversion job\n * GET /api/v1/jobs/{id} — poll status\n * GET <resultFiles[0].url>— download the produced artifact (presigned, no auth)\n *\n * Data lives on {@link ConvertJob}; behaviour (poll / wait / download) lives\n * here. The poll clock + sleep are injectable so the wait loop is testable\n * without real time.\n */\n\nimport { JobFailedError, JobTimeoutError } from '../errors'\nimport type { HttpClient } from '../internal/http'\nimport { parseConvertJob } from '../internal/parsers'\nimport { isConvertJobTerminal, type ConvertJob, type File } from '../types'\n\nexport const DEFAULT_POLL_INTERVAL = 1.0\nexport const DEFAULT_POLL_TIMEOUT = 300.0\nexport const MAX_POLL_INTERVAL = 5.0\nconst STALE_PROGRESS_BACKOFF_AFTER = 3\nconst BACKOFF_FACTOR = 1.5\n\n/** Common document suffixes → backend `source_format` tokens. */\nconst SOURCE_FORMAT_BY_SUFFIX: Record<string, string> = {\n docx: 'docx',\n doc: 'doc',\n pdf: 'pdf',\n pptx: 'pptx',\n ppt: 'ppt',\n xlsx: 'xlsx',\n xls: 'xls',\n txt: 'txt',\n rtf: 'rtf',\n html: 'html',\n htm: 'html',\n md: 'md',\n odt: 'odt',\n}\n\nfunction inferSourceFormat(filename: string): string | null {\n const dot = filename.lastIndexOf('.')\n if (dot < 0) {\n return null\n }\n return SOURCE_FORMAT_BY_SUFFIX[filename.slice(dot + 1).toLowerCase()] ?? null\n}\n\n/** Options for {@link Convert.create} — supply exactly one of `file` / `fileId`. */\nexport interface CreateConvertOptions {\n file?: File\n fileId?: string\n targetFormat: string\n sourceFormat?: string\n quality?: string\n pageRange?: string\n}\n\n/** Polling controls for {@link Convert.wait}. */\nexport interface WaitOptions {\n timeout?: number\n pollInterval?: number\n}\n\n/** Test seams: an injectable clock (ms) + sleep (seconds). */\nexport interface ConvertResourceOptions {\n sleep?: (seconds: number) => Promise<void>\n now?: () => number\n}\n\nconst realSleep = (seconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, seconds * 1000))\n\n/** Asynchronous conversion resource (`client.convert`). */\nexport class Convert {\n readonly #http: HttpClient\n readonly #sleep: (seconds: number) => Promise<void>\n readonly #now: () => number\n\n constructor(http: HttpClient, options: ConvertResourceOptions = {}) {\n this.#http = http\n this.#sleep = options.sleep ?? realSleep\n this.#now = options.now ?? (() => Date.now())\n }\n\n /** Create a conversion job and return immediately (queued/processing). */\n async create(options: CreateConvertOptions): Promise<ConvertJob> {\n const { fileId, sourceFormat } = this.#resolveSource(options)\n const params: Record<string, unknown> = {\n source_file_id: fileId,\n source_format: sourceFormat,\n target_format: options.targetFormat,\n quality: options.quality ?? 'standard',\n }\n if (options.pageRange != null) {\n params.page_range = options.pageRange\n }\n const response = await this.#http.request('POST', '/api/v1/jobs', {\n json: { processor_type: 'document_conversion', params },\n })\n return parseConvertJob((await response.json()) as Record<string, unknown>)\n }\n\n /** Fetch the current state of a job (one-shot poll). */\n async retrieve(jobId: string): Promise<ConvertJob> {\n return this.#pollOnce(jobId)\n }\n\n /**\n * Poll until the job reaches a terminal status, the timeout expires, or the\n * backend reports failure.\n *\n * @throws {@link JobFailedError} when the terminal status is `failed`.\n * @throws {@link JobTimeoutError} when `timeout` elapses first.\n */\n async wait(jobId: string, options: WaitOptions = {}): Promise<ConvertJob> {\n return this.#waitLoop(\n jobId,\n options.timeout ?? DEFAULT_POLL_TIMEOUT,\n options.pollInterval ?? DEFAULT_POLL_INTERVAL\n )\n }\n\n /** Shortcut: {@link create} then {@link wait}. */\n async createAndWait(options: CreateConvertOptions & WaitOptions): Promise<ConvertJob> {\n const job = await this.create(options)\n return this.wait(job.jobId, { timeout: options.timeout, pollInterval: options.pollInterval })\n }\n\n /** Presigned download URL for the first result file. */\n async downloadUrl(job: ConvertJob | string): Promise<string> {\n const resolved = await this.#ensureJob(job)\n const first = resolved.resultFiles?.[0]\n if (!first) {\n throw new JobFailedError({\n jobId: resolved.jobId,\n processorType: resolved.processorType,\n code: 'NO_RESULT_FILES',\n message: 'Job is terminal but no result files were produced',\n })\n }\n return first.url\n }\n\n /** Download the first result file to `to` (Node) and return that path. */\n async downloadTo(job: ConvertJob | string, { to }: { to: string }): Promise<string> {\n const url = await this.downloadUrl(job)\n const { lstat, writeFile } = await import('node:fs/promises')\n // Refuse to write *through* an existing symlink: a pre-placed link could\n // redirect the bytes to an unintended location (e.g. a dotfile or a path\n // outside the intended directory). Writing to a regular path or a\n // brand-new file is unaffected. Port of the Python download_to guard.\n const st = await lstat(to).catch(() => null)\n if (st?.isSymbolicLink()) {\n throw new Error(\n `Refusing to write to ${JSON.stringify(to)}: target is a symlink. ` +\n 'Remove it or choose a non-symlink destination.'\n )\n }\n const response = await this.#http.externalGet(url)\n const bytes = new Uint8Array(await response.arrayBuffer())\n await writeFile(to, bytes)\n return to\n }\n\n // ── private ────────────────────────────────────────────────────\n\n #resolveSource(options: CreateConvertOptions): { fileId: string; sourceFormat: string } {\n const { file, fileId, sourceFormat } = options\n if (file != null && fileId != null) {\n throw new TypeError('create() accepts either `file` or `fileId`, not both')\n }\n if (file != null) {\n const inferred = sourceFormat ?? inferSourceFormat(file.filename)\n if (inferred == null) {\n throw new Error(\n `Could not infer sourceFormat from filename ${JSON.stringify(file.filename)}; ` +\n 'pass sourceFormat explicitly'\n )\n }\n return { fileId: file.fileId, sourceFormat: inferred }\n }\n if (fileId != null) {\n if (sourceFormat == null) {\n throw new Error('sourceFormat is required when only fileId is provided')\n }\n return { fileId, sourceFormat }\n }\n throw new TypeError('create() requires either `file` or `fileId`')\n }\n\n async #pollOnce(jobId: string): Promise<ConvertJob> {\n const response = await this.#http.request('GET', `/api/v1/jobs/${jobId}`)\n return parseConvertJob((await response.json()) as Record<string, unknown>)\n }\n\n async #waitLoop(jobId: string, timeout: number, initialInterval: number): Promise<ConvertJob> {\n const start = this.#now() / 1000\n let interval = initialInterval\n let staleCount = 0\n let lastProgress = -1\n for (;;) {\n const job = await this.#pollOnce(jobId)\n if (isConvertJobTerminal(job)) {\n return this.#finalise(job)\n }\n if (job.progress === lastProgress) {\n staleCount += 1\n if (staleCount >= STALE_PROGRESS_BACKOFF_AFTER) {\n interval = Math.min(interval * BACKOFF_FACTOR, MAX_POLL_INTERVAL)\n staleCount = 0\n }\n } else {\n lastProgress = job.progress\n staleCount = 0\n }\n const elapsed = this.#now() / 1000 - start\n if (elapsed + interval > timeout) {\n throw new JobTimeoutError({ jobId, elapsed, timeout })\n }\n await this.#sleep(interval)\n }\n }\n\n #finalise(job: ConvertJob): ConvertJob {\n if (job.status === 'failed') {\n const err = job.error\n throw new JobFailedError({\n jobId: job.jobId,\n processorType: job.processorType,\n code: err ? err.code : 'UNKNOWN',\n message: err ? err.message : 'Job failed without a structured error',\n })\n }\n return job\n }\n\n async #ensureJob(job: ConvertJob | string): Promise<ConvertJob> {\n return typeof job === 'string' ? this.#pollOnce(job) : job\n }\n}\n","/**\n * Files resource — upload local files via Convilyn's presigned-URL flow.\n *\n * Port of `resources/files.py`. Three steps behind one {@link Files.upload}:\n * 1. `POST /api/v1/upload/presign` — Convilyn issues a presigned upload URL\n * 2. `PUT <presigned-url>` — bytes go straight to storage (no Convilyn auth)\n * 3. `POST /api/v1/upload/confirm` — Convilyn registers the file record\n *\n * The steps are private methods so future extensions (multipart, progress) can\n * override one without rewriting the orchestration. The resource depends only\n * on {@link HttpClient} + types (clean DIP — no sibling-resource imports).\n */\n\nimport type { HttpClient } from '../internal/http'\nimport { parseFile } from '../internal/parsers'\nimport type { File } from '../types'\n\nconst DEFAULT_CONTENT_TYPE = 'application/octet-stream'\n\n/** Common suffix → MIME presets (generic; any caller benefits). */\nconst MIME_BY_SUFFIX: Record<string, string> = {\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n txt: 'text/plain',\n csv: 'text/csv',\n html: 'text/html',\n htm: 'text/html',\n md: 'text/markdown',\n json: 'application/json',\n xml: 'application/xml',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n mp4: 'video/mp4',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n zip: 'application/zip',\n}\n\nfunction basename(path: string): string {\n const parts = path.split(/[\\\\/]/)\n return parts[parts.length - 1] || path\n}\n\n/** Best-effort MIME from a filename suffix, else `application/octet-stream`. */\nexport function guessContentType(filename: string): string {\n const dot = filename.lastIndexOf('.')\n if (dot < 0) {\n return DEFAULT_CONTENT_TYPE\n }\n const suffix = filename.slice(dot + 1).toLowerCase()\n return MIME_BY_SUFFIX[suffix] ?? DEFAULT_CONTENT_TYPE\n}\n\nfunction toBytes(content: Uint8Array | ArrayBuffer | string): Uint8Array {\n if (typeof content === 'string') {\n return new TextEncoder().encode(content)\n }\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content)\n }\n return content\n}\n\n/** Caller input for {@link Files.upload} — exactly one of `path` / `content`. */\nexport interface UploadOptions {\n /** Filesystem path (Node only). */\n path?: string\n /** Raw bytes (works in the browser too). */\n content?: Uint8Array | ArrayBuffer | string\n /** Override the filename (required when uploading raw `content`). */\n filename?: string\n /** MIME type; defaults to a best-guess from the filename suffix. */\n contentType?: string\n}\n\ninterface PresignResult {\n uploadUrl: string\n fileId: string\n s3Key: string\n}\n\n/** Asynchronous file-management resource (`client.files`). */\nexport class Files {\n readonly #http: HttpClient\n\n constructor(http: HttpClient) {\n this.#http = http\n }\n\n /**\n * Upload a file and return its {@link File} record. Supply exactly one of\n * `path` (Node) or `content` (bytes/string).\n */\n async upload(options: UploadOptions): Promise<File> {\n const { path, content } = options\n if (path == null && content == null) {\n throw new TypeError('upload() requires either `path` or `content`')\n }\n if (path != null && content != null) {\n throw new TypeError('upload() accepts either `path` or `content`, not both')\n }\n\n let bytes: Uint8Array\n let filename = options.filename\n if (path != null) {\n const { readFile } = await import('node:fs/promises')\n const buffer = await readFile(path)\n bytes = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n filename ??= basename(path)\n } else {\n bytes = toBytes(content as Uint8Array | ArrayBuffer | string)\n }\n\n if (!filename) {\n throw new Error('filename is required when uploading raw content')\n }\n const contentType = options.contentType ?? guessContentType(filename)\n return this.#uploadWithBody(bytes, filename, contentType)\n }\n\n async #uploadWithBody(body: Uint8Array, filename: string, contentType: string): Promise<File> {\n const size = body.byteLength\n const presign = await this.#presign(filename, size, contentType)\n await this.#http.externalPut(presign.uploadUrl, {\n content: body,\n headers: { 'Content-Type': contentType },\n })\n const confirm = await this.#confirm(presign.fileId, filename, size, contentType, presign.s3Key)\n return parseFile(confirm)\n }\n\n async #presign(filename: string, size: number, contentType: string): Promise<PresignResult> {\n const response = await this.#http.request('POST', '/api/v1/upload/presign', {\n json: { fileName: filename, fileSize: size, contentType },\n })\n const body = (await response.json()) as Record<string, unknown>\n return {\n uploadUrl: String(body.uploadUrl),\n fileId: String(body.fileId),\n s3Key: String(body.s3Key),\n }\n }\n\n async #confirm(\n fileId: string,\n filename: string,\n size: number,\n contentType: string,\n s3Key: string\n ): Promise<Record<string, unknown>> {\n const response = await this.#http.request('POST', '/api/v1/upload/confirm', {\n json: { fileId, fileName: filename, fileSize: size, contentType, s3Key },\n })\n return (await response.json()) as Record<string, unknown>\n }\n}\n","/**\n * Default WebSocket transport for goal event streaming — port of\n * `_internal/ws.py`.\n *\n * The public DIP boundary is {@link WSTransport} (defined in `../transport`):\n * the goals resource depends on that interface, not on any concrete socket.\n * Production injects {@link WebSocketTransport} (the WHATWG `WebSocket` — global\n * in Node 22+ and browsers); tests inject a fake that yields canned messages.\n * This module (the concrete adapter + URL helpers) stays internal.\n */\n\nimport type { WSTransport } from '../transport'\n\nexport const ENV_WS_URL = 'CONVILYN_WS_URL'\n\n/** Options for {@link WebSocketTransport} (inject a `WebSocket` impl in tests). */\nexport interface WebSocketTransportOptions {\n WebSocketImpl?: typeof WebSocket\n}\n\n/**\n * Default {@link WSTransport} adapting the event-driven WHATWG `WebSocket` to\n * the async `connect`/`send`/`recv`/`close` contract via an internal message\n * queue. `recv()` resolves with the next frame, or rejects once the socket\n * errors or closes with nothing buffered.\n */\nexport class WebSocketTransport implements WSTransport {\n readonly #WebSocketImpl: typeof WebSocket\n #ws: WebSocket | null = null\n readonly #queue: string[] = []\n readonly #waiters: Array<{\n resolve: (value: string) => void\n reject: (reason: unknown) => void\n }> = []\n #ended = false\n #failure: unknown = null\n\n constructor(options: WebSocketTransportOptions = {}) {\n const impl = options.WebSocketImpl ?? (typeof WebSocket !== 'undefined' ? WebSocket : undefined)\n if (!impl) {\n throw new Error(\n 'No global WebSocket available; pass a WebSocket implementation ' +\n '(Node 22+ exposes one globally, or use the `ws` package).'\n )\n }\n this.#WebSocketImpl = impl\n }\n\n connect(url: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let settled = false\n let socket: WebSocket\n try {\n socket = new this.#WebSocketImpl(url)\n } catch (err) {\n reject(err)\n return\n }\n this.#ws = socket\n socket.addEventListener('open', () => {\n settled = true\n resolve()\n })\n socket.addEventListener('message', (event) => this.#onMessage(event as MessageEvent))\n socket.addEventListener('error', () => {\n const err = new Error('WebSocket connection error')\n this.#failure = err\n this.#flushWaiters()\n if (!settled) {\n settled = true\n reject(err)\n }\n })\n socket.addEventListener('close', () => {\n this.#ended = true\n this.#flushWaiters()\n })\n })\n }\n\n send(payload: string): Promise<void> {\n if (!this.#ws) {\n return Promise.reject(new Error('WebSocketTransport.send called before connect'))\n }\n this.#ws.send(payload)\n return Promise.resolve()\n }\n\n recv(): Promise<string> {\n const buffered = this.#queue.shift()\n if (buffered !== undefined) {\n return Promise.resolve(buffered)\n }\n if (this.#failure != null) {\n return Promise.reject(this.#failure)\n }\n if (this.#ended) {\n return Promise.reject(new Error('WebSocket closed'))\n }\n return new Promise<string>((resolve, reject) => {\n this.#waiters.push({ resolve, reject })\n })\n }\n\n close(): Promise<void> {\n if (this.#ws) {\n try {\n this.#ws.close()\n } catch {\n // already closing/closed — idempotent\n }\n this.#ws = null\n }\n return Promise.resolve()\n }\n\n #onMessage(event: MessageEvent): void {\n const data: string =\n typeof event.data === 'string'\n ? event.data\n : event.data instanceof ArrayBuffer\n ? new TextDecoder().decode(event.data)\n : String(event.data)\n const waiter = this.#waiters.shift()\n if (waiter) {\n waiter.resolve(data)\n } else {\n this.#queue.push(data)\n }\n }\n\n #flushWaiters(): void {\n const reason = this.#failure ?? new Error('WebSocket closed')\n while (this.#waiters.length > 0) {\n this.#waiters.shift()!.reject(reason)\n }\n }\n}\n\n/** Optional injection seam for {@link resolveWsUrl} (tests pass a fake env). */\nexport interface ResolveWsUrlOptions {\n explicit?: string | null\n fallback?: string | null\n env?: Record<string, string | undefined>\n}\n\n/**\n * Resolve the WebSocket base URL. Precedence: explicit (`events({ wsUrl })`) >\n * client-constructor `wsUrl` > `CONVILYN_WS_URL`. Never derived from the HTTP\n * `baseUrl` — prod and dev WS hostnames differ, so silent guessing misleads.\n */\nexport function resolveWsUrl(options: ResolveWsUrlOptions): string {\n const env = options.env ?? (typeof process !== 'undefined' ? process.env : {})\n for (const candidate of [options.explicit, options.fallback, env[ENV_WS_URL]]) {\n if (candidate) {\n return candidate\n }\n }\n throw new Error(\n 'No WebSocket URL configured. Pass { wsUrl } to events(), set it on the ' +\n 'client constructor, or set the CONVILYN_WS_URL environment variable.'\n )\n}\n\n/** Append the auth `?token=` query param to a WS base URL. */\nexport function buildWsConnectUrl(baseUrl: string, token: string): string {\n const separator = baseUrl.includes('?') ? '&' : '?'\n return `${baseUrl}${separator}token=${token}`\n}\n","/**\n * Goals resource — agentic goal workflow execution. Port of\n * `resources/goals.py`.\n *\n * POST /api/v1/jobs/goal — create a job (\"workflow run\")\n * GET /api/v1/jobs/goal/{id} — full status (drives polling)\n * PATCH /api/v1/jobs/goal/{id}/slots — answer HITL slots\n * POST /api/v1/jobs/goal/{id}/confirm|cancel|retry\n * WS subscribe → GoalEvent stream — live execution events\n *\n * Same SOLID seams as the convert resource (data on {@link GoalJob}, behaviour\n * here) plus the {@link WSTransport} DIP seam for the event stream.\n */\n\nimport { GoalJobFailedError, GoalJobTimeoutError, WebSocketError } from '../errors'\nimport type { HttpClient } from '../internal/http'\nimport { parseGoalEvent, parseGoalJob } from '../internal/parsers'\nimport { WebSocketTransport, buildWsConnectUrl, resolveWsUrl } from '../internal/ws'\nimport type { WSTransport } from '../transport'\nimport {\n goalJobNeedsInput,\n isGoalEventTerminal,\n isGoalEventType,\n isGoalJobTerminal,\n type GoalEvent,\n type GoalJob,\n} from '../types'\n\nexport const DEFAULT_POLL_INTERVAL = 1.0\nexport const DEFAULT_POLL_TIMEOUT = 300.0\nexport const MAX_POLL_INTERVAL = 5.0\nconst STALE_PROGRESS_BACKOFF_AFTER = 3\nconst BACKOFF_FACTOR = 1.5\n\nconst realSleep = (seconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, seconds * 1000))\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/** Options for {@link Goals.start} — supply exactly one of `workflowId` / `goalText`. */\nexport interface StartGoalOptions {\n workflowId?: string\n goalText?: string\n files?: string[]\n slots?: Record<string, unknown>\n /**\n * Optional BYO-LLM provider config id (from the console vault) to run this\n * job on your own provider/key. Omit to use your account default config.\n * Honoured only when BYO-LLM is enabled for your account; otherwise the run\n * uses the platform provider.\n */\n llmConfigId?: string\n}\n\n/** Polling controls for {@link Goals.wait}. */\nexport interface GoalWaitOptions {\n timeout?: number\n pollInterval?: number\n}\n\n/** Constructor options + test seams for {@link Goals}. */\nexport interface GoalsResourceOptions {\n wsUrl?: string | null\n wsTransportFactory?: () => WSTransport\n sleep?: (seconds: number) => Promise<void>\n now?: () => number\n}\n\n/** Asynchronous goal workflow resource (`client.goals`). */\nexport class Goals {\n readonly #http: HttpClient\n readonly #wsUrl: string | null\n readonly #wsTransportFactory: () => WSTransport\n readonly #sleep: (seconds: number) => Promise<void>\n readonly #now: () => number\n\n constructor(http: HttpClient, options: GoalsResourceOptions = {}) {\n this.#http = http\n this.#wsUrl = options.wsUrl ?? null\n this.#wsTransportFactory = options.wsTransportFactory ?? (() => new WebSocketTransport())\n this.#sleep = options.sleep ?? realSleep\n this.#now = options.now ?? (() => Date.now())\n }\n\n /** Create a goal job and return its initial {@link GoalJob} state. */\n async start(options: StartGoalOptions): Promise<GoalJob> {\n validateStartInputs(options)\n const payload: Record<string, unknown> = { fileIds: options.files ?? [] }\n if (options.workflowId != null) {\n payload.workflowId = options.workflowId\n }\n if (options.goalText != null) {\n payload.goalText = options.goalText\n }\n if (options.slots != null) {\n // The create endpoint keys pre-seeded answers as `slotAnswers: [{slotId, value}]`\n // (CreateGoalJobRequest, alias \"slotAnswers\"). Sending the raw `{slotId: value}`\n // dict under `slots` is silently dropped — the seeded answers never reach the\n // backend. Reshape to the list form here (same shape as fillSlots' `answers`).\n payload.slotAnswers = Object.entries(options.slots).map(([slotId, value]) => ({\n slotId,\n value,\n }))\n }\n if (options.llmConfigId != null) {\n payload.llmConfigId = options.llmConfigId\n }\n const response = await this.#http.request('POST', '/api/v1/jobs/goal', { json: payload })\n return parseGoalJob((await response.json()) as Record<string, unknown>)\n }\n\n /** Fetch the current state of a goal job. */\n async retrieve(jobSpecId: string): Promise<GoalJob> {\n return this.#pollOnce(jobSpecId)\n }\n\n /**\n * Poll until the job reaches a terminal state OR stops for HITL\n * (`slots_pending`). `failed` raises {@link GoalJobFailedError}; an elapsed\n * deadline raises {@link GoalJobTimeoutError}.\n */\n async wait(jobSpecId: string, options: GoalWaitOptions = {}): Promise<GoalJob> {\n return this.#waitLoop(\n jobSpecId,\n options.timeout ?? DEFAULT_POLL_TIMEOUT,\n options.pollInterval ?? DEFAULT_POLL_INTERVAL\n )\n }\n\n /** Shortcut: {@link start} then {@link wait}. */\n async run(options: StartGoalOptions & GoalWaitOptions): Promise<GoalJob> {\n const job = await this.start(options)\n return this.wait(job.jobSpecId, {\n timeout: options.timeout,\n pollInterval: options.pollInterval,\n })\n }\n\n /** Answer a single slot the agent is waiting on (sugar over {@link fillSlots}). */\n async fillSlot(\n jobSpecId: string,\n options: { slotId: string; value: unknown; expectedVersion?: number }\n ): Promise<GoalJob> {\n return this.fillSlots(\n jobSpecId,\n { [options.slotId]: options.value },\n {\n expectedVersion: options.expectedVersion,\n }\n )\n }\n\n /** Answer one or more slots in a single PATCH (`{slotId: value}` → wire list). */\n async fillSlots(\n jobSpecId: string,\n answers: Record<string, unknown>,\n options: { expectedVersion?: number } = {}\n ): Promise<GoalJob> {\n const entries = Object.entries(answers)\n if (entries.length === 0) {\n throw new Error('answers must contain at least one slot answer')\n }\n const body: Record<string, unknown> = {\n answers: entries.map(([slotId, value]) => ({ slotId, value })),\n }\n if (options.expectedVersion != null) {\n body.expectedVersion = options.expectedVersion\n }\n const response = await this.#http.request('PATCH', `/api/v1/jobs/goal/${jobSpecId}/slots`, {\n json: body,\n })\n return parseGoalJob((await response.json()) as Record<string, unknown>)\n }\n\n /** Confirm a slots-filled job, queueing it for execution. */\n async confirm(jobSpecId: string, options: { expectedVersion?: number } = {}): Promise<GoalJob> {\n const json =\n options.expectedVersion != null ? { expectedVersion: options.expectedVersion } : undefined\n await this.#http.request('POST', `/api/v1/jobs/goal/${jobSpecId}/confirm`, { json })\n return this.#pollOnce(jobSpecId)\n }\n\n /** Cancel a running or queued job. */\n async cancel(jobSpecId: string): Promise<GoalJob> {\n await this.#http.request('POST', `/api/v1/jobs/goal/${jobSpecId}/cancel`)\n return this.#pollOnce(jobSpecId)\n }\n\n /** Retry a failed job (resume the thread or start a fresh rerun). */\n async retry(\n jobSpecId: string,\n options: { rerunMode?: 'retry_same_thread' | 'fresh_rerun'; reason?: string } = {}\n ): Promise<GoalJob> {\n const body: Record<string, unknown> = { rerunMode: options.rerunMode ?? 'retry_same_thread' }\n if (options.reason != null) {\n body.reason = options.reason\n }\n await this.#http.request('POST', `/api/v1/jobs/goal/${jobSpecId}/retry`, { json: body })\n return this.#pollOnce(jobSpecId)\n }\n\n /**\n * Stream goal execution events for a job. Opens a WebSocket, subscribes,\n * then yields each {@link GoalEvent} in order; the iterator ends (and the\n * socket closes) on a terminal event. No auto-reconnect — the backend does\n * not replay missed events, so a silent reconnect would hide gaps.\n *\n * **WebSocket streaming is not available with a `ck_` consumer key in v1** —\n * the backend WS gateway does not authenticate `ck_` keys, so the connection\n * is denied. Use {@link wait} polling (standard HTTP auth, works today) for\n * the supported real-time path. This method is wired and ready for when the\n * gateway gains `ck_` support.\n *\n * @throws {@link WebSocketError} on connect/subscribe failure, a dropped\n * stream, or an unparseable/unrecognised envelope.\n */\n async *events(\n jobSpecId: string,\n options: { wsUrl?: string } = {}\n ): AsyncGenerator<GoalEvent, void, void> {\n const url = buildWsConnectUrl(\n resolveWsUrl({ explicit: options.wsUrl, fallback: this.#wsUrl }),\n this.#http.auth.bearerToken()\n )\n const transport = this.#wsTransportFactory()\n try {\n try {\n await transport.connect(url)\n await transport.send(JSON.stringify({ action: 'subscribe', jobSpecId }))\n } catch (error) {\n throw new WebSocketError(\n `Failed to open event stream for job ${jobSpecId}: ${errorMessage(error)}. ` +\n `Note: the WebSocket gateway does not accept ck_ consumer keys in v1 — ` +\n `use wait() polling (HTTP auth) instead.`\n )\n }\n\n for (;;) {\n let raw: string\n try {\n raw = await transport.recv()\n } catch (error) {\n throw new WebSocketError(\n `Event stream dropped for job ${jobSpecId}: ${errorMessage(error)}`\n )\n }\n const event = parseEvent(raw)\n yield event\n if (isGoalEventTerminal(event)) {\n return\n }\n }\n } finally {\n await transport.close()\n }\n }\n\n // ── private ────────────────────────────────────────────────────\n\n async #pollOnce(jobSpecId: string): Promise<GoalJob> {\n const response = await this.#http.request('GET', `/api/v1/jobs/goal/${jobSpecId}`)\n return parseGoalJob((await response.json()) as Record<string, unknown>)\n }\n\n async #waitLoop(jobSpecId: string, timeout: number, initialInterval: number): Promise<GoalJob> {\n const start = this.#now() / 1000\n let interval = initialInterval\n let staleCount = 0\n let lastProgress = -1\n for (;;) {\n const job = await this.#pollOnce(jobSpecId)\n if (isGoalJobTerminal(job)) {\n return this.#finalise(job)\n }\n if (goalJobNeedsInput(job)) {\n return job\n }\n if (job.progress === lastProgress) {\n staleCount += 1\n if (staleCount >= STALE_PROGRESS_BACKOFF_AFTER) {\n interval = Math.min(interval * BACKOFF_FACTOR, MAX_POLL_INTERVAL)\n staleCount = 0\n }\n } else {\n lastProgress = job.progress\n staleCount = 0\n }\n const elapsed = this.#now() / 1000 - start\n if (elapsed + interval > timeout) {\n throw new GoalJobTimeoutError({ jobSpecId, elapsed, timeout })\n }\n await this.#sleep(interval)\n }\n }\n\n #finalise(job: GoalJob): GoalJob {\n if (job.status === 'failed') {\n throw new GoalJobFailedError({\n jobSpecId: job.jobSpecId,\n code: job.errorCode,\n message: job.errorMessage,\n })\n }\n return job\n }\n}\n\nfunction validateStartInputs(options: StartGoalOptions): void {\n const { workflowId, goalText, files } = options\n if (workflowId == null && goalText == null) {\n throw new TypeError('start() requires either `workflowId` or `goalText`')\n }\n if (workflowId != null && goalText != null) {\n throw new TypeError('start() accepts either `workflowId` or `goalText`, not both')\n }\n if (workflowId == null && (!files || files.length === 0)) {\n throw new Error('files is required when `workflowId` is not provided')\n }\n}\n\n/** Translate a raw WS frame into a {@link GoalEvent}, or throw {@link WebSocketError}. */\nexport function parseEvent(raw: string): GoalEvent {\n let payload: unknown\n try {\n payload = JSON.parse(raw)\n } catch (error) {\n throw new WebSocketError(`Server sent non-JSON message: ${errorMessage(error)}`, {\n payload: raw,\n })\n }\n if (\n typeof payload !== 'object' ||\n payload === null ||\n typeof (payload as Record<string, unknown>).type !== 'string' ||\n typeof (payload as Record<string, unknown>).jobSpecId !== 'string' ||\n !isGoalEventType((payload as Record<string, unknown>).type as string)\n ) {\n throw new WebSocketError('Server sent an unrecognised event envelope', { payload: raw })\n }\n return parseGoalEvent(payload as Record<string, unknown>)\n}\n","/**\n * Workflows resource — community marketplace + private workflow management.\n * Port of `resources/workflows.py`.\n *\n * GET /api/v1/workflows/community — browse the public listing (search)\n * GET /api/v1/workflows/{id} — fetch one row\n * POST /api/v1/workflows/fork — fork a source into a private workflow\n * PATCH /api/v1/workflows/{id} — partial update (publish = visibility)\n * POST /api/v1/workflows/{id}/like — toggle like\n *\n * `fork` / `publish` require Pro tier; the platform's 402/403 surfaces as\n * {@link import('../errors').APIError} so callers branch on the status code.\n */\n\nimport type { HttpClient } from '../internal/http'\nimport { parseLikeResponse, parseWorkflow, parseWorkflowSearchPage } from '../internal/parsers'\nimport type { LikeResponse, Workflow, WorkflowSearchPage, WorkflowVisibility } from '../types'\n\n/** Sort order for a marketplace workflow search. */\nexport type WorkflowSortMode = 'recent' | 'popular'\n\n/** Options for {@link Workflows.search}. */\nexport interface WorkflowSearchOptions {\n tag?: string\n sort?: WorkflowSortMode\n limit?: number\n cursor?: string\n}\n\n/** Options for {@link Workflows.fork}. */\nexport interface ForkWorkflowOptions {\n sourceSpecId: string\n name?: string\n}\n\n/** Options for {@link Workflows.patch} (optimistic lock via `itemVersion`). */\nexport interface PatchWorkflowOptions {\n itemVersion: number\n name?: string\n description?: string\n visibility?: WorkflowVisibility\n tags?: string[]\n}\n\n/** Asynchronous community-workflows resource (`client.workflows`). */\nexport class Workflows {\n readonly #http: HttpClient\n\n constructor(http: HttpClient) {\n this.#http = http\n }\n\n /** Browse the public community listing (one page + a `cursor`). */\n async search(options: WorkflowSearchOptions = {}): Promise<WorkflowSearchPage> {\n const params: Record<string, string | number> = {\n sort: options.sort ?? 'recent',\n limit: options.limit ?? 20,\n }\n if (options.tag != null) {\n params.tag = options.tag\n }\n if (options.cursor != null) {\n params.cursor = options.cursor\n }\n const response = await this.#http.request('GET', '/api/v1/workflows/community', { params })\n return parseWorkflowSearchPage((await response.json()) as Record<string, unknown>)\n }\n\n /** Fetch a single workflow by id. */\n async get(workflowId: string): Promise<Workflow> {\n const response = await this.#http.request('GET', `/api/v1/workflows/${workflowId}`)\n return parseWorkflow((await response.json()) as Record<string, unknown>)\n }\n\n /** Fork a curated/user source into a new private workflow (Pro). */\n async fork(options: ForkWorkflowOptions): Promise<Workflow> {\n const body: Record<string, unknown> = { sourceSpecId: options.sourceSpecId }\n if (options.name != null) {\n body.name = options.name\n }\n const response = await this.#http.request('POST', '/api/v1/workflows/fork', { json: body })\n return parseWorkflow((await response.json()) as Record<string, unknown>)\n }\n\n /** Flip an owned workflow's visibility to `public` (Pro; optimistic lock). */\n async publish(workflowId: string, options: { itemVersion: number }): Promise<Workflow> {\n return this.patch(workflowId, { itemVersion: options.itemVersion, visibility: 'public' })\n }\n\n /** Partial update of an owned workflow (the generic PATCH escape hatch). */\n async patch(workflowId: string, options: PatchWorkflowOptions): Promise<Workflow> {\n const body: Record<string, unknown> = { itemVersion: options.itemVersion }\n if (options.name != null) {\n body.name = options.name\n }\n if (options.description != null) {\n body.description = options.description\n }\n if (options.visibility != null) {\n body.visibility = options.visibility\n }\n if (options.tags != null) {\n body.tags = [...options.tags]\n }\n const response = await this.#http.request('PATCH', `/api/v1/workflows/${workflowId}`, {\n json: body,\n })\n return parseWorkflow((await response.json()) as Record<string, unknown>)\n }\n\n /** Toggle the caller's like on a public workflow (idempotent toggle). */\n async like(workflowId: string): Promise<LikeResponse> {\n const response = await this.#http.request('POST', `/api/v1/workflows/${workflowId}/like`)\n return parseLikeResponse((await response.json()) as Record<string, unknown>)\n }\n}\n","/**\n * Async root client — port of `client.py`.\n *\n * Wires auth + HTTP transport and exposes the resource accessors. This A2\n * increment exposes `files` + `convert`; `goals` / `workflows` / `account`\n * (and the WebSocket knobs) extend this class in A4. Async-only: Node and the\n * browser are async-native, so there is no synchronous wrapper.\n */\n\nimport { type AuthStrategy, resolveAuth } from './internal/auth'\nimport { HttpClient } from './internal/http'\nimport { ExponentialBackoffRetry, NoRetry, type RetryPolicy } from './retry'\nimport { type AutoThrottleConfig, resolveAutoThrottle } from './throttle'\nimport type { WSTransport } from './transport'\nimport { Account } from './resources/account'\nimport { Convert } from './resources/convert'\nimport { Files } from './resources/files'\nimport { Goals } from './resources/goals'\nimport { Workflows } from './resources/workflows'\n\n/** Constructor options for {@link Convilyn}. */\nexport interface ConvilynOptions {\n /** API key; falls back to `CONVILYN_API_KEY`. Ignored when `auth` is given. */\n apiKey?: string\n baseUrl?: string\n /** Per-request timeout in seconds. */\n timeout?: number\n /** Custom auth strategy (overrides `apiKey`). */\n auth?: AuthStrategy\n /** Cap retry attempts (`0` = no retries). Ignored when `retryPolicy` is given. */\n maxRetries?: number\n /** Custom retry policy (overrides `maxRetries`). */\n retryPolicy?: RetryPolicy\n /** Disable the automatic `Idempotency-Key` on mutating verbs. */\n disableIdempotency?: boolean\n /** WebSocket base URL for `goals.events()`; falls back to `CONVILYN_WS_URL`. */\n wsUrl?: string\n /** Custom WebSocket transport factory (advanced / testing). */\n wsTransportFactory?: () => WSTransport\n /**\n * Sleep + retry on a 402 quota error, waiting for the quota window to reset\n * (distinct from {@link retryPolicy}, which handles transient 5xx/429/408).\n * `true` enables it with defaults (1 retry, 60s cap); pass\n * `new AutoThrottleConfig({ … })` to tune. Omitted = disabled.\n */\n autoThrottle?: boolean | AutoThrottleConfig\n}\n\n/** Asynchronous Convilyn client. */\nexport class Convilyn {\n readonly files: Files\n readonly convert: Convert\n readonly goals: Goals\n readonly workflows: Workflows\n readonly account: Account\n readonly #http: HttpClient\n\n constructor(options: ConvilynOptions = {}) {\n const auth = options.auth ?? resolveAuth(options.apiKey)\n this.#http = new HttpClient({\n auth,\n baseUrl: options.baseUrl,\n timeout: options.timeout,\n retryPolicy: resolveRetryPolicy(options.maxRetries, options.retryPolicy),\n idempotencyEnabled: !options.disableIdempotency,\n autoThrottle: resolveAutoThrottle(options.autoThrottle),\n })\n this.files = new Files(this.#http)\n this.convert = new Convert(this.#http)\n this.goals = new Goals(this.#http, {\n wsUrl: options.wsUrl,\n wsTransportFactory: options.wsTransportFactory,\n })\n this.workflows = new Workflows(this.#http)\n this.account = new Account(this.#http)\n }\n\n get baseUrl(): string {\n return this.#http.baseUrl\n }\n\n async close(): Promise<void> {\n await this.#http.close()\n }\n}\n\n/**\n * Combine the two retry knobs into one policy. Precedence: explicit\n * `retryPolicy` > `maxRetries` (`0` → {@link NoRetry}) > SDK default.\n */\nexport function resolveRetryPolicy(\n maxRetries: number | undefined,\n retryPolicy: RetryPolicy | undefined\n): RetryPolicy {\n if (retryPolicy != null) {\n return retryPolicy\n }\n if (maxRetries == null) {\n return new ExponentialBackoffRetry()\n }\n if (maxRetries <= 0) {\n return new NoRetry()\n }\n return new ExponentialBackoffRetry({ maxAttempts: maxRetries })\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/types.ts","../src/retry.ts","../src/throttle.ts","../src/internal/auth.ts","../src/version.ts","../src/internal/http.ts","../src/internal/parsers.ts","../src/resources/account.ts","../src/resources/convert.ts","../src/resources/files.ts","../src/internal/ws.ts","../src/resources/goals.ts","../src/resources/workflows.ts","../src/client.ts"],"names":["isRecord","realSleep","DEFAULT_POLL_INTERVAL","DEFAULT_POLL_TIMEOUT","MAX_POLL_INTERVAL","STALE_PROGRESS_BACKOFF_AFTER","BACKOFF_FACTOR"],"mappings":";;;AAmCA,IAAM,oBAAA,mBAAuB,MAAA,CAAO,GAAA,CAAI,6BAA6B,CAAA;AAG9D,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA;AAAA,EAEvC,CAAU,oBAAoB,IAAI,IAAA;AAAA,EAElC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAQO,SAAS,gBAAgB,GAAA,EAAoC;AAClE,EAAA,OACE,OAAO,GAAA,KAAQ,QAAA,IACf,QAAQ,IAAA,IACP,GAAA,CAAqC,oBAAoB,CAAA,KAAM,IAAA;AAEpE;AAGO,IAAM,SAAA,GAAN,cAAwB,aAAA,CAAc;AAAA,EAC3C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AAAA,EACd;AACF;AASO,IAAM,QAAA,GAAN,cAAuB,aAAA,CAAc;AAAA,EACjC,UAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EAET,WAAA,CAAY,UAAA,EAAoB,IAAA,EAAc,OAAA,EAAiB,OAAA,EAAwB;AACrF,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,WAAW,EAAC;AAAA,EAC7B;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,QAAA,CAAS;AAAA,EAC3C,WAAA,CAAY,UAAA,EAAoB,IAAA,EAAc,OAAA,EAAiB,OAAA,EAAwB;AACrF,IAAA,KAAA,CAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAGO,IAAM,iBAAA,GAAN,cAAgC,QAAA,CAAS;AAAA,EACrC,YAAA;AAAA,EACA,UAAA;AAAA,EAET,YACE,UAAA,EACA,IAAA,EACA,SACA,OAAA,EACA,IAAA,GAA8D,EAAC,EAC/D;AACA,IAAA,KAAA,CAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,YAAA,IAAgB,KAAA;AACzC,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,IAAc,IAAA;AAAA,EACvC;AACF;AAUO,IAAM,kBAAA,GAAN,cAAiC,QAAA,CAAS;AAAA,EACtC,WAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EAET,YACE,UAAA,EACA,IAAA,EACA,SACA,OAAA,EACA,IAAA,GAII,EAAC,EACL;AACA,IAAA,KAAA,CAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,IAAe,IAAA;AACvC,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,cAAA,IAAkB,IAAA;AAC7C,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,IAAY,IAAA;AAAA,EACnC;AACF;AAGO,IAAM,aAAA,GAAN,cAA4B,QAAA,CAAS;AAAA,EAC1C,WAAA,CAAY,UAAA,EAAoB,IAAA,EAAc,OAAA,EAAiB,OAAA,EAAwB;AACrF,IAAA,KAAA,CAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAGO,IAAM,mBAAA,GAAN,cAAkC,QAAA,CAAS;AAAA,EACvC,YAAA;AAAA,EAET,YACE,UAAA,EACA,IAAA,EACA,SACA,OAAA,EACA,IAAA,GAAkC,EAAC,EACnC;AACA,IAAA,KAAA,CAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,YAAA,IAAgB,CAAA;AAAA,EAC3C;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,aAAA,CAAc;AAAA,EACvC,KAAA;AAAA,EACA,aAAA;AAAA,EACA,IAAA;AAAA,EAET,YAAY,IAAA,EAA+E;AACzF,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,aAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AAAA,EACnB;AACF;AAGO,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAAA,EACxC,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAA2D;AACrE,IAAA,KAAA;AAAA,MACE,CAAA,IAAA,EAAO,IAAA,CAAK,KAAK,CAAA,wCAAA,EAA2C,IAAA,CAAK,OAAO,CAAA,WAAA,EAC1D,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA;AAAA,KACvC;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AACF;AAGO,IAAM,kBAAA,GAAN,cAAiC,aAAA,CAAc;AAAA,EAC3C,SAAA;AAAA,EACA,IAAA;AAAA,EAET,YAAY,IAAA,EAA0E;AACpF,IAAA,KAAA,CAAM,IAAA,CAAK,WAAW,+CAA+C,CAAA;AACrE,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,IAAQ,iBAAA;AAAA,EAC3B;AACF;AAGO,IAAM,mBAAA,GAAN,cAAkC,aAAA,CAAc;AAAA,EAC5C,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAA+D;AACzE,IAAA,KAAA;AAAA,MACE,CAAA,QAAA,EAAW,IAAA,CAAK,SAAS,CAAA,wCAAA,EACpB,IAAA,CAAK,OAAO,CAAA,WAAA,EAAc,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA;AAAA,KACxD;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,aAAA,CAAc;AAAA,EACvC,OAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiB,IAAA,GAAoC,EAAC,EAAG;AACnE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,IAAW,IAAA;AAAA,EACjC;AACF;;;ACzLO,IAAM,6BAAA,GAAsD,CAAC,WAAA,EAAa,QAAQ;AAGlF,SAAS,qBAAqB,GAAA,EAA0C;AAC7E,EAAA,OAAO,6BAAA,CAA8B,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAC1D;AAqBO,IAAM,0BAAA,GAAuD;AAAA,EAClE,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF;AAoCO,SAAS,kBAAkB,GAAA,EAAuC;AACvE,EAAA,OAAO,0BAAA,CAA2B,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACvD;AAGO,SAAS,kBAAkB,GAAA,EAAuC;AACvE,EAAA,OAAO,IAAI,MAAA,KAAW,eAAA;AACxB;AAsBO,IAAM,gBAAA,GAA6C;AAAA,EACxD,cAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA,EACA,qBAAA;AAAA,EACA,0BAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF;AAGO,SAAS,gBAAgB,KAAA,EAAuC;AACrE,EAAA,OAAQ,gBAAA,CAAuC,SAAS,KAAK,CAAA;AAC/D;AAQO,IAAM,yBAAA,GAA+C,CAAC,WAAA,EAAa,QAAA,EAAU,WAAW;AAaxF,SAAS,oBAAoB,KAAA,EAAyC;AAC3E,EAAA,OAAO,yBAAA,CAA0B,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACtD;;;AC5LO,IAAM,gBAAA,uBAA4C,GAAA,CAAI,CAAC,QAAQ,KAAA,EAAO,OAAA,EAAS,QAAQ,CAAC,CAAA;AAGxF,IAAM,0BAAA,uBAAsD,GAAA,CAAI;AAAA,EACrE,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK;AAC3B,CAAC,CAAA;AAqBM,SAAS,gBAAgB,QAAA,EAA4C;AAC1E,EAAA,MAAM,GAAA,GAAM,SAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,IAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACrF,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,OAAO,OAAO,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,IAAK,UAAU,CAAA,EAAG;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,sBAAA,GAAiC;AAC/C,EAAA,OAAO,OAAO,UAAA,EAAW;AAC3B;AAoBO,IAAM,0BAAN,MAAqD;AAAA,EACjD,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,OAAA,GAAqC,EAAC,EAAG;AACnD,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,CAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,IAAA;AAChC,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAQ,iBAAA,IAAqB,0BAAA;AACtD,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,MAAA;AAAA,EAClC;AAAA,EAEA,WAAA,CAAY,QAAA,EAAoC,KAAA,EAAgB,OAAA,EAA0B;AACxF,IAAA,IAAI,OAAA,IAAW,KAAK,WAAA,EAAa;AAC/B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA;AAAA,EACnD;AAAA,EAEA,SAAA,CAAU,UAAoC,OAAA,EAAyB;AACrE,IAAA,MAAM,UAAA,GAAa,QAAA,GAAW,eAAA,CAAgB,QAAQ,CAAA,GAAI,IAAA;AAC1D,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC3C;AACA,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA,IAAK,OAAA,EAAS,KAAK,QAAQ,CAAA;AACpE,IAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,MAAA;AAC7B,IAAA,MAAM,WAAW,MAAA,IAAU,CAAC,SAAS,IAAA,CAAK,IAAA,MAAU,CAAA,GAAI,MAAA,CAAA,CAAA;AACxD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA;AAAA,EAC7B;AACF;AAGO,IAAM,UAAN,MAAqC;AAAA,EAC1C,WAAA,GAAuB;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAoB;AAClB,IAAA,OAAO,CAAA;AAAA,EACT;AACF;;;ACtGO,IAAM,iBAAA,GAAoB,eAAA;AAC1B,IAAM,gBAAA,GAAmB,YAAA;AAGzB,IAAM,mBAAA,GAAsB,CAAA;AAC5B,IAAM,yBAAA,GAA4B,EAAA;AAClC,IAAM,8BAAA,GAAiC,CAAA;AAiBvC,IAAM,qBAAN,MAAyB;AAAA,EACrB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EAET,WAAA,CAAY,OAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,mBAAA;AACxC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,yBAAA;AACpC,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,aAAA,IAAiB,8BAAA;AAC9C,IAAA,IAAI,IAAA,CAAK,aAAa,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,WAAW,sCAAsC,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,WAAW,mCAAmC,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,IAAA,CAAK,gBAAgB,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,WAAW,yCAAyC,CAAA;AAAA,IAChE;AAAA,EACF;AACF;AAYO,SAAS,oBAAoB,KAAA,EAAmD;AACrF,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,KAAA,EAAO;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,IAAI,kBAAA,EAAmB;AAAA,EAChC;AACA,EAAA,OAAO,KAAA;AACT;AAcO,SAAS,iBAAA,CACd,OACA,MAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAClC,EAAA,IAAI,MAAA,GAAS,oBAAoB,OAAO,CAAA;AACxC,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAA,GAAS,iBAAiB,OAAO,CAAA;AAAA,EACnC;AACA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAA,GAAS,MAAA,CAAO,aAAA;AAAA,EAClB;AACA,EAAA,IAAI,MAAA,GAAS,OAAO,QAAA,EAAU;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA;AAC3B;AAEA,SAAS,oBAAoB,OAAA,EAAiD;AAC5E,EAAA,MAAM,MAAM,OAAA,CAAQ,mBAAA;AACpB,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAU,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,GAAM,OAAO,GAAG,CAAA;AAC1D,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,GAAI,OAAA,GAAU,IAAA;AAC9C;AAEA,SAAS,iBAAiB,OAAA,EAAiD;AACzE,EAAA,MAAM,MAAM,OAAA,CAAQ,QAAA;AACpB,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC9B,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,IAAK,GAAA;AAClC;AAOO,SAAS,2BAA2B,OAAA,EAAwD;AACjG,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA;AACzC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY,KAAM,gBAAA;AACtC;AAOO,SAAS,qBAAqB,IAAA,EAAkD;AACrF,EAAA,IAAI,OAAA,GAAU,CAAA,0CAAA,EAA6C,IAAA,CAAK,MAAM,CAAA,CAAA,CAAA;AACtE,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAO,OAAA,CAAQ,gBAAgB,UAAA,EAAY;AAC/E,IAAA,OAAA,CAAQ,YAAY,OAAO,CAAA;AAAA,EAC7B;AACF;;;AC7JO,IAAM,WAAA,GAAc,kBAAA;AAOpB,IAAM,mBAAA,GAAsB,KAAA;AAW5B,IAAM,mBAAA,GAAsB,CAAC,MAAA,EAAQ,MAAM,CAAA;AAG3C,SAAS,YAAY,GAAA,EAAsB;AAChD,EAAA,OAAO,oBAAoB,IAAA,CAAK,CAAC,WAAW,GAAA,CAAI,UAAA,CAAW,MAAM,CAAC,CAAA;AACpE;AAWO,SAAS,QAAQ,GAAA,EAAqB;AAC3C,EAAA,IAAI,GAAA,CAAI,UAAU,CAAA,EAAG;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,MAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAC5C;AAGO,IAAM,SAAN,MAAqC;AAAA,EACjC,IAAA;AAAA,EAET,YAAY,GAAA,EAAa;AACvB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,CAAI,MAAK,EAAG;AACvB,MAAA,MAAM,IAAI,UAAU,oCAAoC,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,WAAA,CAAY,GAAG,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAC,oHAC+C,mBAAmB,CAAA,gIAAA;AAAA,OAGnF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AAAA,EACd;AAAA,EAEA,OAAA,GAAkC;AAChC,IAAA,OAAO,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAA,CAAA,EAAG;AAAA,EAChD;AAAA,EAEA,WAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA,EAGA,QAAA,GAAmB;AACjB,IAAA,OAAO,CAAA,OAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,iBAAC,MAAA,CAAO,GAAA,CAAI,4BAA4B,CAAC,CAAA,GAAY;AACnD,IAAA,OAAO,KAAK,QAAA,EAAS;AAAA,EACvB;AACF,CAAA;AAaO,SAAS,WAAA,CACd,MAAA,EACA,OAAA,GAA8B,EAAC,EACjB;AACd,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,KAAQ,OAAO,YAAY,WAAA,GAAc,OAAA,CAAQ,MAAM,EAAC,CAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,MAAA,IAAU,GAAA,CAAI,WAAW,CAAA;AAC1C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,CAAS,MAAK,EAAG;AACjC,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,mDAAmD,WAAW,CAAA,sBAAA;AAAA,KAChE;AAAA,EACF;AACA,EAAA,OAAO,IAAI,OAAO,QAAQ,CAAA;AAC5B;;;AC7GO,IAAM,OAAA,GAAU;;;ACwChB,IAAM,gBAAA,GAAmB,oCAAA;AACzB,IAAM,eAAA,GAAkB,EAAA;AAcxB,SAAS,aAAa,GAAA,EAAmB;AAC9C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,IAAI,GAAG,CAAA,CAAE,SAAS,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,WAAA,EAAY;AAAA,EAC/D,CAAA,CAAA,MAAQ;AACN,IAAA,MAAA,GAAS,EAAA;AAAA,EACX;AACA,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,uCAAA,EAA0C,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,sDAAA;AAAA,KAElE;AAAA,EACF;AACF;AAMA,IAAM,mBAAA,uBAA+C,GAAA,CAAI;AAAA,EACvD,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAiCD,IAAM,SAAA,GAAY,CAAC,OAAA,KACjB,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,OAAA,GAAU,GAAI,CAAC,CAAA;AAGvD,IAAM,aAAN,MAAiB;AAAA,EACb,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EAET,YAAY,OAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA;AACrB,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACxE,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,OAAA,IAAW,eAAA;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA,CAAQ,SAAA,IAAa,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA;AAC7D,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA,CAAQ,WAAA,IAAe,IAAI,uBAAA,EAAwB;AACvE,IAAA,IAAA,CAAK,mBAAA,GAAsB,QAAQ,kBAAA,IAAsB,IAAA;AACzD,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,YAAA,IAAgB,IAAA;AAC7C,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,KAAA;AAAA,IACxB,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,WAAA,EAAa;AACvC,MAAA,IAAA,CAAK,SAAS,CAAC,GAAA,EAAK,IAAA,KAAS,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,wEAAwE,CAAA;AAAA,IAC1F;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,KAAA,IAAS,SAAA;AAAA,EACjC;AAAA,EAEA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,IAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CAAQ,MAAA,EAAgB,IAAA,EAAc,OAAA,GAA0B,EAAC,EAAsB;AAC3F,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,yBAAA;AAAA,MAC1B,MAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,UAAA,GAAa;AAAA,KACvD;AACA,IAAA,kBAAA,CAAmB,QAAQ,CAAA;AAC3B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,CAAW,MAAA,EAAgB,IAAA,EAAc,OAAA,GAA0B,EAAC,EAAsB;AAC9F,IAAA,MAAM,EAAE,UAAS,GAAI,MAAM,KAAK,mBAAA,CAAoB,MAAA,EAAQ,MAAM,OAAO,CAAA;AACzE,IAAA,kBAAA,CAAmB,QAAQ,CAAA;AAC3B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,yBAAA,CACJ,MAAA,EACA,IAAA,EACA,SACA,sBAAA,EACmB;AACnB,IAAA,MAAM,EAAE,UAAU,QAAA,EAAS,GAAI,MAAM,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AACnF,IAAA,IAAI,QAAA,CAAS,SAAS,GAAA,EAAK;AACzB,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,MAAM,OAAA,GACJ,QAAA,GAAW,CAAA,GAAI,MAAM,gBAAA,CAAiB,UAAU,QAAQ,CAAA,GAAI,MAAM,WAAA,CAAY,QAAQ,CAAA;AACxF,IAAA,IACE,KAAK,aAAA,IAAiB,IAAA,IACtB,sBAAA,GAAyB,CAAA,IACzB,mBAAmB,kBAAA,EACnB;AACA,MAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,OAAA,EAAS,IAAA,CAAK,aAAa,CAAA;AAClE,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,MAAM,IAAA,CAAK,OAAO,YAAY,CAAA;AAC9B,QAAA,OAAO,KAAK,yBAAA,CAA0B,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,yBAAyB,CAAC,CAAA;AAAA,MACzF;AAAA,IACF;AACA,IAAA,MAAM,OAAA;AAAA,EACR;AAAA,EAEA,MAAM,mBAAA,CACJ,MAAA,EACA,IAAA,EACA,OAAA,EACmD;AACnD,IAAA,MAAM,OAAA,GAAU,KAAK,eAAA,EAAgB;AACrC,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,oBAAA,CAAqB,MAAA,CAAO,WAAA,EAAY,EAAG,OAAO,CAAA;AAEvD,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,WAAS;AACP,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAW,MAAA,EAAQ,IAAA,EAAM,SAAS,OAAO,CAAA;AACrE,MAAA,IAAI,QAAA,CAAS,SAAS,GAAA,EAAK;AACzB,QAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,OAAA,GAAU,CAAA,EAAE;AAAA,MAC3C;AACA,MAAA,MAAM,OAA0B,EAAE,MAAA,EAAQ,SAAS,MAAA,EAAQ,OAAA,EAAS,SAAS,OAAA,EAAQ;AACrF,MAAA,IAAI,KAAK,YAAA,CAAa,WAAA,CAAY,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA,EAAG;AACtD,QAAA,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,aAAa,SAAA,CAAU,IAAA,EAAM,OAAO,CAAC,CAAA;AAC5D,QAAA,OAAA,IAAW,CAAA;AACX,QAAA;AAAA,MACF;AACA,MAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,OAAA,GAAU,CAAA,EAAE;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,eAAA,GAA0C;AACxC,IAAA,OAAO;AAAA,MACL,cAAc,IAAA,CAAK,UAAA;AAAA,MACnB,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAG,IAAA,CAAK,KAAA,CAAM,OAAA;AAAQ,KACxB;AAAA,EACF;AAAA,EAEA,oBAAA,CAAqB,QAAgB,OAAA,EAAuC;AAC1E,IAAA,IAAI,CAAC,KAAK,mBAAA,EAAqB;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA,EAAG;AACjC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,qBAAqB,OAAA,EAAS;AAChC,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,iBAAiB,IAAI,sBAAA,EAAuB;AAAA,EACtD;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,IAAA,EACA,SACA,OAAA,EACmB;AACnB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,QAAQ,MAAM,CAAA;AAC/C,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW;AAC9B,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAAA,IAC5B;AACA,IAAA,MAAM,IAAA,GAAoB,EAAE,MAAA,EAAQ,OAAA,EAAQ;AAC5C,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW;AAC9B,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAW;AACxC,MAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,OAAA;AAAA,IACtB;AACA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,WAAW,GAAI,CAAA;AACvE,IAAA,IAAA,CAAK,SAAS,UAAA,CAAW,MAAA;AACzB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,IAAI,CAAA;AAAA,IACpC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,SAAA,CAAU,MAAc,MAAA,EAA2C;AACjE,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,QAAA,GAAW,IAAA,GAAO,CAAA,EAAG,KAAK,QAAQ,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,EAAA,GAAK,GAAG,GAAG,IAAI,CAAA,CAAA;AACxF,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAI,CAAA;AACxB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA;AAAA,MACF;AACA,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAA,CACJ,GAAA,EACA,EAAE,OAAA,EAAS,SAAQ,EACA;AACnB,IAAA,YAAA,CAAa,GAAG,CAAA;AAChB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK;AAAA,MACtC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS,WAAW;AAAC,KACtB,CAAA;AACD,IAAA,IAAI,QAAA,CAAS,UAAU,GAAA,EAAK;AAC1B,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,QAAA,CAAS,MAAA;AAAA,QACT,CAAA,QAAA,EAAW,SAAS,MAAM,CAAA,CAAA;AAAA,QAC1B,SAAS,UAAA,IAAc,wBAAA;AAAA,QACvB,EAAE,GAAA;AAAI,OACR;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,WAAA,CACJ,GAAA,EACA,EAAE,OAAA,EAAQ,GAA0C,EAAC,EAClC;AACnB,IAAA,YAAA,CAAa,GAAG,CAAA;AAChB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,OAAA,IAAW,EAAC,EAAG,CAAA;AACjF,IAAA,IAAI,QAAA,CAAS,UAAU,GAAA,EAAK;AAC1B,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,QAAA,CAAS,MAAA;AAAA,QACT,CAAA,cAAA,EAAiB,SAAS,MAAM,CAAA,CAAA;AAAA,QAChC,SAAS,UAAA,IAAc,0BAAA;AAAA,QACvB,EAAE,GAAA;AAAI,OACR;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,KAAA,GAAuB;AAAA,EAE7B;AACF,CAAA;AASA,SAAS,mBAAmB,QAAA,EAA0B;AACpD,EAAA,IAAI,0BAAA,CAA2B,QAAA,CAAS,OAAO,CAAA,EAAG;AAChD,IAAA,oBAAA,CAAqB,EAAE,MAAA,EAAQ,QAAA,CAAS,GAAA,IAAO,WAAW,CAAA;AAAA,EAC5D;AACF;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,SAAS,KAAA,EAAoC;AACpD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAGA,SAAS,aAAa,KAAA,EAA+B;AACnD,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA;AAAA,EAC1C;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,IAAA;AAAA,EAC5C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,SAAS,QAAA,EAAsD;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAmB,MAAM,QAAA,CAAS,IAAA,EAAK;AAC7C,IAAA,OAAO,QAAA,CAAS,OAAO,CAAA,GAAI,OAAA,GAAU,EAAC;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAGO,SAAS,qBAAqB,OAAA,EAA2D;AAC9F,EAAA,KAAA,MAAW,GAAA,IAAO,CAAC,QAAA,EAAU,OAAO,CAAA,EAAY;AAC9C,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAG,CAAA;AAC1B,IAAA,IAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AACpB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAYA,eAAsB,YAAY,QAAA,EAAuC;AACvE,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,MAAM,QAAA,CAAS,QAAQ,CAAC,CAAA;AAC3D,EAAA,MAAM,OAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,QAAQ,MAAM,CAAA,CAAA;AACnD,EAAA,MAAM,UAAU,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,KAAM,SAAS,UAAA,IAAc,gBAAA,CAAA;AACnE,EAAA,MAAM,UAAoC,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,GAAI,MAAM,OAAA,GAAU,MAAA;AAEpF,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,OAAO,IAAI,cAAA,CAAe,MAAA,EAAQ,IAAA,EAAM,SAAS,OAAO,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,MAAM,UAAA,GACJ,QAAA,CAAS,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,cAAc,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,MAAM,CAAA,IAAK,IAAA;AACpF,IAAA,IAAI,mBAAA,CAAoB,GAAA,CAAI,IAAI,CAAA,EAAG;AACjC,MAAA,OAAO,IAAI,kBAAkB,MAAA,EAAQ,IAAA,EAAM,SAAS,OAAA,EAAS,EAAE,YAAY,CAAA;AAAA,IAC7E;AACA,IAAA,IAAI,IAAA,KAAS,sBAAA,IAA0B,IAAA,KAAS,gBAAA,EAAkB;AAChE,MAAA,OAAO,IAAI,kBAAA,CAAmB,MAAA,EAAQ,IAAA,EAAM,SAAS,OAAA,EAAS;AAAA,QAC5D,WAAA,EAAa,YAAA,CAAa,KAAA,CAAM,WAAA,IAAe,MAAM,YAAY,CAAA;AAAA,QACjE,cAAA,EAAgB,YAAA,CAAa,KAAA,CAAM,cAAA,IAAkB,MAAM,eAAe,CAAA;AAAA,QAC1E,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,SAAS,OAAO,CAAA;AACpD;AAGA,eAAsB,gBAAA,CACpB,UACA,YAAA,EAC8B;AAC9B,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,EAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,QAAQ,CAAA;AACvC,EAAA,MAAM,OAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,IAAK,QAAQ,MAAM,CAAA,CAAA;AACrD,EAAA,MAAM,UAAU,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,KAAM,SAAS,UAAA,IAAc,gBAAA,CAAA;AACrE,EAAA,MAAM,UAAoC,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,GAAI,QAAQ,OAAA,GAAU,MAAA;AACxF,EAAA,OAAO,IAAI,oBAAoB,MAAA,EAAQ,IAAA,EAAM,SAAS,OAAA,EAAS,EAAE,cAAc,CAAA;AACjF;;;ACxaO,IAAM,kBAAA,GAAqB,GAAA;AAElC,SAAS,gBAAgB,KAAA,EAAwB;AAC/C,EAAA,OAAO,MAAA,CAAO,KAAA,IAAS,CAAC,CAAA,GAAI,kBAAA;AAC9B;AAEA,SAAS,OAAO,KAAA,EAAsB;AACpC,EAAA,OAAO,IAAI,KAAK,KAAwB,CAAA;AAC1C;AAEA,SAAS,aAAa,KAAA,EAA6B;AACjD,EAAA,OAAO,KAAA,IAAS,IAAA,GAAO,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA;AAC5C;AAEA,SAASA,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAGO,SAAS,UAAU,IAAA,EAAqC;AAC7D,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1B,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC9B,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC1B,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IACjC,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IAChC,KAAA,EAAQ,KAAK,KAAA,IAAuC,IAAA;AAAA,IACpD,SAAS,IAAA,CAAK,OAAA,IAAW,OAAO,IAAA,GAAO,OAAA,CAAQ,KAAK,OAAO;AAAA,GAC7D;AACF;AAGO,SAAS,gBAAgB,IAAA,EAA2C;AACzE,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC9B,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IACtB,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC9B,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,GAAG;AAAA,GACtB;AACF;AAGO,SAAS,cAAc,IAAA,EAAyC;AACrE,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAI,GAAG,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAE;AAClE;AAGO,SAAS,gBAAgB,IAAA,EAA2C;AACzE,EAAA,MAAM,cAAc,IAAA,CAAK,WAAA;AACzB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,IACxB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAAA,IACxC,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAA,IAAY,CAAC,CAAA;AAAA,IACnC,eAAA,EAAkB,KAAK,eAAA,IAAiD,IAAA;AAAA,IACxE,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAClC,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQ,eAAA,CAAgB,GAA8B,CAAC,CAAA,GACxE,IAAA;AAAA,IACJ,KAAA,EAAO,KAAA,IAAS,IAAA,GAAO,aAAA,CAAc,KAAgC,CAAA,GAAI,IAAA;AAAA,IACzE,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,CAAC,CAAA;AAAA,IACvC,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IAChC,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IAChC,SAAA,EAAW,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAAA,IACtC,WAAA,EAAa,YAAA,CAAa,IAAA,CAAK,WAAW,CAAA;AAAA,IAC1C,iBAAA,EAAoB,KAAK,iBAAA,IAAmD;AAAA,GAC9E;AACF;AAGO,SAAS,iBAAiB,IAAA,EAA4C;AAC3E,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1B,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC9B,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC9B,SAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,OAAO,CAAA,GAC9B,KAAK,OAAA,GACN,IAAA;AAAA,IACJ,UAAU,IAAA,CAAK,QAAA,IAAY,OAAO,IAAA,GAAO,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,IAC9D,gBAAA,EAAkB,OAAA,CAAQ,IAAA,CAAK,gBAAA,IAAoB,KAAK,CAAA;AAAA,IACxD,cAAA,EAAgB,KAAK,cAAA,IAAkB,IAAA;AAAA,IACvC,mBAAA,EAAsB,KAAK,mBAAA,IAAqD;AAAA,GAClF;AACF;AAGO,SAAS,aAAa,IAAA,EAAwC;AACnE,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IAChC,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAA,IAAY,CAAC,CAAA;AAAA,IACnC,WAAA,EAAc,KAAK,WAAA,IAA6C,IAAA;AAAA,IAChE,SAAA,EAAY,KAAK,SAAA,IAA2C,IAAA;AAAA,IAC5D,QAAA,EAAW,KAAK,QAAA,IAA0C,IAAA;AAAA,IAC1D,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AAAA,IACnE,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA,GACzC,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS,gBAAA,CAAiB,IAA+B,CAAC,IACjF,EAAC;AAAA,IACL,aAAaA,SAAAA,CAAS,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA,CAAK,cAAc,EAAC;AAAA,IAC9D,iBAAA,EAAmB,MAAM,OAAA,CAAQ,IAAA,CAAK,iBAAiB,CAAA,GAClD,IAAA,CAAK,oBACN,EAAC;AAAA,IACL,YAAA,EAAe,KAAK,YAAA,IAA8C,IAAA;AAAA,IAClE,YAAA,EAAe,KAAK,YAAA,IAA8C,IAAA;AAAA,IAClE,SAAA,EAAY,KAAK,SAAA,IAA2C,IAAA;AAAA,IAC5D,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IAChC,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IAChC,SAAA,EAAW,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAAA,IACtC,WAAA,EAAa,YAAA,CAAa,IAAA,CAAK,WAAW;AAAA,GAC5C;AACF;AAGO,SAAS,eAAe,IAAA,EAA0C;AACvE,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,aAAA,IAAiB,CAAC,CAAA;AAAA,IAC7C,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IAChC,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IAChC,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,GAAA,IAAO,CAAC,CAAA;AAAA,IACzB,MAAMA,SAAAA,CAAS,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,OAAO;AAAC,GAC3C;AACF;AAKO,SAAS,mBAAmB,IAAA,EAA8B;AAC/D,EAAA,MAAM,KAAA,GAAQA,SAAAA,CAAS,IAAI,CAAA,GAAI,OAAO,EAAC;AACvC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,CAAC,CAAA;AAAA,IACpC,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,SAAA,IAAa,CAAC,CAAA;AAAA,IACtC,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,SAAA,IAAa,CAAC;AAAA,GACxC;AACF;AAGO,SAAS,cAAc,IAAA,EAAyC;AACrE,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,IAClC,OAAA,EAAU,KAAK,OAAA,IAAyC,IAAA;AAAA,IACxD,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1B,YAAA,EAAe,KAAK,YAAA,IAA8C,IAAA;AAAA,IAClE,UAAA,EAAa,KAAK,UAAA,IAA4C,IAAA;AAAA,IAC9D,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IACtB,WAAA,EAAc,KAAK,WAAA,IAA6C,IAAA;AAAA,IAChE,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AAAA,IAC1D,KAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA;AAAA,IACpC,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe,CAAC;AAAA,GAC3C;AACF;AAGO,SAAS,qBAAqB,IAAA,EAAgD;AACnF,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,IAClC,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1B,OAAA,EAAU,KAAK,OAAA,IAAyC,IAAA;AAAA,IACxD,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IACtB,WAAA,EAAc,KAAK,WAAA,IAA6C,IAAA;AAAA,IAChE,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AAAA,IAC1D,KAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,KAAK;AAAA,GACtC;AACF;AAGO,SAAS,wBAAwB,IAAA,EAAmD;AACzF,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACtB,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,oBAAA,CAAqB,GAA8B,CAAC,IACvE,EAAC;AAAA,IACL,MAAA,EAAS,KAAK,MAAA,IAAwC;AAAA,GACxD;AACF;AAGO,SAAS,kBAAkB,IAAA,EAA6C;AAC7E,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,IACzB,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,CAAC;AAAA,GACvC;AACF;AAKO,SAAS,sBAAsB,IAAA,EAAiD;AACrF,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC9B,oBAAA,EAAsB,eAAA,CAAgB,IAAA,CAAK,mBAAmB;AAAA,GAChE;AACF;AAGO,SAAS,gBAAgB,IAAA,EAA2C;AACzE,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,gBAAA,EAAkB,eAAA,CAAgB,IAAA,CAAK,eAAe,CAAA;AAAA,IACtD,gBAAA,EAAkB,eAAA,CAAgB,IAAA,CAAK,eAAe,CAAA;AAAA,IACtD,UAAA,EAAa,KAAK,UAAA,IAA4C;AAAA,GAChE;AACF;AAGO,SAAS,kBAAkB,IAAA,EAA6C;AAC7E,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,OAAO;AAAA,IACL,gBAAA,EAAkB,eAAA,CAAgB,IAAA,CAAK,eAAe,CAAA;AAAA,IACtD,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,YAAA,IAAgB,CAAC,CAAA;AAAA,IAC3C,qBAAA,EAAuB,eAAA,CAAgB,IAAA,CAAK,oBAAoB,CAAA;AAAA,IAChE,mBAAA,EAAqB,eAAA,CAAgB,IAAA,CAAK,kBAAkB,CAAA;AAAA,IAC5D,mBAAA,EAAqB,eAAA,CAAgB,IAAA,CAAK,kBAAkB,CAAA;AAAA,IAC5D,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACtB,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,qBAAA,CAAsB,GAA8B,CAAC,IACxE,EAAC;AAAA,IACL,UAAA,EAAY,gBAAgBA,SAAAA,CAAS,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA,CAAK,UAAA,GAAa,EAAE;AAAA,GAC9E;AACF;AAGO,SAAS,aAAa,IAAA,EAA0B;AACrD,EAAA,OAAO,EAAE,IAAA,EAAK;AAChB;AAGO,SAAS,uBAAuB,IAAA,EAAkD;AACvF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1B,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,YAAA,IAAgB,KAAK,WAAW,CAAA;AAAA,IACzD,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,KAAK,SAAS,CAAA;AAAA,IACnD,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAA;AAAA,IAC3B,KAAA,EAAQ,KAAK,KAAA,IAAuC;AAAA,GACtD;AACF;;;ACzPO,IAAM,UAAN,MAAc;AAAA,EACV,KAAA;AAAA,EAET,YAAY,IAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA;AAAA,EAGA,MAAM,QAAA,CAAS,OAAA,GAA2B,EAAC,EAA0B;AACnE,IAAA,MAAM,OAAgC,EAAE,SAAA,EAAW,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAE;AACvE,IAAA,IAAI,OAAA,CAAQ,iBAAiB,IAAA,EAAM;AACjC,MAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAAA,IAC/B;AACA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,QAAQ,gCAAA,EAAkC;AAAA,MAClF,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,iBAAA,CAAmB,MAAM,QAAA,CAAS,IAAA,EAAkC,CAAA;AAAA,EAC7E;AAAA;AAAA,EAGA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,OAAO,EAAC,EAAG,aAAA,EAAe,CAAA,EAAG,CAAA;AACpE,IAAA,OAAO,YAAA,CAAa,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,CAAa,OAAA,GAA4B,EAAC,EAAiC;AAC/E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,OAAO,+BAA+B,CAAA;AAChF,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAC9B,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,sBAAA,CAAuB,GAA8B,CAAC,IACxE,EAAC;AACL,IAAA,IAAI,OAAA,CAAQ,SAAS,IAAA,EAAM;AACzB,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,eAAe,KAAK,CAAA;AAAA,EAC7D;AACF,CAAA;;;AChDO,IAAM,qBAAA,GAAwB,CAAA;AAC9B,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,iBAAA,GAAoB,CAAA;AACjC,IAAM,4BAAA,GAA+B,CAAA;AACrC,IAAM,cAAA,GAAiB,GAAA;AAGvB,IAAM,uBAAA,GAAkD;AAAA,EACtD,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,MAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK;AACP,CAAA;AAEA,SAAS,kBAAkB,QAAA,EAAiC;AAC1D,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACpC,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,uBAAA,CAAwB,SAAS,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,IAAK,IAAA;AAC3E;AAwBA,IAAMC,UAAAA,GAAY,CAAC,OAAA,KACjB,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,OAAA,GAAU,GAAI,CAAC,CAAA;AAGvD,IAAM,UAAN,MAAc;AAAA,EACV,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,IAAA,EAAkB,OAAA,GAAkC,EAAC,EAAG;AAClE,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,KAAA,IAASA,UAAAA;AAC/B,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,CAAQ,GAAA,KAAQ,MAAM,KAAK,GAAA,EAAI,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,OAAO,OAAA,EAAoD;AAC/D,IAAA,MAAM,EAAE,MAAA,EAAQ,YAAA,EAAa,GAAI,IAAA,CAAK,eAAe,OAAO,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,MAAA;AAAA,MAChB,aAAA,EAAe,YAAA;AAAA,MACf,eAAe,OAAA,CAAQ,YAAA;AAAA,MACvB,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,KAC9B;AACA,IAAA,IAAI,OAAA,CAAQ,aAAa,IAAA,EAAM;AAC7B,MAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,SAAA;AAAA,IAC9B;AACA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,QAAQ,cAAA,EAAgB;AAAA,MAChE,IAAA,EAAM,EAAE,cAAA,EAAgB,qBAAA,EAAuB,MAAA;AAAO,KACvD,CAAA;AACD,IAAA,OAAO,eAAA,CAAiB,MAAM,QAAA,CAAS,IAAA,EAAkC,CAAA;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAM,SAAS,KAAA,EAAoC;AACjD,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,IAAA,CAAK,KAAA,EAAe,OAAA,GAAuB,EAAC,EAAwB;AACxE,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACV,KAAA;AAAA,MACA,QAAQ,OAAA,IAAW,oBAAA;AAAA,MACnB,QAAQ,YAAA,IAAgB;AAAA,KAC1B;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAAc,OAAA,EAAkE;AACpF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACrC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,YAAA,EAAc,OAAA,CAAQ,YAAA,EAAc,CAAA;AAAA,EAC9F;AAAA;AAAA,EAGA,MAAM,YAAY,GAAA,EAA2C;AAC3D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,WAAA,GAAc,CAAC,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,cAAA,CAAe;AAAA,QACvB,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,eAAe,QAAA,CAAS,aAAA;AAAA,QACxB,IAAA,EAAM,iBAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AACA,IAAA,OAAO,KAAA,CAAM,GAAA;AAAA,EACf;AAAA;AAAA,EAGA,MAAM,UAAA,CAAW,GAAA,EAA0B,EAAE,IAAG,EAAoC;AAClF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AACtC,IAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,MAAM,OAAO,aAAkB,CAAA;AAK5D,IAAA,MAAM,KAAK,MAAM,KAAA,CAAM,EAAE,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC3C,IAAA,IAAI,EAAA,EAAI,gBAAe,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,qBAAA,EAAwB,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,qEAAA;AAAA,OAE5C;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,YAAY,GAAG,CAAA;AACjD,IAAA,MAAM,QAAQ,IAAI,UAAA,CAAW,MAAM,QAAA,CAAS,aAAa,CAAA;AACzD,IAAA,MAAM,SAAA,CAAU,IAAI,KAAK,CAAA;AACzB,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA,EAIA,eAAe,OAAA,EAAyE;AACtF,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,YAAA,EAAa,GAAI,OAAA;AACvC,IAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,MAAA,IAAU,IAAA,EAAM;AAClC,MAAA,MAAM,IAAI,UAAU,sDAAsD,CAAA;AAAA,IAC5E;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,QAAA,GAAW,YAAA,IAAgB,iBAAA,CAAkB,IAAA,CAAK,QAAQ,CAAA;AAChE,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,2CAAA,EAA8C,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAC,CAAA,8BAAA;AAAA,SAE7E;AAAA,MACF;AACA,MAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,cAAc,QAAA,EAAS;AAAA,IACvD;AACA,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,MACzE;AACA,MAAA,OAAO,EAAE,QAAQ,YAAA,EAAa;AAAA,IAChC;AACA,IAAA,MAAM,IAAI,UAAU,6CAA6C,CAAA;AAAA,EACnE;AAAA,EAEA,MAAM,UAAU,KAAA,EAAoC;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAA,EAAO,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAE,CAAA;AACxE,IAAA,OAAO,eAAA,CAAiB,MAAM,QAAA,CAAS,IAAA,EAAkC,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAe,OAAA,EAAiB,eAAA,EAA8C;AAC5F,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,GAAI,GAAA;AAC5B,IAAA,IAAI,QAAA,GAAW,eAAA;AACf,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,WAAS;AACP,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACtC,MAAA,IAAI,oBAAA,CAAqB,GAAG,CAAA,EAAG;AAC7B,QAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,MAC3B;AACA,MAAA,IAAI,GAAA,CAAI,aAAa,YAAA,EAAc;AACjC,QAAA,UAAA,IAAc,CAAA;AACd,QAAA,IAAI,cAAc,4BAAA,EAA8B;AAC9C,UAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,cAAA,EAAgB,iBAAiB,CAAA;AAChE,UAAA,UAAA,GAAa,CAAA;AAAA,QACf;AAAA,MACF,CAAA,MAAO;AACL,QAAA,YAAA,GAAe,GAAA,CAAI,QAAA;AACnB,QAAA,UAAA,GAAa,CAAA;AAAA,MACf;AACA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,EAAK,GAAI,GAAA,GAAO,KAAA;AACrC,MAAA,IAAI,OAAA,GAAU,WAAW,OAAA,EAAS;AAChC,QAAA,MAAM,IAAI,eAAA,CAAgB,EAAE,KAAA,EAAO,OAAA,EAAS,SAAS,CAAA;AAAA,MACvD;AACA,MAAA,MAAM,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,UAAU,GAAA,EAA6B;AACrC,IAAA,IAAI,GAAA,CAAI,WAAW,QAAA,EAAU;AAC3B,MAAA,MAAM,MAAM,GAAA,CAAI,KAAA;AAChB,MAAA,MAAM,IAAI,cAAA,CAAe;AAAA,QACvB,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,eAAe,GAAA,CAAI,aAAA;AAAA,QACnB,IAAA,EAAM,GAAA,GAAM,GAAA,CAAI,IAAA,GAAO,SAAA;AAAA,QACvB,OAAA,EAAS,GAAA,GAAM,GAAA,CAAI,OAAA,GAAU;AAAA,OAC9B,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,GAAA,EAA+C;AAC9D,IAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,GAAI,GAAA;AAAA,EACzD;AACF,CAAA;;;AChOA,IAAM,oBAAA,GAAuB,0BAAA;AAG7B,IAAM,cAAA,GAAyC;AAAA,EAC7C,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,oBAAA;AAAA,EACL,IAAA,EAAM,yEAAA;AAAA,EACN,GAAA,EAAK,+BAAA;AAAA,EACL,IAAA,EAAM,2EAAA;AAAA,EACN,GAAA,EAAK,0BAAA;AAAA,EACL,IAAA,EAAM,mEAAA;AAAA,EACN,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,IAAA,EAAM,WAAA;AAAA,EACN,GAAA,EAAK,WAAA;AAAA,EACL,EAAA,EAAI,eAAA;AAAA,EACJ,IAAA,EAAM,kBAAA;AAAA,EACN,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,YAAA;AAAA,EACL,IAAA,EAAM,YAAA;AAAA,EACN,GAAA,EAAK,WAAA;AAAA,EACL,IAAA,EAAM,YAAA;AAAA,EACN,GAAA,EAAK,eAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AAEA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AACpC;AAGO,SAAS,iBAAiB,QAAA,EAA0B;AACzD,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACpC,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,oBAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAS,QAAA,CAAS,KAAA,CAAM,GAAA,GAAM,CAAC,EAAE,WAAA,EAAY;AACnD,EAAA,OAAO,cAAA,CAAe,MAAM,CAAA,IAAK,oBAAA;AACnC;AAEA,SAAS,QAAQ,OAAA,EAAwD;AACvE,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,mBAAmB,WAAA,EAAa;AAClC,IAAA,OAAO,IAAI,WAAW,OAAO,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,OAAA;AACT;AAqBO,IAAM,QAAN,MAAY;AAAA,EACR,KAAA;AAAA,EAET,YAAY,IAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,OAAA,EAAuC;AAClD,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,OAAA;AAC1B,IAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,OAAA,IAAW,IAAA,EAAM;AACnC,MAAA,MAAM,IAAI,UAAU,8CAA8C,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,OAAA,IAAW,IAAA,EAAM;AACnC,MAAA,MAAM,IAAI,UAAU,uDAAuD,CAAA;AAAA,IAC7E;AAEA,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,WAAW,OAAA,CAAQ,QAAA;AACvB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,aAAkB,CAAA;AACpD,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAClC,MAAA,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,QAAQ,MAAA,CAAO,UAAA,EAAY,OAAO,UAAU,CAAA;AAC1E,MAAA,QAAA,KAAa,SAAS,IAAI,CAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,QAAQ,OAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AACA,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,gBAAA,CAAiB,QAAQ,CAAA;AACpE,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,QAAA,EAAU,WAAW,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,eAAA,CAAgB,IAAA,EAAkB,QAAA,EAAkB,WAAA,EAAoC;AAC5F,IAAA,MAAM,OAAO,IAAA,CAAK,UAAA;AAClB,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,MAAM,WAAW,CAAA;AAC/D,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,OAAA,CAAQ,SAAA,EAAW;AAAA,MAC9C,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,EAAE,cAAA,EAAgB,WAAA;AAAY,KACxC,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,QAAQ,QAAA,EAAU,IAAA,EAAM,WAAA,EAAa,OAAA,CAAQ,KAAK,CAAA;AAC9F,IAAA,OAAO,UAAU,OAAO,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,QAAA,CAAS,QAAA,EAAkB,IAAA,EAAc,WAAA,EAA6C;AAC1F,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,QAAQ,wBAAA,EAA0B;AAAA,MAC1E,MAAM,EAAE,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,MAAM,WAAA;AAAY,KACzD,CAAA;AACD,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,MAChC,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,MAC1B,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK;AAAA,KAC1B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CACJ,MAAA,EACA,QAAA,EACA,IAAA,EACA,aACA,KAAA,EACkC;AAClC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,QAAQ,wBAAA,EAA0B;AAAA,MAC1E,IAAA,EAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,UAAU,QAAA,EAAU,IAAA,EAAM,aAAa,KAAA;AAAM,KACxE,CAAA;AACD,IAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAAA,EAC9B;AACF,CAAA;;;ACvJO,IAAM,UAAA,GAAa,iBAAA;AAanB,IAAM,qBAAN,MAAgD;AAAA,EAC5C,cAAA;AAAA,EACT,GAAA,GAAwB,IAAA;AAAA,EACf,SAAmB,EAAC;AAAA,EACpB,WAGJ,EAAC;AAAA,EACN,MAAA,GAAS,KAAA;AAAA,EACT,QAAA,GAAoB,IAAA;AAAA,EAEpB,WAAA,CAAY,OAAA,GAAqC,EAAC,EAAG;AACnD,IAAA,MAAM,OAAO,OAAA,CAAQ,aAAA,KAAkB,OAAO,SAAA,KAAc,cAAc,SAAA,GAAY,MAAA,CAAA;AACtF,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AAAA,EAEA,QAAQ,GAAA,EAA4B;AAClC,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5C,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,IAAI,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA;AAAA,MACtC,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO,GAAG,CAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,GAAA,GAAM,MAAA;AACX,MAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,MAAM;AACpC,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AACD,MAAA,MAAA,CAAO,iBAAiB,SAAA,EAAW,CAAC,UAAU,IAAA,CAAK,UAAA,CAAW,KAAqB,CAAC,CAAA;AACpF,MAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,4BAA4B,CAAA;AAClD,QAAA,IAAA,CAAK,QAAA,GAAW,GAAA;AAChB,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,MAAA,CAAO,GAAG,CAAA;AAAA,QACZ;AAAA,MACF,CAAC,CAAA;AACD,MAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,QAAA,IAAA,CAAK,aAAA,EAAc;AAAA,MACrB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,KAAK,OAAA,EAAgC;AACnC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,+CAA+C,CAAC,CAAA;AAAA,IAClF;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,KAAK,OAAO,CAAA;AACrB,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA,EAEA,IAAA,GAAwB;AACtB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM;AACnC,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,OAAO,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AAAA,IACjC;AACA,IAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACzB,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAAA,IACrD;AACA,IAAA,OAAO,IAAI,OAAA,CAAgB,CAAC,OAAA,EAAS,MAAA,KAAW;AAC9C,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,IACxC,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,KAAA,GAAuB;AACrB,IAAA,IAAI,KAAK,GAAA,EAAK;AACZ,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AAAA,MACjB,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,GAAA,GAAM,IAAA;AAAA,IACb;AACA,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA,EAEA,WAAW,KAAA,EAA2B;AACpC,IAAA,MAAM,OACJ,OAAO,KAAA,CAAM,SAAS,QAAA,GAClB,KAAA,CAAM,OACN,KAAA,CAAM,IAAA,YAAgB,cACpB,IAAI,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GACnC,MAAA,CAAO,MAAM,IAAI,CAAA;AACzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,KAAA,EAAM;AACnC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,aAAA,GAAsB;AACpB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,IAAY,IAAI,MAAM,kBAAkB,CAAA;AAC5D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,QAAA,CAAS,KAAA,EAAM,CAAG,MAAA,CAAO,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AACF,CAAA;AAcO,SAAS,aAAa,OAAA,EAAsC;AACjE,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,KAAQ,OAAO,YAAY,WAAA,GAAc,OAAA,CAAQ,MAAM,EAAC,CAAA;AAC5E,EAAA,KAAA,MAAW,SAAA,IAAa,CAAC,OAAA,CAAQ,QAAA,EAAU,QAAQ,QAAA,EAAU,GAAA,CAAI,UAAU,CAAC,CAAA,EAAG;AAC7E,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GAEF;AACF;AAGO,SAAS,iBAAA,CAAkB,SAAiB,KAAA,EAAuB;AACxE,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAChD,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,SAAS,SAAS,KAAK,CAAA,CAAA;AAC7C;;;AC5IO,IAAMC,sBAAAA,GAAwB,CAAA;AAC9B,IAAMC,qBAAAA,GAAuB,GAAA;AAC7B,IAAMC,kBAAAA,GAAoB,CAAA;AACjC,IAAMC,6BAAAA,GAA+B,CAAA;AACrC,IAAMC,eAAAA,GAAiB,GAAA;AAEvB,IAAML,UAAAA,GAAY,CAAC,OAAA,KACjB,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,OAAA,GAAU,GAAI,CAAC,CAAA;AAE9D,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC9D;AAgCO,IAAM,QAAN,MAAY;AAAA,EACR,KAAA;AAAA,EACA,MAAA;AAAA,EACA,mBAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,IAAA,EAAkB,OAAA,GAAgC,EAAC,EAAG;AAChE,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,KAAA,IAAS,IAAA;AAC/B,IAAA,IAAA,CAAK,mBAAA,GAAsB,OAAA,CAAQ,kBAAA,KAAuB,MAAM,IAAI,kBAAA,EAAmB,CAAA;AACvF,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,KAAA,IAASA,UAAAA;AAC/B,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,CAAQ,GAAA,KAAQ,MAAM,KAAK,GAAA,EAAI,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,MAAM,OAAA,EAA6C;AACvD,IAAA,mBAAA,CAAoB,OAAO,CAAA;AAC3B,IAAA,MAAM,UAAmC,EAAE,OAAA,EAAS,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAE;AACxE,IAAA,IAAI,OAAA,CAAQ,cAAc,IAAA,EAAM;AAC9B,MAAA,OAAA,CAAQ,aAAa,OAAA,CAAQ,UAAA;AAAA,IAC/B;AACA,IAAA,IAAI,OAAA,CAAQ,YAAY,IAAA,EAAM;AAC5B,MAAA,OAAA,CAAQ,WAAW,OAAA,CAAQ,QAAA;AAAA,IAC7B;AACA,IAAA,IAAI,OAAA,CAAQ,SAAS,IAAA,EAAM;AAKzB,MAAA,OAAA,CAAQ,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,MAAA,EAAQ,KAAK,CAAA,MAAO;AAAA,QAC5E,MAAA;AAAA,QACA;AAAA,OACF,CAAE,CAAA;AAAA,IACJ;AACA,IAAA,IAAI,OAAA,CAAQ,eAAe,IAAA,EAAM;AAC/B,MAAA,OAAA,CAAQ,cAAc,OAAA,CAAQ,WAAA;AAAA,IAChC;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,QAAQ,mBAAA,EAAqB,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AACxF,IAAA,OAAO,YAAA,CAAc,MAAM,QAAA,CAAS,IAAA,EAAkC,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,MAAM,SAAS,SAAA,EAAqC;AAClD,IAAA,OAAO,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAA,CAAK,SAAA,EAAmB,OAAA,GAA2B,EAAC,EAAqB;AAC7E,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACV,SAAA;AAAA,MACA,QAAQ,OAAA,IAAWE,qBAAAA;AAAA,MACnB,QAAQ,YAAA,IAAgBD;AAAA,KAC1B;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,IAAI,OAAA,EAA+D;AACvE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACpC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW;AAAA,MAC9B,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAA,CACJ,SAAA,EACA,OAAA,EACkB;AAClB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACV,SAAA;AAAA,MACA,EAAE,CAAC,OAAA,CAAQ,MAAM,GAAG,QAAQ,KAAA,EAAM;AAAA,MAClC;AAAA,QACE,iBAAiB,OAAA,CAAQ;AAAA;AAC3B,KACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAAA,CACJ,SAAA,EACA,OAAA,EACA,OAAA,GAAwC,EAAC,EACvB;AAClB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AACtC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,MAAA,EAAQ,KAAK,CAAA,MAAO,EAAE,MAAA,EAAQ,KAAA,EAAM,CAAE;AAAA,KAC/D;AACA,IAAA,IAAI,OAAA,CAAQ,mBAAmB,IAAA,EAAM;AACnC,MAAA,IAAA,CAAK,kBAAkB,OAAA,CAAQ,eAAA;AAAA,IACjC;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,OAAA,EAAS,CAAA,kBAAA,EAAqB,SAAS,CAAA,MAAA,CAAA,EAAU;AAAA,MACzF,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,YAAA,CAAc,MAAM,QAAA,CAAS,IAAA,EAAkC,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,MAAM,OAAA,CAAQ,SAAA,EAAmB,OAAA,GAAwC,EAAC,EAAqB;AAC7F,IAAA,MAAM,IAAA,GACJ,QAAQ,eAAA,IAAmB,IAAA,GAAO,EAAE,eAAA,EAAiB,OAAA,CAAQ,iBAAgB,GAAI,MAAA;AACnF,IAAA,MAAM,IAAA,CAAK,MAAM,OAAA,CAAQ,MAAA,EAAQ,qBAAqB,SAAS,CAAA,QAAA,CAAA,EAAY,EAAE,IAAA,EAAM,CAAA;AACnF,IAAA,OAAO,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,MAAM,OAAO,SAAA,EAAqC;AAChD,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,CAAA,kBAAA,EAAqB,SAAS,CAAA,OAAA,CAAS,CAAA;AACxE,IAAA,OAAO,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,MAAM,KAAA,CACJ,SAAA,EACA,OAAA,GAAgF,EAAC,EAC/D;AAClB,IAAA,MAAM,IAAA,GAAgC,EAAE,SAAA,EAAW,OAAA,CAAQ,aAAa,mBAAA,EAAoB;AAC5F,IAAA,IAAI,OAAA,CAAQ,UAAU,IAAA,EAAM;AAC1B,MAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,IACxB;AACA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,CAAA,kBAAA,EAAqB,SAAS,CAAA,MAAA,CAAA,EAAU,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AACvF,IAAA,OAAO,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAO,MAAA,CACL,SAAA,EACA,OAAA,GAA8B,EAAC,EACQ;AACvC,IAAA,MAAM,GAAA,GAAM,iBAAA;AAAA,MACV,YAAA,CAAa,EAAE,QAAA,EAAU,OAAA,CAAQ,OAAO,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AAAA,MAC/D,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,WAAA;AAAY,KAC9B;AACA,IAAA,MAAM,SAAA,GAAY,KAAK,mBAAA,EAAoB;AAC3C,IAAA,IAAI;AACF,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,QAAQ,GAAG,CAAA;AAC3B,QAAA,MAAM,SAAA,CAAU,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,WAAA,EAAa,SAAA,EAAW,CAAC,CAAA;AAAA,MACzE,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,cAAA;AAAA,UACR,CAAA,oCAAA,EAAuC,SAAS,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,oHAAA;AAAA,SAG1E;AAAA,MACF;AAEA,MAAA,WAAS;AACP,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI;AACF,UAAA,GAAA,GAAM,MAAM,UAAU,IAAA,EAAK;AAAA,QAC7B,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,IAAI,cAAA;AAAA,YACR,CAAA,6BAAA,EAAgC,SAAS,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,WACnE;AAAA,QACF;AACA,QAAA,MAAM,KAAA,GAAQ,WAAW,GAAG,CAAA;AAC5B,QAAA,MAAM,KAAA;AACN,QAAA,IAAI,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC9B,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAM,UAAU,KAAA,EAAM;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,UAAU,SAAA,EAAqC;AACnD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAA,EAAO,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAE,CAAA;AACjF,IAAA,OAAO,YAAA,CAAc,MAAM,QAAA,CAAS,IAAA,EAAkC,CAAA;AAAA,EACxE;AAAA,EAEA,MAAM,SAAA,CAAU,SAAA,EAAmB,OAAA,EAAiB,eAAA,EAA2C;AAC7F,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,GAAI,GAAA;AAC5B,IAAA,IAAI,QAAA,GAAW,eAAA;AACf,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,WAAS;AACP,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAC1C,MAAA,IAAI,iBAAA,CAAkB,GAAG,CAAA,EAAG;AAC1B,QAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,MAC3B;AACA,MAAA,IAAI,iBAAA,CAAkB,GAAG,CAAA,EAAG;AAC1B,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,IAAI,GAAA,CAAI,aAAa,YAAA,EAAc;AACjC,QAAA,UAAA,IAAc,CAAA;AACd,QAAA,IAAI,cAAcG,6BAAAA,EAA8B;AAC9C,UAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,GAAWC,eAAAA,EAAgBF,kBAAiB,CAAA;AAChE,UAAA,UAAA,GAAa,CAAA;AAAA,QACf;AAAA,MACF,CAAA,MAAO;AACL,QAAA,YAAA,GAAe,GAAA,CAAI,QAAA;AACnB,QAAA,UAAA,GAAa,CAAA;AAAA,MACf;AACA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,EAAK,GAAI,GAAA,GAAO,KAAA;AACrC,MAAA,IAAI,OAAA,GAAU,WAAW,OAAA,EAAS;AAChC,QAAA,MAAM,IAAI,mBAAA,CAAoB,EAAE,SAAA,EAAW,OAAA,EAAS,SAAS,CAAA;AAAA,MAC/D;AACA,MAAA,MAAM,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,UAAU,GAAA,EAAuB;AAC/B,IAAA,IAAI,GAAA,CAAI,WAAW,QAAA,EAAU;AAC3B,MAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,QAC3B,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,MAAM,GAAA,CAAI,SAAA;AAAA,QACV,SAAS,GAAA,CAAI;AAAA,OACd,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAA;AAEA,SAAS,oBAAoB,OAAA,EAAiC;AAC5D,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAU,KAAA,EAAM,GAAI,OAAA;AACxC,EAAA,IAAI,UAAA,IAAc,IAAA,IAAQ,QAAA,IAAY,IAAA,EAAM;AAC1C,IAAA,MAAM,IAAI,UAAU,oDAAoD,CAAA;AAAA,EAC1E;AACA,EAAA,IAAI,UAAA,IAAc,IAAA,IAAQ,QAAA,IAAY,IAAA,EAAM;AAC1C,IAAA,MAAM,IAAI,UAAU,6DAA6D,CAAA;AAAA,EACnF;AACA,EAAA,IAAI,cAAc,IAAA,KAAS,CAAC,KAAA,IAAS,KAAA,CAAM,WAAW,CAAA,CAAA,EAAI;AACxD,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AACF;AAGO,SAAS,WAAW,GAAA,EAAwB;AACjD,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EAC1B,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,8BAAA,EAAiC,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA,EAAI;AAAA,MAC/E,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACA,EAAA,IACE,OAAO,OAAA,KAAY,QAAA,IACnB,OAAA,KAAY,IAAA,IACZ,OAAQ,OAAA,CAAoC,IAAA,KAAS,QAAA,IACrD,OAAQ,QAAoC,SAAA,KAAc,QAAA,IAC1D,CAAC,eAAA,CAAiB,OAAA,CAAoC,IAAc,CAAA,EACpE;AACA,IAAA,MAAM,IAAI,cAAA,CAAe,4CAAA,EAA8C,EAAE,OAAA,EAAS,KAAK,CAAA;AAAA,EACzF;AACA,EAAA,OAAO,eAAe,OAAkC,CAAA;AAC1D;;;ACzSO,IAAM,YAAN,MAAgB;AAAA,EACZ,KAAA;AAAA,EAET,YAAY,IAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,OAAA,GAAiC,EAAC,EAAgC;AAC7E,IAAA,MAAM,MAAA,GAA0C;AAAA,MAC9C,IAAA,EAAM,QAAQ,IAAA,IAAQ,QAAA;AAAA,MACtB,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,KAC1B;AACA,IAAA,IAAI,OAAA,CAAQ,OAAO,IAAA,EAAM;AACvB,MAAA,MAAA,CAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,IACvB;AACA,IAAA,IAAI,OAAA,CAAQ,UAAU,IAAA,EAAM;AAC1B,MAAA,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC1B;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAA,EAAO,6BAAA,EAA+B,EAAE,MAAA,EAAQ,CAAA;AAC1F,IAAA,OAAO,uBAAA,CAAyB,MAAM,QAAA,CAAS,IAAA,EAAkC,CAAA;AAAA,EACnF;AAAA;AAAA,EAGA,MAAM,IAAI,UAAA,EAAuC;AAC/C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAA,EAAO,CAAA,kBAAA,EAAqB,UAAU,CAAA,CAAE,CAAA;AAClF,IAAA,OAAO,aAAA,CAAe,MAAM,QAAA,CAAS,IAAA,EAAkC,CAAA;AAAA,EACzE;AAAA;AAAA,EAGA,MAAM,KAAK,OAAA,EAAiD;AAC1D,IAAA,MAAM,IAAA,GAAgC,EAAE,YAAA,EAAc,OAAA,CAAQ,YAAA,EAAa;AAC3E,IAAA,IAAI,OAAA,CAAQ,QAAQ,IAAA,EAAM;AACxB,MAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAAA,IACtB;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,QAAQ,wBAAA,EAA0B,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAC1F,IAAA,OAAO,aAAA,CAAe,MAAM,QAAA,CAAS,IAAA,EAAkC,CAAA;AAAA,EACzE;AAAA;AAAA,EAGA,MAAM,OAAA,CAAQ,UAAA,EAAoB,OAAA,EAAqD;AACrF,IAAA,OAAO,IAAA,CAAK,MAAM,UAAA,EAAY,EAAE,aAAa,OAAA,CAAQ,WAAA,EAAa,UAAA,EAAY,QAAA,EAAU,CAAA;AAAA,EAC1F;AAAA;AAAA,EAGA,MAAM,KAAA,CAAM,UAAA,EAAoB,OAAA,EAAkD;AAChF,IAAA,MAAM,IAAA,GAAgC,EAAE,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAY;AACzE,IAAA,IAAI,OAAA,CAAQ,QAAQ,IAAA,EAAM;AACxB,MAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAAA,IACtB;AACA,IAAA,IAAI,OAAA,CAAQ,eAAe,IAAA,EAAM;AAC/B,MAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAAA,IAC7B;AACA,IAAA,IAAI,OAAA,CAAQ,cAAc,IAAA,EAAM;AAC9B,MAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAAA,IAC5B;AACA,IAAA,IAAI,OAAA,CAAQ,QAAQ,IAAA,EAAM;AACxB,MAAA,IAAA,CAAK,IAAA,GAAO,CAAC,GAAG,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC9B;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,OAAA,EAAS,CAAA,kBAAA,EAAqB,UAAU,CAAA,CAAA,EAAI;AAAA,MACpF,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,aAAA,CAAe,MAAM,QAAA,CAAS,IAAA,EAAkC,CAAA;AAAA,EACzE;AAAA;AAAA,EAGA,MAAM,KAAK,UAAA,EAA2C;AACpD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,MAAA,EAAQ,CAAA,kBAAA,EAAqB,UAAU,CAAA,KAAA,CAAO,CAAA;AACxF,IAAA,OAAO,iBAAA,CAAmB,MAAM,QAAA,CAAS,IAAA,EAAkC,CAAA;AAAA,EAC7E;AACF,CAAA;;;AClEO,IAAM,WAAN,MAAe;AAAA,EACX,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EAET,WAAA,CAAY,OAAA,GAA2B,EAAC,EAAG;AACzC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,WAAA,CAAY,QAAQ,MAAM,CAAA;AACvD,IAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,IAAa,OAAA,CAAQ,WAAW,CAAA,EAAG;AACzD,MAAA,MAAM,IAAI,SAAA,CAAU,CAAA,kDAAA,EAAqD,OAAA,CAAQ,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7F;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,UAAA,CAAW;AAAA,MAC1B,IAAA;AAAA,MACA,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,WAAA,EAAa,kBAAA,CAAmB,OAAA,CAAQ,UAAA,EAAY,QAAQ,WAAW,CAAA;AAAA,MACvE,kBAAA,EAAoB,CAAC,OAAA,CAAQ,kBAAA;AAAA,MAC7B,YAAA,EAAc,mBAAA,CAAoB,OAAA,CAAQ,YAAY;AAAA,KACvD,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACrC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO;AAAA,MACjC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,oBAAoB,OAAA,CAAQ;AAAA,KAC7B,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,EACvC;AAAA,EAEA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,KAAA,CAAM,OAAA;AAAA,EACpB;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACzB;AACF;AAUO,SAAS,kBAAA,CACd,YACA,WAAA,EACa;AACb,EAAA,IAAI,eAAe,IAAA,EAAM;AACvB,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA,OAAO,IAAI,uBAAA,EAAwB;AAAA,EACrC;AACA,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,6BAAA,EAAgC,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,OAAO,IAAI,OAAA,EAAQ;AAAA,EACrB;AACA,EAAA,OAAO,IAAI,uBAAA,CAAwB,EAAE,WAAA,EAAa,YAAY,CAAA;AAChE","file":"index.cjs","sourcesContent":["/**\n * Typed errors raised by the Convilyn SDK — a faithful port of the Python\n * SDK's `exceptions.py`.\n *\n * Hierarchy:\n *\n * ConvilynError base; everything the SDK throws\n * ├── AuthError missing / malformed credentials\n * ├── APIError HTTP 4xx / 5xx (envelope {code, message, details})\n * │ ├── RateLimitError HTTP 429\n * │ ├── PlanRequiredError HTTP 402 + TIER_REQUIRED-family code\n * │ ├── QuotaExceededError HTTP 402 (insufficient_balance / QUOTA_EXCEEDED)\n * │ ├── S3UploadError presigned upload PUT failed\n * │ └── RetryExhaustedError retry policy ran out of attempts\n * ├── JobFailedError conversion job status=failed\n * ├── JobTimeoutError convert.wait() timed out\n * ├── GoalJobFailedError goal job status=failed\n * ├── GoalJobTimeoutError goals.wait() timed out\n * └── WebSocketError goal-event stream failure\n *\n * Catch `ConvilynError` to handle any SDK-originated failure; branch on the\n * `code` / `statusCode` fields for typed handling.\n */\n\nexport type ErrorDetails = Record<string, unknown>\n\n/**\n * Well-known brand for {@link ConvilynError}. `Symbol.for` resolves to the\n * *same* symbol from the global registry regardless of which module instance\n * (ESM vs. CJS) created it, so {@link isConvilynError} stays reliable even\n * when a process ends up loading both entry points of this package (a classic\n * Node.js dual-package hazard where `instanceof` across the two module graphs\n * can false-negative). Prefer the guard function over `instanceof` unless you\n * can guarantee a single module graph.\n */\nconst CONVILYN_ERROR_BRAND = Symbol.for('@convilyn/sdk.ConvilynError')\n\n/** Base class for every error this SDK throws. */\nexport class ConvilynError extends Error {\n /** @internal brand marker — see {@link isConvilynError} */\n readonly [CONVILYN_ERROR_BRAND] = true\n\n constructor(message: string) {\n super(message)\n this.name = 'ConvilynError'\n }\n}\n\n/**\n * Reliable `err instanceof ConvilynError` replacement across module graphs.\n * Use this (not `instanceof`) when the error may have crossed an ESM/CJS\n * boundary — e.g. a dependency `require()`s this package while your own code\n * `import`s it.\n */\nexport function isConvilynError(err: unknown): err is ConvilynError {\n return (\n typeof err === 'object' &&\n err !== null &&\n (err as Record<PropertyKey, unknown>)[CONVILYN_ERROR_BRAND] === true\n )\n}\n\n/** Authentication / authorization failed before any HTTP call. */\nexport class AuthError extends ConvilynError {\n constructor(message: string) {\n super(message)\n this.name = 'AuthError'\n }\n}\n\n/**\n * Server returned a non-success HTTP response. The Convilyn API uses the\n * envelope `{code, message, details}`; those are exposed as fields.\n *\n * `message` holds the server's raw message (matching the Python `.message`\n * attribute); branch on `code` / `statusCode` for typed handling.\n */\nexport class APIError extends ConvilynError {\n readonly statusCode: number\n readonly code: string\n readonly details: ErrorDetails\n\n constructor(statusCode: number, code: string, message: string, details?: ErrorDetails) {\n super(message)\n this.name = 'APIError'\n this.statusCode = statusCode\n this.code = code\n this.details = details ?? {}\n }\n}\n\n/** HTTP 429 — the SDK or caller exceeded the API rate limit. */\nexport class RateLimitError extends APIError {\n constructor(statusCode: number, code: string, message: string, details?: ErrorDetails) {\n super(statusCode, code, message, details)\n this.name = 'RateLimitError'\n }\n}\n\n/** HTTP 402 with a TIER_REQUIRED-family code — the caller's plan is too low. */\nexport class PlanRequiredError extends APIError {\n readonly requiredPlan: string\n readonly upgradeUrl: string | null\n\n constructor(\n statusCode: number,\n code: string,\n message: string,\n details?: ErrorDetails,\n opts: { requiredPlan?: string; upgradeUrl?: string | null } = {}\n ) {\n super(statusCode, code, message, details)\n this.name = 'PlanRequiredError'\n this.requiredPlan = opts.requiredPlan ?? 'pro'\n this.upgradeUrl = opts.upgradeUrl ?? null\n }\n}\n\n/**\n * HTTP 402 — the run would cost more **credits** than the account's balance.\n *\n * The backend currently emits code `insufficient_balance` (and intends to add\n * `QUOTA_EXCEEDED`); both decode to this error. Fields are in **credits**\n * (1 credit = $0.01) to match the vocabulary users see in the console / web /\n * docs — never internal micro-units.\n */\nexport class QuotaExceededError extends APIError {\n readonly costCredits: number | null\n readonly balanceCredits: number | null\n readonly topUpUrl: string | null\n\n constructor(\n statusCode: number,\n code: string,\n message: string,\n details?: ErrorDetails,\n opts: {\n costCredits?: number | null\n balanceCredits?: number | null\n topUpUrl?: string | null\n } = {}\n ) {\n super(statusCode, code, message, details)\n this.name = 'QuotaExceededError'\n this.costCredits = opts.costCredits ?? null\n this.balanceCredits = opts.balanceCredits ?? null\n this.topUpUrl = opts.topUpUrl ?? null\n }\n}\n\n/** The presigned upload PUT step of a file upload returned a non-success status. */\nexport class S3UploadError extends APIError {\n constructor(statusCode: number, code: string, message: string, details?: ErrorDetails) {\n super(statusCode, code, message, details)\n this.name = 'S3UploadError'\n }\n}\n\n/** The retry policy ran out of attempts before the request succeeded. */\nexport class RetryExhaustedError extends APIError {\n readonly attemptCount: number\n\n constructor(\n statusCode: number,\n code: string,\n message: string,\n details?: ErrorDetails,\n opts: { attemptCount?: number } = {}\n ) {\n super(statusCode, code, message, details)\n this.name = 'RetryExhaustedError'\n this.attemptCount = opts.attemptCount ?? 0\n }\n}\n\n/** A conversion job (`convert.wait`) finished with status `failed`. */\nexport class JobFailedError extends ConvilynError {\n readonly jobId: string\n readonly processorType: string\n readonly code: string\n\n constructor(opts: { jobId: string; processorType: string; code: string; message: string }) {\n super(opts.message)\n this.name = 'JobFailedError'\n this.jobId = opts.jobId\n this.processorType = opts.processorType\n this.code = opts.code\n }\n}\n\n/** A polling helper exceeded its `timeout` before the conversion job finished. */\nexport class JobTimeoutError extends ConvilynError {\n readonly jobId: string\n readonly elapsed: number\n readonly timeout: number\n\n constructor(opts: { jobId: string; elapsed: number; timeout: number }) {\n super(\n `Job ${opts.jobId} did not reach a terminal status within ${opts.timeout}s ` +\n `(elapsed ${opts.elapsed.toFixed(1)}s)`\n )\n this.name = 'JobTimeoutError'\n this.jobId = opts.jobId\n this.elapsed = opts.elapsed\n this.timeout = opts.timeout\n }\n}\n\n/** A goal (agentic) job finished with status `failed`. */\nexport class GoalJobFailedError extends ConvilynError {\n readonly jobSpecId: string\n readonly code: string\n\n constructor(opts: { jobSpecId: string; code: string | null; message: string | null }) {\n super(opts.message ?? 'Job failed without a structured error message')\n this.name = 'GoalJobFailedError'\n this.jobSpecId = opts.jobSpecId\n this.code = opts.code ?? 'GOAL_JOB_FAILED'\n }\n}\n\n/** A goal polling helper exceeded its `timeout` before a terminal status. */\nexport class GoalJobTimeoutError extends ConvilynError {\n readonly jobSpecId: string\n readonly elapsed: number\n readonly timeout: number\n\n constructor(opts: { jobSpecId: string; elapsed: number; timeout: number }) {\n super(\n `GoalJob ${opts.jobSpecId} did not reach a terminal status within ` +\n `${opts.timeout}s (elapsed ${opts.elapsed.toFixed(1)}s)`\n )\n this.name = 'GoalJobTimeoutError'\n this.jobSpecId = opts.jobSpecId\n this.elapsed = opts.elapsed\n this.timeout = opts.timeout\n }\n}\n\n/** Raised when the goal event stream cannot proceed. */\nexport class WebSocketError extends ConvilynError {\n readonly payload: string | null\n\n constructor(message: string, opts: { payload?: string | null } = {}) {\n super(message)\n this.name = 'WebSocketError'\n this.payload = opts.payload ?? null\n }\n}\n","/**\n * Public response types — port of `types.py`.\n *\n * Field names are the SDK's **public** names in camelCase (the TS-idiomatic\n * equivalent of the Python SDK's snake_case public surface), which already\n * differ from the raw wire in places (`fileName`→`filename`, `mimeType`→\n * `contentType`). The resource parsers (A2+) map wire → these shapes.\n *\n * Money is expressed in **credits** (1 credit = $0.01) everywhere user-facing,\n * to match the console / web / docs vocabulary — never internal micro-units.\n *\n * Types carry data only; the `is_terminal` / `needs_input` Python *properties*\n * become standalone predicate functions here (tree-shakeable, no class needed).\n */\n\n// ── File conversion ──────────────────────────────────────────────────\n\n/** Lifecycle status of a file-conversion job (`client.convert`). */\nexport type JobStatus = 'queued' | 'processing' | 'completed' | 'failed'\n\n/** A file known to the Convilyn platform. */\nexport interface File {\n readonly fileId: string\n readonly filename: string\n readonly size: number\n readonly contentType: string\n readonly createdAt: Date\n readonly jobId: string | null\n readonly isInput: boolean\n}\n\n/** A produced artifact attached to a completed job (presigned `url`, 1h TTL). */\nexport interface ResultFile {\n readonly filename: string\n readonly size: number\n readonly mimetype: string\n readonly url: string\n}\n\n/** Failure detail attached to a `failed` job. */\nexport interface JobError {\n readonly code: string\n readonly message: string\n}\n\n/** A file-conversion job (data only; actions live on the resource). */\nexport interface ConvertJob {\n readonly jobId: string\n readonly status: JobStatus\n readonly processorType: string\n readonly progress: number\n readonly progressMessage: string | null\n readonly resultFiles: ResultFile[] | null\n readonly error: JobError | null\n readonly retryCount: number\n readonly createdAt: Date\n readonly updatedAt: Date\n readonly startedAt: Date | null\n readonly completedAt: Date | null\n readonly estimatedDuration: number | null\n}\n\n/** Conversion statuses at which `wait()` stops polling. */\nexport const CONVERT_JOB_TERMINAL_STATUSES: readonly JobStatus[] = ['completed', 'failed']\n\n/** True when a conversion job has reached `completed` or `failed`. */\nexport function isConvertJobTerminal(job: Pick<ConvertJob, 'status'>): boolean {\n return CONVERT_JOB_TERMINAL_STATUSES.includes(job.status)\n}\n\n// ── Goal workflows (agentic) ─────────────────────────────────────────\n\n/** Lifecycle status of a goal (agentic) job (`client.goals`). */\nexport type GoalJobStatus =\n | 'draft'\n | 'created'\n | 'analyzing'\n | 'slots_pending'\n | 'ready'\n | 'ready_with_preview'\n | 'confirmed'\n | 'queued'\n | 'executing'\n | 'completed'\n | 'partial'\n | 'failed'\n | 'cancelled'\n\n/** Goal-lane statuses at which `wait()` stops polling. */\nexport const GOAL_JOB_TERMINAL_STATUSES: readonly GoalJobStatus[] = [\n 'completed',\n 'partial',\n 'failed',\n 'cancelled',\n]\n\n/** A piece of information the agent is asking the user to supply. */\nexport interface PendingSlot {\n readonly slotId: string\n readonly slotType: string\n readonly question: string\n readonly options: Array<string | Record<string, string>> | null\n readonly required: boolean\n readonly isDisambiguation: boolean\n readonly suggestedValue: unknown | null\n readonly suggestedConfidence: number | null\n}\n\n/** A goal (agentic) job — a \"workflow run\" in product vocabulary. */\nexport interface GoalJob {\n readonly jobSpecId: string\n readonly status: GoalJobStatus\n readonly progress: number\n readonly itemVersion: number | null\n readonly attemptId: string | null\n readonly goalText: string | null\n readonly fileIds: string[]\n readonly pendingSlots: PendingSlot[]\n readonly filledSlots: Record<string, unknown>\n readonly pendingInterrupts: Record<string, unknown>[]\n readonly agentMessage: string | null\n readonly errorMessage: string | null\n readonly errorCode: string | null\n readonly createdAt: Date\n readonly updatedAt: Date\n readonly startedAt: Date | null\n readonly completedAt: Date | null\n}\n\n/** True when the workflow run reached a stable end state (incl. `partial`). */\nexport function isGoalJobTerminal(job: Pick<GoalJob, 'status'>): boolean {\n return GOAL_JOB_TERMINAL_STATUSES.includes(job.status)\n}\n\n/** True when the agent is blocked waiting on the user (`slots_pending`). */\nexport function goalJobNeedsInput(job: Pick<GoalJob, 'status'>): boolean {\n return job.status === 'slots_pending'\n}\n\n// ── Goal event stream ────────────────────────────────────────────────\n\n/** Discriminator for a server-sent event in a goal execution stream. */\nexport type GoalEventType =\n | 'tool_started'\n | 'tool_finished'\n | 'agent_step_started'\n | 'agent_step_finished'\n | 'orchestration_transition'\n | 'status'\n | 'progress'\n | 'completed'\n | 'failed'\n | 'slot_needed'\n | 'keepalive'\n | 'agent_text'\n | 'agent_text_done'\n\n/** The known event `type` values (forward-compat: pre-listed so the SDK need\n * not be re-cut the moment the backend starts emitting a reserved one). */\nexport const GOAL_EVENT_TYPES: readonly GoalEventType[] = [\n 'tool_started',\n 'tool_finished',\n 'agent_step_started',\n 'agent_step_finished',\n 'orchestration_transition',\n 'status',\n 'progress',\n 'completed',\n 'failed',\n 'slot_needed',\n 'keepalive',\n 'agent_text',\n 'agent_text_done',\n]\n\n/** Type guard: is `value` a recognised {@link GoalEventType}? */\nexport function isGoalEventType(value: string): value is GoalEventType {\n return (GOAL_EVENT_TYPES as readonly string[]).includes(value)\n}\n\n/**\n * Event `type` values that close the WebSocket and stop iteration. `cancelled`\n * is included for a future backend that emits it directly (today it arrives as\n * a `failed` event with `data.code === \"CANCELLED\"`) — so it is a plain string,\n * not a {@link GoalEventType} member.\n */\nexport const GOAL_EVENT_TERMINAL_TYPES: readonly string[] = ['completed', 'failed', 'cancelled']\n\n/** One server-sent event in a goal execution stream. */\nexport interface GoalEvent {\n readonly type: GoalEventType\n readonly schemaVersion: number\n readonly jobSpecId: string\n readonly emittedAt: Date\n readonly seq: number\n readonly data: Record<string, unknown>\n}\n\n/** True when this event signals the end of the stream. */\nexport function isGoalEventTerminal(event: Pick<GoalEvent, 'type'>): boolean {\n return GOAL_EVENT_TERMINAL_TYPES.includes(event.type)\n}\n\n// ── Community workflows (marketplace) ────────────────────────────────\n\n/** Marketplace visibility of a community workflow. */\nexport type WorkflowVisibility = 'private' | 'public' | 'archived'\n\n/** Aggregate counters surfaced on every workflow row. */\nexport interface WorkflowStats {\n readonly runCount: number\n readonly forkCount: number\n readonly likeCount: number\n}\n\n/** A community / private workflow row. */\nexport interface Workflow {\n readonly workflowId: string\n readonly ownerId: string | null\n readonly specId: string\n readonly sourceSpecId: string | null\n readonly sourceType: string | null\n readonly name: string\n readonly description: string | null\n readonly visibility: WorkflowVisibility\n readonly tags: string[]\n readonly stats: WorkflowStats\n readonly itemVersion: number\n}\n\n/** Light-weight community-list row (no heavy spec/system-prompt fields). */\nexport interface WorkflowSummary {\n readonly workflowId: string\n readonly specId: string\n readonly ownerId: string | null\n readonly name: string\n readonly description: string | null\n readonly visibility: WorkflowVisibility\n readonly tags: string[]\n readonly stats: WorkflowStats\n}\n\n/** One page of community workflow summaries + a pagination cursor. */\nexport interface WorkflowSearchPage {\n readonly items: WorkflowSummary[]\n readonly cursor: string | null\n}\n\n/** Result of `workflows.like` — toggle state + fresh count. */\nexport interface LikeResponse {\n readonly liked: boolean\n readonly likeCount: number\n}\n\n// ── Billing / quota (credits) ────────────────────────────────────────\n\n/** Where an account sits against its quota window. */\nexport type QuotaState = 'ok' | 'soft_limit' | 'quota_exceeded'\n/** Account plan tier. */\nexport type PlanTier = 'free' | 'pro'\n\n/**\n * Caller-plan vs cost-estimate verdict. Amounts in **credits** (the A4 parser\n * converts the wire's micro-units → credits).\n */\nexport interface QuotaCheck {\n readonly state: QuotaState\n readonly tier: PlanTier\n readonly estimatedCredits: number\n readonly thresholdCredits: number\n readonly upgradeUrl: string | null\n}\n\n/** Per-tool cost breakdown row inside {@link CostEstimate}. */\nexport interface ToolCostEstimate {\n readonly toolName: string\n readonly perInvocationCredits: number\n}\n\n/**\n * Result of `account.getQuota()` — a cost-range projection (min / total / max)\n * in **credits** plus the quota verdict, in one round-trip.\n */\nexport interface CostEstimate {\n readonly estimatedCredits: number\n readonly estimatedUsd: number\n readonly estimatedTotalCredits: number\n readonly estimatedMinCredits: number\n readonly estimatedMaxCredits: number\n readonly tools: ToolCostEstimate[]\n readonly quotaCheck: QuotaCheck\n}\n\n/** The caller's current billing plan. */\nexport interface Plan {\n readonly tier: PlanTier\n}\n\n/** One past usage period for a specific metric. */\nexport interface UsageHistoryEntry {\n readonly metric: string\n readonly periodStart: Date\n readonly periodEnd: Date\n readonly used: number\n readonly limit: number | null\n}\n","/**\n * Retry/resilience seam — port of `_internal/resilience.py`.\n *\n * `RetryPolicy` is a pure decision object: it says *whether* to retry and *how\n * long* to wait, but never sleeps or loops itself — `HttpClient` owns the loop.\n * That keeps the SOLID DIP seam (the transport depends on this interface, not\n * the concrete `ExponentialBackoffRetry`).\n *\n * Delays are returned in **seconds** (matching the Python SDK); the caller\n * converts to milliseconds for `setTimeout`.\n */\n\n/** HTTP verbs that get an auto `Idempotency-Key` so retries are safe. */\nexport const MUTATING_METHODS: ReadonlySet<string> = new Set(['POST', 'PUT', 'PATCH', 'DELETE'])\n\n/** Statuses worth retrying: request timeout, rate limit, and transient 5xx. */\nexport const DEFAULT_RETRYABLE_STATUSES: ReadonlySet<number> = new Set([\n 408, 429, 500, 502, 503, 504,\n])\n\n/**\n * The minimal response shape a policy needs — so policies never depend on the\n * concrete `fetch` `Response` or on `HttpClient`. `headers.get` is the standard\n * `Headers` accessor (case-insensitive in real `fetch`).\n */\nexport interface RetryableResponse {\n readonly status: number\n readonly headers: { get(name: string): string | null }\n}\n\n/** Pluggable retry policy. Mirrors the Python `RetryPolicy` Protocol. */\nexport interface RetryPolicy {\n /** Decide whether a retry should fire for this outcome. */\n shouldRetry(response: RetryableResponse | null, error: unknown, attempt: number): boolean\n /** Seconds to wait before the next attempt. */\n nextDelay(response: RetryableResponse | null, attempt: number): number\n}\n\n/** Parse a numeric `Retry-After` header into seconds (HTTP-date form ignored). */\nexport function parseRetryAfter(response: RetryableResponse): number | null {\n const raw = response.headers.get('Retry-After') ?? response.headers.get('retry-after')\n if (raw == null) {\n return null\n }\n const trimmed = raw.trim()\n if (trimmed === '') {\n return null\n }\n const seconds = Number(trimmed)\n if (!Number.isFinite(seconds) || seconds < 0) {\n return null\n }\n return seconds\n}\n\n/** Generate a fresh idempotency key (UUID v4). */\nexport function generateIdempotencyKey(): string {\n return crypto.randomUUID()\n}\n\n/** Tunables for {@link ExponentialBackoffRetry}; all optional. */\nexport interface ExponentialBackoffOptions {\n maxAttempts?: number\n baseDelay?: number\n maxDelay?: number\n jitter?: number\n retryableStatuses?: ReadonlySet<number>\n /** Injectable RNG in [0, 1) — defaults to `Math.random` (tests pass a stub). */\n rng?: () => number\n}\n\n/**\n * Capped exponential backoff with full jitter, honouring `Retry-After`.\n *\n * Defaults match the Python SDK: 5 attempts, 0.2s base, 30s cap, ±25% jitter.\n * Retries only on a retryable **status** — never on a thrown error (mirrors the\n * Python policy, which receives `error=null` from the transport loop).\n */\nexport class ExponentialBackoffRetry implements RetryPolicy {\n readonly maxAttempts: number\n readonly baseDelay: number\n readonly maxDelay: number\n readonly jitter: number\n readonly retryableStatuses: ReadonlySet<number>\n readonly #rng: () => number\n\n constructor(options: ExponentialBackoffOptions = {}) {\n this.maxAttempts = options.maxAttempts ?? 5\n this.baseDelay = options.baseDelay ?? 0.2\n this.maxDelay = options.maxDelay ?? 30.0\n this.jitter = options.jitter ?? 0.25\n this.retryableStatuses = options.retryableStatuses ?? DEFAULT_RETRYABLE_STATUSES\n this.#rng = options.rng ?? Math.random\n }\n\n shouldRetry(response: RetryableResponse | null, error: unknown, attempt: number): boolean {\n if (attempt >= this.maxAttempts) {\n return false\n }\n if (error != null) {\n return false\n }\n if (response == null) {\n return false\n }\n return this.retryableStatuses.has(response.status)\n }\n\n nextDelay(response: RetryableResponse | null, attempt: number): number {\n const retryAfter = response ? parseRetryAfter(response) : null\n if (retryAfter != null) {\n return Math.min(retryAfter, this.maxDelay)\n }\n const capped = Math.min(this.baseDelay * 2 ** attempt, this.maxDelay)\n const spread = capped * this.jitter\n const jittered = capped + (-spread + this.#rng() * (2 * spread))\n return Math.max(0, jittered)\n }\n}\n\n/** Disables retries entirely — pass to the client to fail fast. */\nexport class NoRetry implements RetryPolicy {\n shouldRetry(): boolean {\n return false\n }\n\n nextDelay(): number {\n return 0\n }\n}\n","/**\n * Auto-throttle policy — sleep + retry on {@link QuotaExceededError}. Port of\n * the Python SDK's `_internal/throttle.py`.\n *\n * Layered *above* the transport's {@link RetryPolicy}: that policy retries\n * transient transport failures (5xx / 429 / 408), while this module targets the\n * 402 `QUOTA_EXCEEDED` envelope specifically — where the remediation is *waiting\n * for the quota window to reset*, not re-issuing the same request faster.\n *\n * Only {@link AutoThrottleConfig} is part of the public surface (re-exported\n * from the package root); the resolver / sleep math / soft-limit helpers are\n * internal wiring used by `internal/http.ts`.\n *\n * Design choices (mirroring the Python module):\n * - **Bounded retry** — defaults to `maxRetries = 1` so a misconfigured caller\n * cannot get stuck in an infinite sleep+retry loop against a permanently\n * overrun account.\n * - **Bounded sleep** — `maxSleep` caps any server-supplied delay; if the\n * server asks the SDK to wait longer, the SDK gives up immediately and\n * re-raises so the caller's UX path stays predictable.\n * - **Forward-compat reset hints** — when the backend starts emitting them, the\n * SDK reads `details.retry_after_seconds` or `details.reset_at` transparently.\n */\n\nimport type { QuotaExceededError } from './errors'\n\n/** Header the backend (will) emit to flag \"soft limit\" without blocking the call. */\nexport const SOFT_LIMIT_HEADER = 'X-Quota-State'\nexport const SOFT_LIMIT_VALUE = 'soft_limit'\n\n/** Canonical defaults — shared by {@link AutoThrottleConfig} and the tests. */\nexport const DEFAULT_MAX_RETRIES = 1\nexport const DEFAULT_MAX_SLEEP_SECONDS = 60.0\nexport const DEFAULT_FALLBACK_SLEEP_SECONDS = 5.0\n\n/** Tunables for {@link AutoThrottleConfig}; all optional (each defaults above). */\nexport interface AutoThrottleOptions {\n /** Max number of quota-retry attempts after the first 402 (default 1). */\n maxRetries?: number\n /** Hard cap (seconds) on any single sleep; over this the SDK re-raises. */\n maxSleep?: number\n /** Sleep (seconds) used when the 402 carries no reset hint. */\n fallbackSleep?: number\n}\n\n/**\n * Knobs for the {@link QuotaExceededError} retry loop. Enable on the client with\n * `new Convilyn({ autoThrottle: true })` (defaults) or\n * `new Convilyn({ autoThrottle: new AutoThrottleConfig({ maxRetries: 2 }) })`.\n */\nexport class AutoThrottleConfig {\n readonly maxRetries: number\n readonly maxSleep: number\n readonly fallbackSleep: number\n\n constructor(options: AutoThrottleOptions = {}) {\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES\n this.maxSleep = options.maxSleep ?? DEFAULT_MAX_SLEEP_SECONDS\n this.fallbackSleep = options.fallbackSleep ?? DEFAULT_FALLBACK_SLEEP_SECONDS\n if (this.maxRetries < 0) {\n throw new RangeError('autoThrottle.maxRetries must be >= 0')\n }\n if (this.maxSleep <= 0) {\n throw new RangeError('autoThrottle.maxSleep must be > 0')\n }\n if (this.fallbackSleep < 0) {\n throw new RangeError('autoThrottle.fallbackSleep must be >= 0')\n }\n }\n}\n\n/** The `autoThrottle` constructor knob: `true`/`false` shorthand or a config. */\nexport type AutoThrottleArg = boolean | AutoThrottleConfig | undefined\n\n/**\n * Normalise the ctor knob into an {@link AutoThrottleConfig} or `null`.\n *\n * - `undefined` / `false` → disabled (`null`).\n * - `true` → default config.\n * - {@link AutoThrottleConfig} → returned verbatim.\n */\nexport function resolveAutoThrottle(value: AutoThrottleArg): AutoThrottleConfig | null {\n if (value == null || value === false) {\n return null\n }\n if (value === true) {\n return new AutoThrottleConfig()\n }\n return value\n}\n\n/**\n * Seconds to sleep before retrying, or `null` to give up and re-raise.\n *\n * Resolution order (first present wins):\n * 1. `details.retry_after_seconds` — numeric seconds.\n * 2. `details.reset_at` — ISO-8601 timestamp; delta from now.\n * 3. `config.fallbackSleep` — when neither hint is present.\n *\n * A past/negative `reset_at` delta collapses to `0` (retry immediately). Any\n * computed sleep exceeding `config.maxSleep` returns `null` so the caller\n * re-raises without spinning.\n */\nexport function computeQuotaSleep(\n error: QuotaExceededError,\n config: AutoThrottleConfig\n): number | null {\n const details = error.details ?? {}\n let sleepS = sleepFromRetryAfter(details)\n if (sleepS == null) {\n sleepS = sleepFromResetAt(details)\n }\n if (sleepS == null) {\n sleepS = config.fallbackSleep\n }\n if (sleepS > config.maxSleep) {\n return null\n }\n return Math.max(0, sleepS)\n}\n\nfunction sleepFromRetryAfter(details: Record<string, unknown>): number | null {\n const raw = details.retry_after_seconds\n if (raw == null) {\n return null\n }\n const seconds = typeof raw === 'number' ? raw : Number(raw)\n return Number.isFinite(seconds) ? seconds : null\n}\n\nfunction sleepFromResetAt(details: Record<string, unknown>): number | null {\n const raw = details.reset_at\n if (typeof raw !== 'string') {\n return null\n }\n const resetMs = Date.parse(raw)\n if (Number.isNaN(resetMs)) {\n return null\n }\n return (resetMs - Date.now()) / 1000\n}\n\n/**\n * True when the headers carry `X-Quota-State: soft_limit`. The WHATWG `Headers`\n * accessor is already case-insensitive on the *name*; `.toLowerCase()` here\n * tolerates casing/whitespace in the *value*.\n */\nexport function responseHasSoftLimitHeader(headers: { get(name: string): string | null }): boolean {\n const raw = headers.get(SOFT_LIMIT_HEADER)\n if (!raw) {\n return false\n }\n return raw.trim().toLowerCase() === SOFT_LIMIT_VALUE\n}\n\n/**\n * Surface a soft-limit signal via Node's native warning channel\n * (`process.emitWarning` — the TS analogue of Python's `warnings`). No-ops in\n * runtimes without `process` (browsers), where there is no equivalent channel.\n */\nexport function emitSoftLimitWarning(opts: { source: string; details?: string }): void {\n let message = `Convilyn quota soft_limit reached (source=${opts.source})`\n if (opts.details) {\n message = `${message}: ${opts.details}`\n }\n if (typeof process !== 'undefined' && typeof process.emitWarning === 'function') {\n process.emitWarning(message)\n }\n}\n","/**\n * Authentication strategy seam — port of `_internal/auth.py`.\n *\n * `AuthStrategy` is the DIP boundary: `HttpClient` depends on this interface,\n * not the concrete `ApiKey`, so a future `JwtBearer` / OAuth strategy drops in\n * without touching the transport.\n */\n\nimport { AuthError } from '../errors'\n\n/** Environment variable the SDK reads the API key from when none is passed. */\nexport const ENV_API_KEY = 'CONVILYN_API_KEY'\n\n/**\n * The canonical consumer API-key prefix the backend mints today\n * (`app/core/security/api_key.py` `USER_API_KEY_PREFIX`). This is the key the\n * consumer SDK authenticates with; mint one under Settings → API.\n */\nexport const CONSUMER_KEY_PREFIX = 'ck_'\n\n/**\n * Author-SDK / developer-portal token prefixes. These are **not** consumer\n * keys — `cvl_` / `cvi_` belong to the Author SDK (publishing workflows /\n * tools) and the deploy flow. The consumer SDK recognises them ONLY to raise a\n * precise {@link AuthError} when one is pasted here by mistake, instead of\n * letting the API answer with an opaque 401. Unknown prefixes are still\n * accepted — forward-compat for any new consumer-key format the backend may\n * mint that this SDK has not heard of yet.\n */\nexport const AUTHOR_KEY_PREFIXES = ['cvl_', 'cvi_'] as const\n\n/** True when `key` is an Author-SDK / deploy token rather than a consumer key. */\nexport function isAuthorKey(key: string): boolean {\n return AUTHOR_KEY_PREFIXES.some((prefix) => key.startsWith(prefix))\n}\n\n/** Pluggable auth strategy. Mirrors the Python `AuthStrategy` Protocol. */\nexport interface AuthStrategy {\n /** Headers to merge into every request (e.g. `Authorization`). */\n headers(): Record<string, string>\n /** The raw bearer token — used by non-HTTP transports (WebSocket). */\n bearerToken(): string\n}\n\n/** Mask a secret for safe display: `ck_a…9f` (or `***` when too short). */\nexport function maskKey(key: string): string {\n if (key.length <= 8) {\n return '***'\n }\n return `${key.slice(0, 4)}…${key.slice(-2)}`\n}\n\n/** API-key bearer auth. The key is never logged — `toString` masks it. */\nexport class ApiKey implements AuthStrategy {\n readonly #key: string\n\n constructor(key: string) {\n if (!key || !key.trim()) {\n throw new AuthError('API key must be a non-empty string')\n }\n if (isAuthorKey(key)) {\n throw new AuthError(\n `${maskKey(key)} looks like a Convilyn Author SDK / deploy token, not a ` +\n `consumer API key. The consumer SDK authenticates with a \"${CONSUMER_KEY_PREFIX}\" ` +\n `key — mint one under Settings → API. (Author tokens publish workflows / tools; ` +\n `they do not call the data-plane API.)`\n )\n }\n this.#key = key\n }\n\n headers(): Record<string, string> {\n return { Authorization: `Bearer ${this.#key}` }\n }\n\n bearerToken(): string {\n return this.#key\n }\n\n /** Masked so the raw key never leaks via string interpolation. */\n toString(): string {\n return `ApiKey(${maskKey(this.#key)})`\n }\n\n /** Node's `util.inspect` hook so `console.log(apiKey)` is masked too. */\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.toString()\n }\n}\n\n/** Optional injection seam for `resolveAuth` (tests pass a fake env). */\nexport interface ResolveAuthOptions {\n env?: Record<string, string | undefined>\n}\n\n/**\n * Resolve an `AuthStrategy` from an explicit key or the environment.\n *\n * Precedence: explicit `apiKey` argument > `CONVILYN_API_KEY` env var.\n * Throws {@link AuthError} when neither is present.\n */\nexport function resolveAuth(\n apiKey?: string | null,\n options: ResolveAuthOptions = {}\n): AuthStrategy {\n const env = options.env ?? (typeof process !== 'undefined' ? process.env : {})\n const resolved = apiKey ?? env[ENV_API_KEY]\n if (!resolved || !resolved.trim()) {\n throw new AuthError(\n `No API key provided. Pass { apiKey } or set the ${ENV_API_KEY} environment variable.`\n )\n }\n return new ApiKey(resolved)\n}\n","/**\n * Single source of truth for the package version. Kept in lockstep with\n * package.json + CHANGELOG.md (guarded by test/packaging/version-changelog.test.ts).\n */\nexport const VERSION = '0.3.0'\n","/**\n * HTTP transport — port of `_internal/http.py` (fetch-based; Node 18+ global\n * `fetch` or any browser).\n *\n * Responsibilities (single, per SRP):\n * - inject auth + standard headers (`User-Agent`, `Accept`);\n * - normalise the Convilyn error envelope `{code, message, details}` (flat, or\n * nested under `detail` / `error`) into typed errors;\n * - apply the injected {@link RetryPolicy} on transient 408/429/5xx, reusing one\n * `Idempotency-Key` across retries of a mutating verb;\n * - presigned-URL helpers (`externalPut` / `externalGet`) that send NO auth.\n *\n * The resilience decision lives in {@link RetryPolicy} (DIP seam) — this client\n * owns only the loop. Optionally, an {@link AutoThrottleConfig} adds a higher-\n * level shim that sleeps + re-issues on the 402 `QUOTA_EXCEEDED` envelope\n * (remediation = waiting for the quota window, not retrying faster); it stays\n * OFF unless the caller opts in, so the default path decodes + throws unchanged.\n */\n\nimport {\n APIError,\n PlanRequiredError,\n QuotaExceededError,\n RateLimitError,\n RetryExhaustedError,\n S3UploadError,\n type ErrorDetails,\n} from '../errors'\nimport { VERSION } from '../version'\nimport type { AuthStrategy } from './auth'\nimport {\n ExponentialBackoffRetry,\n MUTATING_METHODS,\n generateIdempotencyKey,\n type RetryPolicy,\n type RetryableResponse,\n} from '../retry'\nimport {\n type AutoThrottleConfig,\n computeQuotaSleep,\n emitSoftLimitWarning,\n responseHasSoftLimitHeader,\n} from '../throttle'\n\nexport const DEFAULT_BASE_URL = 'https://api.convilyn.corenovus.com'\nexport const DEFAULT_TIMEOUT = 30.0\n\n/**\n * Guard external (backend-supplied) URLs to the `https` scheme. Port of the\n * Python `_require_https`: `externalPut` / `externalGet`\n * dial absolute URLs the Convilyn backend returns (presigned upload /\n * download URLs). Enforcing `https` is defence-in-depth — a compromised or\n * MITM'd backend that returned `http://` (downgrade), `file://` (local\n * read), or an internal address over plain HTTP cannot coerce the SDK into\n * following it. The scheme — not the host — is checked, so any legitimate\n * https presign host is still accepted. Unparseable URLs are rejected too.\n *\n * @throws Error when the URL scheme is not `https`.\n */\nexport function requireHttps(url: string): void {\n let scheme: string\n try {\n scheme = new URL(url).protocol.replace(/:$/, '').toLowerCase()\n } catch {\n scheme = ''\n }\n if (scheme !== 'https') {\n throw new Error(\n `Refusing to dial non-https URL (scheme=${JSON.stringify(scheme)}). ` +\n 'The Convilyn SDK only follows https presigned URLs.'\n )\n }\n}\n\n/**\n * Backend 402 codes that mean \"your plan is too low\". Listed so a new tier\n * signal is a one-line addition (OCP). The backend emits `TIER_REQUIRED` today.\n */\nconst PLAN_REQUIRED_CODES: ReadonlySet<string> = new Set([\n 'TIER_REQUIRED',\n 'PRO_TIER_REQUIRED',\n 'BUSINESS_TIER_REQUIRED',\n 'ENTERPRISE_TIER_REQUIRED',\n])\n\n/** Request body shapes the transport accepts. */\nexport type RequestBody = Uint8Array | ArrayBuffer | string | ReadableStream<Uint8Array>\n\n/** Narrow, stubbable `fetch` signature (the real global `fetch` satisfies it). */\nexport type FetchLike = (url: string, init?: RequestInit) => Promise<Response>\n\n/** Per-request options for {@link HttpClient.request} / `rawRequest`. */\nexport interface RequestOptions {\n headers?: Record<string, string>\n json?: unknown\n params?: Record<string, string | number | boolean | null | undefined>\n content?: RequestBody\n}\n\n/** Constructor options for {@link HttpClient}. */\nexport interface HttpClientOptions {\n auth: AuthStrategy\n baseUrl?: string\n /** Per-request timeout in seconds. */\n timeout?: number\n userAgent?: string\n retryPolicy?: RetryPolicy\n idempotencyEnabled?: boolean\n /** Opt-in 402-quota sleep+retry shim; omitted / null = disabled. */\n autoThrottle?: AutoThrottleConfig | null\n /** Injectable `fetch` (tests pass a stub). Defaults to the global `fetch`. */\n fetch?: FetchLike\n /** Injectable sleep in seconds (tests pass a no-op). Defaults to real timer. */\n sleep?: (seconds: number) => Promise<void>\n}\n\nconst realSleep = (seconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, seconds * 1000))\n\n/** Async HTTP client with Convilyn-specific header + error semantics. */\nexport class HttpClient {\n readonly #auth: AuthStrategy\n readonly #baseUrl: string\n readonly #timeout: number\n readonly #userAgent: string\n readonly #retryPolicy: RetryPolicy\n readonly #idempotencyEnabled: boolean\n readonly #autoThrottle: AutoThrottleConfig | null\n readonly #fetch: FetchLike\n readonly #sleep: (seconds: number) => Promise<void>\n\n constructor(options: HttpClientOptions) {\n this.#auth = options.auth\n this.#baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '')\n this.#timeout = options.timeout ?? DEFAULT_TIMEOUT\n this.#userAgent = options.userAgent ?? `convilyn-js/${VERSION}`\n this.#retryPolicy = options.retryPolicy ?? new ExponentialBackoffRetry()\n this.#idempotencyEnabled = options.idempotencyEnabled ?? true\n this.#autoThrottle = options.autoThrottle ?? null\n if (options.fetch) {\n this.#fetch = options.fetch\n } else if (typeof fetch !== 'undefined') {\n this.#fetch = (url, init) => fetch(url, init)\n } else {\n throw new Error('No global fetch available; pass options.fetch (Node 18+ or a polyfill)')\n }\n this.#sleep = options.sleep ?? realSleep\n }\n\n get baseUrl(): string {\n return this.#baseUrl\n }\n\n /** Read-only handle to the auth strategy (used by the WS transport). */\n get auth(): AuthStrategy {\n return this.#auth\n }\n\n /**\n * Issue a request, applying the retry policy on transient failures and\n * raising a typed error on a non-2xx final response.\n */\n async request(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const response = await this.#requestWithQuotaThrottle(\n method,\n path,\n options,\n this.#autoThrottle ? this.#autoThrottle.maxRetries : 0\n )\n maybeEmitSoftLimit(response)\n return response\n }\n\n /**\n * Like {@link request} but never raises on HTTP status — returns the final\n * response so callers (the `convilyn api` CLI escape hatch) can inspect it.\n */\n async rawRequest(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const { response } = await this.#doRequestWithRetry(method, path, options)\n maybeEmitSoftLimit(response)\n return response\n }\n\n /**\n * Run {@link #doRequestWithRetry}, re-issuing on a 402 {@link QuotaExceededError}\n * up to `quotaAttemptsRemaining` times, sleeping {@link computeQuotaSleep}\n * between attempts. Transport-level retries (5xx / 429 / 408) are handled\n * inside `#doRequestWithRetry`; this shim targets the 402 quota envelope only.\n */\n async #requestWithQuotaThrottle(\n method: string,\n path: string,\n options: RequestOptions,\n quotaAttemptsRemaining: number\n ): Promise<Response> {\n const { response, attempts } = await this.#doRequestWithRetry(method, path, options)\n if (response.status < 400) {\n return response\n }\n const decoded =\n attempts > 1 ? await toRetryExhausted(response, attempts) : await decodeError(response)\n if (\n this.#autoThrottle != null &&\n quotaAttemptsRemaining > 0 &&\n decoded instanceof QuotaExceededError\n ) {\n const sleepSeconds = computeQuotaSleep(decoded, this.#autoThrottle)\n if (sleepSeconds != null) {\n await this.#sleep(sleepSeconds)\n return this.#requestWithQuotaThrottle(method, path, options, quotaAttemptsRemaining - 1)\n }\n }\n throw decoded\n }\n\n async #doRequestWithRetry(\n method: string,\n path: string,\n options: RequestOptions\n ): Promise<{ response: Response; attempts: number }> {\n const headers = this.#defaultHeaders()\n if (options.headers) {\n Object.assign(headers, options.headers)\n }\n this.#applyIdempotencyKey(method.toUpperCase(), headers)\n\n let attempt = 0\n for (;;) {\n const response = await this.#fetchOnce(method, path, headers, options)\n if (response.status < 400) {\n return { response, attempts: attempt + 1 }\n }\n const view: RetryableResponse = { status: response.status, headers: response.headers }\n if (this.#retryPolicy.shouldRetry(view, null, attempt)) {\n await this.#sleep(this.#retryPolicy.nextDelay(view, attempt))\n attempt += 1\n continue\n }\n return { response, attempts: attempt + 1 }\n }\n }\n\n #defaultHeaders(): Record<string, string> {\n return {\n 'User-Agent': this.#userAgent,\n Accept: 'application/json',\n ...this.#auth.headers(),\n }\n }\n\n #applyIdempotencyKey(method: string, headers: Record<string, string>): void {\n if (!this.#idempotencyEnabled) {\n return\n }\n if (!MUTATING_METHODS.has(method)) {\n return\n }\n if ('Idempotency-Key' in headers) {\n return\n }\n headers['Idempotency-Key'] = generateIdempotencyKey()\n }\n\n async #fetchOnce(\n method: string,\n path: string,\n headers: Record<string, string>,\n options: RequestOptions\n ): Promise<Response> {\n const url = this.#buildUrl(path, options.params)\n if (options.json !== undefined) {\n headers['Content-Type'] = 'application/json'\n }\n const init: RequestInit = { method, headers }\n if (options.json !== undefined) {\n init.body = JSON.stringify(options.json)\n } else if (options.content !== undefined) {\n init.body = options.content as BodyInit\n }\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.#timeout * 1000)\n init.signal = controller.signal\n try {\n return await this.#fetch(url, init)\n } finally {\n clearTimeout(timer)\n }\n }\n\n #buildUrl(path: string, params?: RequestOptions['params']): string {\n const absolute = /^https?:\\/\\//i.test(path)\n const full = absolute ? path : `${this.#baseUrl}${path.startsWith('/') ? '' : '/'}${path}`\n if (!params) {\n return full\n }\n const url = new URL(full)\n for (const [key, value] of Object.entries(params)) {\n if (value == null) {\n continue\n }\n url.searchParams.set(key, String(value))\n }\n return url.toString()\n }\n\n /**\n * PUT to an external absolute URL (e.g. a presigned upload URL). Sends NO\n * Convilyn auth (the URL carries its own signature) and is NOT retried.\n */\n async externalPut(\n url: string,\n { content, headers }: { content: RequestBody; headers?: Record<string, string> }\n ): Promise<Response> {\n requireHttps(url)\n const response = await this.#fetch(url, {\n method: 'PUT',\n body: content as BodyInit,\n headers: headers ?? {},\n })\n if (response.status >= 400) {\n throw new S3UploadError(\n response.status,\n `S3_HTTP_${response.status}`,\n response.statusText || 'External upload failed',\n { url }\n )\n }\n return response\n }\n\n /** GET an external absolute URL (e.g. a presigned download). No auth. */\n async externalGet(\n url: string,\n { headers }: { headers?: Record<string, string> } = {}\n ): Promise<Response> {\n requireHttps(url)\n const response = await this.#fetch(url, { method: 'GET', headers: headers ?? {} })\n if (response.status >= 400) {\n throw new APIError(\n response.status,\n `DOWNLOAD_HTTP_${response.status}`,\n response.statusText || 'External download failed',\n { url }\n )\n }\n return response\n }\n\n /** No persistent connection pool with `fetch`; provided for API symmetry. */\n async close(): Promise<void> {\n // no-op\n }\n}\n\n// --- error decoding (free functions; pure + independently testable) ----------\n\n/**\n * Emit a soft-limit warning when the response carries `X-Quota-State:\n * soft_limit`. Independent of {@link AutoThrottleConfig} — soft-limit is purely\n * informational, so the SDK warns whether or not auto-throttle is enabled.\n */\nfunction maybeEmitSoftLimit(response: Response): void {\n if (responseHasSoftLimitHeader(response.headers)) {\n emitSoftLimitWarning({ source: response.url || 'request' })\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined\n}\n\n/** Best-effort numeric coercion for wire fields that may arrive as strings. */\nfunction coerceNumber(value: unknown): number | null {\n if (value == null) {\n return null\n }\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : null\n }\n if (typeof value === 'string') {\n const parsed = Number(value)\n return Number.isFinite(parsed) ? parsed : null\n }\n return null\n}\n\nasync function readJson(response: Response): Promise<Record<string, unknown>> {\n try {\n const payload: unknown = await response.json()\n return isRecord(payload) ? payload : {}\n } catch {\n return {}\n }\n}\n\n/** Return the inner error dict regardless of envelope shape (flat/detail/error). */\nexport function flattenErrorEnvelope(payload: Record<string, unknown>): Record<string, unknown> {\n for (const key of ['detail', 'error'] as const) {\n const nested = payload[key]\n if (isRecord(nested)) {\n return nested\n }\n }\n return payload\n}\n\n/**\n * Translate a non-2xx response into the appropriate {@link APIError} subclass.\n *\n * Status-aware dispatch:\n * - 429 → {@link RateLimitError}\n * - 402 + plan-required code → {@link PlanRequiredError}\n * - 402 + `insufficient_balance` / `QUOTA_EXCEEDED` → {@link QuotaExceededError}\n * (fields read in **credits**: `costCredits` / `balanceCredits` / top-up URL)\n * - otherwise → {@link APIError}\n */\nexport async function decodeError(response: Response): Promise<APIError> {\n const status = response.status\n const inner = flattenErrorEnvelope(await readJson(response))\n const code = asString(inner.code) ?? `HTTP_${status}`\n const message = asString(inner.message) ?? (response.statusText || 'Request failed')\n const details: ErrorDetails | undefined = isRecord(inner.details) ? inner.details : undefined\n\n if (status === 429) {\n return new RateLimitError(status, code, message, details)\n }\n\n if (status === 402) {\n const upgradeUrl =\n asString(inner.upgrade_url ?? inner.upgradeUrl ?? inner.topUp ?? inner.top_up) ?? null\n if (PLAN_REQUIRED_CODES.has(code)) {\n return new PlanRequiredError(status, code, message, details, { upgradeUrl })\n }\n if (code === 'insufficient_balance' || code === 'QUOTA_EXCEEDED') {\n return new QuotaExceededError(status, code, message, details, {\n costCredits: coerceNumber(inner.costCredits ?? inner.cost_credits),\n balanceCredits: coerceNumber(inner.balanceCredits ?? inner.balance_credits),\n topUpUrl: upgradeUrl,\n })\n }\n }\n\n return new APIError(status, code, message, details)\n}\n\n/** Convert the final retried response into a {@link RetryExhaustedError}. */\nexport async function toRetryExhausted(\n response: Response,\n attemptCount: number\n): Promise<RetryExhaustedError> {\n const status = response.status\n const payload = await readJson(response)\n const code = asString(payload.code) ?? `HTTP_${status}`\n const message = asString(payload.message) ?? (response.statusText || 'Request failed')\n const details: ErrorDetails | undefined = isRecord(payload.details) ? payload.details : undefined\n return new RetryExhaustedError(status, code, message, details, { attemptCount })\n}\n","/**\n * Wire → public-type parsers.\n *\n * The Python SDK gets this for free from Pydantic aliases\n * (`fileName`→`filename`, `mimeType`→`contentType`, ISO string→`datetime`).\n * In TS we hand-map the wire envelope to the public {@link File} /\n * {@link ConvertJob} shapes. Parsers trust the backend wire contract for\n * required fields (the 2xx responses always carry them) and only default the\n * genuinely-optional ones.\n */\n\nimport type {\n ConvertJob,\n CostEstimate,\n File,\n GoalEvent,\n GoalJob,\n JobError,\n LikeResponse,\n PendingSlot,\n Plan,\n QuotaCheck,\n ResultFile,\n ToolCostEstimate,\n UsageHistoryEntry,\n Workflow,\n WorkflowSearchPage,\n WorkflowStats,\n WorkflowSummary,\n} from '../types'\n\n/**\n * Micro-units per credit. 1 credit = $0.01 and 1 µU = $1e-6, so 1 credit =\n * 10,000 µU (matches the backend's `/10_000` boundary conversion). The\n * cost-preview endpoint returns µU on the wire; the SDK exposes **credits**.\n */\nexport const MICRO_U_PER_CREDIT = 10_000\n\nfunction microUToCredits(value: unknown): number {\n return Number(value ?? 0) / MICRO_U_PER_CREDIT\n}\n\nfunction toDate(value: unknown): Date {\n return new Date(value as string | number)\n}\n\nfunction toDateOrNull(value: unknown): Date | null {\n return value == null ? null : toDate(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** Map the `/upload/confirm` wire record to a {@link File}. */\nexport function parseFile(wire: Record<string, unknown>): File {\n return {\n fileId: String(wire.fileId),\n filename: String(wire.fileName),\n size: Number(wire.fileSize),\n contentType: String(wire.mimeType),\n createdAt: toDate(wire.createdAt),\n jobId: (wire.jobId as string | null | undefined) ?? null,\n isInput: wire.isInput == null ? true : Boolean(wire.isInput),\n }\n}\n\n/** Map a result-file wire record to a {@link ResultFile}. */\nexport function parseResultFile(wire: Record<string, unknown>): ResultFile {\n return {\n filename: String(wire.filename),\n size: Number(wire.size),\n mimetype: String(wire.mimetype),\n url: String(wire.url),\n }\n}\n\n/** Map a job-error wire record to a {@link JobError}. */\nexport function parseJobError(wire: Record<string, unknown>): JobError {\n return { code: String(wire.code), message: String(wire.message) }\n}\n\n/** Map a conversion job wire record to a {@link ConvertJob}. */\nexport function parseConvertJob(wire: Record<string, unknown>): ConvertJob {\n const resultFiles = wire.resultFiles\n const error = wire.error\n return {\n jobId: String(wire.jobId),\n status: wire.status as ConvertJob['status'],\n processorType: String(wire.processorType),\n progress: Number(wire.progress ?? 0),\n progressMessage: (wire.progressMessage as string | null | undefined) ?? null,\n resultFiles: Array.isArray(resultFiles)\n ? resultFiles.map((row) => parseResultFile(row as Record<string, unknown>))\n : null,\n error: error != null ? parseJobError(error as Record<string, unknown>) : null,\n retryCount: Number(wire.retryCount ?? 0),\n createdAt: toDate(wire.createdAt),\n updatedAt: toDate(wire.updatedAt),\n startedAt: toDateOrNull(wire.startedAt),\n completedAt: toDateOrNull(wire.completedAt),\n estimatedDuration: (wire.estimatedDuration as number | null | undefined) ?? null,\n }\n}\n\n/** Map a pending-slot wire record to a {@link PendingSlot}. */\nexport function parsePendingSlot(wire: Record<string, unknown>): PendingSlot {\n return {\n slotId: String(wire.slotId),\n slotType: String(wire.slotType),\n question: String(wire.question),\n options: Array.isArray(wire.options)\n ? (wire.options as Array<string | Record<string, string>>)\n : null,\n required: wire.required == null ? true : Boolean(wire.required),\n isDisambiguation: Boolean(wire.isDisambiguation ?? false),\n suggestedValue: wire.suggestedValue ?? null,\n suggestedConfidence: (wire.suggestedConfidence as number | null | undefined) ?? null,\n }\n}\n\n/** Map a goal job wire record to a {@link GoalJob}. */\nexport function parseGoalJob(wire: Record<string, unknown>): GoalJob {\n return {\n jobSpecId: String(wire.jobSpecId),\n status: wire.status as GoalJob['status'],\n progress: Number(wire.progress ?? 0),\n itemVersion: (wire.itemVersion as number | null | undefined) ?? null,\n attemptId: (wire.attemptId as string | null | undefined) ?? null,\n goalText: (wire.goalText as string | null | undefined) ?? null,\n fileIds: Array.isArray(wire.fileIds) ? wire.fileIds.map(String) : [],\n pendingSlots: Array.isArray(wire.pendingSlots)\n ? wire.pendingSlots.map((slot) => parsePendingSlot(slot as Record<string, unknown>))\n : [],\n filledSlots: isRecord(wire.filledSlots) ? wire.filledSlots : {},\n pendingInterrupts: Array.isArray(wire.pendingInterrupts)\n ? (wire.pendingInterrupts as Record<string, unknown>[])\n : [],\n agentMessage: (wire.agentMessage as string | null | undefined) ?? null,\n errorMessage: (wire.errorMessage as string | null | undefined) ?? null,\n errorCode: (wire.errorCode as string | null | undefined) ?? null,\n createdAt: toDate(wire.createdAt),\n updatedAt: toDate(wire.updatedAt),\n startedAt: toDateOrNull(wire.startedAt),\n completedAt: toDateOrNull(wire.completedAt),\n }\n}\n\n/** Map a goal event wire record to a {@link GoalEvent}. */\nexport function parseGoalEvent(wire: Record<string, unknown>): GoalEvent {\n return {\n type: wire.type as GoalEvent['type'],\n schemaVersion: Number(wire.schemaVersion ?? 0),\n jobSpecId: String(wire.jobSpecId),\n emittedAt: toDate(wire.emittedAt),\n seq: Number(wire.seq ?? 0),\n data: isRecord(wire.data) ? wire.data : {},\n }\n}\n\n// ── community workflows ──────────────────────────────────────────────\n\n/** Map a workflow-stats wire record to {@link WorkflowStats}. */\nexport function parseWorkflowStats(wire: unknown): WorkflowStats {\n const stats = isRecord(wire) ? wire : {}\n return {\n runCount: Number(stats.runCount ?? 0),\n forkCount: Number(stats.forkCount ?? 0),\n likeCount: Number(stats.likeCount ?? 0),\n }\n}\n\n/** Map a full workflow wire record to {@link Workflow}. */\nexport function parseWorkflow(wire: Record<string, unknown>): Workflow {\n return {\n workflowId: String(wire.workflowId),\n ownerId: (wire.ownerId as string | null | undefined) ?? null,\n specId: String(wire.specId),\n sourceSpecId: (wire.sourceSpecId as string | null | undefined) ?? null,\n sourceType: (wire.sourceType as string | null | undefined) ?? null,\n name: String(wire.name),\n description: (wire.description as string | null | undefined) ?? null,\n visibility: wire.visibility as Workflow['visibility'],\n tags: Array.isArray(wire.tags) ? wire.tags.map(String) : [],\n stats: parseWorkflowStats(wire.stats),\n itemVersion: Number(wire.itemVersion ?? 0),\n }\n}\n\n/** Map a community-list row to {@link WorkflowSummary}. */\nexport function parseWorkflowSummary(wire: Record<string, unknown>): WorkflowSummary {\n return {\n workflowId: String(wire.workflowId),\n specId: String(wire.specId),\n ownerId: (wire.ownerId as string | null | undefined) ?? null,\n name: String(wire.name),\n description: (wire.description as string | null | undefined) ?? null,\n visibility: wire.visibility as WorkflowSummary['visibility'],\n tags: Array.isArray(wire.tags) ? wire.tags.map(String) : [],\n stats: parseWorkflowStats(wire.stats),\n }\n}\n\n/** Map a community search page to {@link WorkflowSearchPage}. */\nexport function parseWorkflowSearchPage(wire: Record<string, unknown>): WorkflowSearchPage {\n const items = wire.items\n return {\n items: Array.isArray(items)\n ? items.map((row) => parseWorkflowSummary(row as Record<string, unknown>))\n : [],\n cursor: (wire.cursor as string | null | undefined) ?? null,\n }\n}\n\n/** Map a like-toggle wire record to {@link LikeResponse}. */\nexport function parseLikeResponse(wire: Record<string, unknown>): LikeResponse {\n return {\n liked: Boolean(wire.liked),\n likeCount: Number(wire.likeCount ?? 0),\n }\n}\n\n// ── billing / quota (µU wire → credits) ──────────────────────────────\n\n/** Map a per-tool cost row (µU wire) to {@link ToolCostEstimate} (credits). */\nexport function parseToolCostEstimate(wire: Record<string, unknown>): ToolCostEstimate {\n return {\n toolName: String(wire.toolName),\n perInvocationCredits: microUToCredits(wire.perInvocationMicroU),\n }\n}\n\n/** Map a quota-check wire record (µU) to {@link QuotaCheck} (credits). */\nexport function parseQuotaCheck(wire: Record<string, unknown>): QuotaCheck {\n return {\n state: wire.state as QuotaCheck['state'],\n tier: wire.tier as QuotaCheck['tier'],\n estimatedCredits: microUToCredits(wire.estimatedMicroU),\n thresholdCredits: microUToCredits(wire.thresholdMicroU),\n upgradeUrl: (wire.upgradeUrl as string | null | undefined) ?? null,\n }\n}\n\n/** Map a cost-preview wire record (µU) to {@link CostEstimate} (credits). */\nexport function parseCostEstimate(wire: Record<string, unknown>): CostEstimate {\n const tools = wire.tools\n return {\n estimatedCredits: microUToCredits(wire.estimatedMicroU),\n estimatedUsd: Number(wire.estimatedUsd ?? 0),\n estimatedTotalCredits: microUToCredits(wire.estimatedTotalMicroU),\n estimatedMinCredits: microUToCredits(wire.estimatedMinMicroU),\n estimatedMaxCredits: microUToCredits(wire.estimatedMaxMicroU),\n tools: Array.isArray(tools)\n ? tools.map((row) => parseToolCostEstimate(row as Record<string, unknown>))\n : [],\n quotaCheck: parseQuotaCheck(isRecord(wire.quotaCheck) ? wire.quotaCheck : {}),\n }\n}\n\n/** Build a {@link Plan} from a cost-estimate verdict's tier. */\nexport function planFromTier(tier: Plan['tier']): Plan {\n return { tier }\n}\n\n/** Map a usage-history row to {@link UsageHistoryEntry}. */\nexport function parseUsageHistoryEntry(wire: Record<string, unknown>): UsageHistoryEntry {\n return {\n metric: String(wire.metric),\n periodStart: toDate(wire.period_start ?? wire.periodStart),\n periodEnd: toDate(wire.period_end ?? wire.periodEnd),\n used: Number(wire.used ?? 0),\n limit: (wire.limit as number | null | undefined) ?? null,\n }\n}\n","/**\n * Account resource — caller-side billing plan + quota queries. Port of\n * `resources/account.py`.\n *\n * POST /api/v1/workflows/cost-preview — estimate cost (credits) + quota verdict\n * GET /api/v1/payment/usage/history — past usage periods\n *\n * Read-only — actions (upgrade, top-up) live on the website, not the SDK.\n * Money is expressed in **credits** (the µU wire is converted in the parser).\n */\n\nimport type { HttpClient } from '../internal/http'\nimport { parseCostEstimate, parseUsageHistoryEntry, planFromTier } from '../internal/parsers'\nimport type { CostEstimate, Plan, UsageHistoryEntry } from '../types'\n\n/** Options for {@link Account.getQuota}. */\nexport interface GetQuotaOptions {\n /** Fully-qualified tool ids (e.g. `pdf-mcp:extract_text`). */\n tools?: string[]\n /** Iteration cap from the draft spec. */\n maxIterations?: number\n}\n\n/** Asynchronous account-tier resource (`client.account`). */\nexport class Account {\n readonly #http: HttpClient\n\n constructor(http: HttpClient) {\n this.#http = http\n }\n\n /** Estimate a workflow's cost (credits) + check the verdict against the plan. */\n async getQuota(options: GetQuotaOptions = {}): Promise<CostEstimate> {\n const body: Record<string, unknown> = { toolNames: options.tools ?? [] }\n if (options.maxIterations != null) {\n body.maxIterations = options.maxIterations\n }\n const response = await this.#http.request('POST', '/api/v1/workflows/cost-preview', {\n json: body,\n })\n return parseCostEstimate((await response.json()) as Record<string, unknown>)\n }\n\n /** Return the caller's current billing plan (derived from the cost-preview tier). */\n async getPlan(): Promise<Plan> {\n const estimate = await this.getQuota({ tools: [], maxIterations: 1 })\n return planFromTier(estimate.quotaCheck.tier)\n }\n\n /**\n * List the caller's past usage periods (one row per metric+period). `since`\n * filters client-side to entries whose `periodStart` is on or after it\n * (the backend does not honour a query param today).\n */\n async usageHistory(options: { since?: Date } = {}): Promise<UsageHistoryEntry[]> {\n const response = await this.#http.request('GET', '/api/v1/payment/usage/history')\n const rows = await response.json()\n const entries = Array.isArray(rows)\n ? rows.map((row) => parseUsageHistoryEntry(row as Record<string, unknown>))\n : []\n if (options.since == null) {\n return entries\n }\n const since = options.since\n return entries.filter((entry) => entry.periodStart >= since)\n }\n}\n","/**\n * Convert resource — document conversion jobs. Port of\n * `resources/convert.py`.\n *\n * POST /api/v1/jobs — create a conversion job\n * GET /api/v1/jobs/{id} — poll status\n * GET <resultFiles[0].url>— download the produced artifact (presigned, no auth)\n *\n * Data lives on {@link ConvertJob}; behaviour (poll / wait / download) lives\n * here. The poll clock + sleep are injectable so the wait loop is testable\n * without real time.\n */\n\nimport { JobFailedError, JobTimeoutError } from '../errors'\nimport type { HttpClient } from '../internal/http'\nimport { parseConvertJob } from '../internal/parsers'\nimport { isConvertJobTerminal, type ConvertJob, type File } from '../types'\n\nexport const DEFAULT_POLL_INTERVAL = 1.0\nexport const DEFAULT_POLL_TIMEOUT = 300.0\nexport const MAX_POLL_INTERVAL = 5.0\nconst STALE_PROGRESS_BACKOFF_AFTER = 3\nconst BACKOFF_FACTOR = 1.5\n\n/** Common document suffixes → backend `source_format` tokens. */\nconst SOURCE_FORMAT_BY_SUFFIX: Record<string, string> = {\n docx: 'docx',\n doc: 'doc',\n pdf: 'pdf',\n pptx: 'pptx',\n ppt: 'ppt',\n xlsx: 'xlsx',\n xls: 'xls',\n txt: 'txt',\n rtf: 'rtf',\n html: 'html',\n htm: 'html',\n md: 'md',\n odt: 'odt',\n}\n\nfunction inferSourceFormat(filename: string): string | null {\n const dot = filename.lastIndexOf('.')\n if (dot < 0) {\n return null\n }\n return SOURCE_FORMAT_BY_SUFFIX[filename.slice(dot + 1).toLowerCase()] ?? null\n}\n\n/** Options for {@link Convert.create} — supply exactly one of `file` / `fileId`. */\nexport interface CreateConvertOptions {\n file?: File\n fileId?: string\n targetFormat: string\n sourceFormat?: string\n quality?: string\n pageRange?: string\n}\n\n/** Polling controls for {@link Convert.wait}. */\nexport interface WaitOptions {\n timeout?: number\n pollInterval?: number\n}\n\n/** Test seams: an injectable clock (ms) + sleep (seconds). */\nexport interface ConvertResourceOptions {\n sleep?: (seconds: number) => Promise<void>\n now?: () => number\n}\n\nconst realSleep = (seconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, seconds * 1000))\n\n/** Asynchronous conversion resource (`client.convert`). */\nexport class Convert {\n readonly #http: HttpClient\n readonly #sleep: (seconds: number) => Promise<void>\n readonly #now: () => number\n\n constructor(http: HttpClient, options: ConvertResourceOptions = {}) {\n this.#http = http\n this.#sleep = options.sleep ?? realSleep\n this.#now = options.now ?? (() => Date.now())\n }\n\n /** Create a conversion job and return immediately (queued/processing). */\n async create(options: CreateConvertOptions): Promise<ConvertJob> {\n const { fileId, sourceFormat } = this.#resolveSource(options)\n const params: Record<string, unknown> = {\n source_file_id: fileId,\n source_format: sourceFormat,\n target_format: options.targetFormat,\n quality: options.quality ?? 'standard',\n }\n if (options.pageRange != null) {\n params.page_range = options.pageRange\n }\n const response = await this.#http.request('POST', '/api/v1/jobs', {\n json: { processor_type: 'document_conversion', params },\n })\n return parseConvertJob((await response.json()) as Record<string, unknown>)\n }\n\n /** Fetch the current state of a job (one-shot poll). */\n async retrieve(jobId: string): Promise<ConvertJob> {\n return this.#pollOnce(jobId)\n }\n\n /**\n * Poll until the job reaches a terminal status, the timeout expires, or the\n * backend reports failure.\n *\n * @throws {@link JobFailedError} when the terminal status is `failed`.\n * @throws {@link JobTimeoutError} when `timeout` elapses first.\n */\n async wait(jobId: string, options: WaitOptions = {}): Promise<ConvertJob> {\n return this.#waitLoop(\n jobId,\n options.timeout ?? DEFAULT_POLL_TIMEOUT,\n options.pollInterval ?? DEFAULT_POLL_INTERVAL\n )\n }\n\n /** Shortcut: {@link create} then {@link wait}. */\n async createAndWait(options: CreateConvertOptions & WaitOptions): Promise<ConvertJob> {\n const job = await this.create(options)\n return this.wait(job.jobId, { timeout: options.timeout, pollInterval: options.pollInterval })\n }\n\n /** Presigned download URL for the first result file. */\n async downloadUrl(job: ConvertJob | string): Promise<string> {\n const resolved = await this.#ensureJob(job)\n const first = resolved.resultFiles?.[0]\n if (!first) {\n throw new JobFailedError({\n jobId: resolved.jobId,\n processorType: resolved.processorType,\n code: 'NO_RESULT_FILES',\n message: 'Job is terminal but no result files were produced',\n })\n }\n return first.url\n }\n\n /** Download the first result file to `to` (Node) and return that path. */\n async downloadTo(job: ConvertJob | string, { to }: { to: string }): Promise<string> {\n const url = await this.downloadUrl(job)\n const { lstat, writeFile } = await import('node:fs/promises')\n // Refuse to write *through* an existing symlink: a pre-placed link could\n // redirect the bytes to an unintended location (e.g. a dotfile or a path\n // outside the intended directory). Writing to a regular path or a\n // brand-new file is unaffected. Port of the Python download_to guard.\n const st = await lstat(to).catch(() => null)\n if (st?.isSymbolicLink()) {\n throw new Error(\n `Refusing to write to ${JSON.stringify(to)}: target is a symlink. ` +\n 'Remove it or choose a non-symlink destination.'\n )\n }\n const response = await this.#http.externalGet(url)\n const bytes = new Uint8Array(await response.arrayBuffer())\n await writeFile(to, bytes)\n return to\n }\n\n // ── private ────────────────────────────────────────────────────\n\n #resolveSource(options: CreateConvertOptions): { fileId: string; sourceFormat: string } {\n const { file, fileId, sourceFormat } = options\n if (file != null && fileId != null) {\n throw new TypeError('create() accepts either `file` or `fileId`, not both')\n }\n if (file != null) {\n const inferred = sourceFormat ?? inferSourceFormat(file.filename)\n if (inferred == null) {\n throw new Error(\n `Could not infer sourceFormat from filename ${JSON.stringify(file.filename)}; ` +\n 'pass sourceFormat explicitly'\n )\n }\n return { fileId: file.fileId, sourceFormat: inferred }\n }\n if (fileId != null) {\n if (sourceFormat == null) {\n throw new Error('sourceFormat is required when only fileId is provided')\n }\n return { fileId, sourceFormat }\n }\n throw new TypeError('create() requires either `file` or `fileId`')\n }\n\n async #pollOnce(jobId: string): Promise<ConvertJob> {\n const response = await this.#http.request('GET', `/api/v1/jobs/${jobId}`)\n return parseConvertJob((await response.json()) as Record<string, unknown>)\n }\n\n async #waitLoop(jobId: string, timeout: number, initialInterval: number): Promise<ConvertJob> {\n const start = this.#now() / 1000\n let interval = initialInterval\n let staleCount = 0\n let lastProgress = -1\n for (;;) {\n const job = await this.#pollOnce(jobId)\n if (isConvertJobTerminal(job)) {\n return this.#finalise(job)\n }\n if (job.progress === lastProgress) {\n staleCount += 1\n if (staleCount >= STALE_PROGRESS_BACKOFF_AFTER) {\n interval = Math.min(interval * BACKOFF_FACTOR, MAX_POLL_INTERVAL)\n staleCount = 0\n }\n } else {\n lastProgress = job.progress\n staleCount = 0\n }\n const elapsed = this.#now() / 1000 - start\n if (elapsed + interval > timeout) {\n throw new JobTimeoutError({ jobId, elapsed, timeout })\n }\n await this.#sleep(interval)\n }\n }\n\n #finalise(job: ConvertJob): ConvertJob {\n if (job.status === 'failed') {\n const err = job.error\n throw new JobFailedError({\n jobId: job.jobId,\n processorType: job.processorType,\n code: err ? err.code : 'UNKNOWN',\n message: err ? err.message : 'Job failed without a structured error',\n })\n }\n return job\n }\n\n async #ensureJob(job: ConvertJob | string): Promise<ConvertJob> {\n return typeof job === 'string' ? this.#pollOnce(job) : job\n }\n}\n","/**\n * Files resource — upload local files via Convilyn's presigned-URL flow.\n *\n * Port of `resources/files.py`. Three steps behind one {@link Files.upload}:\n * 1. `POST /api/v1/upload/presign` — Convilyn issues a presigned upload URL\n * 2. `PUT <presigned-url>` — bytes go straight to storage (no Convilyn auth)\n * 3. `POST /api/v1/upload/confirm` — Convilyn registers the file record\n *\n * The steps are private methods so future extensions (multipart, progress) can\n * override one without rewriting the orchestration. The resource depends only\n * on {@link HttpClient} + types (clean DIP — no sibling-resource imports).\n */\n\nimport type { HttpClient } from '../internal/http'\nimport { parseFile } from '../internal/parsers'\nimport type { File } from '../types'\n\nconst DEFAULT_CONTENT_TYPE = 'application/octet-stream'\n\n/** Common suffix → MIME presets (generic; any caller benefits). */\nconst MIME_BY_SUFFIX: Record<string, string> = {\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n txt: 'text/plain',\n csv: 'text/csv',\n html: 'text/html',\n htm: 'text/html',\n md: 'text/markdown',\n json: 'application/json',\n xml: 'application/xml',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n mp4: 'video/mp4',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n zip: 'application/zip',\n}\n\nfunction basename(path: string): string {\n const parts = path.split(/[\\\\/]/)\n return parts[parts.length - 1] || path\n}\n\n/** Best-effort MIME from a filename suffix, else `application/octet-stream`. */\nexport function guessContentType(filename: string): string {\n const dot = filename.lastIndexOf('.')\n if (dot < 0) {\n return DEFAULT_CONTENT_TYPE\n }\n const suffix = filename.slice(dot + 1).toLowerCase()\n return MIME_BY_SUFFIX[suffix] ?? DEFAULT_CONTENT_TYPE\n}\n\nfunction toBytes(content: Uint8Array | ArrayBuffer | string): Uint8Array {\n if (typeof content === 'string') {\n return new TextEncoder().encode(content)\n }\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content)\n }\n return content\n}\n\n/** Caller input for {@link Files.upload} — exactly one of `path` / `content`. */\nexport interface UploadOptions {\n /** Filesystem path (Node only). */\n path?: string\n /** Raw bytes (works in the browser too). */\n content?: Uint8Array | ArrayBuffer | string\n /** Override the filename (required when uploading raw `content`). */\n filename?: string\n /** MIME type; defaults to a best-guess from the filename suffix. */\n contentType?: string\n}\n\ninterface PresignResult {\n uploadUrl: string\n fileId: string\n s3Key: string\n}\n\n/** Asynchronous file-management resource (`client.files`). */\nexport class Files {\n readonly #http: HttpClient\n\n constructor(http: HttpClient) {\n this.#http = http\n }\n\n /**\n * Upload a file and return its {@link File} record. Supply exactly one of\n * `path` (Node) or `content` (bytes/string).\n */\n async upload(options: UploadOptions): Promise<File> {\n const { path, content } = options\n if (path == null && content == null) {\n throw new TypeError('upload() requires either `path` or `content`')\n }\n if (path != null && content != null) {\n throw new TypeError('upload() accepts either `path` or `content`, not both')\n }\n\n let bytes: Uint8Array\n let filename = options.filename\n if (path != null) {\n const { readFile } = await import('node:fs/promises')\n const buffer = await readFile(path)\n bytes = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n filename ??= basename(path)\n } else {\n bytes = toBytes(content as Uint8Array | ArrayBuffer | string)\n }\n\n if (!filename) {\n throw new Error('filename is required when uploading raw content')\n }\n const contentType = options.contentType ?? guessContentType(filename)\n return this.#uploadWithBody(bytes, filename, contentType)\n }\n\n async #uploadWithBody(body: Uint8Array, filename: string, contentType: string): Promise<File> {\n const size = body.byteLength\n const presign = await this.#presign(filename, size, contentType)\n await this.#http.externalPut(presign.uploadUrl, {\n content: body,\n headers: { 'Content-Type': contentType },\n })\n const confirm = await this.#confirm(presign.fileId, filename, size, contentType, presign.s3Key)\n return parseFile(confirm)\n }\n\n async #presign(filename: string, size: number, contentType: string): Promise<PresignResult> {\n const response = await this.#http.request('POST', '/api/v1/upload/presign', {\n json: { fileName: filename, fileSize: size, contentType },\n })\n const body = (await response.json()) as Record<string, unknown>\n return {\n uploadUrl: String(body.uploadUrl),\n fileId: String(body.fileId),\n s3Key: String(body.s3Key),\n }\n }\n\n async #confirm(\n fileId: string,\n filename: string,\n size: number,\n contentType: string,\n s3Key: string\n ): Promise<Record<string, unknown>> {\n const response = await this.#http.request('POST', '/api/v1/upload/confirm', {\n json: { fileId, fileName: filename, fileSize: size, contentType, s3Key },\n })\n return (await response.json()) as Record<string, unknown>\n }\n}\n","/**\n * Default WebSocket transport for goal event streaming — port of\n * `_internal/ws.py`.\n *\n * The public DIP boundary is {@link WSTransport} (defined in `../transport`):\n * the goals resource depends on that interface, not on any concrete socket.\n * Production injects {@link WebSocketTransport} (the WHATWG `WebSocket` — global\n * in Node 22+ and browsers); tests inject a fake that yields canned messages.\n * This module (the concrete adapter + URL helpers) stays internal.\n */\n\nimport type { WSTransport } from '../transport'\n\nexport const ENV_WS_URL = 'CONVILYN_WS_URL'\n\n/** Options for {@link WebSocketTransport} (inject a `WebSocket` impl in tests). */\nexport interface WebSocketTransportOptions {\n WebSocketImpl?: typeof WebSocket\n}\n\n/**\n * Default {@link WSTransport} adapting the event-driven WHATWG `WebSocket` to\n * the async `connect`/`send`/`recv`/`close` contract via an internal message\n * queue. `recv()` resolves with the next frame, or rejects once the socket\n * errors or closes with nothing buffered.\n */\nexport class WebSocketTransport implements WSTransport {\n readonly #WebSocketImpl: typeof WebSocket\n #ws: WebSocket | null = null\n readonly #queue: string[] = []\n readonly #waiters: Array<{\n resolve: (value: string) => void\n reject: (reason: unknown) => void\n }> = []\n #ended = false\n #failure: unknown = null\n\n constructor(options: WebSocketTransportOptions = {}) {\n const impl = options.WebSocketImpl ?? (typeof WebSocket !== 'undefined' ? WebSocket : undefined)\n if (!impl) {\n throw new Error(\n 'No global WebSocket available; pass a WebSocket implementation ' +\n '(Node 22+ exposes one globally, or use the `ws` package).'\n )\n }\n this.#WebSocketImpl = impl\n }\n\n connect(url: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let settled = false\n let socket: WebSocket\n try {\n socket = new this.#WebSocketImpl(url)\n } catch (err) {\n reject(err)\n return\n }\n this.#ws = socket\n socket.addEventListener('open', () => {\n settled = true\n resolve()\n })\n socket.addEventListener('message', (event) => this.#onMessage(event as MessageEvent))\n socket.addEventListener('error', () => {\n const err = new Error('WebSocket connection error')\n this.#failure = err\n this.#flushWaiters()\n if (!settled) {\n settled = true\n reject(err)\n }\n })\n socket.addEventListener('close', () => {\n this.#ended = true\n this.#flushWaiters()\n })\n })\n }\n\n send(payload: string): Promise<void> {\n if (!this.#ws) {\n return Promise.reject(new Error('WebSocketTransport.send called before connect'))\n }\n this.#ws.send(payload)\n return Promise.resolve()\n }\n\n recv(): Promise<string> {\n const buffered = this.#queue.shift()\n if (buffered !== undefined) {\n return Promise.resolve(buffered)\n }\n if (this.#failure != null) {\n return Promise.reject(this.#failure)\n }\n if (this.#ended) {\n return Promise.reject(new Error('WebSocket closed'))\n }\n return new Promise<string>((resolve, reject) => {\n this.#waiters.push({ resolve, reject })\n })\n }\n\n close(): Promise<void> {\n if (this.#ws) {\n try {\n this.#ws.close()\n } catch {\n // already closing/closed — idempotent\n }\n this.#ws = null\n }\n return Promise.resolve()\n }\n\n #onMessage(event: MessageEvent): void {\n const data: string =\n typeof event.data === 'string'\n ? event.data\n : event.data instanceof ArrayBuffer\n ? new TextDecoder().decode(event.data)\n : String(event.data)\n const waiter = this.#waiters.shift()\n if (waiter) {\n waiter.resolve(data)\n } else {\n this.#queue.push(data)\n }\n }\n\n #flushWaiters(): void {\n const reason = this.#failure ?? new Error('WebSocket closed')\n while (this.#waiters.length > 0) {\n this.#waiters.shift()!.reject(reason)\n }\n }\n}\n\n/** Optional injection seam for {@link resolveWsUrl} (tests pass a fake env). */\nexport interface ResolveWsUrlOptions {\n explicit?: string | null\n fallback?: string | null\n env?: Record<string, string | undefined>\n}\n\n/**\n * Resolve the WebSocket base URL. Precedence: explicit (`events({ wsUrl })`) >\n * client-constructor `wsUrl` > `CONVILYN_WS_URL`. Never derived from the HTTP\n * `baseUrl` — prod and dev WS hostnames differ, so silent guessing misleads.\n */\nexport function resolveWsUrl(options: ResolveWsUrlOptions): string {\n const env = options.env ?? (typeof process !== 'undefined' ? process.env : {})\n for (const candidate of [options.explicit, options.fallback, env[ENV_WS_URL]]) {\n if (candidate) {\n return candidate\n }\n }\n throw new Error(\n 'No WebSocket URL configured. Pass { wsUrl } to events(), set it on the ' +\n 'client constructor, or set the CONVILYN_WS_URL environment variable.'\n )\n}\n\n/** Append the auth `?token=` query param to a WS base URL. */\nexport function buildWsConnectUrl(baseUrl: string, token: string): string {\n const separator = baseUrl.includes('?') ? '&' : '?'\n return `${baseUrl}${separator}token=${token}`\n}\n","/**\n * Goals resource — agentic goal workflow execution. Port of\n * `resources/goals.py`.\n *\n * POST /api/v1/jobs/goal — create a job (\"workflow run\")\n * GET /api/v1/jobs/goal/{id} — full status (drives polling)\n * PATCH /api/v1/jobs/goal/{id}/slots — answer HITL slots\n * POST /api/v1/jobs/goal/{id}/confirm|cancel|retry\n * WS subscribe → GoalEvent stream — live execution events\n *\n * Same SOLID seams as the convert resource (data on {@link GoalJob}, behaviour\n * here) plus the {@link WSTransport} DIP seam for the event stream.\n */\n\nimport { GoalJobFailedError, GoalJobTimeoutError, WebSocketError } from '../errors'\nimport type { HttpClient } from '../internal/http'\nimport { parseGoalEvent, parseGoalJob } from '../internal/parsers'\nimport { WebSocketTransport, buildWsConnectUrl, resolveWsUrl } from '../internal/ws'\nimport type { WSTransport } from '../transport'\nimport {\n goalJobNeedsInput,\n isGoalEventTerminal,\n isGoalEventType,\n isGoalJobTerminal,\n type GoalEvent,\n type GoalJob,\n} from '../types'\n\nexport const DEFAULT_POLL_INTERVAL = 1.0\nexport const DEFAULT_POLL_TIMEOUT = 300.0\nexport const MAX_POLL_INTERVAL = 5.0\nconst STALE_PROGRESS_BACKOFF_AFTER = 3\nconst BACKOFF_FACTOR = 1.5\n\nconst realSleep = (seconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, seconds * 1000))\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/** Options for {@link Goals.start} — supply exactly one of `workflowId` / `goalText`. */\nexport interface StartGoalOptions {\n workflowId?: string\n goalText?: string\n files?: string[]\n slots?: Record<string, unknown>\n /**\n * Optional BYO-LLM provider config id (from the console vault) to run this\n * job on your own provider/key. Omit to use your account default config.\n * Honoured only when BYO-LLM is enabled for your account; otherwise the run\n * uses the platform provider.\n */\n llmConfigId?: string\n}\n\n/** Polling controls for {@link Goals.wait}. */\nexport interface GoalWaitOptions {\n timeout?: number\n pollInterval?: number\n}\n\n/** Constructor options + test seams for {@link Goals}. */\nexport interface GoalsResourceOptions {\n wsUrl?: string | null\n wsTransportFactory?: () => WSTransport\n sleep?: (seconds: number) => Promise<void>\n now?: () => number\n}\n\n/** Asynchronous goal workflow resource (`client.goals`). */\nexport class Goals {\n readonly #http: HttpClient\n readonly #wsUrl: string | null\n readonly #wsTransportFactory: () => WSTransport\n readonly #sleep: (seconds: number) => Promise<void>\n readonly #now: () => number\n\n constructor(http: HttpClient, options: GoalsResourceOptions = {}) {\n this.#http = http\n this.#wsUrl = options.wsUrl ?? null\n this.#wsTransportFactory = options.wsTransportFactory ?? (() => new WebSocketTransport())\n this.#sleep = options.sleep ?? realSleep\n this.#now = options.now ?? (() => Date.now())\n }\n\n /** Create a goal job and return its initial {@link GoalJob} state. */\n async start(options: StartGoalOptions): Promise<GoalJob> {\n validateStartInputs(options)\n const payload: Record<string, unknown> = { fileIds: options.files ?? [] }\n if (options.workflowId != null) {\n payload.workflowId = options.workflowId\n }\n if (options.goalText != null) {\n payload.goalText = options.goalText\n }\n if (options.slots != null) {\n // The create endpoint keys pre-seeded answers as `slotAnswers: [{slotId, value}]`\n // (CreateGoalJobRequest, alias \"slotAnswers\"). Sending the raw `{slotId: value}`\n // dict under `slots` is silently dropped — the seeded answers never reach the\n // backend. Reshape to the list form here (same shape as fillSlots' `answers`).\n payload.slotAnswers = Object.entries(options.slots).map(([slotId, value]) => ({\n slotId,\n value,\n }))\n }\n if (options.llmConfigId != null) {\n payload.llmConfigId = options.llmConfigId\n }\n const response = await this.#http.request('POST', '/api/v1/jobs/goal', { json: payload })\n return parseGoalJob((await response.json()) as Record<string, unknown>)\n }\n\n /** Fetch the current state of a goal job. */\n async retrieve(jobSpecId: string): Promise<GoalJob> {\n return this.#pollOnce(jobSpecId)\n }\n\n /**\n * Poll until the job reaches a terminal state OR stops for HITL\n * (`slots_pending`). `failed` raises {@link GoalJobFailedError}; an elapsed\n * deadline raises {@link GoalJobTimeoutError}.\n */\n async wait(jobSpecId: string, options: GoalWaitOptions = {}): Promise<GoalJob> {\n return this.#waitLoop(\n jobSpecId,\n options.timeout ?? DEFAULT_POLL_TIMEOUT,\n options.pollInterval ?? DEFAULT_POLL_INTERVAL\n )\n }\n\n /** Shortcut: {@link start} then {@link wait}. */\n async run(options: StartGoalOptions & GoalWaitOptions): Promise<GoalJob> {\n const job = await this.start(options)\n return this.wait(job.jobSpecId, {\n timeout: options.timeout,\n pollInterval: options.pollInterval,\n })\n }\n\n /** Answer a single slot the agent is waiting on (sugar over {@link fillSlots}). */\n async fillSlot(\n jobSpecId: string,\n options: { slotId: string; value: unknown; expectedVersion?: number }\n ): Promise<GoalJob> {\n return this.fillSlots(\n jobSpecId,\n { [options.slotId]: options.value },\n {\n expectedVersion: options.expectedVersion,\n }\n )\n }\n\n /** Answer one or more slots in a single PATCH (`{slotId: value}` → wire list). */\n async fillSlots(\n jobSpecId: string,\n answers: Record<string, unknown>,\n options: { expectedVersion?: number } = {}\n ): Promise<GoalJob> {\n const entries = Object.entries(answers)\n if (entries.length === 0) {\n throw new Error('answers must contain at least one slot answer')\n }\n const body: Record<string, unknown> = {\n answers: entries.map(([slotId, value]) => ({ slotId, value })),\n }\n if (options.expectedVersion != null) {\n body.expectedVersion = options.expectedVersion\n }\n const response = await this.#http.request('PATCH', `/api/v1/jobs/goal/${jobSpecId}/slots`, {\n json: body,\n })\n return parseGoalJob((await response.json()) as Record<string, unknown>)\n }\n\n /** Confirm a slots-filled job, queueing it for execution. */\n async confirm(jobSpecId: string, options: { expectedVersion?: number } = {}): Promise<GoalJob> {\n const json =\n options.expectedVersion != null ? { expectedVersion: options.expectedVersion } : undefined\n await this.#http.request('POST', `/api/v1/jobs/goal/${jobSpecId}/confirm`, { json })\n return this.#pollOnce(jobSpecId)\n }\n\n /** Cancel a running or queued job. */\n async cancel(jobSpecId: string): Promise<GoalJob> {\n await this.#http.request('POST', `/api/v1/jobs/goal/${jobSpecId}/cancel`)\n return this.#pollOnce(jobSpecId)\n }\n\n /** Retry a failed job (resume the thread or start a fresh rerun). */\n async retry(\n jobSpecId: string,\n options: { rerunMode?: 'retry_same_thread' | 'fresh_rerun'; reason?: string } = {}\n ): Promise<GoalJob> {\n const body: Record<string, unknown> = { rerunMode: options.rerunMode ?? 'retry_same_thread' }\n if (options.reason != null) {\n body.reason = options.reason\n }\n await this.#http.request('POST', `/api/v1/jobs/goal/${jobSpecId}/retry`, { json: body })\n return this.#pollOnce(jobSpecId)\n }\n\n /**\n * Stream goal execution events for a job. Opens a WebSocket, subscribes,\n * then yields each {@link GoalEvent} in order; the iterator ends (and the\n * socket closes) on a terminal event. No auto-reconnect — the backend does\n * not replay missed events, so a silent reconnect would hide gaps.\n *\n * **WebSocket streaming is not available with a `ck_` consumer key in v1** —\n * the backend WS gateway does not authenticate `ck_` keys, so the connection\n * is denied. Use {@link wait} polling (standard HTTP auth, works today) for\n * the supported real-time path. This method is wired and ready for when the\n * gateway gains `ck_` support.\n *\n * @throws {@link WebSocketError} on connect/subscribe failure, a dropped\n * stream, or an unparseable/unrecognised envelope.\n */\n async *events(\n jobSpecId: string,\n options: { wsUrl?: string } = {}\n ): AsyncGenerator<GoalEvent, void, void> {\n const url = buildWsConnectUrl(\n resolveWsUrl({ explicit: options.wsUrl, fallback: this.#wsUrl }),\n this.#http.auth.bearerToken()\n )\n const transport = this.#wsTransportFactory()\n try {\n try {\n await transport.connect(url)\n await transport.send(JSON.stringify({ action: 'subscribe', jobSpecId }))\n } catch (error) {\n throw new WebSocketError(\n `Failed to open event stream for job ${jobSpecId}: ${errorMessage(error)}. ` +\n `Note: the WebSocket gateway does not accept ck_ consumer keys in v1 — ` +\n `use wait() polling (HTTP auth) instead.`\n )\n }\n\n for (;;) {\n let raw: string\n try {\n raw = await transport.recv()\n } catch (error) {\n throw new WebSocketError(\n `Event stream dropped for job ${jobSpecId}: ${errorMessage(error)}`\n )\n }\n const event = parseEvent(raw)\n yield event\n if (isGoalEventTerminal(event)) {\n return\n }\n }\n } finally {\n await transport.close()\n }\n }\n\n // ── private ────────────────────────────────────────────────────\n\n async #pollOnce(jobSpecId: string): Promise<GoalJob> {\n const response = await this.#http.request('GET', `/api/v1/jobs/goal/${jobSpecId}`)\n return parseGoalJob((await response.json()) as Record<string, unknown>)\n }\n\n async #waitLoop(jobSpecId: string, timeout: number, initialInterval: number): Promise<GoalJob> {\n const start = this.#now() / 1000\n let interval = initialInterval\n let staleCount = 0\n let lastProgress = -1\n for (;;) {\n const job = await this.#pollOnce(jobSpecId)\n if (isGoalJobTerminal(job)) {\n return this.#finalise(job)\n }\n if (goalJobNeedsInput(job)) {\n return job\n }\n if (job.progress === lastProgress) {\n staleCount += 1\n if (staleCount >= STALE_PROGRESS_BACKOFF_AFTER) {\n interval = Math.min(interval * BACKOFF_FACTOR, MAX_POLL_INTERVAL)\n staleCount = 0\n }\n } else {\n lastProgress = job.progress\n staleCount = 0\n }\n const elapsed = this.#now() / 1000 - start\n if (elapsed + interval > timeout) {\n throw new GoalJobTimeoutError({ jobSpecId, elapsed, timeout })\n }\n await this.#sleep(interval)\n }\n }\n\n #finalise(job: GoalJob): GoalJob {\n if (job.status === 'failed') {\n throw new GoalJobFailedError({\n jobSpecId: job.jobSpecId,\n code: job.errorCode,\n message: job.errorMessage,\n })\n }\n return job\n }\n}\n\nfunction validateStartInputs(options: StartGoalOptions): void {\n const { workflowId, goalText, files } = options\n if (workflowId == null && goalText == null) {\n throw new TypeError('start() requires either `workflowId` or `goalText`')\n }\n if (workflowId != null && goalText != null) {\n throw new TypeError('start() accepts either `workflowId` or `goalText`, not both')\n }\n if (workflowId == null && (!files || files.length === 0)) {\n throw new Error('files is required when `workflowId` is not provided')\n }\n}\n\n/** Translate a raw WS frame into a {@link GoalEvent}, or throw {@link WebSocketError}. */\nexport function parseEvent(raw: string): GoalEvent {\n let payload: unknown\n try {\n payload = JSON.parse(raw)\n } catch (error) {\n throw new WebSocketError(`Server sent non-JSON message: ${errorMessage(error)}`, {\n payload: raw,\n })\n }\n if (\n typeof payload !== 'object' ||\n payload === null ||\n typeof (payload as Record<string, unknown>).type !== 'string' ||\n typeof (payload as Record<string, unknown>).jobSpecId !== 'string' ||\n !isGoalEventType((payload as Record<string, unknown>).type as string)\n ) {\n throw new WebSocketError('Server sent an unrecognised event envelope', { payload: raw })\n }\n return parseGoalEvent(payload as Record<string, unknown>)\n}\n","/**\n * Workflows resource — community marketplace + private workflow management.\n * Port of `resources/workflows.py`.\n *\n * GET /api/v1/workflows/community — browse the public listing (search)\n * GET /api/v1/workflows/{id} — fetch one row\n * POST /api/v1/workflows/fork — fork a source into a private workflow\n * PATCH /api/v1/workflows/{id} — partial update (publish = visibility)\n * POST /api/v1/workflows/{id}/like — toggle like\n *\n * `fork` / `publish` require Pro tier; the platform's 402/403 surfaces as\n * {@link import('../errors').APIError} so callers branch on the status code.\n */\n\nimport type { HttpClient } from '../internal/http'\nimport { parseLikeResponse, parseWorkflow, parseWorkflowSearchPage } from '../internal/parsers'\nimport type { LikeResponse, Workflow, WorkflowSearchPage, WorkflowVisibility } from '../types'\n\n/** Sort order for a marketplace workflow search. */\nexport type WorkflowSortMode = 'recent' | 'popular'\n\n/** Options for {@link Workflows.search}. */\nexport interface WorkflowSearchOptions {\n tag?: string\n sort?: WorkflowSortMode\n limit?: number\n cursor?: string\n}\n\n/** Options for {@link Workflows.fork}. */\nexport interface ForkWorkflowOptions {\n sourceSpecId: string\n name?: string\n}\n\n/** Options for {@link Workflows.patch} (optimistic lock via `itemVersion`). */\nexport interface PatchWorkflowOptions {\n itemVersion: number\n name?: string\n description?: string\n visibility?: WorkflowVisibility\n tags?: string[]\n}\n\n/** Asynchronous community-workflows resource (`client.workflows`). */\nexport class Workflows {\n readonly #http: HttpClient\n\n constructor(http: HttpClient) {\n this.#http = http\n }\n\n /** Browse the public community listing (one page + a `cursor`). */\n async search(options: WorkflowSearchOptions = {}): Promise<WorkflowSearchPage> {\n const params: Record<string, string | number> = {\n sort: options.sort ?? 'recent',\n limit: options.limit ?? 20,\n }\n if (options.tag != null) {\n params.tag = options.tag\n }\n if (options.cursor != null) {\n params.cursor = options.cursor\n }\n const response = await this.#http.request('GET', '/api/v1/workflows/community', { params })\n return parseWorkflowSearchPage((await response.json()) as Record<string, unknown>)\n }\n\n /** Fetch a single workflow by id. */\n async get(workflowId: string): Promise<Workflow> {\n const response = await this.#http.request('GET', `/api/v1/workflows/${workflowId}`)\n return parseWorkflow((await response.json()) as Record<string, unknown>)\n }\n\n /** Fork a curated/user source into a new private workflow (Pro). */\n async fork(options: ForkWorkflowOptions): Promise<Workflow> {\n const body: Record<string, unknown> = { sourceSpecId: options.sourceSpecId }\n if (options.name != null) {\n body.name = options.name\n }\n const response = await this.#http.request('POST', '/api/v1/workflows/fork', { json: body })\n return parseWorkflow((await response.json()) as Record<string, unknown>)\n }\n\n /** Flip an owned workflow's visibility to `public` (Pro; optimistic lock). */\n async publish(workflowId: string, options: { itemVersion: number }): Promise<Workflow> {\n return this.patch(workflowId, { itemVersion: options.itemVersion, visibility: 'public' })\n }\n\n /** Partial update of an owned workflow (the generic PATCH escape hatch). */\n async patch(workflowId: string, options: PatchWorkflowOptions): Promise<Workflow> {\n const body: Record<string, unknown> = { itemVersion: options.itemVersion }\n if (options.name != null) {\n body.name = options.name\n }\n if (options.description != null) {\n body.description = options.description\n }\n if (options.visibility != null) {\n body.visibility = options.visibility\n }\n if (options.tags != null) {\n body.tags = [...options.tags]\n }\n const response = await this.#http.request('PATCH', `/api/v1/workflows/${workflowId}`, {\n json: body,\n })\n return parseWorkflow((await response.json()) as Record<string, unknown>)\n }\n\n /** Toggle the caller's like on a public workflow (idempotent toggle). */\n async like(workflowId: string): Promise<LikeResponse> {\n const response = await this.#http.request('POST', `/api/v1/workflows/${workflowId}/like`)\n return parseLikeResponse((await response.json()) as Record<string, unknown>)\n }\n}\n","/**\n * Async root client — port of `client.py`.\n *\n * Wires auth + HTTP transport and exposes the resource accessors. This A2\n * increment exposes `files` + `convert`; `goals` / `workflows` / `account`\n * (and the WebSocket knobs) extend this class in A4. Async-only: Node and the\n * browser are async-native, so there is no synchronous wrapper.\n */\n\nimport { type AuthStrategy, resolveAuth } from './internal/auth'\nimport { HttpClient } from './internal/http'\nimport { ExponentialBackoffRetry, NoRetry, type RetryPolicy } from './retry'\nimport { type AutoThrottleConfig, resolveAutoThrottle } from './throttle'\nimport type { WSTransport } from './transport'\nimport { Account } from './resources/account'\nimport { Convert } from './resources/convert'\nimport { Files } from './resources/files'\nimport { Goals } from './resources/goals'\nimport { Workflows } from './resources/workflows'\n\n/** Constructor options for {@link Convilyn}. */\nexport interface ConvilynOptions {\n /** API key; falls back to `CONVILYN_API_KEY`. Ignored when `auth` is given. */\n apiKey?: string\n baseUrl?: string\n /** Per-request timeout in seconds. */\n timeout?: number\n /** Custom auth strategy (overrides `apiKey`). */\n auth?: AuthStrategy\n /** Cap retry attempts (`0` = no retries). Ignored when `retryPolicy` is given. */\n maxRetries?: number\n /** Custom retry policy (overrides `maxRetries`). */\n retryPolicy?: RetryPolicy\n /** Disable the automatic `Idempotency-Key` on mutating verbs. */\n disableIdempotency?: boolean\n /** WebSocket base URL for `goals.events()`; falls back to `CONVILYN_WS_URL`. */\n wsUrl?: string\n /** Custom WebSocket transport factory (advanced / testing). */\n wsTransportFactory?: () => WSTransport\n /**\n * Sleep + retry on a 402 quota error, waiting for the quota window to reset\n * (distinct from {@link retryPolicy}, which handles transient 5xx/429/408).\n * `true` enables it with defaults (1 retry, 60s cap); pass\n * `new AutoThrottleConfig({ … })` to tune. Omitted = disabled.\n */\n autoThrottle?: boolean | AutoThrottleConfig\n}\n\n/** Asynchronous Convilyn client. */\nexport class Convilyn {\n readonly files: Files\n readonly convert: Convert\n readonly goals: Goals\n readonly workflows: Workflows\n readonly account: Account\n readonly #http: HttpClient\n\n constructor(options: ConvilynOptions = {}) {\n const auth = options.auth ?? resolveAuth(options.apiKey)\n if (options.timeout !== undefined && options.timeout <= 0) {\n throw new TypeError(`timeout must be a positive number of seconds (got ${options.timeout})`)\n }\n this.#http = new HttpClient({\n auth,\n baseUrl: options.baseUrl,\n timeout: options.timeout,\n retryPolicy: resolveRetryPolicy(options.maxRetries, options.retryPolicy),\n idempotencyEnabled: !options.disableIdempotency,\n autoThrottle: resolveAutoThrottle(options.autoThrottle),\n })\n this.files = new Files(this.#http)\n this.convert = new Convert(this.#http)\n this.goals = new Goals(this.#http, {\n wsUrl: options.wsUrl,\n wsTransportFactory: options.wsTransportFactory,\n })\n this.workflows = new Workflows(this.#http)\n this.account = new Account(this.#http)\n }\n\n get baseUrl(): string {\n return this.#http.baseUrl\n }\n\n async close(): Promise<void> {\n await this.#http.close()\n }\n}\n\n/**\n * Combine the two retry knobs into one policy. Precedence: explicit\n * `retryPolicy` > `maxRetries` (`0` → {@link NoRetry}) > SDK default.\n *\n * @throws {TypeError} if `maxRetries` is negative — `0` is the documented\n * \"no retries\" value; a negative count has no meaning and is rejected\n * rather than silently treated as `0`.\n */\nexport function resolveRetryPolicy(\n maxRetries: number | undefined,\n retryPolicy: RetryPolicy | undefined\n): RetryPolicy {\n if (retryPolicy != null) {\n return retryPolicy\n }\n if (maxRetries == null) {\n return new ExponentialBackoffRetry()\n }\n if (maxRetries < 0) {\n throw new TypeError(`maxRetries must be >= 0 (got ${maxRetries})`)\n }\n if (maxRetries === 0) {\n return new NoRetry()\n }\n return new ExponentialBackoffRetry({ maxAttempts: maxRetries })\n}\n"]}