@cronvello/sdk 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +1 -1
- package/dist/cli.cjs +1 -1
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/{dispatch-handler-BNy-H5Nr.d.cts → dispatch-handler-DazGcFHz.d.cts} +1 -1
- package/dist/{dispatch-handler-BNy-H5Nr.d.ts → dispatch-handler-DazGcFHz.d.ts} +1 -1
- package/dist/express.d.cts +1 -1
- package/dist/express.d.ts +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +2 -2
- package/dist/next.d.ts +2 -2
- package/dist/next.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/internal/errors.ts","../src/internal/http.ts","../src/client/client.ts","../src/internal/cron.ts","../src/registry/verify.ts","../src/registry/dispatch.ts","../src/registry/reconcile.ts","../src/adapters/express.ts","../src/adapters/next.ts","../src/registry/define.ts","../src/registry/format.ts","../src/schedule/index.ts","../src/index.ts"],"names":["field","headerValue","defineCronvello"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error taxonomy for the SDK. Everything thrown by the public surface is a\n * `CronvelloError` (or subclass), so callers can `catch (e) { if (e instanceof CronvelloError) … }`.\n */\n\nexport class CronvelloError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloError\";\n // Restore prototype chain for instanceof across transpilation targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A non-2xx response from the Cronvello API. */\nexport class CronvelloApiError extends CronvelloError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the API body, when present. */\n readonly code: string | undefined;\n /** The method + path that failed, e.g. `POST /v1/jobs`. */\n readonly endpoint: string;\n /** Parsed response body (best effort). */\n readonly body: unknown;\n /** Seconds to wait before retrying, parsed from `Retry-After` / rate-limit payload (429 only). */\n readonly retryAfterSeconds: number | undefined;\n\n constructor(args: {\n status: number;\n endpoint: string;\n message: string;\n code?: string;\n body?: unknown;\n retryAfterSeconds?: number;\n }) {\n super(`[${args.status}] ${args.endpoint}: ${args.message}`);\n this.name = \"CronvelloApiError\";\n this.status = args.status;\n this.code = args.code;\n this.endpoint = args.endpoint;\n this.body = args.body;\n this.retryAfterSeconds = args.retryAfterSeconds;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n get isAuthError(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n get isNotFound(): boolean {\n return this.status === 404;\n }\n}\n\n/** A network/transport failure (DNS, connection reset, timeout) before any HTTP status. */\nexport class CronvelloNetworkError extends CronvelloError {\n readonly endpoint: string;\n override readonly cause: unknown;\n constructor(endpoint: string, cause: unknown) {\n super(`Network error calling ${endpoint}: ${describe(cause)}`);\n this.name = \"CronvelloNetworkError\";\n this.endpoint = endpoint;\n this.cause = cause;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A misconfiguration caught before any network call (missing apiKey, bad URL, …). */\nexport class CronvelloConfigError extends CronvelloError {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloConfigError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nfunction describe(cause: unknown): string {\n if (cause instanceof Error) return cause.message;\n return String(cause);\n}\n","/**\n * Minimal HTTP transport over the global `fetch` (Node 18+). No axios, no node-fetch —\n * zero runtime dependencies. Adds bearer auth, JSON (de)serialization, typed error mapping,\n * bounded retries with backoff for transient failures, and optional idempotency keys.\n */\n\nimport {\n CronvelloApiError,\n CronvelloConfigError,\n CronvelloNetworkError,\n} from \"./errors.js\";\n\nexport type FetchLike = (\n input: string,\n init?: {\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n },\n) => Promise<{\n ok: boolean;\n status: number;\n headers: { get(name: string): string | null };\n text(): Promise<string>;\n}>;\n\nexport interface TransportOptions {\n baseUrl: string;\n apiKey: string;\n /** Per-request timeout in ms. Default 30_000. */\n timeoutMs?: number;\n /** Max retry attempts for 429/5xx/network errors. Default 2 (=> up to 3 tries). */\n maxRetries?: number;\n /** Override the fetch implementation (testing / custom agents). */\n fetch?: FetchLike;\n /** Extra headers sent on every request (e.g. a custom User-Agent). */\n defaultHeaders?: Record<string, string>;\n /** Telemetry hook — called once per completed attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport interface RequestOptions {\n method: string;\n path: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Idempotency-Key header value — replays of the same key are de-duplicated server-side. */\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\n\nexport class Transport {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly onRequest: TransportOptions[\"onRequest\"];\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) throw new CronvelloConfigError(\"apiKey is required\");\n if (!opts.baseUrl) throw new CronvelloConfigError(\"baseUrl is required\");\n const resolvedFetch = opts.fetch ?? (globalThis.fetch as unknown as FetchLike | undefined);\n if (!resolvedFetch) {\n throw new CronvelloConfigError(\n \"No global fetch found. Use Node 18+ or pass a `fetch` implementation in the client options.\",\n );\n }\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.maxRetries = opts.maxRetries ?? 2;\n this.fetchImpl = resolvedFetch;\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.onRequest = opts.onRequest;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const endpoint = `${opts.method} ${opts.path}`;\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.apiKey}`,\n accept: \"application/json\",\n ...this.defaultHeaders,\n };\n let payload: string | undefined;\n if (opts.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(opts.body);\n }\n if (opts.idempotencyKey) headers[\"idempotency-key\"] = opts.idempotencyKey;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const startedAt = Date.now();\n const { signal, cancel } = this.withTimeout(opts.signal);\n try {\n const res = await this.fetchImpl(url, {\n method: opts.method,\n headers,\n ...(payload !== undefined ? { body: payload } : {}),\n signal,\n });\n cancel();\n const durationMs = Date.now() - startedAt;\n this.onRequest?.({ method: opts.method, path: opts.path, status: res.status, attempt, durationMs });\n\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (res.ok) return unwrapEnvelope(parsed) as T;\n\n const retryAfter = parseRetryAfter(res, parsed);\n if (RETRYABLE_STATUS.has(res.status) && attempt < this.maxRetries) {\n await sleep(this.backoff(attempt, retryAfter));\n continue;\n }\n throw new CronvelloApiError({\n status: res.status,\n endpoint,\n message: extractMessage(parsed) ?? `Request failed`,\n code: extractCode(parsed),\n body: parsed,\n ...(retryAfter !== undefined ? { retryAfterSeconds: retryAfter } : {}),\n });\n } catch (err) {\n cancel();\n if (err instanceof CronvelloApiError) throw err;\n // Network/abort error — retry if attempts remain.\n lastError = err;\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt));\n continue;\n }\n throw new CronvelloNetworkError(endpoint, err);\n }\n }\n // Unreachable, but satisfies the type checker.\n throw new CronvelloNetworkError(endpoint, lastError);\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const base = `${this.baseUrl}${path.startsWith(\"/\") ? path : `/${path}`}`;\n if (!query) return base;\n const params = Object.entries(query)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n return params.length ? `${base}?${params.join(\"&\")}` : base;\n }\n\n private withTimeout(external?: AbortSignal): { signal: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const onExternalAbort = () => controller.abort();\n if (external) {\n if (external.aborted) controller.abort();\n else external.addEventListener(\"abort\", onExternalAbort, { once: true });\n }\n return {\n signal: controller.signal,\n cancel: () => {\n clearTimeout(timer);\n external?.removeEventListener(\"abort\", onExternalAbort);\n },\n };\n }\n\n private backoff(attempt: number, retryAfterSeconds?: number): number {\n if (retryAfterSeconds !== undefined) return Math.min(retryAfterSeconds * 1000, 30_000);\n // Exponential backoff with full jitter: base 300ms, capped at 5s.\n const base = Math.min(300 * 2 ** attempt, 5_000);\n return Math.floor(Math.random() * base);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n/**\n * The Cronvello server wraps every successful `/v1` response in a `{ success, message, data }`\n * envelope, while the typed client methods are declared in terms of the inner payload. Unwrap\n * it here — centrally — so every resource method (and the high-level `sync()`) sees the data it\n * expects. Bodies that aren't enveloped (no boolean `success` + `data`) pass through unchanged,\n * so non-enveloped or future endpoints keep working.\n */\nfunction unwrapEnvelope(body: unknown): unknown {\n if (\n body !== null &&\n typeof body === \"object\" &&\n \"success\" in body &&\n typeof (body as { success: unknown }).success === \"boolean\" &&\n \"data\" in body\n ) {\n return (body as { data: unknown }).data;\n }\n return body;\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"message\" in body) {\n const m = (body as { message?: unknown }).message;\n if (typeof m === \"string\") return m;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"code\" in body) {\n const c = (body as { code?: unknown }).code;\n if (typeof c === \"string\") return c;\n }\n return undefined;\n}\n\nfunction parseRetryAfter(\n res: { headers: { get(name: string): string | null } },\n body: unknown,\n): number | undefined {\n const header = res.headers.get(\"retry-after\");\n if (header) {\n const n = Number(header);\n if (Number.isFinite(n)) return n;\n }\n if (body && typeof body === \"object\" && \"data\" in body) {\n const data = (body as { data?: { retryAfterSeconds?: unknown } }).data;\n if (data && typeof data.retryAfterSeconds === \"number\") return data.retryAfterSeconds;\n }\n return undefined;\n}\n","/**\n * Low-level, fully-typed client for the Cronvello public `/v1` API.\n *\n * This is the thin REST layer: one method per endpoint, request/response types straight\n * from the server contract. The high-level registry (`defineCronvello`) is built on top of\n * it. Use this directly when you need ad-hoc control beyond the registry model.\n */\n\nimport { Transport, type FetchLike } from \"../internal/http.js\";\nimport { CronvelloConfigError } from \"../internal/errors.js\";\nimport type {\n AccountRunsQuery,\n AccountTasksQuery,\n JobCreateBody,\n JobUpdateBody,\n MeResponse,\n PublicJob,\n PublicRun,\n PublicTask,\n RunNowResult,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RunsPage,\n RunsQuery,\n TaskCreateBody,\n TasksPage,\n TaskUpdateBody,\n UsageResponse,\n} from \"../internal/wire.js\";\n\n/** The production Cronvello API. Override `baseUrl` only for self-hosting or testing. */\nexport const CRONVELLO_DEFAULT_BASE_URL = \"https://api.cronvello.com\";\n\nexport interface CronvelloClientOptions {\n /** Account API key (`crn_live_…`). Required. */\n apiKey: string;\n /** API base URL. Defaults to https://api.cronvello.com. */\n baseUrl?: string;\n /** Per-request timeout in ms (default 30_000). */\n timeoutMs?: number;\n /** Retry attempts for 429/5xx/network errors (default 2). */\n maxRetries?: number;\n /** Custom fetch implementation (default: global fetch). */\n fetch?: FetchLike;\n /** Telemetry hook for every request attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport class CronvelloClient {\n private readonly transport: Transport;\n /** The resolved base URL in use. */\n readonly baseUrl: string;\n\n /** Job container operations. */\n readonly jobs: JobsResource;\n /** Scheduled task operations. */\n readonly tasks: TasksResource;\n /** Execution-history (run) operations. */\n readonly runs: RunsResource;\n /** Account identity + usage. */\n readonly account: AccountResource;\n\n constructor(options: CronvelloClientOptions) {\n if (!options || !options.apiKey) {\n throw new CronvelloConfigError(\"CronvelloClient requires an `apiKey` (crn_live_…).\");\n }\n this.baseUrl = (options.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.transport = new Transport({\n baseUrl: this.baseUrl,\n apiKey: options.apiKey,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.onRequest ? { onRequest: options.onRequest } : {}),\n defaultHeaders: { \"user-agent\": \"cronvello-sdk\" },\n });\n this.jobs = new JobsResource(this.transport);\n this.tasks = new TasksResource(this.transport);\n this.runs = new RunsResource(this.transport);\n this.account = new AccountResource(this.transport);\n }\n\n /**\n * Atomically reconcile a whole code registry server-side (`PUT /v1/registry`): one job\n * container + its tasks, created/updated/pruned/started in a single call. This is what\n * `defineCronvello().sync()` prefers; the high-level API builds the body for you.\n */\n reconcileRegistry(body: RegistryReconcileRequest, opts?: { idempotencyKey?: string }): Promise<RegistryReconcileResponse> {\n return this.transport.request({\n method: \"PUT\",\n path: \"/v1/registry\",\n body,\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n\n /**\n * Escape hatch for endpoints not yet wrapped by a typed method (heartbeat monitors,\n * maintenance windows, DLQ, notification channels, audit log, API-key self-service …).\n * `T` is the response shape you expect.\n */\n request<T>(method: string, path: string, opts?: { query?: Record<string, string | number | boolean | undefined>; body?: unknown; idempotencyKey?: string }): Promise<T> {\n return this.transport.request<T>({\n method,\n path,\n ...(opts?.query ? { query: opts.query } : {}),\n ...(opts?.body !== undefined ? { body: opts.body } : {}),\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n}\n\nclass JobsResource {\n constructor(private readonly t: Transport) {}\n\n list(): Promise<PublicJob[]> {\n return this.t.request({ method: \"GET\", path: \"/v1/jobs\" });\n }\n get(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}` });\n }\n create(body: JobCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: \"/v1/jobs\", body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n update(jobId: string, body: JobUpdateBody): Promise<PublicJob> {\n return this.t.request({ method: \"PATCH\", path: `/v1/jobs/${enc(jobId)}`, body });\n }\n delete(jobId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/jobs/${enc(jobId)}` });\n }\n start(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/start` });\n }\n stop(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/stop` });\n }\n listTasks(jobId: string): Promise<PublicTask[]> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}/tasks` });\n }\n createTask(jobId: string, body: TaskCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/tasks`, body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n}\n\nclass TasksResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated task table. */\n list(query?: AccountTasksQuery): Promise<TasksPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/tasks\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}` });\n }\n update(taskId: string, body: TaskUpdateBody): Promise<PublicTask> {\n return this.t.request({ method: \"PATCH\", path: `/v1/tasks/${enc(taskId)}`, body });\n }\n delete(taskId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/tasks/${enc(taskId)}` });\n }\n start(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/start` });\n }\n stop(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/stop` });\n }\n /** Trigger a one-off manual execution (does not change the schedule). */\n runNow(taskId: string): Promise<RunNowResult> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/run` });\n }\n listRuns(taskId: string, query?: RunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}/runs`, ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n}\n\nclass RunsResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated activity feed. */\n list(query?: AccountRunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/runs\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(runId: string): Promise<PublicRun> {\n return this.t.request({ method: \"GET\", path: `/v1/runs/${enc(runId)}` });\n }\n}\n\nclass AccountResource {\n constructor(private readonly t: Transport) {}\n\n me(): Promise<MeResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/me\" });\n }\n usage(): Promise<UsageResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/usage\" });\n }\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n","/**\n * Client-side cron + IANA-timezone validation.\n *\n * The goal is to catch *typos* at define/sync time with a clear message — not to re-implement the\n * server's scheduler. So the validator is deliberately permissive: it accepts the standard 5-field\n * crontab syntax (and an optional leading seconds field), the common `@macros`, names for months\n * and weekdays, and step/range/list combinations. Anything it cannot confidently reject is allowed\n * through, so a valid-but-unusual expression never blocks a deploy.\n */\n\nconst MACROS = new Set([\n \"@yearly\", \"@annually\", \"@monthly\", \"@weekly\", \"@daily\", \"@midnight\", \"@hourly\", \"@reboot\",\n]);\n\nconst MONTHS = [\"jan\", \"feb\", \"mar\", \"apr\", \"may\", \"jun\", \"jul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"];\nconst DOWS = [\"sun\", \"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\"];\n\ninterface FieldSpec {\n min: number;\n max: number;\n names?: string[];\n label: string;\n}\n\n// Field order for a 5-part expression.\nconst FIVE: FieldSpec[] = [\n { min: 0, max: 59, label: \"minute\" },\n { min: 0, max: 23, label: \"hour\" },\n { min: 1, max: 31, label: \"day-of-month\" },\n { min: 1, max: 12, names: MONTHS, label: \"month\" },\n { min: 0, max: 7, names: DOWS, label: \"day-of-week\" }, // 0 and 7 are both Sunday\n];\nconst SECONDS: FieldSpec = { min: 0, max: 59, label: \"second\" };\n\nexport interface CronValidation {\n valid: boolean;\n /** Human-readable reason when invalid. */\n error?: string;\n}\n\n/** Validate a cron expression. Returns `{ valid, error? }` rather than throwing. */\nexport function validateCron(expr: string): CronValidation {\n if (typeof expr !== \"string\" || !expr.trim()) {\n return { valid: false, error: \"schedule is empty\" };\n }\n const trimmed = expr.trim();\n if (trimmed.startsWith(\"@\")) {\n return MACROS.has(trimmed.toLowerCase())\n ? { valid: true }\n : { valid: false, error: `unknown cron macro \"${trimmed}\" (try @daily, @hourly, …)` };\n }\n\n const parts = trimmed.split(/\\s+/);\n if (parts.length !== 5 && parts.length !== 6) {\n return {\n valid: false,\n error: `expected 5 fields (min hour dom month dow) or 6 with seconds, got ${parts.length}: \"${trimmed}\"`,\n };\n }\n\n const specs = parts.length === 6 ? [SECONDS, ...FIVE] : FIVE;\n for (let i = 0; i < parts.length; i++) {\n const err = validateField(parts[i]!, specs[i]!);\n if (err) return { valid: false, error: `invalid ${specs[i]!.label} \"${parts[i]}\": ${err}` };\n }\n return { valid: true };\n}\n\nfunction validateField(field: string, spec: FieldSpec): string | null {\n // A field is a comma-separated list of terms.\n for (const term of field.split(\",\")) {\n const err = validateTerm(term, spec);\n if (err) return err;\n }\n return null;\n}\n\nfunction validateTerm(term: string, spec: FieldSpec): string | null {\n if (term === \"\") return \"empty list item\";\n // step: <range-or-*>/<n>\n let step: string | undefined;\n let base = term;\n const slash = term.indexOf(\"/\");\n if (slash >= 0) {\n base = term.slice(0, slash);\n step = term.slice(slash + 1);\n if (!/^\\d+$/.test(step) || Number(step) === 0) return `step must be a positive integer`;\n }\n if (base === \"*\") return null;\n // range: a-b\n const dash = base.indexOf(\"-\");\n if (dash > 0) {\n const lo = resolveValue(base.slice(0, dash), spec);\n const hi = resolveValue(base.slice(dash + 1), spec);\n if (lo === null) return `\"${base.slice(0, dash)}\" is out of range ${spec.min}-${spec.max}`;\n if (hi === null) return `\"${base.slice(dash + 1)}\" is out of range ${spec.min}-${spec.max}`;\n if (lo > hi) return `range start ${lo} is greater than end ${hi}`;\n return null;\n }\n // single value (only meaningful with a step if it's the base of `n/step`, which crontab rejects;\n // but most parsers accept it, so we stay permissive).\n if (step !== undefined && base !== \"*\") {\n // e.g. \"5/10\" — accept the base as a start value.\n return resolveValue(base, spec) === null ? `\"${base}\" is out of range ${spec.min}-${spec.max}` : null;\n }\n return resolveValue(base, spec) === null ? `\"${base}\" is out of range ${spec.min}-${spec.max}` : null;\n}\n\n/** Resolve a numeric or named field value to its number, or null if out of range / unknown. */\nfunction resolveValue(token: string, spec: FieldSpec): number | null {\n if (/^\\d+$/.test(token)) {\n const n = Number(token);\n return n >= spec.min && n <= spec.max ? n : null;\n }\n if (spec.names) {\n const idx = spec.names.indexOf(token.toLowerCase());\n if (idx >= 0) return idx + (spec.label === \"month\" ? 1 : 0);\n }\n return null;\n}\n\n/** Throw a clear error if the cron expression is invalid. `context` is woven into the message. */\nexport function assertValidCron(expr: string, context = \"\"): void {\n const res = validateCron(expr);\n if (!res.valid) {\n throw new Error(`${context ? `${context}: ` : \"\"}invalid cron schedule — ${res.error}`);\n }\n}\n\n/** True if `tz` is a valid IANA timezone (uses the runtime's Intl database). \"UTC\" always passes. */\nexport function isValidTimeZone(tz: string): boolean {\n if (!tz || typeof tz !== \"string\") return false;\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: tz });\n return true;\n } catch {\n return false;\n }\n}\n\n/** Throw a clear error if the timezone is not a valid IANA zone. */\nexport function assertValidTimeZone(tz: string, context = \"\"): void {\n if (!isValidTimeZone(tz)) {\n throw new Error(`${context ? `${context}: ` : \"\"}invalid timezone \"${tz}\" (expected an IANA name like \"Europe/Berlin\" or \"UTC\")`);\n }\n}\n","/**\n * Authentication helpers for the dispatch handler.\n *\n * Inbound (Cronvello → app): a bearer token equal to the configured `dispatchSecret`.\n * We compare it in constant time to avoid leaking the secret through timing.\n *\n * Outbound (app → Cronvello, async_callback only): we sign the callback body with\n * HMAC-SHA256 (`sha256=<hex>`), matching node-cron's `webhook-hmac.service`.\n */\n\nconst encoder = new TextEncoder();\n\n/** Parse `Authorization: Bearer <token>` (scheme is case-insensitive). Returns the token or null. */\nexport function parseBearer(headerValue: string | undefined): string | null {\n if (!headerValue) return null;\n const match = /^bearer\\s+(.+)$/i.exec(headerValue.trim());\n return match ? match[1]!.trim() : null;\n}\n\n/**\n * Constant-time string comparison. Runs in time proportional to the longer input and never\n * short-circuits, so it does not reveal where two values diverge. No `node:crypto` dependency,\n * so it works on edge runtimes too.\n */\nexport function timingSafeEqual(a: string, b: string): boolean {\n const ab = encoder.encode(a);\n const bb = encoder.encode(b);\n const len = Math.max(ab.length, bb.length);\n let diff = ab.length ^ bb.length;\n for (let i = 0; i < len; i++) {\n diff |= (ab[i] ?? 0) ^ (bb[i] ?? 0);\n }\n return diff === 0;\n}\n\n/**\n * HMAC-SHA256 signature in node-cron's wire format: `sha256=<hex>`.\n * Uses WebCrypto (`crypto.subtle`), available on Node 18+ and edge runtimes — no node:crypto.\n */\nexport async function signHmacSha256(payload: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sig = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(payload));\n const hex = Array.from(new Uint8Array(sig))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return `sha256=${hex}`;\n}\n","/**\n * Framework-neutral dispatch core.\n *\n * Cronvello fires a due task by POSTing to the app's dispatch URL with\n * Authorization: Bearer <dispatchSecret>\n * body: { job: \"<registry-key>\", schedule: \"<cron>\", ...payload, _callback?: {...} }\n *\n * This module verifies the bearer, selects the job by key, runs its handler, and returns a\n * response. The Express/Next adapters are thin shells that translate their request/response\n * objects to/from the neutral shapes below.\n */\n\nimport type { CronvelloHooks, CronvelloJobConfig, CronvelloJobContext, CronvelloLogger, CronvelloRunSource } from \"./types.js\";\nimport { parseBearer, signHmacSha256, timingSafeEqual } from \"./verify.js\";\n\nexport interface ResolvedJob {\n key: string;\n config: CronvelloJobConfig;\n}\n\n/** A logger that discards everything — used when the app configures none, so `ctx.logger` is always safe. */\nexport const NOOP_LOGGER: CronvelloLogger = {};\n\nexport interface DispatcherState {\n jobs: Map<string, ResolvedJob>;\n dispatchSecret: string;\n logger: CronvelloLogger | undefined;\n hooks?: CronvelloHooks | undefined;\n /** Reject inbound bodies larger than this many bytes (default 1 MiB). */\n maxBodyBytes?: number;\n}\n\nexport interface DispatchRequest {\n method: string;\n /** Value of the Authorization header, if any. */\n authorization: string | undefined;\n /** Raw request body as text. */\n rawBody: string;\n /** Lower-cased request headers. */\n headers: Record<string, string>;\n /** Abort signal for the inbound request, if the host provides one. */\n signal?: AbortSignal;\n /**\n * Optional serverless lifecycle hook (e.g. Vercel/Cloudflare `ctx.waitUntil`). When present,\n * async_callback background work is registered with it so the function stays alive until done.\n */\n waitUntil?: (promise: Promise<unknown>) => void;\n}\n\nexport interface DispatchResponse {\n status: number;\n body: Record<string, unknown>;\n}\n\n/** Async-callback metadata Cronvello injects into the request body. */\ninterface CallbackEnvelope {\n url: string;\n runId: string;\n expectedSignatureHeader?: string;\n timeoutMs?: number;\n}\n\nexport interface Dispatcher {\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /** Run a job's handler in-process (no HTTP, no auth) — powers `cronvello.trigger()`. */\n runLocal(key: string, payload?: Record<string, unknown>): Promise<unknown>;\n}\n\nexport function createDispatcher(state: DispatcherState): Dispatcher {\n const log = state.logger ?? NOOP_LOGGER;\n const hooks = state.hooks;\n const maxBodyBytes = state.maxBodyBytes ?? 1_048_576; // 1 MiB\n\n /** Run the handler with lifecycle hooks + timing. Hook failures never break the run. */\n async function invokeHandler(job: ResolvedJob, ctx: CronvelloJobContext): Promise<{ durationMs: number; result: unknown }> {\n await safeHook(() => hooks?.onJobStart?.({ key: job.key, source: ctx.source, isAsync: ctx.isAsync }), log);\n const startedAt = Date.now();\n try {\n const result = await job.config.handler(ctx);\n const durationMs = Date.now() - startedAt;\n log.debug?.(`[cronvello] job '${job.key}' completed in ${durationMs}ms`);\n await safeHook(() => hooks?.onJobSuccess?.({ key: job.key, source: ctx.source, durationMs, result }), log);\n return { durationMs, result };\n } catch (err) {\n const durationMs = Date.now() - startedAt;\n const error = err instanceof Error ? err : new Error(String(err));\n log.error?.(`[cronvello] job '${job.key}' failed: ${error.message}`, { error: error.message });\n await safeHook(() => hooks?.onJobError?.({ key: job.key, source: ctx.source, durationMs, error }), log);\n throw error;\n }\n }\n\n function buildContext(key: string, job: ResolvedJob, req: DispatchRequest | null, body: Record<string, unknown>, isAsync: boolean, source: CronvelloRunSource): CronvelloJobContext {\n return {\n key,\n schedule: typeof body[\"schedule\"] === \"string\" ? (body[\"schedule\"] as string) : (job.config.schedule ?? \"\"),\n payload: (job.config.payload as Record<string, unknown>) ?? {},\n body,\n headers: req?.headers ?? {},\n isAsync,\n source,\n logger: log,\n signal: req?.signal,\n };\n }\n\n async function handle(req: DispatchRequest): Promise<DispatchResponse> {\n if (req.method.toUpperCase() !== \"POST\") {\n return resp(405, { ok: false, error: \"Method not allowed\" });\n }\n\n // 1. Authenticate: bearer must equal the dispatch secret (constant-time).\n const token = parseBearer(req.authorization);\n if (!token || !timingSafeEqual(token, state.dispatchSecret)) {\n log.warn?.(\"[cronvello] dispatch rejected: bad or missing bearer token\");\n return resp(401, { ok: false, error: \"Unauthorized\" });\n }\n\n // 2. Guard body size before parsing (defence against oversized/abusive payloads).\n if (byteLength(req.rawBody) > maxBodyBytes) {\n log.warn?.(`[cronvello] dispatch rejected: body exceeds ${maxBodyBytes} bytes`);\n return resp(413, { ok: false, error: \"Payload too large\" });\n }\n\n // 3. Parse the body.\n let body: Record<string, unknown>;\n try {\n const parsed = req.rawBody ? JSON.parse(req.rawBody) : {};\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return resp(400, { ok: false, error: \"Body must be a JSON object\" });\n }\n body = parsed as Record<string, unknown>;\n } catch {\n return resp(400, { ok: false, error: \"Invalid JSON body\" });\n }\n\n // 4. Select the job by its registry key.\n const key = typeof body[\"job\"] === \"string\" ? (body[\"job\"] as string) : null;\n if (!key) {\n return resp(400, { ok: false, error: \"Missing 'job' key in body\" });\n }\n const job = state.jobs.get(key);\n if (!job) {\n log.warn?.(`[cronvello] dispatch for unknown job '${key}'`);\n return resp(404, { ok: false, error: `Unknown job: ${key}` });\n }\n\n const callback = readCallback(body[\"_callback\"]);\n const isAsync = callback !== null;\n const ctx = buildContext(key, job, req, body, isAsync, \"dispatch\");\n\n // 5a. Async path — acknowledge now, run in the background, post the result back.\n if (callback) {\n const work = runAndReportCallback(job, ctx, callback, state.dispatchSecret, log, invokeHandler);\n if (req.waitUntil) req.waitUntil(work);\n else void work; // fire-and-forget on long-running hosts\n return resp(202, { ok: true, job: key, accepted: true });\n }\n\n // 5b. Sync path — run inline; the result IS the HTTP response Cronvello records.\n try {\n const { result } = await invokeHandler(job, ctx);\n return resp(200, { ok: true, job: key, result: result ?? null });\n } catch (err) {\n // Non-2xx → Cronvello records a failure and retries per the task's maxRetries.\n return resp(500, { ok: false, job: key, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n async function runLocal(key: string, payload?: Record<string, unknown>): Promise<unknown> {\n const job = state.jobs.get(key);\n if (!job) throw new Error(`Unknown job '${key}'. Known: ${[...state.jobs.keys()].join(\", \") || \"(none)\"}`);\n const body: Record<string, unknown> = { job: key, schedule: job.config.schedule, ...(payload ?? {}) };\n const ctx = buildContext(key, job, null, body, false, \"local\");\n const { result } = await invokeHandler(job, ctx);\n return result;\n }\n\n return { handle, runLocal };\n}\n\nasync function runAndReportCallback(\n job: ResolvedJob,\n ctx: CronvelloJobContext,\n callback: CallbackEnvelope,\n secret: string,\n log: CronvelloLogger,\n invokeHandler: (job: ResolvedJob, ctx: CronvelloJobContext) => Promise<{ durationMs: number; result: unknown }>,\n): Promise<void> {\n let payload: Record<string, unknown>;\n try {\n const { durationMs, result } = await invokeHandler(job, ctx);\n payload = { runId: callback.runId, success: true, durationMs, result: result ?? null };\n } catch (err) {\n payload = {\n runId: callback.runId,\n success: false,\n durationMs: 0,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n try {\n const bodyStr = JSON.stringify(payload);\n const header = callback.expectedSignatureHeader || \"X-Webhook-Signature\";\n const signature = await signHmacSha256(bodyStr, secret);\n const res = await fetch(callback.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", [header]: signature },\n body: bodyStr,\n });\n if (!res.ok) {\n log.warn?.(`[cronvello] callback POST for job '${job.key}' returned ${res.status}`);\n }\n } catch (err) {\n log.error?.(`[cronvello] failed to deliver callback for job '${job.key}'`, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/** Run a lifecycle hook, swallowing any error it throws so observability never breaks a job. */\nasync function safeHook(fn: () => void | Promise<void> | undefined, log: CronvelloLogger): Promise<void> {\n try {\n await fn();\n } catch (err) {\n log.warn?.(`[cronvello] a lifecycle hook threw: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\n/** Byte length of a UTF-8 string without allocating a Buffer when TextEncoder is available. */\nfunction byteLength(s: string): number {\n if (!s) return 0;\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(s).length;\n return s.length;\n}\n\nfunction readCallback(value: unknown): CallbackEnvelope | null {\n if (!value || typeof value !== \"object\") return null;\n const v = value as Record<string, unknown>;\n if (typeof v[\"url\"] !== \"string\" || typeof v[\"runId\"] !== \"string\") return null;\n return {\n url: v[\"url\"] as string,\n runId: v[\"runId\"] as string,\n ...(typeof v[\"expectedSignatureHeader\"] === \"string\"\n ? { expectedSignatureHeader: v[\"expectedSignatureHeader\"] as string }\n : {}),\n ...(typeof v[\"timeoutMs\"] === \"number\" ? { timeoutMs: v[\"timeoutMs\"] as number } : {}),\n };\n}\n\nfunction resp(status: number, body: Record<string, unknown>): DispatchResponse {\n return { status, body };\n}\n","/**\n * Idempotent reconciliation of a code registry into Cronvello.\n *\n * Model: ONE Job container per app (named `appName`), and one Task per registry job. The\n * Task's `name` IS the registry key — the stable identity used for matching, so renaming a\n * job's display/description never breaks the link. On each `sync()` we:\n * 1. ensure the Job container exists,\n * 2. diff registry tasks against the container's current tasks,\n * 3. create missing, patch changed, (optionally) delete removed,\n * 4. start newly-created tasks (Cronvello creates them DISABLED).\n *\n * The container is fully SDK-managed: only tasks inside THIS app's Job are ever touched.\n */\n\nimport type { CronvelloClient } from \"../client/client.js\";\nimport type {\n PublicJob,\n PublicTask,\n SuccessCriteria,\n TaskCreateBody,\n TaskUpdateBody,\n} from \"../internal/wire.js\";\nimport type {\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./types.js\";\nimport type { ResolvedJob } from \"./dispatch.js\";\n\nexport interface ReconcileInput {\n client: CronvelloClient;\n appName: string;\n appDescription?: string;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n jobs: ResolvedJob[];\n}\n\nexport async function reconcile(input: ReconcileInput, options: SyncOptions = {}): Promise<ReconcileResult> {\n const { client, appName, dispatchUrl, dispatchSecret, defaultTimeZone, jobs } = input;\n const prune = options.prune ?? true;\n const dryRun = options.dryRun ?? false;\n const rotateSecret = options.rotateSecret ?? false;\n\n // 1. Ensure the Job container.\n const { job: container, created: jobCreated } = await ensureContainer(client, appName, input.appDescription, dryRun);\n const jobId = container?.id ?? \"(dry-run)\";\n\n const changes: ReconcileTaskChange[] = [];\n const existingTasks = container && !jobCreated ? await client.jobs.listTasks(container.id) : [];\n const byKey = new Map(existingTasks.map((t) => [t.name, t] as const));\n const registryKeys = new Set(jobs.map((j) => j.key));\n\n // 2. Reconcile each registry job.\n for (const job of jobs) {\n const enabled = job.config.enabled ?? true;\n const existing = byKey.get(job.key);\n const desired = buildDesiredTask({ job, dispatchUrl, dispatchSecret, defaultTimeZone });\n\n if (!enabled) {\n // Keep the task but make sure it is not scheduled.\n if (existing && existing.status === \"ACTIVE\" && !dryRun) await client.tasks.stop(existing.id);\n changes.push({ key: job.key, action: \"skipped\", taskId: existing?.id ?? null, reason: \"disabled in registry\" });\n continue;\n }\n\n if (!existing) {\n if (dryRun || !container) {\n changes.push({ key: job.key, action: \"created\", taskId: null });\n continue;\n }\n const createBody: TaskCreateBody = { ...desired, targetToken: dispatchSecret };\n const task = await client.jobs.createTask(container.id, createBody, { idempotencyKey: `cv-create-${appName}-${job.key}` });\n await client.tasks.start(task.id); // tasks are created DISABLED\n changes.push({ key: job.key, action: \"created\", taskId: task.id });\n continue;\n }\n\n // Existing task — compute the diff.\n const { patch, changedFields } = diffTask(existing, desired, { rotateSecret, dispatchSecret });\n const needsStart = existing.status === \"DISABLED\";\n\n if (changedFields.length === 0 && !needsStart) {\n changes.push({ key: job.key, action: \"unchanged\", taskId: existing.id });\n continue;\n }\n if (!dryRun) {\n if (changedFields.length > 0) await client.tasks.update(existing.id, patch);\n if (needsStart) await client.tasks.start(existing.id);\n }\n changes.push({\n key: job.key,\n action: changedFields.length > 0 ? \"updated\" : \"unchanged\",\n taskId: existing.id,\n ...(changedFields.length > 0 ? { changedFields } : {}),\n ...(needsStart ? { reason: \"re-activated\" } : {}),\n });\n }\n\n // 3. Prune tasks no longer in the registry.\n if (prune) {\n for (const task of existingTasks) {\n if (registryKeys.has(task.name)) continue;\n if (!dryRun) await client.tasks.delete(task.id);\n changes.push({ key: task.name, action: \"deleted\", taskId: task.id });\n }\n }\n\n return summarize(jobId, appName, jobCreated, changes);\n}\n\nasync function ensureContainer(\n client: CronvelloClient,\n appName: string,\n description: string | undefined,\n dryRun: boolean,\n): Promise<{ job: PublicJob | null; created: boolean }> {\n const jobs = await client.jobs.list();\n const found = jobs.find((j) => j.name === appName);\n if (found) return { job: found, created: false };\n if (dryRun) return { job: null, created: true };\n const created = await client.jobs.create(\n { name: appName, ...(description ? { description } : {}) },\n { idempotencyKey: `cv-job-${appName}` },\n );\n return { job: created, created: true };\n}\n\nfunction buildDesiredTask(args: {\n job: ResolvedJob;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n}): TaskCreateBody {\n const { job, dispatchUrl, defaultTimeZone } = args;\n const cfg = job.config;\n const requestBody = JSON.stringify({ job: job.key, ...(cfg.payload ?? {}) });\n const body: TaskCreateBody = {\n name: job.key,\n schedule: cfg.schedule,\n timeZone: cfg.timeZone ?? defaultTimeZone,\n targetUrl: dispatchUrl,\n method: \"POST\",\n requestBody,\n };\n if (cfg.description !== undefined) body.description = cfg.description;\n if (cfg.urgency !== undefined) body.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) body.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) body.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) body.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) body.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) body.successCriteria = cfg.successCriteria;\n return body;\n}\n\nfunction diffTask(\n existing: PublicTask,\n desired: TaskCreateBody,\n opts: { rotateSecret: boolean; dispatchSecret: string },\n): { patch: TaskUpdateBody; changedFields: string[] } {\n const patch: TaskUpdateBody = {};\n const changed: string[] = [];\n\n const set = <K extends keyof TaskUpdateBody>(field: K, value: TaskUpdateBody[K]) => {\n patch[field] = value;\n changed.push(field);\n };\n\n if (existing.schedule !== desired.schedule) set(\"schedule\", desired.schedule);\n if (desired.timeZone !== undefined && existing.timeZone !== desired.timeZone) set(\"timeZone\", desired.timeZone);\n if (existing.targetUrl !== desired.targetUrl) set(\"targetUrl\", desired.targetUrl);\n if (existing.method !== (desired.method ?? \"POST\")) set(\"method\", desired.method ?? \"POST\");\n if (!jsonEqual(existing.requestBody, desired.requestBody)) set(\"requestBody\", desired.requestBody ?? null);\n\n // Optional fields: only reconcile when the registry explicitly sets them.\n if (desired.description !== undefined && (existing.description ?? undefined) !== desired.description) {\n set(\"description\", desired.description);\n }\n if (desired.urgency !== undefined && existing.urgency !== desired.urgency) set(\"urgency\", desired.urgency);\n if (desired.maxRetries !== undefined && existing.maxRetries !== desired.maxRetries) set(\"maxRetries\", desired.maxRetries);\n if (desired.executionMode !== undefined && existing.executionMode !== desired.executionMode) {\n set(\"executionMode\", desired.executionMode);\n }\n if (desired.callbackTimeoutMs !== undefined && existing.callbackTimeoutMs !== desired.callbackTimeoutMs) {\n set(\"callbackTimeoutMs\", desired.callbackTimeoutMs);\n }\n if (desired.allowConcurrentRuns !== undefined && existing.allowConcurrentRuns !== desired.allowConcurrentRuns) {\n set(\"allowConcurrentRuns\", desired.allowConcurrentRuns);\n }\n if (desired.successCriteria !== undefined && !deepEqual(existing.successCriteria, desired.successCriteria)) {\n set(\"successCriteria\", desired.successCriteria as SuccessCriteria);\n }\n\n // The dispatch secret (targetToken) can't be read back — only (re)set it on demand or when absent.\n if (opts.rotateSecret || !existing.hasTargetToken) set(\"targetToken\", opts.dispatchSecret);\n\n return { patch, changedFields: changed };\n}\n\nfunction jsonEqual(a: string | null, b: string | null | undefined): boolean {\n if (a == null || b == null) return a == b;\n try {\n return deepEqual(JSON.parse(a), JSON.parse(b));\n } catch {\n return a === b;\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n const ak = Object.keys(a as object).sort();\n const bk = Object.keys(b as object).sort();\n if (ak.length !== bk.length) return false;\n for (let i = 0; i < ak.length; i++) {\n if (ak[i] !== bk[i]) return false;\n if (!deepEqual((a as Record<string, unknown>)[ak[i]!], (b as Record<string, unknown>)[bk[i]!])) return false;\n }\n return true;\n}\n\nfunction summarize(\n jobId: string,\n jobName: string,\n jobCreated: boolean,\n changes: ReconcileTaskChange[],\n): ReconcileResult {\n const count = (a: ReconcileTaskChange[\"action\"]) => changes.filter((c) => c.action === a).length;\n return {\n jobId,\n jobName,\n jobCreated,\n created: count(\"created\"),\n updated: count(\"updated\"),\n unchanged: count(\"unchanged\"),\n deleted: count(\"deleted\"),\n skipped: count(\"skipped\"),\n changes,\n };\n}\n","/**\n * Express adapter. Zero dependency on `express` itself — the request/response are typed\n * structurally, so this works with Express 4/5 and any Connect-style middleware stack.\n *\n * import { defineCronvello } from \"@cronvello/sdk\";\n * import { expressHandler } from \"@cronvello/sdk/express\";\n *\n * app.post(\"/cronvello/dispatch\", express.json(), expressHandler(cronvello));\n * // …or simply: app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n *\n * Works with or without `express.json()` — if the body isn't pre-parsed, the raw stream is read.\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\nexport interface ExpressRequestLike {\n method?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n on?(event: string, listener: (chunk?: unknown) => void): void;\n}\n\nexport interface ExpressResponseLike {\n status(code: number): ExpressResponseLike;\n json(body: unknown): void;\n}\n\nexport type ExpressDispatchHandler = (req: ExpressRequestLike, res: ExpressResponseLike) => Promise<void>;\n\nexport function expressHandler(app: DispatchHandler): ExpressDispatchHandler {\n return async (req, res) => {\n const rawBody = await readBody(req);\n const result = await app.handle({\n method: req.method ?? \"POST\",\n authorization: headerValue(req.headers[\"authorization\"]),\n rawBody,\n headers: flattenHeaders(req.headers),\n });\n res.status(result.status).json(result.body);\n };\n}\n\nasync function readBody(req: ExpressRequestLike): Promise<string> {\n const body = req.body;\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\") return body;\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) return body.toString(\"utf8\");\n if (typeof body === \"object\") return JSON.stringify(body);\n }\n if (typeof req.on !== \"function\") return \"\";\n return new Promise<string>((resolve) => {\n let data = \"\";\n req.on!(\"data\", (chunk?: unknown) => {\n data += typeof chunk === \"string\" ? chunk : String(chunk ?? \"\");\n });\n req.on!(\"end\", () => resolve(data));\n req.on!(\"error\", () => resolve(data));\n });\n}\n\nfunction headerValue(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) return value[0];\n return value;\n}\n\nfunction flattenHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined) continue;\n out[k.toLowerCase()] = Array.isArray(v) ? v.join(\", \") : v;\n }\n return out;\n}\n","/**\n * Next.js App Router adapter (Route Handlers). Zero dependency on `next` — uses the Web\n * Fetch `Request`/`Response` globals (Node 18+ and the edge runtime).\n *\n * // app/cronvello/dispatch/route.ts\n * import { cronvello } from \"@/lib/cronvello\";\n * import { nextHandler } from \"@cronvello/sdk/next\";\n * export const POST = nextHandler(cronvello);\n *\n * On serverless hosts, prefer the default sync execution mode so the work finishes within the\n * request. async_callback needs a host that keeps running after the response (see docs).\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\n/** Structural subset of the Web Fetch `Request` we rely on. */\nexport interface FetchRequestLike {\n method: string;\n headers: {\n get(name: string): string | null;\n forEach?(cb: (value: string, key: string) => void): void;\n };\n text(): Promise<string>;\n}\n\nexport type NextRouteHandler = (req: FetchRequestLike) => Promise<Response>;\n\nexport function nextHandler(app: DispatchHandler): NextRouteHandler {\n return async (req) => {\n const rawBody = await req.text();\n const headers: Record<string, string> = {};\n req.headers.forEach?.((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n const result = await app.handle({\n method: req.method,\n authorization: req.headers.get(\"authorization\") ?? undefined,\n rawBody,\n headers,\n });\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n","/**\n * `defineCronvello` — the high-level, code-first entry point.\n *\n * export const cronvello = defineCronvello({\n * appName: \"my-app\",\n * appUrl: process.env.APP_URL!,\n * apiKey: process.env.CRONVELLO_API_KEY!,\n * dispatchSecret: process.env.CRONVELLO_DISPATCH_SECRET!,\n * jobs: {\n * \"send-daily-digest\": { schedule: \"0 8 * * *\", handler: async () => { … } },\n * \"cleanup-temp\": { schedule: \"*\\/15 * * * *\", handler: async () => { … } },\n * },\n * });\n *\n * await cronvello.sync(); // reconcile the registry to Cronvello (idempotent)\n * app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n */\n\nimport { CronvelloClient, CRONVELLO_DEFAULT_BASE_URL } from \"../client/client.js\";\nimport { CronvelloApiError, CronvelloConfigError } from \"../internal/errors.js\";\nimport { validateCron, isValidTimeZone } from \"../internal/cron.js\";\nimport type { RegistryReconcileRequest, RegistryTaskInput, RunNowResult } from \"../internal/wire.js\";\nimport { createDispatcher, type DispatchRequest, type DispatchResponse, type ResolvedJob } from \"./dispatch.js\";\nimport { reconcile } from \"./reconcile.js\";\nimport { expressHandler, type ExpressDispatchHandler } from \"../adapters/express.js\";\nimport { nextHandler, type NextRouteHandler } from \"../adapters/next.js\";\nimport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobsInput,\n ReconcileResult,\n SyncOptions,\n} from \"./types.js\";\n\nconst DEFAULT_DISPATCH_PATH = \"/cronvello/dispatch\";\nconst DEFAULT_TIME_ZONE = \"Europe/Berlin\";\n\nexport interface CronvelloApp {\n /** The underlying low-level client for ad-hoc `/v1` calls. */\n readonly client: CronvelloClient;\n /** Resolved jobs, keyed by their stable registry key. */\n readonly jobs: ReadonlyMap<string, ResolvedJob>;\n /** The app identity / Job-container name. */\n readonly appName: string;\n /** Path the dispatch handler should be mounted at (e.g. \"/cronvello/dispatch\"). */\n readonly dispatchPath: string;\n /** Absolute URL Cronvello calls back (appUrl + dispatchPath). */\n readonly dispatchUrl: string;\n\n /** Reconcile the registry into Cronvello. Idempotent — safe to call on every boot/deploy. */\n sync(options?: SyncOptions): Promise<ReconcileResult>;\n /** Trigger one job immediately via Cronvello (manual run). Requires a prior `sync()`. */\n run(key: string): Promise<RunNowResult>;\n /**\n * Run a job's handler locally, in-process — no HTTP round-trip, no Cronvello, no deploy.\n * Perfect for unit tests and `npx cronvello dev`. Lifecycle hooks fire (`source: \"local\"`).\n */\n trigger(key: string, payload?: Record<string, unknown>): Promise<unknown>;\n /** Framework-neutral dispatch entry — used by the adapters. */\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /** Express/Connect request handler for the dispatch endpoint. */\n expressHandler(): ExpressDispatchHandler;\n /** Next.js App Router (Route Handler) for the dispatch endpoint. */\n nextHandler(): NextRouteHandler;\n /** The registry keys, for diagnostics. */\n keys(): string[];\n}\n\nexport function defineCronvello(config: CronvelloAppConfig): CronvelloApp {\n validateConfig(config);\n\n const validate = config.validateSchedules ?? true;\n const defaultTimeZone = config.timeZone ?? DEFAULT_TIME_ZONE;\n if (validate && !isValidTimeZone(defaultTimeZone)) {\n throw new CronvelloConfigError(`Invalid \\`timeZone\\` \"${defaultTimeZone}\" — expected an IANA name like \"Europe/Berlin\" or \"UTC\".`);\n }\n\n const jobs = normalizeJobs(config.jobs, validate);\n const dispatchPath = normalizePath(config.dispatchPath ?? DEFAULT_DISPATCH_PATH);\n const dispatchUrl = joinUrl(config.appUrl, dispatchPath);\n\n const client = new CronvelloClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL,\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n ...(config.maxRetries !== undefined ? { maxRetries: config.maxRetries } : {}),\n ...(config.fetch ? { fetch: config.fetch } : {}),\n });\n\n const dispatcher = createDispatcher({\n jobs,\n dispatchSecret: config.dispatchSecret,\n logger: config.logger,\n ...(config.hooks ? { hooks: config.hooks } : {}),\n ...(config.maxBodyBytes !== undefined ? { maxBodyBytes: config.maxBodyBytes } : {}),\n });\n\n const app: CronvelloApp = {\n client,\n jobs,\n appName: config.appName,\n dispatchPath,\n dispatchUrl,\n\n async sync(options?: SyncOptions): Promise<ReconcileResult> {\n const opts = options ?? {};\n // Prefer the atomic server-side reconcile (one round-trip). dryRun is only supported by\n // the local differ, so it always takes the client-side path.\n if (!opts.dryRun) {\n try {\n const res = await client.reconcileRegistry(\n buildRegistryRequest(config, dispatchUrl, defaultTimeZone, [...jobs.values()], opts),\n );\n return {\n jobId: res.job.id,\n jobName: res.job.name,\n jobCreated: res.jobCreated,\n created: res.created,\n updated: res.updated,\n unchanged: res.unchanged,\n deleted: res.deleted,\n skipped: res.skipped,\n changes: res.changes.map((c) => ({\n key: c.key,\n action: c.action,\n taskId: c.taskId,\n ...(c.changedFields ? { changedFields: c.changedFields } : {}),\n })),\n tasks: res.tasks,\n };\n } catch (e) {\n // Older server without /v1/registry → fall back to the client-side differ.\n if (!(e instanceof CronvelloApiError) || (e.status !== 404 && e.status !== 405)) throw e;\n }\n }\n return reconcile(\n {\n client,\n appName: config.appName,\n dispatchUrl,\n dispatchSecret: config.dispatchSecret,\n defaultTimeZone,\n jobs: [...jobs.values()],\n },\n opts,\n );\n },\n\n async run(key: string): Promise<RunNowResult> {\n if (!jobs.has(key)) {\n throw new CronvelloConfigError(`Unknown job '${key}'. Known: ${[...jobs.keys()].join(\", \") || \"(none)\"}`);\n }\n const containers = await client.jobs.list();\n const container = containers.find((j) => j.name === config.appName);\n if (!container) {\n throw new CronvelloConfigError(`App '${config.appName}' is not synced yet — call sync() first.`);\n }\n const tasks = await client.jobs.listTasks(container.id);\n const task = tasks.find((t) => t.name === key);\n if (!task) {\n throw new CronvelloConfigError(`Job '${key}' has no task yet — call sync() first.`);\n }\n return client.tasks.runNow(task.id);\n },\n\n trigger: (key: string, payload?: Record<string, unknown>) => dispatcher.runLocal(key, payload),\n handle: dispatcher.handle,\n expressHandler: () => expressHandler(app),\n nextHandler: () => nextHandler(app),\n keys: () => [...jobs.keys()],\n };\n\n return app;\n}\n\n/** Config for `defineCronvello.fromEnv` — the three secret fields become optional (read from env). */\nexport type CronvelloEnvConfig = Omit<CronvelloAppConfig, \"apiKey\" | \"dispatchSecret\" | \"appUrl\"> &\n Partial<Pick<CronvelloAppConfig, \"apiKey\" | \"dispatchSecret\" | \"appUrl\">>;\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace defineCronvello {\n /**\n * Build an app from environment variables, so you don't repeat the same reads in every service.\n * Reads `CRONVELLO_API_KEY`, `CRONVELLO_DISPATCH_SECRET`, `CRONVELLO_APP_URL` (or `PUBLIC_URL`),\n * and optionally `CRONVELLO_API_URL` (base URL). Anything passed explicitly overrides the env.\n *\n * export const cronvello = defineCronvello.fromEnv({ appName: \"my-app\", jobs: { … } });\n */\n export function fromEnv(\n config: CronvelloEnvConfig,\n env: Record<string, string | undefined> = typeof process !== \"undefined\" ? process.env : {},\n ): CronvelloApp {\n const apiKey = config.apiKey ?? env[\"CRONVELLO_API_KEY\"];\n const dispatchSecret = config.dispatchSecret ?? env[\"CRONVELLO_DISPATCH_SECRET\"];\n const appUrl = config.appUrl ?? env[\"CRONVELLO_APP_URL\"] ?? env[\"PUBLIC_URL\"];\n const baseUrl = config.baseUrl ?? env[\"CRONVELLO_API_URL\"];\n\n const missing = [\n !apiKey && \"CRONVELLO_API_KEY\",\n !dispatchSecret && \"CRONVELLO_DISPATCH_SECRET\",\n !appUrl && \"CRONVELLO_APP_URL (or PUBLIC_URL)\",\n ].filter(Boolean);\n if (missing.length) {\n throw new CronvelloConfigError(`defineCronvello.fromEnv() is missing required env: ${missing.join(\", \")}.`);\n }\n\n return defineCronvello({\n ...config,\n apiKey: apiKey!,\n dispatchSecret: dispatchSecret!,\n appUrl: appUrl!,\n ...(baseUrl ? { baseUrl } : {}),\n });\n }\n}\n\nfunction validateConfig(config: CronvelloAppConfig): void {\n if (!config) throw new CronvelloConfigError(\"defineCronvello requires a config object.\");\n if (!config.appName || !config.appName.trim()) throw new CronvelloConfigError(\"`appName` is required.\");\n if (!config.appUrl || !/^https?:\\/\\//i.test(config.appUrl)) {\n throw new CronvelloConfigError(\"`appUrl` must be an absolute http(s) URL (the public URL of THIS app).\");\n }\n if (!config.apiKey) throw new CronvelloConfigError(\"`apiKey` (crn_live_…) is required.\");\n if (!config.dispatchSecret || config.dispatchSecret.length < 16) {\n throw new CronvelloConfigError(\"`dispatchSecret` is required and must be at least 16 chars (use a random 32-byte value).\");\n }\n if (!config.jobs) throw new CronvelloConfigError(\"`jobs` is required.\");\n}\n\nfunction normalizeJobs(input: CronvelloJobsInput, validate: boolean): Map<string, ResolvedJob> {\n const map = new Map<string, ResolvedJob>();\n const entries: Array<{ key: string; config: CronvelloJobConfig }> = Array.isArray(input)\n ? input.map(({ key, ...rest }) => ({ key, config: rest }))\n : Object.entries(input).map(([key, config]) => ({ key, config }));\n\n for (const { key, config } of entries) {\n const trimmed = (key ?? \"\").trim();\n if (!trimmed) throw new CronvelloConfigError(\"Every job needs a non-empty key.\");\n if (trimmed.length > 255) throw new CronvelloConfigError(`Job key '${trimmed}' exceeds 255 characters.`);\n if (map.has(trimmed)) throw new CronvelloConfigError(`Duplicate job key '${trimmed}'.`);\n if (!config || typeof config.handler !== \"function\") {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a handler function.`);\n }\n if (!config.schedule || !config.schedule.trim()) {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a schedule.`);\n }\n if (validate) {\n const cronCheck = validateCron(config.schedule);\n if (!cronCheck.valid) {\n throw new CronvelloConfigError(`Job '${trimmed}' has an invalid schedule \"${config.schedule}\" — ${cronCheck.error}.`);\n }\n if (config.timeZone !== undefined && !isValidTimeZone(config.timeZone)) {\n throw new CronvelloConfigError(`Job '${trimmed}' has an invalid timeZone \"${config.timeZone}\" — expected an IANA name.`);\n }\n }\n map.set(trimmed, { key: trimmed, config });\n }\n if (map.size === 0) throw new CronvelloConfigError(\"At least one job is required.\");\n return map;\n}\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n return trimmed.startsWith(\"/\") ? trimmed.replace(/\\/+$/, \"\") || \"/\" : `/${trimmed.replace(/\\/+$/, \"\")}`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, \"\")}${path}`;\n}\n\n/** Build the PUT /v1/registry body from the registry jobs. */\nfunction buildRegistryRequest(\n config: CronvelloAppConfig,\n dispatchUrl: string,\n defaultTimeZone: string,\n jobs: ResolvedJob[],\n opts: SyncOptions,\n): RegistryReconcileRequest {\n const tasks: RegistryTaskInput[] = jobs.map((j) => {\n const cfg = j.config;\n const task: RegistryTaskInput = {\n key: j.key,\n schedule: cfg.schedule,\n targetUrl: dispatchUrl,\n targetToken: config.dispatchSecret,\n method: \"POST\",\n timeZone: cfg.timeZone ?? defaultTimeZone,\n requestBody: JSON.stringify({ job: j.key, ...(cfg.payload ?? {}) }),\n };\n if (cfg.description !== undefined) task.description = cfg.description;\n if (cfg.urgency !== undefined) task.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) task.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) task.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) task.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) task.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) task.successCriteria = cfg.successCriteria;\n if (cfg.enabled !== undefined) task.enabled = cfg.enabled;\n return task;\n });\n return {\n appName: config.appName,\n tasks,\n prune: opts.prune ?? true,\n rotateSecret: opts.rotateSecret ?? false,\n };\n}\n","/**\n * Render a `ReconcileResult` as a clean, human-readable summary — for boot logs, CI output, and\n * `npx cronvello sync`. Zero-dependency ANSI colouring, opt-in via `color: true`.\n */\n\nimport type { ReconcileResult, ReconcileTaskChange } from \"./types.js\";\n\nexport interface FormatOptions {\n /** Emit ANSI colour codes (default false — safe for log files). */\n color?: boolean;\n /** Label the summary as a preview (\"would …\") rather than an applied change. */\n dryRun?: boolean;\n}\n\nconst ESC = String.fromCharCode(27); // ANSI escape\nconst ANSI = {\n reset: `${ESC}[0m`,\n dim: `${ESC}[2m`,\n bold: `${ESC}[1m`,\n green: `${ESC}[32m`,\n yellow: `${ESC}[33m`,\n red: `${ESC}[31m`,\n cyan: `${ESC}[36m`,\n gray: `${ESC}[90m`,\n} as const;\n\ntype Color = keyof typeof ANSI;\n\nconst GLYPH: Record<ReconcileTaskChange[\"action\"], { sign: string; color: Color }> = {\n created: { sign: \"+\", color: \"green\" },\n updated: { sign: \"~\", color: \"yellow\" },\n unchanged: { sign: \"=\", color: \"gray\" },\n deleted: { sign: \"-\", color: \"red\" },\n skipped: { sign: \"·\", color: \"cyan\" },\n};\n\n/** Build the multi-line summary string. */\nexport function formatSyncResult(result: ReconcileResult, options: FormatOptions = {}): string {\n const paint = (s: string, c: Color) => (options.color ? `${ANSI[c]}${s}${ANSI.reset}` : s);\n const verb = options.dryRun ? \"would sync\" : \"synced\";\n const lines: string[] = [];\n\n lines.push(\n `${paint(\"Cronvello\", \"cyan\")} ${verb} ${paint(`\"${result.jobName}\"`, \"bold\")} ${paint(`(${result.jobId})`, \"gray\")}`,\n );\n\n // Per-task lines, in a stable, readable order.\n const order: ReconcileTaskChange[\"action\"][] = [\"created\", \"updated\", \"deleted\", \"skipped\", \"unchanged\"];\n const sorted = [...result.changes].sort((a, b) => order.indexOf(a.action) - order.indexOf(b.action));\n for (const c of sorted) {\n const g = GLYPH[c.action];\n const detail =\n c.changedFields && c.changedFields.length\n ? paint(` (${c.changedFields.join(\", \")})`, \"gray\")\n : c.reason\n ? paint(` (${c.reason})`, \"gray\")\n : \"\";\n lines.push(` ${paint(g.sign, g.color)} ${paint(c.action.padEnd(9), g.color)} ${c.key}${detail}`);\n }\n\n const tally = [\n result.created && `${result.created} created`,\n result.updated && `${result.updated} updated`,\n result.unchanged && `${result.unchanged} unchanged`,\n result.deleted && `${result.deleted} deleted`,\n result.skipped && `${result.skipped} skipped`,\n ].filter(Boolean);\n const summary = tally.length ? tally.join(\", \") : \"no changes\";\n const containerNote = result.jobCreated ? paint(\" · container created\", \"gray\") : \"\";\n lines.push(` ${paint(summary, \"bold\")}${containerNote}`);\n\n return lines.join(\"\\n\");\n}\n","/**\n * Human-friendly schedule builders. Each returns a plain cron string (so it drops straight into a\n * job's `schedule`), validated on the way out — a bad argument throws immediately with a clear\n * message instead of silently producing a wrong schedule.\n *\n * import { every, daily, weekly, hourly, cron } from \"@cronvello/sdk\";\n *\n * jobs: {\n * \"digest\": { schedule: daily(\"08:00\"), handler },\n * \"poll\": { schedule: every(\"15m\"), handler },\n * \"report\": { schedule: weekly(\"mon\", \"09:00\"),handler },\n * \"beat\": { schedule: hourly(), handler },\n * \"custom\": { schedule: cron(\"0 0 1 * *\"), handler },\n * }\n */\n\nimport { assertValidCron } from \"../internal/cron.js\";\n\nexport type Weekday = \"sun\" | \"mon\" | \"tue\" | \"wed\" | \"thu\" | \"fri\" | \"sat\" | 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nconst DOW: Record<string, number> = { sun: 0, mon: 1, tue: 2, wed: 3, thu: 4, fri: 5, sat: 6 };\n\n/** Validate a raw cron expression and return it unchanged. The explicit escape hatch. */\nexport function cron(expression: string): string {\n assertValidCron(expression, \"cron()\");\n return expression;\n}\n\n/**\n * A recurring interval expressed as `<n><unit>` where unit is `s`, `m`, `h`, or `d`.\n * every(\"30s\") → every 30 seconds every(\"15m\") → every 15 minutes\n * every(\"2h\") → every 2 hours every(\"1d\") → daily at midnight\n * Note: sub-hour intervals that don't divide evenly (e.g. 7m) restart each hour, matching cron.\n */\nexport function every(interval: string): string {\n const m = /^(\\d+)\\s*(s|sec|secs|m|min|mins|h|hr|hrs|hour|hours|d|day|days)$/i.exec(interval.trim());\n if (!m) throw new Error(`every(): cannot parse interval \"${interval}\" — use forms like \"30s\", \"15m\", \"2h\", \"1d\"`);\n const n = Number(m[1]);\n const unit = m[2]!.toLowerCase()[0]; // s | m | h | d\n if (n < 1) throw new Error(`every(): interval must be at least 1, got ${n}`);\n\n let expr: string;\n if (unit === \"s\") {\n if (n > 59) throw new Error(`every(): seconds must be 1–59, got ${n}`);\n expr = `*/${n} * * * * *`; // 6-field (seconds)\n } else if (unit === \"m\") {\n if (n > 59) throw new Error(`every(): minutes must be 1–59 (use \"1h\" for 60), got ${n}`);\n expr = `*/${n} * * * *`;\n } else if (unit === \"h\") {\n if (n > 23) throw new Error(`every(): hours must be 1–23 (use \"1d\" for 24), got ${n}`);\n expr = `0 */${n} * * *`;\n } else {\n if (n > 31) throw new Error(`every(): days must be 1–31, got ${n}`);\n expr = n === 1 ? `0 0 * * *` : `0 0 */${n} * *`;\n }\n assertValidCron(expr, `every(\"${interval}\")`);\n return expr;\n}\n\n/** Every N minutes (1–59). */\nexport function everyMinutes(n: number): string {\n return every(`${n}m`);\n}\n\n/** Every N hours (1–23). */\nexport function everyHours(n: number): string {\n return every(`${n}h`);\n}\n\n/** Once an hour, at the given minute past (default :00). */\nexport function hourly(minute = 0): string {\n const mm = field(minute, 0, 59, \"minute\");\n return cron(`${mm} * * * *`);\n}\n\n/** Once a day at \"HH:MM\" (24h, default midnight). */\nexport function daily(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * *`);\n}\n\n/** Once a week on `day` at \"HH:MM\". */\nexport function weekly(day: Weekday, time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * ${weekday(day)}`);\n}\n\n/** Once a month on `dayOfMonth` (1–31) at \"HH:MM\". */\nexport function monthly(dayOfMonth: number, time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n const dom = field(dayOfMonth, 1, 31, \"day-of-month\");\n return cron(`${mm} ${hh} ${dom} * *`);\n}\n\n/** Monday–Friday at \"HH:MM\". */\nexport function weekdays(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * 1-5`);\n}\n\n/** Saturday & Sunday at \"HH:MM\". */\nexport function weekends(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * 0,6`);\n}\n\n/** Namespace form for discoverability: `import { schedule } from \"@cronvello/sdk\"`. */\nexport const schedule = {\n cron, every, everyMinutes, everyHours, hourly, daily, weekly, monthly, weekdays, weekends,\n};\n\nfunction parseTime(time: string): { hh: number; mm: number } {\n const m = /^(\\d{1,2}):(\\d{2})$/.exec(time.trim());\n if (!m) throw new Error(`Expected a time like \"08:00\" or \"23:30\", got \"${time}\"`);\n const hh = Number(m[1]);\n const mm = Number(m[2]);\n if (hh > 23) throw new Error(`Hour must be 0–23, got ${hh}`);\n if (mm > 59) throw new Error(`Minute must be 0–59, got ${mm}`);\n return { hh, mm };\n}\n\nfunction weekday(day: Weekday): number {\n if (typeof day === \"number\") {\n if (day < 0 || day > 6) throw new Error(`Weekday number must be 0 (Sun) – 6 (Sat), got ${day}`);\n return day;\n }\n const n = DOW[day.toLowerCase()];\n if (n === undefined) throw new Error(`Unknown weekday \"${day}\" — use sun…sat or 0…6`);\n return n;\n}\n\nfunction field(value: number, min: number, max: number, label: string): number {\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`${label} must be an integer ${min}–${max}, got ${value}`);\n }\n return value;\n}\n","/**\n * @cronvello/sdk — code-first cron jobs for Cronvello.\n *\n * Two layers, one package:\n * • High-level registry: `defineCronvello({ jobs })` → `.sync()` + `.expressHandler()` / `.nextHandler()`.\n * Define jobs in code; the SDK reconciles them to https://api.cronvello.com and runs them.\n * • Low-level client: `new CronvelloClient({ apiKey })` → typed access to the whole `/v1` API.\n */\n\n// ── High-level registry ────────────────────────────────────────────────────\nexport { defineCronvello, type CronvelloApp, type CronvelloEnvConfig } from \"./registry/define.js\";\nexport { formatSyncResult, type FormatOptions } from \"./registry/format.js\";\nexport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobConfigWithKey,\n CronvelloJobsInput,\n CronvelloJobContext,\n CronvelloJobHandler,\n CronvelloLogger,\n CronvelloHooks,\n CronvelloRunSource,\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./registry/types.js\";\nexport type { DispatchRequest, DispatchResponse } from \"./registry/dispatch.js\";\n\n// ── Schedule builders ──────────────────────────────────────────────────────\nexport {\n cron,\n every,\n everyMinutes,\n everyHours,\n hourly,\n daily,\n weekly,\n monthly,\n weekdays,\n weekends,\n schedule,\n type Weekday,\n} from \"./schedule/index.js\";\nexport { validateCron, isValidTimeZone, type CronValidation } from \"./internal/cron.js\";\n\n// ── Low-level client ───────────────────────────────────────────────────────\nexport {\n CronvelloClient,\n CRONVELLO_DEFAULT_BASE_URL,\n type CronvelloClientOptions,\n} from \"./client/client.js\";\n\n// ── Errors ─────────────────────────────────────────────────────────────────\nexport {\n CronvelloError,\n CronvelloApiError,\n CronvelloNetworkError,\n CronvelloConfigError,\n} from \"./internal/errors.js\";\n\n// ── Wire types ─────────────────────────────────────────────────────────────\nexport type {\n Urgency,\n ExecutionMode,\n HttpMethod,\n JobStatus,\n RunStatus,\n RunType,\n CallbackStatus,\n SuccessCriteria,\n PublicJob,\n PublicTask,\n PublicRun,\n JobCreateBody,\n JobUpdateBody,\n TaskCreateBody,\n TaskUpdateBody,\n RunsPage,\n TasksPage,\n RunNowResult,\n RegistryTaskInput,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RegistryReconcileChange,\n MeResponse,\n UsageResponse,\n Pagination,\n RunsQuery,\n AccountTasksQuery,\n AccountRunsQuery,\n} from \"./internal/wire.js\";\n\n/**\n * Generate a strong random dispatch secret (hex). Convenience for setup scripts:\n * node -e \"console.log(require('@cronvello/sdk').generateDispatchSecret())\"\n */\nexport function generateDispatchSecret(bytes = 32): string {\n const buf = new Uint8Array(bytes);\n crypto.getRandomValues(buf);\n return Array.from(buf)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/errors.ts","../src/internal/http.ts","../src/client/client.ts","../src/internal/cron.ts","../src/registry/verify.ts","../src/registry/dispatch.ts","../src/registry/reconcile.ts","../src/adapters/express.ts","../src/adapters/next.ts","../src/registry/define.ts","../src/registry/format.ts","../src/schedule/index.ts","../src/index.ts"],"names":["field","headerValue","defineCronvello"],"mappings":";;;AAKO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACxC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAEZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAGO,IAAM,iBAAA,GAAN,cAAgC,cAAA,CAAe;AAAA;AAAA,EAE3C,MAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,iBAAA;AAAA,EAET,YAAY,IAAA,EAOT;AACD,IAAA,KAAA,CAAM,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,EAAA,EAAK,KAAK,QAAQ,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC1D,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK,iBAAA;AAC9B,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AAAA,EAEA,IAAI,aAAA,GAAyB;AAC3B,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AAAA,EAEA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,IAAA,CAAK,MAAA,KAAW,GAAA;AAAA,EAChD;AAAA,EAEA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AACF;AAGO,IAAM,qBAAA,GAAN,cAAoC,cAAA,CAAe;AAAA,EAC/C,QAAA;AAAA,EACS,KAAA;AAAA,EAClB,WAAA,CAAY,UAAkB,KAAA,EAAgB;AAC5C,IAAA,KAAA,CAAM,yBAAyB,QAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,KAAK,CAAC,CAAA,CAAE,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAGO,IAAM,oBAAA,GAAN,cAAmC,cAAA,CAAe;AAAA,EACvD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAEA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,IAAI,KAAA,YAAiB,KAAA,EAAO,OAAO,KAAA,CAAM,OAAA;AACzC,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;;;AC/BA,IAAM,gBAAA,uBAAuB,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAEnD,IAAM,YAAN,MAAgB;AAAA,EACJ,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,IAAA,EAAwB;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAI,qBAAqB,oBAAoB,CAAA;AACrE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,MAAM,IAAI,qBAAqB,qBAAqB,CAAA;AACvE,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,IAAU,UAAA,CAAW,KAAA;AAChD,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,oBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC9C,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,IAAc,CAAA;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,aAAA;AACjB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,cAAA,IAAkB,EAAC;AAC9C,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AAAA,EACxB;AAAA,EAEA,MAAM,QAAW,IAAA,EAAkC;AACjD,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AAC/C,IAAA,MAAM,WAAW,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,MACpC,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAG,IAAA,CAAK;AAAA,KACV;AACA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAC1B,MAAA,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,OAAA,CAAQ,iBAAiB,IAAI,IAAA,CAAK,cAAA;AAE3D,IAAA,IAAI,SAAA;AACJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,YAAY,OAAA,EAAA,EAAW;AAC3D,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,KAAW,IAAA,CAAK,WAAA,CAAY,KAAK,MAAM,CAAA;AACvD,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,UACpC,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,OAAA;AAAA,UACA,GAAI,OAAA,KAAY,KAAA,CAAA,GAAY,EAAE,IAAA,EAAM,OAAA,KAAY,EAAC;AAAA,UACjD;AAAA,SACD,CAAA;AACD,QAAA,MAAA,EAAO;AACP,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,QAAA,IAAA,CAAK,SAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,YAAY,CAAA;AAElG,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,MAAM,MAAA,GAAS,IAAA,GAAO,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA;AAEvC,QAAA,IAAI,GAAA,CAAI,EAAA,EAAI,OAAO,cAAA,CAAe,MAAM,CAAA;AAExC,QAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,GAAA,EAAK,MAAM,CAAA;AAC9C,QAAA,IAAI,iBAAiB,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,OAAA,GAAU,KAAK,UAAA,EAAY;AACjE,UAAA,MAAM,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,UAAU,CAAC,CAAA;AAC7C,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,UAC1B,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,QAAA;AAAA,UACA,OAAA,EAAS,cAAA,CAAe,MAAM,CAAA,IAAK,CAAA,cAAA,CAAA;AAAA,UACnC,IAAA,EAAM,YAAY,MAAM,CAAA;AAAA,UACxB,IAAA,EAAM,MAAA;AAAA,UACN,GAAI,UAAA,KAAe,KAAA,CAAA,GAAY,EAAE,iBAAA,EAAmB,UAAA,KAAe;AAAC,SACrE,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,EAAO;AACP,QAAA,IAAI,GAAA,YAAe,mBAAmB,MAAM,GAAA;AAE5C,QAAA,SAAA,GAAY,GAAA;AACZ,QAAA,IAAI,OAAA,GAAU,KAAK,UAAA,EAAY;AAC7B,UAAA,MAAM,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA;AACjC,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAI,qBAAA,CAAsB,QAAA,EAAU,GAAG,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,qBAAA,CAAsB,QAAA,EAAU,SAAS,CAAA;AAAA,EACrD;AAAA,EAEQ,QAAA,CAAS,MAAc,KAAA,EAAyC;AACtE,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA,CAAA;AACvE,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAChC,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,KAAM,MAAS,CAAA,CACjC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAC9E,IAAA,OAAO,MAAA,CAAO,SAAS,CAAA,EAAG,IAAI,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,GAAK,IAAA;AAAA,EACzD;AAAA,EAEQ,YAAY,QAAA,EAAqE;AACvF,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AACjE,IAAA,MAAM,eAAA,GAAkB,MAAM,UAAA,CAAW,KAAA,EAAM;AAC/C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,UAAA,CAAW,KAAA,EAAM;AAAA,oBACzB,gBAAA,CAAiB,OAAA,EAAS,iBAAiB,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IACzE;AACA,IAAA,OAAO;AAAA,MACL,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,QAAQ,MAAM;AACZ,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,QAAA,EAAU,mBAAA,CAAoB,SAAS,eAAe,CAAA;AAAA,MACxD;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,OAAA,CAAQ,SAAiB,iBAAA,EAAoC;AACnE,IAAA,IAAI,sBAAsB,MAAA,EAAW,OAAO,KAAK,GAAA,CAAI,iBAAA,GAAoB,KAAM,GAAM,CAAA;AAErF,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,CAAA,IAAK,SAAS,GAAK,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,IAAI,CAAA;AAAA,EACxC;AACF,CAAA;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEA,SAAS,SAAS,IAAA,EAAuB;AACvC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AASA,SAAS,eAAe,IAAA,EAAwB;AAC9C,EAAA,IACE,IAAA,KAAS,IAAA,IACT,OAAO,IAAA,KAAS,QAAA,IAChB,SAAA,IAAa,IAAA,IACb,OAAQ,IAAA,CAA8B,OAAA,KAAY,SAAA,IAClD,MAAA,IAAU,IAAA,EACV;AACA,IAAA,OAAQ,IAAA,CAA2B,IAAA;AAAA,EACrC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAe,IAAA,EAAmC;AACzD,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,EAAM;AACzD,IAAA,MAAM,IAAK,IAAA,CAA+B,OAAA;AAC1C,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,IAAA,EAAmC;AACtD,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,IAAA,MAAM,IAAK,IAAA,CAA4B,IAAA;AACvC,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CACP,KACA,IAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAC5C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,CAAA,GAAI,OAAO,MAAM,CAAA;AACvB,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,IAAA,MAAM,OAAQ,IAAA,CAAoD,IAAA;AAClE,IAAA,IAAI,QAAQ,OAAO,IAAA,CAAK,iBAAA,KAAsB,QAAA,SAAiB,IAAA,CAAK,iBAAA;AAAA,EACtE;AACA,EAAA,OAAO,MAAA;AACT;;;AClNO,IAAM,0BAAA,GAA6B;AAiBnC,IAAM,kBAAN,MAAsB;AAAA,EACV,SAAA;AAAA;AAAA,EAER,OAAA;AAAA;AAAA,EAGA,IAAA;AAAA;AAAA,EAEA,KAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,OAAA;AAAA,EAET,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,MAAA,EAAQ;AAC/B,MAAA,MAAM,IAAI,qBAAqB,yDAAoD,CAAA;AAAA,IACrF;AACA,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA,IAAW,0BAAA,EAA4B,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACjF,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,MAC7B,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,GAAI,QAAQ,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU,GAAI,EAAC;AAAA,MAC1E,GAAI,QAAQ,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAW,GAAI,EAAC;AAAA,MAC7E,GAAI,QAAQ,KAAA,GAAQ,EAAE,OAAO,OAAA,CAAQ,KAAA,KAAU,EAAC;AAAA,MAChD,GAAI,QAAQ,SAAA,GAAY,EAAE,WAAW,OAAA,CAAQ,SAAA,KAAc,EAAC;AAAA,MAC5D,cAAA,EAAgB,EAAE,YAAA,EAAc,eAAA;AAAgB,KACjD,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAA,CAAc,IAAA,CAAK,SAAS,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAA,CAAkB,MAAgC,IAAA,EAAwE;AACxH,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC5B,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,cAAA;AAAA,MACN,IAAA;AAAA,MACA,GAAI,MAAM,cAAA,GAAiB,EAAE,gBAAgB,IAAA,CAAK,cAAA,KAAmB;AAAC,KACvE,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CAAW,MAAA,EAAgB,IAAA,EAAc,IAAA,EAA+H;AACtK,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAW;AAAA,MAC/B,MAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAI,MAAM,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAU,EAAC;AAAA,MAC3C,GAAI,MAAM,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,MACtD,GAAI,MAAM,cAAA,GAAiB,EAAE,gBAAgB,IAAA,CAAK,cAAA,KAAmB;AAAC,KACvE,CAAA;AAAA,EACH;AACF;AAEA,IAAM,eAAN,MAAmB;AAAA,EACjB,YAA6B,CAAA,EAAc;AAAd,IAAA,IAAA,CAAA,CAAA,GAAA,CAAA;AAAA,EAAe;AAAA,EAAf,CAAA;AAAA,EAE7B,IAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,CAAQ,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,YAAY,CAAA;AAAA,EAC3D;AAAA,EACA,IAAI,KAAA,EAAmC;AACrC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,EACzE;AAAA,EACA,MAAA,CAAO,MAAqB,IAAA,EAAwD;AAClF,IAAA,OAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,UAAA,EAAY,IAAA,EAAM,GAAI,IAAA,EAAM,cAAA,GAAiB,EAAE,cAAA,EAAgB,IAAA,CAAK,gBAAe,GAAI,IAAK,CAAA;AAAA,EAC5I;AAAA,EACA,MAAA,CAAO,OAAe,IAAA,EAAyC;AAC7D,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA;AAAA,EACjF;AAAA,EACA,OAAO,KAAA,EAA8B;AACnC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,EAC5E;AAAA,EACA,MAAM,KAAA,EAAmC;AACvC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,MAAA,CAAA,EAAU,CAAA;AAAA,EAChF;AAAA,EACA,KAAK,KAAA,EAAmC;AACtC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,KAAA,CAAA,EAAS,CAAA;AAAA,EAC/E;AAAA,EACA,UAAU,KAAA,EAAsC;AAC9C,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,MAAA,CAAA,EAAU,CAAA;AAAA,EAC/E;AAAA,EACA,UAAA,CAAW,KAAA,EAAe,IAAA,EAAsB,IAAA,EAAyD;AACvG,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,CAAQ,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,UAAU,IAAA,EAAM,GAAI,IAAA,EAAM,cAAA,GAAiB,EAAE,cAAA,EAAgB,KAAK,cAAA,EAAe,GAAI,EAAC,EAAI,CAAA;AAAA,EAChK;AACF,CAAA;AAEA,IAAM,gBAAN,MAAoB;AAAA,EAClB,YAA6B,CAAA,EAAc;AAAd,IAAA,IAAA,CAAA,CAAA,GAAA,CAAA;AAAA,EAAe;AAAA,EAAf,CAAA;AAAA;AAAA,EAG7B,KAAK,KAAA,EAA+C;AAClD,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,WAAA,EAAa,GAAI,QAAQ,EAAE,KAAA,EAAsE,GAAI,IAAK,CAAA;AAAA,EACzJ;AAAA,EACA,IAAI,MAAA,EAAqC;AACvC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,EAC3E;AAAA,EACA,MAAA,CAAO,QAAgB,IAAA,EAA2C;AAChE,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA;AAAA,EACnF;AAAA,EACA,OAAO,MAAA,EAA+B;AACpC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,EAC9E;AAAA,EACA,MAAM,MAAA,EAAqC;AACzC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,MAAA,CAAA,EAAU,CAAA;AAAA,EAClF;AAAA,EACA,KAAK,MAAA,EAAqC;AACxC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,KAAA,CAAA,EAAS,CAAA;AAAA,EACjF;AAAA;AAAA,EAEA,OAAO,MAAA,EAAuC;AAC5C,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,IAAA,CAAA,EAAQ,CAAA;AAAA,EAChF;AAAA,EACA,QAAA,CAAS,QAAgB,KAAA,EAAsC;AAC7D,IAAA,OAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,KAAA,CAAA,EAAS,GAAI,KAAA,GAAQ,EAAE,OAAsE,GAAI,IAAK,CAAA;AAAA,EAC7K;AACF,CAAA;AAEA,IAAM,eAAN,MAAmB;AAAA,EACjB,YAA6B,CAAA,EAAc;AAAd,IAAA,IAAA,CAAA,CAAA,GAAA,CAAA;AAAA,EAAe;AAAA,EAAf,CAAA;AAAA;AAAA,EAG7B,KAAK,KAAA,EAA6C;AAChD,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,GAAI,QAAQ,EAAE,KAAA,EAAsE,GAAI,IAAK,CAAA;AAAA,EACxJ;AAAA,EACA,IAAI,KAAA,EAAmC;AACrC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,EACzE;AACF,CAAA;AAEA,IAAM,kBAAN,MAAsB;AAAA,EACpB,YAA6B,CAAA,EAAc;AAAd,IAAA,IAAA,CAAA,CAAA,GAAA,CAAA;AAAA,EAAe;AAAA,EAAf,CAAA;AAAA,EAE7B,EAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,CAAQ,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,UAAU,CAAA;AAAA,EACzD;AAAA,EACA,KAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,CAAQ,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,aAAa,CAAA;AAAA,EAC5D;AACF,CAAA;AAEA,SAAS,IAAI,OAAA,EAAyB;AACpC,EAAA,OAAO,mBAAmB,OAAO,CAAA;AACnC;;;AC9LA,IAAM,MAAA,uBAAa,GAAA,CAAI;AAAA,EACrB,SAAA;AAAA,EAAW,WAAA;AAAA,EAAa,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,WAAA;AAAA,EAAa,SAAA;AAAA,EAAW;AACnF,CAAC,CAAA;AAED,IAAM,MAAA,GAAS,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAClG,IAAM,IAAA,GAAO,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAU7D,IAAM,IAAA,GAAoB;AAAA,EACxB,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,OAAO,QAAA,EAAS;AAAA,EACnC,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,OAAO,MAAA,EAAO;AAAA,EACjC,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,OAAO,cAAA,EAAe;AAAA,EACzC,EAAE,KAAK,CAAA,EAAG,GAAA,EAAK,IAAI,KAAA,EAAO,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,EACjD,EAAE,KAAK,CAAA,EAAG,GAAA,EAAK,GAAG,KAAA,EAAO,IAAA,EAAM,OAAO,aAAA;AAAc;AACtD,CAAA;AACA,IAAM,UAAqB,EAAE,GAAA,EAAK,GAAG,GAAA,EAAK,EAAA,EAAI,OAAO,QAAA,EAAS;AASvD,SAAS,aAAa,IAAA,EAA8B;AACzD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,CAAK,MAAK,EAAG;AAC5C,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AAAA,EACpD;AACA,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAO,OAAO,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,IACnC,EAAE,KAAA,EAAO,IAAA,EAAK,GACd,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAA,oBAAA,EAAuB,OAAO,CAAA,+BAAA,CAAA,EAA6B;AAAA,EACxF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AACjC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC5C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,CAAA,kEAAA,EAAqE,KAAA,CAAM,MAAM,MAAM,OAAO,CAAA,CAAA;AAAA,KACvG;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,KAAW,CAAA,GAAI,CAAC,OAAA,EAAS,GAAG,IAAI,CAAA,GAAI,IAAA;AACxD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,MAAM,aAAA,CAAc,KAAA,CAAM,CAAC,CAAA,EAAI,KAAA,CAAM,CAAC,CAAE,CAAA;AAC9C,IAAA,IAAI,KAAK,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA,QAAA,EAAW,KAAA,CAAM,CAAC,CAAA,CAAG,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAC,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAG;AAAA,EAC5F;AACA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAEA,SAAS,aAAA,CAAcA,QAAe,IAAA,EAAgC;AAEpE,EAAA,KAAA,MAAW,IAAA,IAAQA,MAAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA;AACnC,IAAA,IAAI,KAAK,OAAO,GAAA;AAAA,EAClB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAA,CAAa,MAAc,IAAA,EAAgC;AAClE,EAAA,IAAI,IAAA,KAAS,IAAI,OAAO,iBAAA;AAExB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAC1B,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AAC3B,IAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,IAAI,KAAK,MAAA,CAAO,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,CAAA,+BAAA,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,IAAA,KAAS,KAAK,OAAO,IAAA;AAEzB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC7B,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,KAAK,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,EAAG,IAAI,GAAG,IAAI,CAAA;AACjD,IAAA,MAAM,KAAK,YAAA,CAAa,IAAA,CAAK,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AAClD,IAAA,IAAI,EAAA,KAAO,IAAA,EAAM,OAAO,CAAA,CAAA,EAAI,KAAK,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA,kBAAA,EAAqB,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,KAAK,GAAG,CAAA,CAAA;AACxF,IAAA,IAAI,EAAA,KAAO,IAAA,EAAM,OAAO,CAAA,CAAA,EAAI,KAAK,KAAA,CAAM,IAAA,GAAO,CAAC,CAAC,CAAA,kBAAA,EAAqB,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,KAAK,GAAG,CAAA,CAAA;AACzF,IAAA,IAAI,KAAK,EAAA,EAAI,OAAO,CAAA,YAAA,EAAe,EAAE,wBAAwB,EAAE,CAAA,CAAA;AAC/D,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,GAAA,EAAK;AAEtC,IAAA,OAAO,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA,KAAM,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,kBAAA,EAAqB,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAA,GAAK,IAAA;AAAA,EACnG;AACA,EAAA,OAAO,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA,KAAM,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,kBAAA,EAAqB,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAA,GAAK,IAAA;AACnG;AAGA,SAAS,YAAA,CAAa,OAAe,IAAA,EAAgC;AACnE,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACvB,IAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,IAAO,CAAA,IAAK,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AAAA,EAC9C;AACA,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAClD,IAAA,IAAI,OAAO,CAAA,EAAG,OAAO,OAAO,IAAA,CAAK,KAAA,KAAU,UAAU,CAAA,GAAI,CAAA,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,eAAA,CAAgB,IAAA,EAAc,OAAA,GAAU,EAAA,EAAU;AAChE,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,IAAI,CAAC,IAAI,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,EAAA,CAAA,GAAO,EAAE,CAAA,6BAAA,EAA2B,GAAA,CAAI,KAAK,CAAA,CAAE,CAAA;AAAA,EACxF;AACF;AAGO,SAAS,gBAAgB,EAAA,EAAqB;AACnD,EAAA,IAAI,CAAC,EAAA,IAAM,OAAO,EAAA,KAAO,UAAU,OAAO,KAAA;AAC1C,EAAA,IAAI;AACF,IAAA,IAAI,KAAK,cAAA,CAAe,OAAA,EAAS,EAAE,QAAA,EAAU,IAAI,CAAA;AACjD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AChIA,IAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAGzB,SAAS,YAAYC,YAAAA,EAAgD;AAC1E,EAAA,IAAI,CAACA,cAAa,OAAO,IAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAKA,YAAAA,CAAY,MAAM,CAAA;AACxD,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAG,MAAK,GAAI,IAAA;AACpC;AAOO,SAAS,eAAA,CAAgB,GAAW,CAAA,EAAoB;AAC7D,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAC3B,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,GAAG,MAAM,CAAA;AACzC,EAAA,IAAI,IAAA,GAAO,EAAA,CAAG,MAAA,GAAS,EAAA,CAAG,MAAA;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,IAAA,IAAA,CAAS,GAAG,CAAC,CAAA,IAAK,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,IAAA,KAAS,CAAA;AAClB;AAMA,eAAsB,cAAA,CAAe,SAAiB,MAAA,EAAiC;AACrF,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,IAC9B,KAAA;AAAA,IACA,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,IACrB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,IAChC,KAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAC,CAAA;AACzE,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAI,WAAW,GAAG,CAAC,EACvC,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CAAA;AACV,EAAA,OAAO,UAAU,GAAG,CAAA,CAAA;AACtB;;;AC/BO,IAAM,cAA+B,EAAC;AA+CtC,SAAS,iBAAiB,KAAA,EAAoC;AACnE,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,IAAU,WAAA;AAC5B,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,MAAM,YAAA,GAAe,MAAM,YAAA,IAAgB,OAAA;AAG3C,EAAA,eAAe,aAAA,CAAc,KAAkB,GAAA,EAA4E;AACzH,IAAA,MAAM,SAAS,MAAM,KAAA,EAAO,UAAA,GAAa,EAAE,KAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,GAAA,CAAI,QAAQ,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,GAAG,GAAG,CAAA;AACzG,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,GAAG,CAAA;AAC3C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,MAAA,GAAA,CAAI,QAAQ,CAAA,iBAAA,EAAoB,GAAA,CAAI,GAAG,CAAA,eAAA,EAAkB,UAAU,CAAA,EAAA,CAAI,CAAA;AACvE,MAAA,MAAM,QAAA,CAAS,MAAM,KAAA,EAAO,YAAA,GAAe,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAI,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,GAAG,GAAG,CAAA;AACzG,MAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAAA,IAC9B,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,MAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,KAAA,GAAQ,CAAA,iBAAA,EAAoB,GAAA,CAAI,GAAG,CAAA,UAAA,EAAa,KAAA,CAAM,OAAO,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,CAAA;AAC7F,MAAA,MAAM,QAAA,CAAS,MAAM,KAAA,EAAO,UAAA,GAAa,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAI,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,GAAG,GAAG,CAAA;AACtG,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAEA,EAAA,SAAS,aAAa,GAAA,EAAa,GAAA,EAAkB,GAAA,EAA6B,IAAA,EAA+B,SAAkB,MAAA,EAAiD;AAClL,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,QAAA,EAAU,OAAO,IAAA,CAAK,UAAU,CAAA,KAAM,QAAA,GAAY,IAAA,CAAK,UAAU,CAAA,GAAgB,GAAA,CAAI,MAAA,CAAO,QAAA,IAAY,EAAA;AAAA,MACxG,OAAA,EAAU,GAAA,CAAI,MAAA,CAAO,OAAA,IAAuC,EAAC;AAAA,MAC7D,IAAA;AAAA,MACA,OAAA,EAAS,GAAA,EAAK,OAAA,IAAW,EAAC;AAAA,MAC1B,OAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA,EAAQ,GAAA;AAAA,MACR,QAAQ,GAAA,EAAK;AAAA,KACf;AAAA,EACF;AAEA,EAAA,eAAe,OAAO,GAAA,EAAiD;AACrE,IAAA,IAAI,GAAA,CAAI,MAAA,CAAO,WAAA,EAAY,KAAM,MAAA,EAAQ;AACvC,MAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,sBAAsB,CAAA;AAAA,IAC7D;AAGA,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,aAAa,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,gBAAgB,KAAA,EAAO,KAAA,CAAM,cAAc,CAAA,EAAG;AAC3D,MAAA,GAAA,CAAI,OAAO,4DAA4D,CAAA;AACvE,MAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,gBAAgB,CAAA;AAAA,IACvD;AAGA,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA,GAAI,YAAA,EAAc;AAC1C,MAAA,GAAA,CAAI,IAAA,GAAO,CAAA,4CAAA,EAA+C,YAAY,CAAA,MAAA,CAAQ,CAAA;AAC9E,MAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,qBAAqB,CAAA;AAAA,IAC5D;AAGA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,OAAA,GAAU,IAAA,CAAK,MAAM,GAAA,CAAI,OAAO,IAAI,EAAC;AACxD,MAAA,IAAI,CAAC,UAAU,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,QAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,8BAA8B,CAAA;AAAA,MACrE;AACA,MAAA,IAAA,GAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,qBAAqB,CAAA;AAAA,IAC5D;AAGA,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,KAAK,MAAM,QAAA,GAAY,IAAA,CAAK,KAAK,CAAA,GAAe,IAAA;AACxE,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,6BAA6B,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC9B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,CAAI,IAAA,GAAO,CAAA,sCAAA,EAAyC,GAAG,CAAA,CAAA,CAAG,CAAA;AAC1D,MAAA,OAAO,IAAA,CAAK,KAAK,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAA,EAAI,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,WAAW,CAAC,CAAA;AAC/C,IAAA,MAAM,UAAU,QAAA,KAAa,IAAA;AAC7B,IAAA,MAAM,MAAM,YAAA,CAAa,GAAA,EAAK,KAAK,GAAA,EAAK,IAAA,EAAM,SAAS,UAAU,CAAA;AAGjE,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAA,GAAO,qBAAqB,GAAA,EAAK,GAAA,EAAK,UAAU,KAAA,CAAM,cAAA,EAAgB,KAAK,aAAa,CAAA;AAC9F,MAAA,IAAI,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA;AAErC,MAAA,OAAO,IAAA,CAAK,KAAK,EAAE,EAAA,EAAI,MAAM,GAAA,EAAK,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,IACzD;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,aAAA,CAAc,KAAK,GAAG,CAAA;AAC/C,MAAA,OAAO,IAAA,CAAK,GAAA,EAAK,EAAE,EAAA,EAAI,IAAA,EAAM,KAAK,GAAA,EAAK,MAAA,EAAQ,MAAA,IAAU,IAAA,EAAM,CAAA;AAAA,IACjE,SAAS,GAAA,EAAK;AAEZ,MAAA,OAAO,IAAA,CAAK,GAAA,EAAK,EAAE,EAAA,EAAI,OAAO,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,GAAG,CAAA;AAAA,IACnG;AAAA,EACF;AAEA,EAAA,eAAe,QAAA,CAAS,KAAa,OAAA,EAAqD;AACxF,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC9B,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,GAAG,CAAA,UAAA,EAAa,CAAC,GAAG,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA,IAAK,QAAQ,CAAA,CAAE,CAAA;AACzG,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAA,EAAK,GAAA,EAAK,QAAA,EAAU,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,GAAI,OAAA,IAAW,EAAC,EAAG;AACpG,IAAA,MAAM,MAAM,YAAA,CAAa,GAAA,EAAK,KAAK,IAAA,EAAM,IAAA,EAAM,OAAO,OAAO,CAAA;AAC7D,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,aAAA,CAAc,KAAK,GAAG,CAAA;AAC/C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,QAAQ,QAAA,EAAS;AAC5B;AAEA,eAAe,qBACb,GAAA,EACA,GAAA,EACA,QAAA,EACA,MAAA,EACA,KACA,aAAA,EACe;AACf,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,KAAW,MAAM,aAAA,CAAc,KAAK,GAAG,CAAA;AAC3D,IAAA,OAAA,GAAU,EAAE,OAAO,QAAA,CAAS,KAAA,EAAO,SAAS,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,MAAA,IAAU,IAAA,EAAK;AAAA,EACvF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,GAAU;AAAA,MACR,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,OAAA,EAAS,KAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,KACxD;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,SAAS,uBAAA,IAA2B,qBAAA;AACnD,IAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,OAAA,EAAS,MAAM,CAAA;AACtD,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,MAAA;AAAA,MACR,SAAS,EAAE,cAAA,EAAgB,oBAAoB,CAAC,MAAM,GAAG,SAAA,EAAU;AAAA,MACnE,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,GAAA,CAAI,OAAO,CAAA,mCAAA,EAAsC,GAAA,CAAI,GAAG,CAAA,WAAA,EAAc,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IACpF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,KAAA,GAAQ,CAAA,gDAAA,EAAmD,GAAA,CAAI,GAAG,CAAA,CAAA,CAAA,EAAK;AAAA,MACzE,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,KACvD,CAAA;AAAA,EACH;AACF;AAGA,eAAe,QAAA,CAAS,IAA4C,GAAA,EAAqC;AACvG,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,EAAG;AAAA,EACX,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,IAAA,GAAO,uCAAuC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EACtG;AACF;AAGA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,IAAI,CAAC,GAAG,OAAO,CAAA;AACf,EAAA,IAAI,OAAO,gBAAgB,WAAA,EAAa,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA;AAC3E,EAAA,OAAO,CAAA,CAAE,MAAA;AACX;AAEA,SAAS,aAAa,KAAA,EAAyC;AAC7D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA;AAChD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,IAAI,OAAO,CAAA,CAAE,KAAK,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,CAAE,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,IAAA;AAC3E,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,EAAE,KAAK,CAAA;AAAA,IACZ,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,IAChB,GAAI,OAAO,CAAA,CAAE,yBAAyB,CAAA,KAAM,QAAA,GACxC,EAAE,uBAAA,EAAyB,CAAA,CAAE,yBAAyB,CAAA,EAAY,GAClE,EAAC;AAAA,IACL,GAAI,OAAO,CAAA,CAAE,WAAW,CAAA,KAAM,QAAA,GAAW,EAAE,SAAA,EAAW,CAAA,CAAE,WAAW,CAAA,EAAY,GAAI;AAAC,GACtF;AACF;AAEA,SAAS,IAAA,CAAK,QAAgB,IAAA,EAAiD;AAC7E,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AACxB;;;ACtNA,eAAsB,SAAA,CAAU,KAAA,EAAuB,OAAA,GAAuB,EAAC,EAA6B;AAC1G,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,aAAa,cAAA,EAAgB,eAAA,EAAiB,MAAK,GAAI,KAAA;AAChF,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,IAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,KAAA;AACjC,EAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,KAAA;AAG7C,EAAA,MAAM,EAAE,GAAA,EAAK,SAAA,EAAW,OAAA,EAAS,UAAA,EAAW,GAAI,MAAM,eAAA,CAAgB,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,cAAA,EAAgB,MAAM,CAAA;AACnH,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAA,IAAM,WAAA;AAE/B,EAAA,MAAM,UAAiC,EAAC;AACxC,EAAA,MAAM,aAAA,GAAgB,SAAA,IAAa,CAAC,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,EAAE,CAAA,GAAI,EAAC;AAC9F,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAU,CAAC,CAAA;AACpE,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,CAAC,CAAA;AAGnD,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,OAAA,IAAW,IAAA;AACtC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAClC,IAAA,MAAM,UAAU,gBAAA,CAAiB,EAAE,KAAK,WAAA,EAA6B,iBAAiB,CAAA;AAEtF,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,QAAA,IAAY,CAAC,MAAA,EAAQ,MAAM,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AAC5F,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,EAAA,IAAM,IAAA,EAAM,MAAA,EAAQ,wBAAwB,CAAA;AAC9G,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAI,MAAA,IAAU,CAAC,SAAA,EAAW;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,GAAA,CAAI,KAAK,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,CAAA;AAC9D,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAA6B,EAAE,GAAG,OAAA,EAAS,aAAa,cAAA,EAAe;AAC7E,MAAA,MAAM,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,UAAU,EAAA,EAAI,UAAA,EAAY,EAAE,cAAA,EAAgB,aAAa,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,GAAG,IAAI,CAAA;AACzH,MAAA,MAAM,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,QAAQ,SAAA,EAAW,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AACjE,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAc,GAAI,QAAA,CAAS,UAAU,OAAA,EAAS,EAAE,YAAA,EAAc,cAAA,EAAgB,CAAA;AAC7F,IAAA,MAAM,UAAA,GAAa,SAAS,MAAA,KAAW,UAAA;AAEvC,IAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,CAAC,UAAA,EAAY;AAC7C,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,QAAQ,WAAA,EAAa,MAAA,EAAQ,QAAA,CAAS,EAAA,EAAI,CAAA;AACvE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG,MAAM,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,EAAA,EAAI,KAAK,CAAA;AAC1E,MAAA,IAAI,YAAY,MAAM,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,SAAS,EAAE,CAAA;AAAA,IACtD;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,MAAA,EAAQ,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,WAAA;AAAA,MAC/C,QAAQ,QAAA,CAAS,EAAA;AAAA,MACjB,GAAI,aAAA,CAAc,MAAA,GAAS,IAAI,EAAE,aAAA,KAAkB,EAAC;AAAA,MACpD,GAAI,UAAA,GAAa,EAAE,MAAA,EAAQ,cAAA,KAAmB;AAAC,KAChD,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AACjC,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,OAAO,KAAA,CAAM,MAAA,CAAO,KAAK,EAAE,CAAA;AAC9C,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,SAAA,EAAW,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO,SAAA,CAAU,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,OAAO,CAAA;AACtD;AAEA,eAAe,eAAA,CACb,MAAA,EACA,OAAA,EACA,WAAA,EACA,MAAA,EACsD;AACtD,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK;AACpC,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AACjD,EAAA,IAAI,OAAO,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,SAAS,KAAA,EAAM;AAC/C,EAAA,IAAI,QAAQ,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,SAAS,IAAA,EAAK;AAC9C,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAA,CAAK,MAAA;AAAA,IAChC,EAAE,MAAM,OAAA,EAAS,GAAI,cAAc,EAAE,WAAA,EAAY,GAAI,EAAC,EAAG;AAAA,IACzD,EAAE,cAAA,EAAgB,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA;AAAG,GACxC;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,OAAA,EAAS,OAAA,EAAS,IAAA,EAAK;AACvC;AAEA,SAAS,iBAAiB,IAAA,EAKP;AACjB,EAAA,MAAM,EAAE,GAAA,EAAK,WAAA,EAAa,eAAA,EAAgB,GAAI,IAAA;AAC9C,EAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,GAAI,GAAA,CAAI,OAAA,IAAW,EAAC,EAAI,CAAA;AAC3E,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,MAAM,GAAA,CAAI,GAAA;AAAA,IACV,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,QAAA,EAAU,IAAI,QAAA,IAAY,eAAA;AAAA,IAC1B,SAAA,EAAW,WAAA;AAAA,IACX,MAAA,EAAQ,MAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,IAAI,GAAA,CAAI,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,cAAc,GAAA,CAAI,WAAA;AAC1D,EAAA,IAAI,GAAA,CAAI,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,GAAA,CAAI,OAAA;AAClD,EAAA,IAAI,GAAA,CAAI,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,aAAa,GAAA,CAAI,UAAA;AACxD,EAAA,IAAI,GAAA,CAAI,aAAA,KAAkB,MAAA,EAAW,IAAA,CAAK,gBAAgB,GAAA,CAAI,aAAA;AAC9D,EAAA,IAAI,GAAA,CAAI,iBAAA,KAAsB,MAAA,EAAW,IAAA,CAAK,oBAAoB,GAAA,CAAI,iBAAA;AACtE,EAAA,IAAI,GAAA,CAAI,mBAAA,KAAwB,MAAA,EAAW,IAAA,CAAK,sBAAsB,GAAA,CAAI,mBAAA;AAC1E,EAAA,IAAI,GAAA,CAAI,eAAA,KAAoB,MAAA,EAAW,IAAA,CAAK,kBAAkB,GAAA,CAAI,eAAA;AAClE,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAA,CACP,QAAA,EACA,OAAA,EACA,IAAA,EACoD;AACpD,EAAA,MAAM,QAAwB,EAAC;AAC/B,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,MAAM,GAAA,GAAM,CAAiCD,MAAAA,EAAU,KAAA,KAA6B;AAClF,IAAA,KAAA,CAAMA,MAAK,CAAA,GAAI,KAAA;AACf,IAAA,OAAA,CAAQ,KAAKA,MAAK,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,IAAI,SAAS,QAAA,KAAa,OAAA,CAAQ,UAAU,GAAA,CAAI,UAAA,EAAY,QAAQ,QAAQ,CAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,IAAa,QAAA,CAAS,QAAA,KAAa,QAAQ,QAAA,EAAU,GAAA,CAAI,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AAC9G,EAAA,IAAI,SAAS,SAAA,KAAc,OAAA,CAAQ,WAAW,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAChF,EAAA,IAAI,QAAA,CAAS,YAAY,OAAA,CAAQ,MAAA,IAAU,SAAS,GAAA,CAAI,QAAA,EAAU,OAAA,CAAQ,MAAA,IAAU,MAAM,CAAA;AAC1F,EAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,WAAA,EAAa,OAAA,CAAQ,WAAW,CAAA,EAAG,GAAA,CAAI,aAAA,EAAe,OAAA,CAAQ,WAAA,IAAe,IAAI,CAAA;AAGzG,EAAA,IAAI,QAAQ,WAAA,KAAgB,MAAA,IAAA,CAAc,SAAS,WAAA,IAAe,MAAA,MAAe,QAAQ,WAAA,EAAa;AACpG,IAAA,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,IAAa,QAAA,CAAS,OAAA,KAAY,QAAQ,OAAA,EAAS,GAAA,CAAI,SAAA,EAAW,OAAA,CAAQ,OAAO,CAAA;AACzG,EAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,MAAA,IAAa,QAAA,CAAS,UAAA,KAAe,QAAQ,UAAA,EAAY,GAAA,CAAI,YAAA,EAAc,OAAA,CAAQ,UAAU,CAAA;AACxH,EAAA,IAAI,QAAQ,aAAA,KAAkB,MAAA,IAAa,QAAA,CAAS,aAAA,KAAkB,QAAQ,aAAA,EAAe;AAC3F,IAAA,GAAA,CAAI,eAAA,EAAiB,QAAQ,aAAa,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,QAAQ,iBAAA,KAAsB,MAAA,IAAa,QAAA,CAAS,iBAAA,KAAsB,QAAQ,iBAAA,EAAmB;AACvG,IAAA,GAAA,CAAI,mBAAA,EAAqB,QAAQ,iBAAiB,CAAA;AAAA,EACpD;AACA,EAAA,IAAI,QAAQ,mBAAA,KAAwB,MAAA,IAAa,QAAA,CAAS,mBAAA,KAAwB,QAAQ,mBAAA,EAAqB;AAC7G,IAAA,GAAA,CAAI,qBAAA,EAAuB,QAAQ,mBAAmB,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,OAAA,CAAQ,oBAAoB,MAAA,IAAa,CAAC,UAAU,QAAA,CAAS,eAAA,EAAiB,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC1G,IAAA,GAAA,CAAI,iBAAA,EAAmB,QAAQ,eAAkC,CAAA;AAAA,EACnE;AAGA,EAAA,IAAI,IAAA,CAAK,gBAAgB,CAAC,QAAA,CAAS,gBAAgB,GAAA,CAAI,aAAA,EAAe,KAAK,cAAc,CAAA;AAEzF,EAAA,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,OAAA,EAAQ;AACzC;AAEA,SAAS,SAAA,CAAU,GAAkB,CAAA,EAAuC;AAC1E,EAAA,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,IAAK,IAAA,SAAa,CAAA,IAAK,CAAA;AACxC,EAAA,IAAI;AACF,IAAA,OAAO,SAAA,CAAU,KAAK,KAAA,CAAM,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,CAAA,KAAM,CAAA;AAAA,EACf;AACF;AAEA,SAAS,SAAA,CAAU,GAAY,CAAA,EAAqB;AAClD,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,IAAK,IAAA,SAAa,CAAA,KAAM,CAAA;AACzC,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,KAAM,UAAU,OAAO,KAAA;AAC3D,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,CAAW,EAAE,IAAA,EAAK;AACzC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,CAAW,EAAE,IAAA,EAAK;AACzC,EAAA,IAAI,EAAA,CAAG,MAAA,KAAW,EAAA,CAAG,MAAA,EAAQ,OAAO,KAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,IAAI,GAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,GAAG,OAAO,KAAA;AAC5B,IAAA,IAAI,CAAC,SAAA,CAAW,CAAA,CAA8B,EAAA,CAAG,CAAC,CAAE,CAAA,EAAI,CAAA,CAA8B,EAAA,CAAG,CAAC,CAAE,CAAC,GAAG,OAAO,KAAA;AAAA,EACzG;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAA,CACP,KAAA,EACA,OAAA,EACA,UAAA,EACA,OAAA,EACiB;AACjB,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqC,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,CAAC,CAAA,CAAE,MAAA;AAC1F,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA,EAAS,MAAM,SAAS,CAAA;AAAA,IACxB,OAAA,EAAS,MAAM,SAAS,CAAA;AAAA,IACxB,SAAA,EAAW,MAAM,WAAW,CAAA;AAAA,IAC5B,OAAA,EAAS,MAAM,SAAS,CAAA;AAAA,IACxB,OAAA,EAAS,MAAM,SAAS,CAAA;AAAA,IACxB;AAAA,GACF;AACF;;;ACpNO,SAAS,eAAe,GAAA,EAA8C;AAC3E,EAAA,OAAO,OAAO,KAAK,GAAA,KAAQ;AACzB,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,GAAG,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO;AAAA,MAC9B,MAAA,EAAQ,IAAI,MAAA,IAAU,MAAA;AAAA,MACtB,aAAA,EAAe,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,eAAe,CAAC,CAAA;AAAA,MACvD,OAAA;AAAA,MACA,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,OAAO;AAAA,KACpC,CAAA;AACD,IAAA,GAAA,CAAI,OAAO,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,EAC5C,CAAA;AACF;AAEA,eAAe,SAAS,GAAA,EAA0C;AAChE,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,EAAM;AACvC,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AACvF,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,EAAA,KAAO,UAAA,EAAY,OAAO,EAAA;AACzC,EAAA,OAAO,IAAI,OAAA,CAAgB,CAAC,OAAA,KAAY;AACtC,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,GAAA,CAAI,EAAA,CAAI,MAAA,EAAQ,CAAC,KAAA,KAAoB;AACnC,MAAA,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA,CAAO,SAAS,EAAE,CAAA;AAAA,IAChE,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,EAAA,CAAI,KAAA,EAAO,MAAM,OAAA,CAAQ,IAAI,CAAC,CAAA;AAClC,IAAA,GAAA,CAAI,EAAA,CAAI,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,EACtC,CAAC,CAAA;AACH;AAEA,SAAS,YAAY,KAAA,EAA0D;AAC7E,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,MAAM,CAAC,CAAA;AACxC,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,OAAA,EAAgF;AACtG,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC5C,IAAA,IAAI,MAAM,MAAA,EAAW;AACrB,IAAA,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,GAAA;AACT;;;AC7CO,SAAS,YAAY,GAAA,EAAwC;AAClE,EAAA,OAAO,OAAO,GAAA,KAAQ;AACpB,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA,EAAK;AAC/B,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,GAAU,CAAC,KAAA,EAAO,GAAA,KAAQ;AACpC,MAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,KAAA;AAAA,IAC/B,CAAC,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO;AAAA,MAC9B,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,aAAA,EAAe,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,IAAK,MAAA;AAAA,MACnD,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA,EAAG;AAAA,MAC/C,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,KAC/C,CAAA;AAAA,EACH,CAAA;AACF;;;ACXA,IAAM,qBAAA,GAAwB,qBAAA;AAC9B,IAAM,iBAAA,GAAoB,eAAA;AAiCnB,SAAS,gBAAgB,MAAA,EAA0C;AACxE,EAAA,cAAA,CAAe,MAAM,CAAA;AAErB,EAAA,MAAM,QAAA,GAAW,OAAO,iBAAA,IAAqB,IAAA;AAC7C,EAAA,MAAM,eAAA,GAAkB,OAAO,QAAA,IAAY,iBAAA;AAC3C,EAAA,IAAI,QAAA,IAAY,CAAC,eAAA,CAAgB,eAAe,CAAA,EAAG;AACjD,IAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,sBAAA,EAAyB,eAAe,CAAA,6DAAA,CAA0D,CAAA;AAAA,EACnI;AAEA,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,MAAA,CAAO,YAAA,IAAgB,qBAAqB,CAAA;AAC/E,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAQ,YAAY,CAAA;AAEvD,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,IACjC,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,OAAA,EAAS,OAAO,OAAA,IAAW,0BAAA;AAAA,IAC3B,GAAI,OAAO,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,GAAI,EAAC;AAAA,IACxE,GAAI,OAAO,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,MAAA,CAAO,UAAA,EAAW,GAAI,EAAC;AAAA,IAC3E,GAAI,OAAO,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU;AAAC,GAC/C,CAAA;AAED,EAAA,MAAM,aAAa,gBAAA,CAAiB;AAAA,IAClC,IAAA;AAAA,IACA,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,GAAI,OAAO,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU,EAAC;AAAA,IAC9C,GAAI,OAAO,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAa,GAAI;AAAC,GAClF,CAAA;AAED,EAAA,MAAM,GAAA,GAAoB;AAAA,IACxB,MAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,YAAA;AAAA,IACA,WAAA;AAAA,IAEA,MAAM,KAAK,OAAA,EAAiD;AAC1D,MAAA,MAAM,IAAA,GAAO,WAAW,EAAC;AAGzB,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,iBAAA;AAAA,YACvB,oBAAA,CAAqB,MAAA,EAAQ,WAAA,EAAa,eAAA,EAAiB,CAAC,GAAG,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI;AAAA,WACrF;AACA,UAAA,OAAO;AAAA,YACL,KAAA,EAAO,IAAI,GAAA,CAAI,EAAA;AAAA,YACf,OAAA,EAAS,IAAI,GAAA,CAAI,IAAA;AAAA,YACjB,YAAY,GAAA,CAAI,UAAA;AAAA,YAChB,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,WAAW,GAAA,CAAI,SAAA;AAAA,YACf,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,cAC/B,KAAK,CAAA,CAAE,GAAA;AAAA,cACP,QAAQ,CAAA,CAAE,MAAA;AAAA,cACV,QAAQ,CAAA,CAAE,MAAA;AAAA,cACV,GAAI,EAAE,aAAA,GAAgB,EAAE,eAAe,CAAA,CAAE,aAAA,KAAkB;AAAC,aAC9D,CAAE,CAAA;AAAA,YACF,OAAO,GAAA,CAAI;AAAA,WACb;AAAA,QACF,SAAS,CAAA,EAAG;AAEV,UAAA,IAAI,EAAE,aAAa,iBAAA,CAAA,IAAuB,CAAA,CAAE,WAAW,GAAA,IAAO,CAAA,CAAE,MAAA,KAAW,GAAA,EAAM,MAAM,CAAA;AAAA,QACzF;AAAA,MACF;AACA,MAAA,OAAO,SAAA;AAAA,QACL;AAAA,UACE,MAAA;AAAA,UACA,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,WAAA;AAAA,UACA,gBAAgB,MAAA,CAAO,cAAA;AAAA,UACvB,eAAA;AAAA,UACA,IAAA,EAAM,CAAC,GAAG,IAAA,CAAK,QAAQ;AAAA,SACzB;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,IAAI,GAAA,EAAoC;AAC5C,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,aAAA,EAAgB,GAAG,aAAa,CAAC,GAAG,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC1G;AACA,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK;AAC1C,MAAA,MAAM,SAAA,GAAY,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,OAAO,OAAO,CAAA;AAClE,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,MAAA,CAAO,OAAO,CAAA,6CAAA,CAA0C,CAAA;AAAA,MACjG;AACA,MAAA,MAAM,QAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,UAAU,EAAE,CAAA;AACtD,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,GAAG,CAAA;AAC7C,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,GAAG,CAAA,2CAAA,CAAwC,CAAA;AAAA,MACpF;AACA,MAAA,OAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAAA,IACpC,CAAA;AAAA,IAEA,SAAS,CAAC,GAAA,EAAa,YAAsC,UAAA,CAAW,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAC7F,QAAQ,UAAA,CAAW,MAAA;AAAA,IACnB,cAAA,EAAgB,MAAM,cAAA,CAAe,GAAG,CAAA;AAAA,IACxC,WAAA,EAAa,MAAM,WAAA,CAAY,GAAG,CAAA;AAAA,IAClC,MAAM,MAAM,CAAC,GAAG,IAAA,CAAK,MAAM;AAAA,GAC7B;AAEA,EAAA,OAAO,GAAA;AACT;AAAA,CAOO,CAAUE,gBAAAA,KAAV;AAQE,EAAA,SAAS,OAAA,CACd,QACA,GAAA,GAA0C,OAAO,YAAY,WAAA,GAAc,OAAA,CAAQ,GAAA,GAAM,EAAC,EAC5E;AACd,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,GAAA,CAAI,mBAAmB,CAAA;AACvD,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,cAAA,IAAkB,GAAA,CAAI,2BAA2B,CAAA;AAC/E,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA,IAAU,IAAI,mBAAmB,CAAA,IAAK,IAAI,YAAY,CAAA;AAC5E,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,GAAA,CAAI,mBAAmB,CAAA;AAEzD,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,CAAC,MAAA,IAAU,mBAAA;AAAA,MACX,CAAC,cAAA,IAAkB,2BAAA;AAAA,MACnB,CAAC,MAAA,IAAU;AAAA,KACb,CAAE,OAAO,OAAO,CAAA;AAChB,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,mDAAA,EAAsD,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5G;AAEA,IAAA,OAAOA,gBAAAA,CAAgB;AAAA,MACrB,GAAG,MAAA;AAAA,MACH,MAAA;AAAA,MACA,cAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAI,OAAA,GAAU,EAAE,OAAA,KAAY;AAAC,KAC9B,CAAA;AAAA,EACH;AAzBO,EAAAA,gBAAAA,CAAS,OAAA,GAAA,OAAA;AAAA,CAAA,EARD,eAAA,KAAA,eAAA,GAAA,EAAA,CAAA,CAAA;AAoCjB,SAAS,eAAe,MAAA,EAAkC;AACxD,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,qBAAqB,2CAA2C,CAAA;AACvF,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK,EAAG,MAAM,IAAI,oBAAA,CAAqB,wBAAwB,CAAA;AACtG,EAAA,IAAI,CAAC,OAAO,MAAA,IAAU,CAAC,gBAAgB,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAI,qBAAqB,wEAAwE,CAAA;AAAA,EACzG;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,qBAAqB,yCAAoC,CAAA;AACvF,EAAA,IAAI,CAAC,MAAA,CAAO,cAAA,IAAkB,MAAA,CAAO,cAAA,CAAe,SAAS,EAAA,EAAI;AAC/D,IAAA,MAAM,IAAI,qBAAqB,0FAA0F,CAAA;AAAA,EAC3H;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,MAAM,IAAI,qBAAqB,qBAAqB,CAAA;AACxE;AAEA,SAAS,aAAA,CAAc,OAA2B,QAAA,EAA6C;AAC7F,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAyB;AACzC,EAAA,MAAM,OAAA,GAA8D,KAAA,CAAM,OAAA,CAAQ,KAAK,IACnF,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,GAAG,IAAA,EAAK,MAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAK,CAAE,CAAA,GACvD,MAAA,CAAO,OAAA,CAAQ,KAAK,EAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,MAAM,CAAA,MAAO,EAAE,GAAA,EAAK,QAAO,CAAE,CAAA;AAElE,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,MAAA,EAAO,IAAK,OAAA,EAAS;AACrC,IAAA,MAAM,OAAA,GAAA,CAAW,GAAA,IAAO,EAAA,EAAI,IAAA,EAAK;AACjC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,kCAAkC,CAAA;AAC/E,IAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAK,MAAM,IAAI,oBAAA,CAAqB,CAAA,SAAA,EAAY,OAAO,CAAA,yBAAA,CAA2B,CAAA;AACvG,IAAA,IAAI,GAAA,CAAI,IAAI,OAAO,CAAA,QAAS,IAAI,oBAAA,CAAqB,CAAA,mBAAA,EAAsB,OAAO,CAAA,EAAA,CAAI,CAAA;AACtF,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,CAAO,YAAY,UAAA,EAAY;AACnD,MAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,OAAO,CAAA,gCAAA,CAAkC,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,MAAK,EAAG;AAC/C,MAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,OAAO,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,CAAO,QAAQ,CAAA;AAC9C,MAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACpB,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,OAAO,CAAA,2BAAA,EAA8B,OAAO,QAAQ,CAAA,SAAA,EAAO,SAAA,CAAU,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,MACtH;AACA,MAAA,IAAI,OAAO,QAAA,KAAa,MAAA,IAAa,CAAC,eAAA,CAAgB,MAAA,CAAO,QAAQ,CAAA,EAAG;AACtE,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,OAAO,CAAA,2BAAA,EAA8B,MAAA,CAAO,QAAQ,CAAA,+BAAA,CAA4B,CAAA;AAAA,MACzH;AAAA,IACF;AACA,IAAA,GAAA,CAAI,IAAI,OAAA,EAAS,EAAE,GAAA,EAAK,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC3C;AACA,EAAA,IAAI,IAAI,IAAA,KAAS,CAAA,EAAG,MAAM,IAAI,qBAAqB,+BAA+B,CAAA;AAClF,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,GAAI,QAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,MAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAA;AACvG;AAEA,SAAS,OAAA,CAAQ,MAAc,IAAA,EAAsB;AACnD,EAAA,OAAO,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAA,CAAA;AAC3C;AAGA,SAAS,oBAAA,CACP,MAAA,EACA,WAAA,EACA,eAAA,EACA,MACA,IAAA,EAC0B;AAC1B,EAAA,MAAM,KAAA,GAA6B,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACjD,IAAA,MAAM,MAAM,CAAA,CAAE,MAAA;AACd,IAAA,MAAM,IAAA,GAA0B;AAAA,MAC9B,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,SAAA,EAAW,WAAA;AAAA,MACX,aAAa,MAAA,CAAO,cAAA;AAAA,MACpB,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,IAAI,QAAA,IAAY,eAAA;AAAA,MAC1B,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,GAAI,GAAA,CAAI,OAAA,IAAW,EAAC,EAAI;AAAA,KACpE;AACA,IAAA,IAAI,GAAA,CAAI,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,cAAc,GAAA,CAAI,WAAA;AAC1D,IAAA,IAAI,GAAA,CAAI,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,GAAA,CAAI,OAAA;AAClD,IAAA,IAAI,GAAA,CAAI,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,aAAa,GAAA,CAAI,UAAA;AACxD,IAAA,IAAI,GAAA,CAAI,aAAA,KAAkB,MAAA,EAAW,IAAA,CAAK,gBAAgB,GAAA,CAAI,aAAA;AAC9D,IAAA,IAAI,GAAA,CAAI,iBAAA,KAAsB,MAAA,EAAW,IAAA,CAAK,oBAAoB,GAAA,CAAI,iBAAA;AACtE,IAAA,IAAI,GAAA,CAAI,mBAAA,KAAwB,MAAA,EAAW,IAAA,CAAK,sBAAsB,GAAA,CAAI,mBAAA;AAC1E,IAAA,IAAI,GAAA,CAAI,eAAA,KAAoB,MAAA,EAAW,IAAA,CAAK,kBAAkB,GAAA,CAAI,eAAA;AAClE,IAAA,IAAI,GAAA,CAAI,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,GAAA,CAAI,OAAA;AAClD,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,KAAA;AAAA,IACA,KAAA,EAAO,KAAK,KAAA,IAAS,IAAA;AAAA,IACrB,YAAA,EAAc,KAAK,YAAA,IAAgB;AAAA,GACrC;AACF;;;ACnSA,IAAM,GAAA,GAAM,MAAA,CAAO,YAAA,CAAa,EAAE,CAAA;AAClC,IAAM,IAAA,GAAO;AAAA,EACX,KAAA,EAAO,GAAG,GAAG,CAAA,GAAA,CAAA;AAAA,EACb,GAAA,EAAK,GAAG,GAAG,CAAA,GAAA,CAAA;AAAA,EACX,IAAA,EAAM,GAAG,GAAG,CAAA,GAAA,CAAA;AAAA,EACZ,KAAA,EAAO,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA,EACb,MAAA,EAAQ,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA,EACd,GAAA,EAAK,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA,EACX,IAAA,EAAM,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA,EACZ,IAAA,EAAM,GAAG,GAAG,CAAA,IAAA;AACd,CAAA;AAIA,IAAM,KAAA,GAA+E;AAAA,EACnF,OAAA,EAAS,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,OAAA,EAAQ;AAAA,EACrC,OAAA,EAAS,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,QAAA,EAAS;AAAA,EACtC,SAAA,EAAW,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,MAAA,EAAO;AAAA,EACtC,OAAA,EAAS,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,KAAA,EAAM;AAAA,EACnC,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAK,OAAO,MAAA;AAC/B,CAAA;AAGO,SAAS,gBAAA,CAAiB,MAAA,EAAyB,OAAA,GAAyB,EAAC,EAAW;AAC7F,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,CAAA,KAAc,QAAQ,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,GAAK,CAAA;AACxF,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,GAAS,YAAA,GAAe,QAAA;AAC7C,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,EAAG,MAAM,WAAA,EAAa,MAAM,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAA,CAAA,EAAK,MAAM,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,MAAA,CAAO,KAAK,CAAA,CAAA,CAAA,EAAK,MAAM,CAAC,CAAA;AAAA,GACrH;AAGA,EAAA,MAAM,QAAyC,CAAC,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,WAAW,WAAW,CAAA;AACvG,EAAA,MAAM,SAAS,CAAC,GAAG,OAAO,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,MAAM,CAAA,GAAI,MAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AACnG,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,CAAE,MAAM,CAAA;AACxB,IAAA,MAAM,MAAA,GACJ,CAAA,CAAE,aAAA,IAAiB,CAAA,CAAE,aAAA,CAAc,SAC/B,KAAA,CAAM,CAAA,EAAA,EAAK,CAAA,CAAE,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,EAAK,MAAM,CAAA,GAChD,CAAA,CAAE,MAAA,GACA,KAAA,CAAM,KAAK,CAAA,CAAE,MAAM,CAAA,CAAA,CAAA,EAAK,MAAM,CAAA,GAC9B,EAAA;AACR,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,CAAA,CAAE,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAA,CAAE,OAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,CAAC,IAAI,CAAA,CAAE,GAAG,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,EAClG;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,MAAA,CAAO,OAAA,IAAW,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,QAAA,CAAA;AAAA,IACnC,MAAA,CAAO,OAAA,IAAW,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,QAAA,CAAA;AAAA,IACnC,MAAA,CAAO,SAAA,IAAa,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA,UAAA,CAAA;AAAA,IACvC,MAAA,CAAO,OAAA,IAAW,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,QAAA,CAAA;AAAA,IACnC,MAAA,CAAO,OAAA,IAAW,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,QAAA;AAAA,GACrC,CAAE,OAAO,OAAO,CAAA;AAChB,EAAA,MAAM,UAAU,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,YAAA;AAClD,EAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA,GAAa,KAAA,CAAM,2BAAA,EAA0B,MAAM,CAAA,GAAI,EAAA;AACpF,EAAA,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,OAAA,EAAS,MAAM,CAAC,CAAA,EAAG,aAAa,CAAA,CAAE,CAAA;AAExD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACpDA,IAAM,GAAA,GAA8B,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAE;AAGtF,SAAS,KAAK,UAAA,EAA4B;AAC/C,EAAA,eAAA,CAAgB,YAAY,QAAQ,CAAA;AACpC,EAAA,OAAO,UAAA;AACT;AAQO,SAAS,MAAM,QAAA,EAA0B;AAC9C,EAAA,MAAM,CAAA,GAAI,mEAAA,CAAoE,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAClG,EAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAQ,CAAA,gDAAA,CAA6C,CAAA;AAChH,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACrB,EAAA,MAAM,OAAO,CAAA,CAAE,CAAC,CAAA,CAAG,WAAA,GAAc,CAAC,CAAA;AAClC,EAAA,IAAI,IAAI,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,CAAC,CAAA,CAAE,CAAA;AAE3E,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAS,GAAA,EAAK;AAChB,IAAA,IAAI,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAAsC,CAAC,CAAA,CAAE,CAAA;AACrE,IAAA,IAAA,GAAO,KAAK,CAAC,CAAA,UAAA,CAAA;AAAA,EACf,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,IAAA,IAAI,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,0DAAA,EAAwD,CAAC,CAAA,CAAE,CAAA;AACvF,IAAA,IAAA,GAAO,KAAK,CAAC,CAAA,QAAA,CAAA;AAAA,EACf,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,IAAA,IAAI,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,wDAAA,EAAsD,CAAC,CAAA,CAAE,CAAA;AACrF,IAAA,IAAA,GAAO,OAAO,CAAC,CAAA,MAAA,CAAA;AAAA,EACjB,CAAA,MAAO;AACL,IAAA,IAAI,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAmC,CAAC,CAAA,CAAE,CAAA;AAClE,IAAA,IAAA,GAAO,CAAA,KAAM,CAAA,GAAI,CAAA,SAAA,CAAA,GAAc,CAAA,MAAA,EAAS,CAAC,CAAA,IAAA,CAAA;AAAA,EAC3C;AACA,EAAA,eAAA,CAAgB,IAAA,EAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,EAAA,CAAI,CAAA;AAC5C,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,aAAa,CAAA,EAAmB;AAC9C,EAAA,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AACtB;AAGO,SAAS,WAAW,CAAA,EAAmB;AAC5C,EAAA,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AACtB;AAGO,SAAS,MAAA,CAAO,SAAS,CAAA,EAAW;AACzC,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAG,IAAI,QAAQ,CAAA;AACxC,EAAA,OAAO,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,QAAA,CAAU,CAAA;AAC7B;AAGO,SAAS,KAAA,CAAM,OAAO,OAAA,EAAiB;AAC5C,EAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,UAAU,IAAI,CAAA;AACjC,EAAA,OAAO,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,MAAA,CAAQ,CAAA;AACjC;AAGO,SAAS,MAAA,CAAO,GAAA,EAAc,IAAA,GAAO,OAAA,EAAiB;AAC3D,EAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,UAAU,IAAI,CAAA;AACjC,EAAA,OAAO,IAAA,CAAK,GAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,KAAA,EAAQ,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAE,CAAA;AAC/C;AAGO,SAAS,OAAA,CAAQ,UAAA,EAAoB,IAAA,GAAO,OAAA,EAAiB;AAClE,EAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,UAAU,IAAI,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,UAAA,EAAY,CAAA,EAAG,IAAI,cAAc,CAAA;AACnD,EAAA,OAAO,KAAK,CAAA,EAAG,EAAE,IAAI,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,IAAA,CAAM,CAAA;AACtC;AAGO,SAAS,QAAA,CAAS,OAAO,OAAA,EAAiB;AAC/C,EAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,UAAU,IAAI,CAAA;AACjC,EAAA,OAAO,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,QAAA,CAAU,CAAA;AACnC;AAGO,SAAS,QAAA,CAAS,OAAO,OAAA,EAAiB;AAC/C,EAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,UAAU,IAAI,CAAA;AACjC,EAAA,OAAO,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,QAAA,CAAU,CAAA;AACnC;AAGO,IAAM,QAAA,GAAW;AAAA,EACtB,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,YAAA;AAAA,EAAc,UAAA;AAAA,EAAY,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU;AACnF;AAEA,SAAS,UAAU,IAAA,EAA0C;AAC3D,EAAA,MAAM,CAAA,GAAI,qBAAA,CAAsB,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAChD,EAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAiD,IAAI,CAAA,CAAA,CAAG,CAAA;AAChF,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACtB,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACtB,EAAA,IAAI,KAAK,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA0B,EAAE,CAAA,CAAE,CAAA;AAC3D,EAAA,IAAI,KAAK,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAA4B,EAAE,CAAA,CAAE,CAAA;AAC7D,EAAA,OAAO,EAAE,IAAI,EAAA,EAAG;AAClB;AAEA,SAAS,QAAQ,GAAA,EAAsB;AACrC,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,GAAA,GAAM,KAAK,GAAA,GAAM,CAAA,QAAS,IAAI,KAAA,CAAM,CAAA,mDAAA,EAAiD,GAAG,CAAA,CAAE,CAAA;AAC9F,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA;AAC/B,EAAA,IAAI,MAAM,MAAA,EAAW,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,GAAG,CAAA,qCAAA,CAAwB,CAAA;AACpF,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAa,KAAA,EAAuB;AAC7E,EAAA,IAAI,CAAC,OAAO,SAAA,CAAU,KAAK,KAAK,KAAA,GAAQ,GAAA,IAAO,QAAQ,GAAA,EAAK;AAC1D,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,oBAAA,EAAuB,GAAG,CAAA,MAAA,EAAI,GAAG,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,KAAA;AACT;;;ACxCO,SAAS,sBAAA,CAAuB,QAAQ,EAAA,EAAY;AACzD,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,KAAK,CAAA;AAChC,EAAA,MAAA,CAAO,gBAAgB,GAAG,CAAA;AAC1B,EAAA,OAAO,MAAM,IAAA,CAAK,GAAG,CAAA,CAClB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CAAA;AACZ","file":"index.cjs","sourcesContent":["/**\n * Error taxonomy for the SDK. Everything thrown by the public surface is a\n * `CronvelloError` (or subclass), so callers can `catch (e) { if (e instanceof CronvelloError) … }`.\n */\n\nexport class CronvelloError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloError\";\n // Restore prototype chain for instanceof across transpilation targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A non-2xx response from the Cronvello API. */\nexport class CronvelloApiError extends CronvelloError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the API body, when present. */\n readonly code: string | undefined;\n /** The method + path that failed, e.g. `POST /v1/jobs`. */\n readonly endpoint: string;\n /** Parsed response body (best effort). */\n readonly body: unknown;\n /** Seconds to wait before retrying, parsed from `Retry-After` / rate-limit payload (429 only). */\n readonly retryAfterSeconds: number | undefined;\n\n constructor(args: {\n status: number;\n endpoint: string;\n message: string;\n code?: string;\n body?: unknown;\n retryAfterSeconds?: number;\n }) {\n super(`[${args.status}] ${args.endpoint}: ${args.message}`);\n this.name = \"CronvelloApiError\";\n this.status = args.status;\n this.code = args.code;\n this.endpoint = args.endpoint;\n this.body = args.body;\n this.retryAfterSeconds = args.retryAfterSeconds;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n get isAuthError(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n get isNotFound(): boolean {\n return this.status === 404;\n }\n}\n\n/** A network/transport failure (DNS, connection reset, timeout) before any HTTP status. */\nexport class CronvelloNetworkError extends CronvelloError {\n readonly endpoint: string;\n override readonly cause: unknown;\n constructor(endpoint: string, cause: unknown) {\n super(`Network error calling ${endpoint}: ${describe(cause)}`);\n this.name = \"CronvelloNetworkError\";\n this.endpoint = endpoint;\n this.cause = cause;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A misconfiguration caught before any network call (missing apiKey, bad URL, …). */\nexport class CronvelloConfigError extends CronvelloError {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloConfigError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nfunction describe(cause: unknown): string {\n if (cause instanceof Error) return cause.message;\n return String(cause);\n}\n","/**\n * Minimal HTTP transport over the global `fetch` (Node 20+). No axios, no node-fetch —\n * zero runtime dependencies. Adds bearer auth, JSON (de)serialization, typed error mapping,\n * bounded retries with backoff for transient failures, and optional idempotency keys.\n */\n\nimport {\n CronvelloApiError,\n CronvelloConfigError,\n CronvelloNetworkError,\n} from \"./errors.js\";\n\nexport type FetchLike = (\n input: string,\n init?: {\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n },\n) => Promise<{\n ok: boolean;\n status: number;\n headers: { get(name: string): string | null };\n text(): Promise<string>;\n}>;\n\nexport interface TransportOptions {\n baseUrl: string;\n apiKey: string;\n /** Per-request timeout in ms. Default 30_000. */\n timeoutMs?: number;\n /** Max retry attempts for 429/5xx/network errors. Default 2 (=> up to 3 tries). */\n maxRetries?: number;\n /** Override the fetch implementation (testing / custom agents). */\n fetch?: FetchLike;\n /** Extra headers sent on every request (e.g. a custom User-Agent). */\n defaultHeaders?: Record<string, string>;\n /** Telemetry hook — called once per completed attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport interface RequestOptions {\n method: string;\n path: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Idempotency-Key header value — replays of the same key are de-duplicated server-side. */\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\n\nexport class Transport {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly onRequest: TransportOptions[\"onRequest\"];\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) throw new CronvelloConfigError(\"apiKey is required\");\n if (!opts.baseUrl) throw new CronvelloConfigError(\"baseUrl is required\");\n const resolvedFetch = opts.fetch ?? (globalThis.fetch as unknown as FetchLike | undefined);\n if (!resolvedFetch) {\n throw new CronvelloConfigError(\n \"No global fetch found. Use Node 20+ or pass a `fetch` implementation in the client options.\",\n );\n }\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.maxRetries = opts.maxRetries ?? 2;\n this.fetchImpl = resolvedFetch;\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.onRequest = opts.onRequest;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const endpoint = `${opts.method} ${opts.path}`;\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.apiKey}`,\n accept: \"application/json\",\n ...this.defaultHeaders,\n };\n let payload: string | undefined;\n if (opts.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(opts.body);\n }\n if (opts.idempotencyKey) headers[\"idempotency-key\"] = opts.idempotencyKey;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const startedAt = Date.now();\n const { signal, cancel } = this.withTimeout(opts.signal);\n try {\n const res = await this.fetchImpl(url, {\n method: opts.method,\n headers,\n ...(payload !== undefined ? { body: payload } : {}),\n signal,\n });\n cancel();\n const durationMs = Date.now() - startedAt;\n this.onRequest?.({ method: opts.method, path: opts.path, status: res.status, attempt, durationMs });\n\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (res.ok) return unwrapEnvelope(parsed) as T;\n\n const retryAfter = parseRetryAfter(res, parsed);\n if (RETRYABLE_STATUS.has(res.status) && attempt < this.maxRetries) {\n await sleep(this.backoff(attempt, retryAfter));\n continue;\n }\n throw new CronvelloApiError({\n status: res.status,\n endpoint,\n message: extractMessage(parsed) ?? `Request failed`,\n code: extractCode(parsed),\n body: parsed,\n ...(retryAfter !== undefined ? { retryAfterSeconds: retryAfter } : {}),\n });\n } catch (err) {\n cancel();\n if (err instanceof CronvelloApiError) throw err;\n // Network/abort error — retry if attempts remain.\n lastError = err;\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt));\n continue;\n }\n throw new CronvelloNetworkError(endpoint, err);\n }\n }\n // Unreachable, but satisfies the type checker.\n throw new CronvelloNetworkError(endpoint, lastError);\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const base = `${this.baseUrl}${path.startsWith(\"/\") ? path : `/${path}`}`;\n if (!query) return base;\n const params = Object.entries(query)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n return params.length ? `${base}?${params.join(\"&\")}` : base;\n }\n\n private withTimeout(external?: AbortSignal): { signal: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const onExternalAbort = () => controller.abort();\n if (external) {\n if (external.aborted) controller.abort();\n else external.addEventListener(\"abort\", onExternalAbort, { once: true });\n }\n return {\n signal: controller.signal,\n cancel: () => {\n clearTimeout(timer);\n external?.removeEventListener(\"abort\", onExternalAbort);\n },\n };\n }\n\n private backoff(attempt: number, retryAfterSeconds?: number): number {\n if (retryAfterSeconds !== undefined) return Math.min(retryAfterSeconds * 1000, 30_000);\n // Exponential backoff with full jitter: base 300ms, capped at 5s.\n const base = Math.min(300 * 2 ** attempt, 5_000);\n return Math.floor(Math.random() * base);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n/**\n * The Cronvello server wraps every successful `/v1` response in a `{ success, message, data }`\n * envelope, while the typed client methods are declared in terms of the inner payload. Unwrap\n * it here — centrally — so every resource method (and the high-level `sync()`) sees the data it\n * expects. Bodies that aren't enveloped (no boolean `success` + `data`) pass through unchanged,\n * so non-enveloped or future endpoints keep working.\n */\nfunction unwrapEnvelope(body: unknown): unknown {\n if (\n body !== null &&\n typeof body === \"object\" &&\n \"success\" in body &&\n typeof (body as { success: unknown }).success === \"boolean\" &&\n \"data\" in body\n ) {\n return (body as { data: unknown }).data;\n }\n return body;\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"message\" in body) {\n const m = (body as { message?: unknown }).message;\n if (typeof m === \"string\") return m;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"code\" in body) {\n const c = (body as { code?: unknown }).code;\n if (typeof c === \"string\") return c;\n }\n return undefined;\n}\n\nfunction parseRetryAfter(\n res: { headers: { get(name: string): string | null } },\n body: unknown,\n): number | undefined {\n const header = res.headers.get(\"retry-after\");\n if (header) {\n const n = Number(header);\n if (Number.isFinite(n)) return n;\n }\n if (body && typeof body === \"object\" && \"data\" in body) {\n const data = (body as { data?: { retryAfterSeconds?: unknown } }).data;\n if (data && typeof data.retryAfterSeconds === \"number\") return data.retryAfterSeconds;\n }\n return undefined;\n}\n","/**\n * Low-level, fully-typed client for the Cronvello public `/v1` API.\n *\n * This is the thin REST layer: one method per endpoint, request/response types straight\n * from the server contract. The high-level registry (`defineCronvello`) is built on top of\n * it. Use this directly when you need ad-hoc control beyond the registry model.\n */\n\nimport { Transport, type FetchLike } from \"../internal/http.js\";\nimport { CronvelloConfigError } from \"../internal/errors.js\";\nimport type {\n AccountRunsQuery,\n AccountTasksQuery,\n JobCreateBody,\n JobUpdateBody,\n MeResponse,\n PublicJob,\n PublicRun,\n PublicTask,\n RunNowResult,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RunsPage,\n RunsQuery,\n TaskCreateBody,\n TasksPage,\n TaskUpdateBody,\n UsageResponse,\n} from \"../internal/wire.js\";\n\n/** The production Cronvello API. Override `baseUrl` only for self-hosting or testing. */\nexport const CRONVELLO_DEFAULT_BASE_URL = \"https://api.cronvello.com\";\n\nexport interface CronvelloClientOptions {\n /** Account API key (`crn_live_…`). Required. */\n apiKey: string;\n /** API base URL. Defaults to https://api.cronvello.com. */\n baseUrl?: string;\n /** Per-request timeout in ms (default 30_000). */\n timeoutMs?: number;\n /** Retry attempts for 429/5xx/network errors (default 2). */\n maxRetries?: number;\n /** Custom fetch implementation (default: global fetch). */\n fetch?: FetchLike;\n /** Telemetry hook for every request attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport class CronvelloClient {\n private readonly transport: Transport;\n /** The resolved base URL in use. */\n readonly baseUrl: string;\n\n /** Job container operations. */\n readonly jobs: JobsResource;\n /** Scheduled task operations. */\n readonly tasks: TasksResource;\n /** Execution-history (run) operations. */\n readonly runs: RunsResource;\n /** Account identity + usage. */\n readonly account: AccountResource;\n\n constructor(options: CronvelloClientOptions) {\n if (!options || !options.apiKey) {\n throw new CronvelloConfigError(\"CronvelloClient requires an `apiKey` (crn_live_…).\");\n }\n this.baseUrl = (options.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.transport = new Transport({\n baseUrl: this.baseUrl,\n apiKey: options.apiKey,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.onRequest ? { onRequest: options.onRequest } : {}),\n defaultHeaders: { \"user-agent\": \"cronvello-sdk\" },\n });\n this.jobs = new JobsResource(this.transport);\n this.tasks = new TasksResource(this.transport);\n this.runs = new RunsResource(this.transport);\n this.account = new AccountResource(this.transport);\n }\n\n /**\n * Atomically reconcile a whole code registry server-side (`PUT /v1/registry`): one job\n * container + its tasks, created/updated/pruned/started in a single call. This is what\n * `defineCronvello().sync()` prefers; the high-level API builds the body for you.\n */\n reconcileRegistry(body: RegistryReconcileRequest, opts?: { idempotencyKey?: string }): Promise<RegistryReconcileResponse> {\n return this.transport.request({\n method: \"PUT\",\n path: \"/v1/registry\",\n body,\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n\n /**\n * Escape hatch for endpoints not yet wrapped by a typed method (heartbeat monitors,\n * maintenance windows, DLQ, notification channels, audit log, API-key self-service …).\n * `T` is the response shape you expect.\n */\n request<T>(method: string, path: string, opts?: { query?: Record<string, string | number | boolean | undefined>; body?: unknown; idempotencyKey?: string }): Promise<T> {\n return this.transport.request<T>({\n method,\n path,\n ...(opts?.query ? { query: opts.query } : {}),\n ...(opts?.body !== undefined ? { body: opts.body } : {}),\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n}\n\nclass JobsResource {\n constructor(private readonly t: Transport) {}\n\n list(): Promise<PublicJob[]> {\n return this.t.request({ method: \"GET\", path: \"/v1/jobs\" });\n }\n get(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}` });\n }\n create(body: JobCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: \"/v1/jobs\", body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n update(jobId: string, body: JobUpdateBody): Promise<PublicJob> {\n return this.t.request({ method: \"PATCH\", path: `/v1/jobs/${enc(jobId)}`, body });\n }\n delete(jobId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/jobs/${enc(jobId)}` });\n }\n start(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/start` });\n }\n stop(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/stop` });\n }\n listTasks(jobId: string): Promise<PublicTask[]> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}/tasks` });\n }\n createTask(jobId: string, body: TaskCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/tasks`, body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n}\n\nclass TasksResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated task table. */\n list(query?: AccountTasksQuery): Promise<TasksPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/tasks\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}` });\n }\n update(taskId: string, body: TaskUpdateBody): Promise<PublicTask> {\n return this.t.request({ method: \"PATCH\", path: `/v1/tasks/${enc(taskId)}`, body });\n }\n delete(taskId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/tasks/${enc(taskId)}` });\n }\n start(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/start` });\n }\n stop(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/stop` });\n }\n /** Trigger a one-off manual execution (does not change the schedule). */\n runNow(taskId: string): Promise<RunNowResult> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/run` });\n }\n listRuns(taskId: string, query?: RunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}/runs`, ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n}\n\nclass RunsResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated activity feed. */\n list(query?: AccountRunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/runs\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(runId: string): Promise<PublicRun> {\n return this.t.request({ method: \"GET\", path: `/v1/runs/${enc(runId)}` });\n }\n}\n\nclass AccountResource {\n constructor(private readonly t: Transport) {}\n\n me(): Promise<MeResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/me\" });\n }\n usage(): Promise<UsageResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/usage\" });\n }\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n","/**\n * Client-side cron + IANA-timezone validation.\n *\n * The goal is to catch *typos* at define/sync time with a clear message — not to re-implement the\n * server's scheduler. So the validator is deliberately permissive: it accepts the standard 5-field\n * crontab syntax (and an optional leading seconds field), the common `@macros`, names for months\n * and weekdays, and step/range/list combinations. Anything it cannot confidently reject is allowed\n * through, so a valid-but-unusual expression never blocks a deploy.\n */\n\nconst MACROS = new Set([\n \"@yearly\", \"@annually\", \"@monthly\", \"@weekly\", \"@daily\", \"@midnight\", \"@hourly\", \"@reboot\",\n]);\n\nconst MONTHS = [\"jan\", \"feb\", \"mar\", \"apr\", \"may\", \"jun\", \"jul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"];\nconst DOWS = [\"sun\", \"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\"];\n\ninterface FieldSpec {\n min: number;\n max: number;\n names?: string[];\n label: string;\n}\n\n// Field order for a 5-part expression.\nconst FIVE: FieldSpec[] = [\n { min: 0, max: 59, label: \"minute\" },\n { min: 0, max: 23, label: \"hour\" },\n { min: 1, max: 31, label: \"day-of-month\" },\n { min: 1, max: 12, names: MONTHS, label: \"month\" },\n { min: 0, max: 7, names: DOWS, label: \"day-of-week\" }, // 0 and 7 are both Sunday\n];\nconst SECONDS: FieldSpec = { min: 0, max: 59, label: \"second\" };\n\nexport interface CronValidation {\n valid: boolean;\n /** Human-readable reason when invalid. */\n error?: string;\n}\n\n/** Validate a cron expression. Returns `{ valid, error? }` rather than throwing. */\nexport function validateCron(expr: string): CronValidation {\n if (typeof expr !== \"string\" || !expr.trim()) {\n return { valid: false, error: \"schedule is empty\" };\n }\n const trimmed = expr.trim();\n if (trimmed.startsWith(\"@\")) {\n return MACROS.has(trimmed.toLowerCase())\n ? { valid: true }\n : { valid: false, error: `unknown cron macro \"${trimmed}\" (try @daily, @hourly, …)` };\n }\n\n const parts = trimmed.split(/\\s+/);\n if (parts.length !== 5 && parts.length !== 6) {\n return {\n valid: false,\n error: `expected 5 fields (min hour dom month dow) or 6 with seconds, got ${parts.length}: \"${trimmed}\"`,\n };\n }\n\n const specs = parts.length === 6 ? [SECONDS, ...FIVE] : FIVE;\n for (let i = 0; i < parts.length; i++) {\n const err = validateField(parts[i]!, specs[i]!);\n if (err) return { valid: false, error: `invalid ${specs[i]!.label} \"${parts[i]}\": ${err}` };\n }\n return { valid: true };\n}\n\nfunction validateField(field: string, spec: FieldSpec): string | null {\n // A field is a comma-separated list of terms.\n for (const term of field.split(\",\")) {\n const err = validateTerm(term, spec);\n if (err) return err;\n }\n return null;\n}\n\nfunction validateTerm(term: string, spec: FieldSpec): string | null {\n if (term === \"\") return \"empty list item\";\n // step: <range-or-*>/<n>\n let step: string | undefined;\n let base = term;\n const slash = term.indexOf(\"/\");\n if (slash >= 0) {\n base = term.slice(0, slash);\n step = term.slice(slash + 1);\n if (!/^\\d+$/.test(step) || Number(step) === 0) return `step must be a positive integer`;\n }\n if (base === \"*\") return null;\n // range: a-b\n const dash = base.indexOf(\"-\");\n if (dash > 0) {\n const lo = resolveValue(base.slice(0, dash), spec);\n const hi = resolveValue(base.slice(dash + 1), spec);\n if (lo === null) return `\"${base.slice(0, dash)}\" is out of range ${spec.min}-${spec.max}`;\n if (hi === null) return `\"${base.slice(dash + 1)}\" is out of range ${spec.min}-${spec.max}`;\n if (lo > hi) return `range start ${lo} is greater than end ${hi}`;\n return null;\n }\n // single value (only meaningful with a step if it's the base of `n/step`, which crontab rejects;\n // but most parsers accept it, so we stay permissive).\n if (step !== undefined && base !== \"*\") {\n // e.g. \"5/10\" — accept the base as a start value.\n return resolveValue(base, spec) === null ? `\"${base}\" is out of range ${spec.min}-${spec.max}` : null;\n }\n return resolveValue(base, spec) === null ? `\"${base}\" is out of range ${spec.min}-${spec.max}` : null;\n}\n\n/** Resolve a numeric or named field value to its number, or null if out of range / unknown. */\nfunction resolveValue(token: string, spec: FieldSpec): number | null {\n if (/^\\d+$/.test(token)) {\n const n = Number(token);\n return n >= spec.min && n <= spec.max ? n : null;\n }\n if (spec.names) {\n const idx = spec.names.indexOf(token.toLowerCase());\n if (idx >= 0) return idx + (spec.label === \"month\" ? 1 : 0);\n }\n return null;\n}\n\n/** Throw a clear error if the cron expression is invalid. `context` is woven into the message. */\nexport function assertValidCron(expr: string, context = \"\"): void {\n const res = validateCron(expr);\n if (!res.valid) {\n throw new Error(`${context ? `${context}: ` : \"\"}invalid cron schedule — ${res.error}`);\n }\n}\n\n/** True if `tz` is a valid IANA timezone (uses the runtime's Intl database). \"UTC\" always passes. */\nexport function isValidTimeZone(tz: string): boolean {\n if (!tz || typeof tz !== \"string\") return false;\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: tz });\n return true;\n } catch {\n return false;\n }\n}\n\n/** Throw a clear error if the timezone is not a valid IANA zone. */\nexport function assertValidTimeZone(tz: string, context = \"\"): void {\n if (!isValidTimeZone(tz)) {\n throw new Error(`${context ? `${context}: ` : \"\"}invalid timezone \"${tz}\" (expected an IANA name like \"Europe/Berlin\" or \"UTC\")`);\n }\n}\n","/**\n * Authentication helpers for the dispatch handler.\n *\n * Inbound (Cronvello → app): a bearer token equal to the configured `dispatchSecret`.\n * We compare it in constant time to avoid leaking the secret through timing.\n *\n * Outbound (app → Cronvello, async_callback only): we sign the callback body with\n * HMAC-SHA256 (`sha256=<hex>`), matching node-cron's `webhook-hmac.service`.\n */\n\nconst encoder = new TextEncoder();\n\n/** Parse `Authorization: Bearer <token>` (scheme is case-insensitive). Returns the token or null. */\nexport function parseBearer(headerValue: string | undefined): string | null {\n if (!headerValue) return null;\n const match = /^bearer\\s+(.+)$/i.exec(headerValue.trim());\n return match ? match[1]!.trim() : null;\n}\n\n/**\n * Constant-time string comparison. Runs in time proportional to the longer input and never\n * short-circuits, so it does not reveal where two values diverge. No `node:crypto` dependency,\n * so it works on edge runtimes too.\n */\nexport function timingSafeEqual(a: string, b: string): boolean {\n const ab = encoder.encode(a);\n const bb = encoder.encode(b);\n const len = Math.max(ab.length, bb.length);\n let diff = ab.length ^ bb.length;\n for (let i = 0; i < len; i++) {\n diff |= (ab[i] ?? 0) ^ (bb[i] ?? 0);\n }\n return diff === 0;\n}\n\n/**\n * HMAC-SHA256 signature in node-cron's wire format: `sha256=<hex>`.\n * Uses WebCrypto (`crypto.subtle`), a global on Node 20+ and edge runtimes — no node:crypto.\n */\nexport async function signHmacSha256(payload: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sig = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(payload));\n const hex = Array.from(new Uint8Array(sig))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return `sha256=${hex}`;\n}\n","/**\n * Framework-neutral dispatch core.\n *\n * Cronvello fires a due task by POSTing to the app's dispatch URL with\n * Authorization: Bearer <dispatchSecret>\n * body: { job: \"<registry-key>\", schedule: \"<cron>\", ...payload, _callback?: {...} }\n *\n * This module verifies the bearer, selects the job by key, runs its handler, and returns a\n * response. The Express/Next adapters are thin shells that translate their request/response\n * objects to/from the neutral shapes below.\n */\n\nimport type { CronvelloHooks, CronvelloJobConfig, CronvelloJobContext, CronvelloLogger, CronvelloRunSource } from \"./types.js\";\nimport { parseBearer, signHmacSha256, timingSafeEqual } from \"./verify.js\";\n\nexport interface ResolvedJob {\n key: string;\n config: CronvelloJobConfig;\n}\n\n/** A logger that discards everything — used when the app configures none, so `ctx.logger` is always safe. */\nexport const NOOP_LOGGER: CronvelloLogger = {};\n\nexport interface DispatcherState {\n jobs: Map<string, ResolvedJob>;\n dispatchSecret: string;\n logger: CronvelloLogger | undefined;\n hooks?: CronvelloHooks | undefined;\n /** Reject inbound bodies larger than this many bytes (default 1 MiB). */\n maxBodyBytes?: number;\n}\n\nexport interface DispatchRequest {\n method: string;\n /** Value of the Authorization header, if any. */\n authorization: string | undefined;\n /** Raw request body as text. */\n rawBody: string;\n /** Lower-cased request headers. */\n headers: Record<string, string>;\n /** Abort signal for the inbound request, if the host provides one. */\n signal?: AbortSignal;\n /**\n * Optional serverless lifecycle hook (e.g. Vercel/Cloudflare `ctx.waitUntil`). When present,\n * async_callback background work is registered with it so the function stays alive until done.\n */\n waitUntil?: (promise: Promise<unknown>) => void;\n}\n\nexport interface DispatchResponse {\n status: number;\n body: Record<string, unknown>;\n}\n\n/** Async-callback metadata Cronvello injects into the request body. */\ninterface CallbackEnvelope {\n url: string;\n runId: string;\n expectedSignatureHeader?: string;\n timeoutMs?: number;\n}\n\nexport interface Dispatcher {\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /** Run a job's handler in-process (no HTTP, no auth) — powers `cronvello.trigger()`. */\n runLocal(key: string, payload?: Record<string, unknown>): Promise<unknown>;\n}\n\nexport function createDispatcher(state: DispatcherState): Dispatcher {\n const log = state.logger ?? NOOP_LOGGER;\n const hooks = state.hooks;\n const maxBodyBytes = state.maxBodyBytes ?? 1_048_576; // 1 MiB\n\n /** Run the handler with lifecycle hooks + timing. Hook failures never break the run. */\n async function invokeHandler(job: ResolvedJob, ctx: CronvelloJobContext): Promise<{ durationMs: number; result: unknown }> {\n await safeHook(() => hooks?.onJobStart?.({ key: job.key, source: ctx.source, isAsync: ctx.isAsync }), log);\n const startedAt = Date.now();\n try {\n const result = await job.config.handler(ctx);\n const durationMs = Date.now() - startedAt;\n log.debug?.(`[cronvello] job '${job.key}' completed in ${durationMs}ms`);\n await safeHook(() => hooks?.onJobSuccess?.({ key: job.key, source: ctx.source, durationMs, result }), log);\n return { durationMs, result };\n } catch (err) {\n const durationMs = Date.now() - startedAt;\n const error = err instanceof Error ? err : new Error(String(err));\n log.error?.(`[cronvello] job '${job.key}' failed: ${error.message}`, { error: error.message });\n await safeHook(() => hooks?.onJobError?.({ key: job.key, source: ctx.source, durationMs, error }), log);\n throw error;\n }\n }\n\n function buildContext(key: string, job: ResolvedJob, req: DispatchRequest | null, body: Record<string, unknown>, isAsync: boolean, source: CronvelloRunSource): CronvelloJobContext {\n return {\n key,\n schedule: typeof body[\"schedule\"] === \"string\" ? (body[\"schedule\"] as string) : (job.config.schedule ?? \"\"),\n payload: (job.config.payload as Record<string, unknown>) ?? {},\n body,\n headers: req?.headers ?? {},\n isAsync,\n source,\n logger: log,\n signal: req?.signal,\n };\n }\n\n async function handle(req: DispatchRequest): Promise<DispatchResponse> {\n if (req.method.toUpperCase() !== \"POST\") {\n return resp(405, { ok: false, error: \"Method not allowed\" });\n }\n\n // 1. Authenticate: bearer must equal the dispatch secret (constant-time).\n const token = parseBearer(req.authorization);\n if (!token || !timingSafeEqual(token, state.dispatchSecret)) {\n log.warn?.(\"[cronvello] dispatch rejected: bad or missing bearer token\");\n return resp(401, { ok: false, error: \"Unauthorized\" });\n }\n\n // 2. Guard body size before parsing (defence against oversized/abusive payloads).\n if (byteLength(req.rawBody) > maxBodyBytes) {\n log.warn?.(`[cronvello] dispatch rejected: body exceeds ${maxBodyBytes} bytes`);\n return resp(413, { ok: false, error: \"Payload too large\" });\n }\n\n // 3. Parse the body.\n let body: Record<string, unknown>;\n try {\n const parsed = req.rawBody ? JSON.parse(req.rawBody) : {};\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return resp(400, { ok: false, error: \"Body must be a JSON object\" });\n }\n body = parsed as Record<string, unknown>;\n } catch {\n return resp(400, { ok: false, error: \"Invalid JSON body\" });\n }\n\n // 4. Select the job by its registry key.\n const key = typeof body[\"job\"] === \"string\" ? (body[\"job\"] as string) : null;\n if (!key) {\n return resp(400, { ok: false, error: \"Missing 'job' key in body\" });\n }\n const job = state.jobs.get(key);\n if (!job) {\n log.warn?.(`[cronvello] dispatch for unknown job '${key}'`);\n return resp(404, { ok: false, error: `Unknown job: ${key}` });\n }\n\n const callback = readCallback(body[\"_callback\"]);\n const isAsync = callback !== null;\n const ctx = buildContext(key, job, req, body, isAsync, \"dispatch\");\n\n // 5a. Async path — acknowledge now, run in the background, post the result back.\n if (callback) {\n const work = runAndReportCallback(job, ctx, callback, state.dispatchSecret, log, invokeHandler);\n if (req.waitUntil) req.waitUntil(work);\n else void work; // fire-and-forget on long-running hosts\n return resp(202, { ok: true, job: key, accepted: true });\n }\n\n // 5b. Sync path — run inline; the result IS the HTTP response Cronvello records.\n try {\n const { result } = await invokeHandler(job, ctx);\n return resp(200, { ok: true, job: key, result: result ?? null });\n } catch (err) {\n // Non-2xx → Cronvello records a failure and retries per the task's maxRetries.\n return resp(500, { ok: false, job: key, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n async function runLocal(key: string, payload?: Record<string, unknown>): Promise<unknown> {\n const job = state.jobs.get(key);\n if (!job) throw new Error(`Unknown job '${key}'. Known: ${[...state.jobs.keys()].join(\", \") || \"(none)\"}`);\n const body: Record<string, unknown> = { job: key, schedule: job.config.schedule, ...(payload ?? {}) };\n const ctx = buildContext(key, job, null, body, false, \"local\");\n const { result } = await invokeHandler(job, ctx);\n return result;\n }\n\n return { handle, runLocal };\n}\n\nasync function runAndReportCallback(\n job: ResolvedJob,\n ctx: CronvelloJobContext,\n callback: CallbackEnvelope,\n secret: string,\n log: CronvelloLogger,\n invokeHandler: (job: ResolvedJob, ctx: CronvelloJobContext) => Promise<{ durationMs: number; result: unknown }>,\n): Promise<void> {\n let payload: Record<string, unknown>;\n try {\n const { durationMs, result } = await invokeHandler(job, ctx);\n payload = { runId: callback.runId, success: true, durationMs, result: result ?? null };\n } catch (err) {\n payload = {\n runId: callback.runId,\n success: false,\n durationMs: 0,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n try {\n const bodyStr = JSON.stringify(payload);\n const header = callback.expectedSignatureHeader || \"X-Webhook-Signature\";\n const signature = await signHmacSha256(bodyStr, secret);\n const res = await fetch(callback.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", [header]: signature },\n body: bodyStr,\n });\n if (!res.ok) {\n log.warn?.(`[cronvello] callback POST for job '${job.key}' returned ${res.status}`);\n }\n } catch (err) {\n log.error?.(`[cronvello] failed to deliver callback for job '${job.key}'`, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/** Run a lifecycle hook, swallowing any error it throws so observability never breaks a job. */\nasync function safeHook(fn: () => void | Promise<void> | undefined, log: CronvelloLogger): Promise<void> {\n try {\n await fn();\n } catch (err) {\n log.warn?.(`[cronvello] a lifecycle hook threw: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\n/** Byte length of a UTF-8 string without allocating a Buffer when TextEncoder is available. */\nfunction byteLength(s: string): number {\n if (!s) return 0;\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(s).length;\n return s.length;\n}\n\nfunction readCallback(value: unknown): CallbackEnvelope | null {\n if (!value || typeof value !== \"object\") return null;\n const v = value as Record<string, unknown>;\n if (typeof v[\"url\"] !== \"string\" || typeof v[\"runId\"] !== \"string\") return null;\n return {\n url: v[\"url\"] as string,\n runId: v[\"runId\"] as string,\n ...(typeof v[\"expectedSignatureHeader\"] === \"string\"\n ? { expectedSignatureHeader: v[\"expectedSignatureHeader\"] as string }\n : {}),\n ...(typeof v[\"timeoutMs\"] === \"number\" ? { timeoutMs: v[\"timeoutMs\"] as number } : {}),\n };\n}\n\nfunction resp(status: number, body: Record<string, unknown>): DispatchResponse {\n return { status, body };\n}\n","/**\n * Idempotent reconciliation of a code registry into Cronvello.\n *\n * Model: ONE Job container per app (named `appName`), and one Task per registry job. The\n * Task's `name` IS the registry key — the stable identity used for matching, so renaming a\n * job's display/description never breaks the link. On each `sync()` we:\n * 1. ensure the Job container exists,\n * 2. diff registry tasks against the container's current tasks,\n * 3. create missing, patch changed, (optionally) delete removed,\n * 4. start newly-created tasks (Cronvello creates them DISABLED).\n *\n * The container is fully SDK-managed: only tasks inside THIS app's Job are ever touched.\n */\n\nimport type { CronvelloClient } from \"../client/client.js\";\nimport type {\n PublicJob,\n PublicTask,\n SuccessCriteria,\n TaskCreateBody,\n TaskUpdateBody,\n} from \"../internal/wire.js\";\nimport type {\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./types.js\";\nimport type { ResolvedJob } from \"./dispatch.js\";\n\nexport interface ReconcileInput {\n client: CronvelloClient;\n appName: string;\n appDescription?: string;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n jobs: ResolvedJob[];\n}\n\nexport async function reconcile(input: ReconcileInput, options: SyncOptions = {}): Promise<ReconcileResult> {\n const { client, appName, dispatchUrl, dispatchSecret, defaultTimeZone, jobs } = input;\n const prune = options.prune ?? true;\n const dryRun = options.dryRun ?? false;\n const rotateSecret = options.rotateSecret ?? false;\n\n // 1. Ensure the Job container.\n const { job: container, created: jobCreated } = await ensureContainer(client, appName, input.appDescription, dryRun);\n const jobId = container?.id ?? \"(dry-run)\";\n\n const changes: ReconcileTaskChange[] = [];\n const existingTasks = container && !jobCreated ? await client.jobs.listTasks(container.id) : [];\n const byKey = new Map(existingTasks.map((t) => [t.name, t] as const));\n const registryKeys = new Set(jobs.map((j) => j.key));\n\n // 2. Reconcile each registry job.\n for (const job of jobs) {\n const enabled = job.config.enabled ?? true;\n const existing = byKey.get(job.key);\n const desired = buildDesiredTask({ job, dispatchUrl, dispatchSecret, defaultTimeZone });\n\n if (!enabled) {\n // Keep the task but make sure it is not scheduled.\n if (existing && existing.status === \"ACTIVE\" && !dryRun) await client.tasks.stop(existing.id);\n changes.push({ key: job.key, action: \"skipped\", taskId: existing?.id ?? null, reason: \"disabled in registry\" });\n continue;\n }\n\n if (!existing) {\n if (dryRun || !container) {\n changes.push({ key: job.key, action: \"created\", taskId: null });\n continue;\n }\n const createBody: TaskCreateBody = { ...desired, targetToken: dispatchSecret };\n const task = await client.jobs.createTask(container.id, createBody, { idempotencyKey: `cv-create-${appName}-${job.key}` });\n await client.tasks.start(task.id); // tasks are created DISABLED\n changes.push({ key: job.key, action: \"created\", taskId: task.id });\n continue;\n }\n\n // Existing task — compute the diff.\n const { patch, changedFields } = diffTask(existing, desired, { rotateSecret, dispatchSecret });\n const needsStart = existing.status === \"DISABLED\";\n\n if (changedFields.length === 0 && !needsStart) {\n changes.push({ key: job.key, action: \"unchanged\", taskId: existing.id });\n continue;\n }\n if (!dryRun) {\n if (changedFields.length > 0) await client.tasks.update(existing.id, patch);\n if (needsStart) await client.tasks.start(existing.id);\n }\n changes.push({\n key: job.key,\n action: changedFields.length > 0 ? \"updated\" : \"unchanged\",\n taskId: existing.id,\n ...(changedFields.length > 0 ? { changedFields } : {}),\n ...(needsStart ? { reason: \"re-activated\" } : {}),\n });\n }\n\n // 3. Prune tasks no longer in the registry.\n if (prune) {\n for (const task of existingTasks) {\n if (registryKeys.has(task.name)) continue;\n if (!dryRun) await client.tasks.delete(task.id);\n changes.push({ key: task.name, action: \"deleted\", taskId: task.id });\n }\n }\n\n return summarize(jobId, appName, jobCreated, changes);\n}\n\nasync function ensureContainer(\n client: CronvelloClient,\n appName: string,\n description: string | undefined,\n dryRun: boolean,\n): Promise<{ job: PublicJob | null; created: boolean }> {\n const jobs = await client.jobs.list();\n const found = jobs.find((j) => j.name === appName);\n if (found) return { job: found, created: false };\n if (dryRun) return { job: null, created: true };\n const created = await client.jobs.create(\n { name: appName, ...(description ? { description } : {}) },\n { idempotencyKey: `cv-job-${appName}` },\n );\n return { job: created, created: true };\n}\n\nfunction buildDesiredTask(args: {\n job: ResolvedJob;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n}): TaskCreateBody {\n const { job, dispatchUrl, defaultTimeZone } = args;\n const cfg = job.config;\n const requestBody = JSON.stringify({ job: job.key, ...(cfg.payload ?? {}) });\n const body: TaskCreateBody = {\n name: job.key,\n schedule: cfg.schedule,\n timeZone: cfg.timeZone ?? defaultTimeZone,\n targetUrl: dispatchUrl,\n method: \"POST\",\n requestBody,\n };\n if (cfg.description !== undefined) body.description = cfg.description;\n if (cfg.urgency !== undefined) body.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) body.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) body.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) body.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) body.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) body.successCriteria = cfg.successCriteria;\n return body;\n}\n\nfunction diffTask(\n existing: PublicTask,\n desired: TaskCreateBody,\n opts: { rotateSecret: boolean; dispatchSecret: string },\n): { patch: TaskUpdateBody; changedFields: string[] } {\n const patch: TaskUpdateBody = {};\n const changed: string[] = [];\n\n const set = <K extends keyof TaskUpdateBody>(field: K, value: TaskUpdateBody[K]) => {\n patch[field] = value;\n changed.push(field);\n };\n\n if (existing.schedule !== desired.schedule) set(\"schedule\", desired.schedule);\n if (desired.timeZone !== undefined && existing.timeZone !== desired.timeZone) set(\"timeZone\", desired.timeZone);\n if (existing.targetUrl !== desired.targetUrl) set(\"targetUrl\", desired.targetUrl);\n if (existing.method !== (desired.method ?? \"POST\")) set(\"method\", desired.method ?? \"POST\");\n if (!jsonEqual(existing.requestBody, desired.requestBody)) set(\"requestBody\", desired.requestBody ?? null);\n\n // Optional fields: only reconcile when the registry explicitly sets them.\n if (desired.description !== undefined && (existing.description ?? undefined) !== desired.description) {\n set(\"description\", desired.description);\n }\n if (desired.urgency !== undefined && existing.urgency !== desired.urgency) set(\"urgency\", desired.urgency);\n if (desired.maxRetries !== undefined && existing.maxRetries !== desired.maxRetries) set(\"maxRetries\", desired.maxRetries);\n if (desired.executionMode !== undefined && existing.executionMode !== desired.executionMode) {\n set(\"executionMode\", desired.executionMode);\n }\n if (desired.callbackTimeoutMs !== undefined && existing.callbackTimeoutMs !== desired.callbackTimeoutMs) {\n set(\"callbackTimeoutMs\", desired.callbackTimeoutMs);\n }\n if (desired.allowConcurrentRuns !== undefined && existing.allowConcurrentRuns !== desired.allowConcurrentRuns) {\n set(\"allowConcurrentRuns\", desired.allowConcurrentRuns);\n }\n if (desired.successCriteria !== undefined && !deepEqual(existing.successCriteria, desired.successCriteria)) {\n set(\"successCriteria\", desired.successCriteria as SuccessCriteria);\n }\n\n // The dispatch secret (targetToken) can't be read back — only (re)set it on demand or when absent.\n if (opts.rotateSecret || !existing.hasTargetToken) set(\"targetToken\", opts.dispatchSecret);\n\n return { patch, changedFields: changed };\n}\n\nfunction jsonEqual(a: string | null, b: string | null | undefined): boolean {\n if (a == null || b == null) return a == b;\n try {\n return deepEqual(JSON.parse(a), JSON.parse(b));\n } catch {\n return a === b;\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n const ak = Object.keys(a as object).sort();\n const bk = Object.keys(b as object).sort();\n if (ak.length !== bk.length) return false;\n for (let i = 0; i < ak.length; i++) {\n if (ak[i] !== bk[i]) return false;\n if (!deepEqual((a as Record<string, unknown>)[ak[i]!], (b as Record<string, unknown>)[bk[i]!])) return false;\n }\n return true;\n}\n\nfunction summarize(\n jobId: string,\n jobName: string,\n jobCreated: boolean,\n changes: ReconcileTaskChange[],\n): ReconcileResult {\n const count = (a: ReconcileTaskChange[\"action\"]) => changes.filter((c) => c.action === a).length;\n return {\n jobId,\n jobName,\n jobCreated,\n created: count(\"created\"),\n updated: count(\"updated\"),\n unchanged: count(\"unchanged\"),\n deleted: count(\"deleted\"),\n skipped: count(\"skipped\"),\n changes,\n };\n}\n","/**\n * Express adapter. Zero dependency on `express` itself — the request/response are typed\n * structurally, so this works with Express 4/5 and any Connect-style middleware stack.\n *\n * import { defineCronvello } from \"@cronvello/sdk\";\n * import { expressHandler } from \"@cronvello/sdk/express\";\n *\n * app.post(\"/cronvello/dispatch\", express.json(), expressHandler(cronvello));\n * // …or simply: app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n *\n * Works with or without `express.json()` — if the body isn't pre-parsed, the raw stream is read.\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\nexport interface ExpressRequestLike {\n method?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n on?(event: string, listener: (chunk?: unknown) => void): void;\n}\n\nexport interface ExpressResponseLike {\n status(code: number): ExpressResponseLike;\n json(body: unknown): void;\n}\n\nexport type ExpressDispatchHandler = (req: ExpressRequestLike, res: ExpressResponseLike) => Promise<void>;\n\nexport function expressHandler(app: DispatchHandler): ExpressDispatchHandler {\n return async (req, res) => {\n const rawBody = await readBody(req);\n const result = await app.handle({\n method: req.method ?? \"POST\",\n authorization: headerValue(req.headers[\"authorization\"]),\n rawBody,\n headers: flattenHeaders(req.headers),\n });\n res.status(result.status).json(result.body);\n };\n}\n\nasync function readBody(req: ExpressRequestLike): Promise<string> {\n const body = req.body;\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\") return body;\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) return body.toString(\"utf8\");\n if (typeof body === \"object\") return JSON.stringify(body);\n }\n if (typeof req.on !== \"function\") return \"\";\n return new Promise<string>((resolve) => {\n let data = \"\";\n req.on!(\"data\", (chunk?: unknown) => {\n data += typeof chunk === \"string\" ? chunk : String(chunk ?? \"\");\n });\n req.on!(\"end\", () => resolve(data));\n req.on!(\"error\", () => resolve(data));\n });\n}\n\nfunction headerValue(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) return value[0];\n return value;\n}\n\nfunction flattenHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined) continue;\n out[k.toLowerCase()] = Array.isArray(v) ? v.join(\", \") : v;\n }\n return out;\n}\n","/**\n * Next.js App Router adapter (Route Handlers). Zero dependency on `next` — uses the Web\n * Fetch `Request`/`Response` globals (Node 20+ and the edge runtime).\n *\n * // app/cronvello/dispatch/route.ts\n * import { cronvello } from \"@/lib/cronvello\";\n * import { nextHandler } from \"@cronvello/sdk/next\";\n * export const POST = nextHandler(cronvello);\n *\n * On serverless hosts, prefer the default sync execution mode so the work finishes within the\n * request. async_callback needs a host that keeps running after the response (see docs).\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\n/** Structural subset of the Web Fetch `Request` we rely on. */\nexport interface FetchRequestLike {\n method: string;\n headers: {\n get(name: string): string | null;\n forEach?(cb: (value: string, key: string) => void): void;\n };\n text(): Promise<string>;\n}\n\nexport type NextRouteHandler = (req: FetchRequestLike) => Promise<Response>;\n\nexport function nextHandler(app: DispatchHandler): NextRouteHandler {\n return async (req) => {\n const rawBody = await req.text();\n const headers: Record<string, string> = {};\n req.headers.forEach?.((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n const result = await app.handle({\n method: req.method,\n authorization: req.headers.get(\"authorization\") ?? undefined,\n rawBody,\n headers,\n });\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n","/**\n * `defineCronvello` — the high-level, code-first entry point.\n *\n * export const cronvello = defineCronvello({\n * appName: \"my-app\",\n * appUrl: process.env.APP_URL!,\n * apiKey: process.env.CRONVELLO_API_KEY!,\n * dispatchSecret: process.env.CRONVELLO_DISPATCH_SECRET!,\n * jobs: {\n * \"send-daily-digest\": { schedule: \"0 8 * * *\", handler: async () => { … } },\n * \"cleanup-temp\": { schedule: \"*\\/15 * * * *\", handler: async () => { … } },\n * },\n * });\n *\n * await cronvello.sync(); // reconcile the registry to Cronvello (idempotent)\n * app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n */\n\nimport { CronvelloClient, CRONVELLO_DEFAULT_BASE_URL } from \"../client/client.js\";\nimport { CronvelloApiError, CronvelloConfigError } from \"../internal/errors.js\";\nimport { validateCron, isValidTimeZone } from \"../internal/cron.js\";\nimport type { RegistryReconcileRequest, RegistryTaskInput, RunNowResult } from \"../internal/wire.js\";\nimport { createDispatcher, type DispatchRequest, type DispatchResponse, type ResolvedJob } from \"./dispatch.js\";\nimport { reconcile } from \"./reconcile.js\";\nimport { expressHandler, type ExpressDispatchHandler } from \"../adapters/express.js\";\nimport { nextHandler, type NextRouteHandler } from \"../adapters/next.js\";\nimport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobsInput,\n ReconcileResult,\n SyncOptions,\n} from \"./types.js\";\n\nconst DEFAULT_DISPATCH_PATH = \"/cronvello/dispatch\";\nconst DEFAULT_TIME_ZONE = \"Europe/Berlin\";\n\nexport interface CronvelloApp {\n /** The underlying low-level client for ad-hoc `/v1` calls. */\n readonly client: CronvelloClient;\n /** Resolved jobs, keyed by their stable registry key. */\n readonly jobs: ReadonlyMap<string, ResolvedJob>;\n /** The app identity / Job-container name. */\n readonly appName: string;\n /** Path the dispatch handler should be mounted at (e.g. \"/cronvello/dispatch\"). */\n readonly dispatchPath: string;\n /** Absolute URL Cronvello calls back (appUrl + dispatchPath). */\n readonly dispatchUrl: string;\n\n /** Reconcile the registry into Cronvello. Idempotent — safe to call on every boot/deploy. */\n sync(options?: SyncOptions): Promise<ReconcileResult>;\n /** Trigger one job immediately via Cronvello (manual run). Requires a prior `sync()`. */\n run(key: string): Promise<RunNowResult>;\n /**\n * Run a job's handler locally, in-process — no HTTP round-trip, no Cronvello, no deploy.\n * Perfect for unit tests and `npx cronvello dev`. Lifecycle hooks fire (`source: \"local\"`).\n */\n trigger(key: string, payload?: Record<string, unknown>): Promise<unknown>;\n /** Framework-neutral dispatch entry — used by the adapters. */\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /** Express/Connect request handler for the dispatch endpoint. */\n expressHandler(): ExpressDispatchHandler;\n /** Next.js App Router (Route Handler) for the dispatch endpoint. */\n nextHandler(): NextRouteHandler;\n /** The registry keys, for diagnostics. */\n keys(): string[];\n}\n\nexport function defineCronvello(config: CronvelloAppConfig): CronvelloApp {\n validateConfig(config);\n\n const validate = config.validateSchedules ?? true;\n const defaultTimeZone = config.timeZone ?? DEFAULT_TIME_ZONE;\n if (validate && !isValidTimeZone(defaultTimeZone)) {\n throw new CronvelloConfigError(`Invalid \\`timeZone\\` \"${defaultTimeZone}\" — expected an IANA name like \"Europe/Berlin\" or \"UTC\".`);\n }\n\n const jobs = normalizeJobs(config.jobs, validate);\n const dispatchPath = normalizePath(config.dispatchPath ?? DEFAULT_DISPATCH_PATH);\n const dispatchUrl = joinUrl(config.appUrl, dispatchPath);\n\n const client = new CronvelloClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL,\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n ...(config.maxRetries !== undefined ? { maxRetries: config.maxRetries } : {}),\n ...(config.fetch ? { fetch: config.fetch } : {}),\n });\n\n const dispatcher = createDispatcher({\n jobs,\n dispatchSecret: config.dispatchSecret,\n logger: config.logger,\n ...(config.hooks ? { hooks: config.hooks } : {}),\n ...(config.maxBodyBytes !== undefined ? { maxBodyBytes: config.maxBodyBytes } : {}),\n });\n\n const app: CronvelloApp = {\n client,\n jobs,\n appName: config.appName,\n dispatchPath,\n dispatchUrl,\n\n async sync(options?: SyncOptions): Promise<ReconcileResult> {\n const opts = options ?? {};\n // Prefer the atomic server-side reconcile (one round-trip). dryRun is only supported by\n // the local differ, so it always takes the client-side path.\n if (!opts.dryRun) {\n try {\n const res = await client.reconcileRegistry(\n buildRegistryRequest(config, dispatchUrl, defaultTimeZone, [...jobs.values()], opts),\n );\n return {\n jobId: res.job.id,\n jobName: res.job.name,\n jobCreated: res.jobCreated,\n created: res.created,\n updated: res.updated,\n unchanged: res.unchanged,\n deleted: res.deleted,\n skipped: res.skipped,\n changes: res.changes.map((c) => ({\n key: c.key,\n action: c.action,\n taskId: c.taskId,\n ...(c.changedFields ? { changedFields: c.changedFields } : {}),\n })),\n tasks: res.tasks,\n };\n } catch (e) {\n // Older server without /v1/registry → fall back to the client-side differ.\n if (!(e instanceof CronvelloApiError) || (e.status !== 404 && e.status !== 405)) throw e;\n }\n }\n return reconcile(\n {\n client,\n appName: config.appName,\n dispatchUrl,\n dispatchSecret: config.dispatchSecret,\n defaultTimeZone,\n jobs: [...jobs.values()],\n },\n opts,\n );\n },\n\n async run(key: string): Promise<RunNowResult> {\n if (!jobs.has(key)) {\n throw new CronvelloConfigError(`Unknown job '${key}'. Known: ${[...jobs.keys()].join(\", \") || \"(none)\"}`);\n }\n const containers = await client.jobs.list();\n const container = containers.find((j) => j.name === config.appName);\n if (!container) {\n throw new CronvelloConfigError(`App '${config.appName}' is not synced yet — call sync() first.`);\n }\n const tasks = await client.jobs.listTasks(container.id);\n const task = tasks.find((t) => t.name === key);\n if (!task) {\n throw new CronvelloConfigError(`Job '${key}' has no task yet — call sync() first.`);\n }\n return client.tasks.runNow(task.id);\n },\n\n trigger: (key: string, payload?: Record<string, unknown>) => dispatcher.runLocal(key, payload),\n handle: dispatcher.handle,\n expressHandler: () => expressHandler(app),\n nextHandler: () => nextHandler(app),\n keys: () => [...jobs.keys()],\n };\n\n return app;\n}\n\n/** Config for `defineCronvello.fromEnv` — the three secret fields become optional (read from env). */\nexport type CronvelloEnvConfig = Omit<CronvelloAppConfig, \"apiKey\" | \"dispatchSecret\" | \"appUrl\"> &\n Partial<Pick<CronvelloAppConfig, \"apiKey\" | \"dispatchSecret\" | \"appUrl\">>;\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace defineCronvello {\n /**\n * Build an app from environment variables, so you don't repeat the same reads in every service.\n * Reads `CRONVELLO_API_KEY`, `CRONVELLO_DISPATCH_SECRET`, `CRONVELLO_APP_URL` (or `PUBLIC_URL`),\n * and optionally `CRONVELLO_API_URL` (base URL). Anything passed explicitly overrides the env.\n *\n * export const cronvello = defineCronvello.fromEnv({ appName: \"my-app\", jobs: { … } });\n */\n export function fromEnv(\n config: CronvelloEnvConfig,\n env: Record<string, string | undefined> = typeof process !== \"undefined\" ? process.env : {},\n ): CronvelloApp {\n const apiKey = config.apiKey ?? env[\"CRONVELLO_API_KEY\"];\n const dispatchSecret = config.dispatchSecret ?? env[\"CRONVELLO_DISPATCH_SECRET\"];\n const appUrl = config.appUrl ?? env[\"CRONVELLO_APP_URL\"] ?? env[\"PUBLIC_URL\"];\n const baseUrl = config.baseUrl ?? env[\"CRONVELLO_API_URL\"];\n\n const missing = [\n !apiKey && \"CRONVELLO_API_KEY\",\n !dispatchSecret && \"CRONVELLO_DISPATCH_SECRET\",\n !appUrl && \"CRONVELLO_APP_URL (or PUBLIC_URL)\",\n ].filter(Boolean);\n if (missing.length) {\n throw new CronvelloConfigError(`defineCronvello.fromEnv() is missing required env: ${missing.join(\", \")}.`);\n }\n\n return defineCronvello({\n ...config,\n apiKey: apiKey!,\n dispatchSecret: dispatchSecret!,\n appUrl: appUrl!,\n ...(baseUrl ? { baseUrl } : {}),\n });\n }\n}\n\nfunction validateConfig(config: CronvelloAppConfig): void {\n if (!config) throw new CronvelloConfigError(\"defineCronvello requires a config object.\");\n if (!config.appName || !config.appName.trim()) throw new CronvelloConfigError(\"`appName` is required.\");\n if (!config.appUrl || !/^https?:\\/\\//i.test(config.appUrl)) {\n throw new CronvelloConfigError(\"`appUrl` must be an absolute http(s) URL (the public URL of THIS app).\");\n }\n if (!config.apiKey) throw new CronvelloConfigError(\"`apiKey` (crn_live_…) is required.\");\n if (!config.dispatchSecret || config.dispatchSecret.length < 16) {\n throw new CronvelloConfigError(\"`dispatchSecret` is required and must be at least 16 chars (use a random 32-byte value).\");\n }\n if (!config.jobs) throw new CronvelloConfigError(\"`jobs` is required.\");\n}\n\nfunction normalizeJobs(input: CronvelloJobsInput, validate: boolean): Map<string, ResolvedJob> {\n const map = new Map<string, ResolvedJob>();\n const entries: Array<{ key: string; config: CronvelloJobConfig }> = Array.isArray(input)\n ? input.map(({ key, ...rest }) => ({ key, config: rest }))\n : Object.entries(input).map(([key, config]) => ({ key, config }));\n\n for (const { key, config } of entries) {\n const trimmed = (key ?? \"\").trim();\n if (!trimmed) throw new CronvelloConfigError(\"Every job needs a non-empty key.\");\n if (trimmed.length > 255) throw new CronvelloConfigError(`Job key '${trimmed}' exceeds 255 characters.`);\n if (map.has(trimmed)) throw new CronvelloConfigError(`Duplicate job key '${trimmed}'.`);\n if (!config || typeof config.handler !== \"function\") {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a handler function.`);\n }\n if (!config.schedule || !config.schedule.trim()) {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a schedule.`);\n }\n if (validate) {\n const cronCheck = validateCron(config.schedule);\n if (!cronCheck.valid) {\n throw new CronvelloConfigError(`Job '${trimmed}' has an invalid schedule \"${config.schedule}\" — ${cronCheck.error}.`);\n }\n if (config.timeZone !== undefined && !isValidTimeZone(config.timeZone)) {\n throw new CronvelloConfigError(`Job '${trimmed}' has an invalid timeZone \"${config.timeZone}\" — expected an IANA name.`);\n }\n }\n map.set(trimmed, { key: trimmed, config });\n }\n if (map.size === 0) throw new CronvelloConfigError(\"At least one job is required.\");\n return map;\n}\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n return trimmed.startsWith(\"/\") ? trimmed.replace(/\\/+$/, \"\") || \"/\" : `/${trimmed.replace(/\\/+$/, \"\")}`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, \"\")}${path}`;\n}\n\n/** Build the PUT /v1/registry body from the registry jobs. */\nfunction buildRegistryRequest(\n config: CronvelloAppConfig,\n dispatchUrl: string,\n defaultTimeZone: string,\n jobs: ResolvedJob[],\n opts: SyncOptions,\n): RegistryReconcileRequest {\n const tasks: RegistryTaskInput[] = jobs.map((j) => {\n const cfg = j.config;\n const task: RegistryTaskInput = {\n key: j.key,\n schedule: cfg.schedule,\n targetUrl: dispatchUrl,\n targetToken: config.dispatchSecret,\n method: \"POST\",\n timeZone: cfg.timeZone ?? defaultTimeZone,\n requestBody: JSON.stringify({ job: j.key, ...(cfg.payload ?? {}) }),\n };\n if (cfg.description !== undefined) task.description = cfg.description;\n if (cfg.urgency !== undefined) task.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) task.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) task.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) task.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) task.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) task.successCriteria = cfg.successCriteria;\n if (cfg.enabled !== undefined) task.enabled = cfg.enabled;\n return task;\n });\n return {\n appName: config.appName,\n tasks,\n prune: opts.prune ?? true,\n rotateSecret: opts.rotateSecret ?? false,\n };\n}\n","/**\n * Render a `ReconcileResult` as a clean, human-readable summary — for boot logs, CI output, and\n * `npx cronvello sync`. Zero-dependency ANSI colouring, opt-in via `color: true`.\n */\n\nimport type { ReconcileResult, ReconcileTaskChange } from \"./types.js\";\n\nexport interface FormatOptions {\n /** Emit ANSI colour codes (default false — safe for log files). */\n color?: boolean;\n /** Label the summary as a preview (\"would …\") rather than an applied change. */\n dryRun?: boolean;\n}\n\nconst ESC = String.fromCharCode(27); // ANSI escape\nconst ANSI = {\n reset: `${ESC}[0m`,\n dim: `${ESC}[2m`,\n bold: `${ESC}[1m`,\n green: `${ESC}[32m`,\n yellow: `${ESC}[33m`,\n red: `${ESC}[31m`,\n cyan: `${ESC}[36m`,\n gray: `${ESC}[90m`,\n} as const;\n\ntype Color = keyof typeof ANSI;\n\nconst GLYPH: Record<ReconcileTaskChange[\"action\"], { sign: string; color: Color }> = {\n created: { sign: \"+\", color: \"green\" },\n updated: { sign: \"~\", color: \"yellow\" },\n unchanged: { sign: \"=\", color: \"gray\" },\n deleted: { sign: \"-\", color: \"red\" },\n skipped: { sign: \"·\", color: \"cyan\" },\n};\n\n/** Build the multi-line summary string. */\nexport function formatSyncResult(result: ReconcileResult, options: FormatOptions = {}): string {\n const paint = (s: string, c: Color) => (options.color ? `${ANSI[c]}${s}${ANSI.reset}` : s);\n const verb = options.dryRun ? \"would sync\" : \"synced\";\n const lines: string[] = [];\n\n lines.push(\n `${paint(\"Cronvello\", \"cyan\")} ${verb} ${paint(`\"${result.jobName}\"`, \"bold\")} ${paint(`(${result.jobId})`, \"gray\")}`,\n );\n\n // Per-task lines, in a stable, readable order.\n const order: ReconcileTaskChange[\"action\"][] = [\"created\", \"updated\", \"deleted\", \"skipped\", \"unchanged\"];\n const sorted = [...result.changes].sort((a, b) => order.indexOf(a.action) - order.indexOf(b.action));\n for (const c of sorted) {\n const g = GLYPH[c.action];\n const detail =\n c.changedFields && c.changedFields.length\n ? paint(` (${c.changedFields.join(\", \")})`, \"gray\")\n : c.reason\n ? paint(` (${c.reason})`, \"gray\")\n : \"\";\n lines.push(` ${paint(g.sign, g.color)} ${paint(c.action.padEnd(9), g.color)} ${c.key}${detail}`);\n }\n\n const tally = [\n result.created && `${result.created} created`,\n result.updated && `${result.updated} updated`,\n result.unchanged && `${result.unchanged} unchanged`,\n result.deleted && `${result.deleted} deleted`,\n result.skipped && `${result.skipped} skipped`,\n ].filter(Boolean);\n const summary = tally.length ? tally.join(\", \") : \"no changes\";\n const containerNote = result.jobCreated ? paint(\" · container created\", \"gray\") : \"\";\n lines.push(` ${paint(summary, \"bold\")}${containerNote}`);\n\n return lines.join(\"\\n\");\n}\n","/**\n * Human-friendly schedule builders. Each returns a plain cron string (so it drops straight into a\n * job's `schedule`), validated on the way out — a bad argument throws immediately with a clear\n * message instead of silently producing a wrong schedule.\n *\n * import { every, daily, weekly, hourly, cron } from \"@cronvello/sdk\";\n *\n * jobs: {\n * \"digest\": { schedule: daily(\"08:00\"), handler },\n * \"poll\": { schedule: every(\"15m\"), handler },\n * \"report\": { schedule: weekly(\"mon\", \"09:00\"),handler },\n * \"beat\": { schedule: hourly(), handler },\n * \"custom\": { schedule: cron(\"0 0 1 * *\"), handler },\n * }\n */\n\nimport { assertValidCron } from \"../internal/cron.js\";\n\nexport type Weekday = \"sun\" | \"mon\" | \"tue\" | \"wed\" | \"thu\" | \"fri\" | \"sat\" | 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nconst DOW: Record<string, number> = { sun: 0, mon: 1, tue: 2, wed: 3, thu: 4, fri: 5, sat: 6 };\n\n/** Validate a raw cron expression and return it unchanged. The explicit escape hatch. */\nexport function cron(expression: string): string {\n assertValidCron(expression, \"cron()\");\n return expression;\n}\n\n/**\n * A recurring interval expressed as `<n><unit>` where unit is `s`, `m`, `h`, or `d`.\n * every(\"30s\") → every 30 seconds every(\"15m\") → every 15 minutes\n * every(\"2h\") → every 2 hours every(\"1d\") → daily at midnight\n * Note: sub-hour intervals that don't divide evenly (e.g. 7m) restart each hour, matching cron.\n */\nexport function every(interval: string): string {\n const m = /^(\\d+)\\s*(s|sec|secs|m|min|mins|h|hr|hrs|hour|hours|d|day|days)$/i.exec(interval.trim());\n if (!m) throw new Error(`every(): cannot parse interval \"${interval}\" — use forms like \"30s\", \"15m\", \"2h\", \"1d\"`);\n const n = Number(m[1]);\n const unit = m[2]!.toLowerCase()[0]; // s | m | h | d\n if (n < 1) throw new Error(`every(): interval must be at least 1, got ${n}`);\n\n let expr: string;\n if (unit === \"s\") {\n if (n > 59) throw new Error(`every(): seconds must be 1–59, got ${n}`);\n expr = `*/${n} * * * * *`; // 6-field (seconds)\n } else if (unit === \"m\") {\n if (n > 59) throw new Error(`every(): minutes must be 1–59 (use \"1h\" for 60), got ${n}`);\n expr = `*/${n} * * * *`;\n } else if (unit === \"h\") {\n if (n > 23) throw new Error(`every(): hours must be 1–23 (use \"1d\" for 24), got ${n}`);\n expr = `0 */${n} * * *`;\n } else {\n if (n > 31) throw new Error(`every(): days must be 1–31, got ${n}`);\n expr = n === 1 ? `0 0 * * *` : `0 0 */${n} * *`;\n }\n assertValidCron(expr, `every(\"${interval}\")`);\n return expr;\n}\n\n/** Every N minutes (1–59). */\nexport function everyMinutes(n: number): string {\n return every(`${n}m`);\n}\n\n/** Every N hours (1–23). */\nexport function everyHours(n: number): string {\n return every(`${n}h`);\n}\n\n/** Once an hour, at the given minute past (default :00). */\nexport function hourly(minute = 0): string {\n const mm = field(minute, 0, 59, \"minute\");\n return cron(`${mm} * * * *`);\n}\n\n/** Once a day at \"HH:MM\" (24h, default midnight). */\nexport function daily(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * *`);\n}\n\n/** Once a week on `day` at \"HH:MM\". */\nexport function weekly(day: Weekday, time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * ${weekday(day)}`);\n}\n\n/** Once a month on `dayOfMonth` (1–31) at \"HH:MM\". */\nexport function monthly(dayOfMonth: number, time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n const dom = field(dayOfMonth, 1, 31, \"day-of-month\");\n return cron(`${mm} ${hh} ${dom} * *`);\n}\n\n/** Monday–Friday at \"HH:MM\". */\nexport function weekdays(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * 1-5`);\n}\n\n/** Saturday & Sunday at \"HH:MM\". */\nexport function weekends(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * 0,6`);\n}\n\n/** Namespace form for discoverability: `import { schedule } from \"@cronvello/sdk\"`. */\nexport const schedule = {\n cron, every, everyMinutes, everyHours, hourly, daily, weekly, monthly, weekdays, weekends,\n};\n\nfunction parseTime(time: string): { hh: number; mm: number } {\n const m = /^(\\d{1,2}):(\\d{2})$/.exec(time.trim());\n if (!m) throw new Error(`Expected a time like \"08:00\" or \"23:30\", got \"${time}\"`);\n const hh = Number(m[1]);\n const mm = Number(m[2]);\n if (hh > 23) throw new Error(`Hour must be 0–23, got ${hh}`);\n if (mm > 59) throw new Error(`Minute must be 0–59, got ${mm}`);\n return { hh, mm };\n}\n\nfunction weekday(day: Weekday): number {\n if (typeof day === \"number\") {\n if (day < 0 || day > 6) throw new Error(`Weekday number must be 0 (Sun) – 6 (Sat), got ${day}`);\n return day;\n }\n const n = DOW[day.toLowerCase()];\n if (n === undefined) throw new Error(`Unknown weekday \"${day}\" — use sun…sat or 0…6`);\n return n;\n}\n\nfunction field(value: number, min: number, max: number, label: string): number {\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`${label} must be an integer ${min}–${max}, got ${value}`);\n }\n return value;\n}\n","/**\n * @cronvello/sdk — code-first cron jobs for Cronvello.\n *\n * Two layers, one package:\n * • High-level registry: `defineCronvello({ jobs })` → `.sync()` + `.expressHandler()` / `.nextHandler()`.\n * Define jobs in code; the SDK reconciles them to https://api.cronvello.com and runs them.\n * • Low-level client: `new CronvelloClient({ apiKey })` → typed access to the whole `/v1` API.\n */\n\n// ── High-level registry ────────────────────────────────────────────────────\nexport { defineCronvello, type CronvelloApp, type CronvelloEnvConfig } from \"./registry/define.js\";\nexport { formatSyncResult, type FormatOptions } from \"./registry/format.js\";\nexport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobConfigWithKey,\n CronvelloJobsInput,\n CronvelloJobContext,\n CronvelloJobHandler,\n CronvelloLogger,\n CronvelloHooks,\n CronvelloRunSource,\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./registry/types.js\";\nexport type { DispatchRequest, DispatchResponse } from \"./registry/dispatch.js\";\n\n// ── Schedule builders ──────────────────────────────────────────────────────\nexport {\n cron,\n every,\n everyMinutes,\n everyHours,\n hourly,\n daily,\n weekly,\n monthly,\n weekdays,\n weekends,\n schedule,\n type Weekday,\n} from \"./schedule/index.js\";\nexport { validateCron, isValidTimeZone, type CronValidation } from \"./internal/cron.js\";\n\n// ── Low-level client ───────────────────────────────────────────────────────\nexport {\n CronvelloClient,\n CRONVELLO_DEFAULT_BASE_URL,\n type CronvelloClientOptions,\n} from \"./client/client.js\";\n\n// ── Errors ─────────────────────────────────────────────────────────────────\nexport {\n CronvelloError,\n CronvelloApiError,\n CronvelloNetworkError,\n CronvelloConfigError,\n} from \"./internal/errors.js\";\n\n// ── Wire types ─────────────────────────────────────────────────────────────\nexport type {\n Urgency,\n ExecutionMode,\n HttpMethod,\n JobStatus,\n RunStatus,\n RunType,\n CallbackStatus,\n SuccessCriteria,\n PublicJob,\n PublicTask,\n PublicRun,\n JobCreateBody,\n JobUpdateBody,\n TaskCreateBody,\n TaskUpdateBody,\n RunsPage,\n TasksPage,\n RunNowResult,\n RegistryTaskInput,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RegistryReconcileChange,\n MeResponse,\n UsageResponse,\n Pagination,\n RunsQuery,\n AccountTasksQuery,\n AccountRunsQuery,\n} from \"./internal/wire.js\";\n\n/**\n * Generate a strong random dispatch secret (hex). Convenience for setup scripts:\n * node -e \"console.log(require('@cronvello/sdk').generateDispatchSecret())\"\n */\nexport function generateDispatchSecret(bytes = 32): string {\n const buf = new Uint8Array(bytes);\n crypto.getRandomValues(buf);\n return Array.from(buf)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n"]}
|