@wspc/cli 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/generated/cli/invite/accept.ts","../src/generated/sdk/core/bodySerializer.gen.ts","../src/generated/sdk/core/params.gen.ts","../src/generated/sdk/core/serverSentEvents.gen.ts","../src/generated/sdk/core/pathSerializer.gen.ts","../src/generated/sdk/core/utils.gen.ts","../src/generated/sdk/core/auth.gen.ts","../src/generated/sdk/client/utils.gen.ts","../src/generated/sdk/client/client.gen.ts","../src/generated/sdk/client.gen.ts","../src/generated/sdk/sdk.gen.ts","../src/handwritten/config/index.ts","../src/version.ts","../src/index.ts","../src/handwritten/auth/sdk-auth.ts","../src/handwritten/auth/resolve-account.ts","../src/handwritten/auth/load-sdk-client.ts","../src/handwritten/output/primitives.ts","../src/handwritten/output/render.ts","../src/generated/cli/keys/create.ts","../src/generated/cli/keys/ls.ts","../src/generated/cli/org/invite.ts","../src/generated/cli/org/invites.ts","../src/generated/cli/org/show.ts","../src/generated/cli/org/rename.ts","../src/generated/cli/invite/show.ts","../src/generated/cli/auth/me.ts","../src/generated/cli/invites.ts","../src/generated/cli/org/members.ts","../src/generated/cli/invite/reject.ts","../src/generated/cli/keys/rm.ts","../src/generated/cli/keys/edit.ts","../src/generated/cli/org/invite/revoke.ts","../src/generated/cli/event/add.ts","../src/handwritten/utils/parse-time.ts","../src/handwritten/utils/parse-date.ts","../src/handwritten/utils/parse-attendee.ts","../src/generated/cli/event/ls.ts","../src/generated/cli/event/rm.ts","../src/generated/cli/event/show.ts","../src/generated/cli/event/set.ts","../src/generated/cli/event/ics.ts","../src/generated/cli/alias/add.ts","../src/generated/cli/alias/ls.ts","../src/generated/cli/domain/add.ts","../src/generated/cli/domain/ls.ts","../src/generated/cli/alias/rm.ts","../src/generated/cli/email/rm.ts","../src/generated/cli/domain/show.ts","../src/generated/cli/email/show.ts","../src/generated/cli/email/ls.ts","../src/generated/cli/email/read.ts","../src/generated/cli/email/unread.ts","../src/generated/cli/domain/verify.ts","../src/generated/cli/push/config/rm.ts","../src/generated/cli/push/config/set.ts","../src/generated/cli/push/config/show.ts","../src/generated/cli/push/test.ts","../src/generated/cli/todo/comment/add.ts","../src/generated/cli/todo/comment/ls.ts","../src/generated/cli/todo/project/add.ts","../src/generated/cli/todo/project/ls.ts","../src/generated/cli/todo/rule/ls.ts","../src/generated/cli/todo/add.ts","../src/generated/cli/todo/ls.ts","../src/generated/cli/todo/type/ls.ts","../src/generated/cli/todo/comment/rm.ts","../src/generated/cli/todo/comment/edit.ts","../src/generated/cli/todo/rm.ts","../src/generated/cli/todo/show.ts","../src/generated/cli/todo/update.ts","../src/generated/cli/index.ts","../src/handwritten/commands/login.ts","../src/handwritten/auth/device-flow.ts","../src/handwritten/auth/client-registration.ts","../src/handwritten/auth/fetch-me.ts","../src/handwritten/auth/login.ts","../src/handwritten/commands/logout.ts","../src/handwritten/auth/logout.ts","../src/handwritten/commands/whoami.ts","../src/handwritten/commands/config.ts","../src/handwritten/commands/account.ts","../src/handwritten/commands/todo-done.ts","../src/handwritten/commands/email/send.ts","../src/handwritten/utils/mime-from-ext.ts","../src/handwritten/commands/email/attachment.ts","../src/handwritten/utils/parse-content-disposition.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\"\nimport { registerGeneratedCommands } from \"./generated/cli/index.js\"\nimport { loginCommand } from \"./handwritten/commands/login.js\"\nimport { logoutCommand } from \"./handwritten/commands/logout.js\"\nimport { whoamiCommand } from \"./handwritten/commands/whoami.js\"\nimport { configCommand } from \"./handwritten/commands/config.js\"\nimport { accountCommand } from \"./handwritten/commands/account.js\"\nimport { todoDoneCommand } from \"./handwritten/commands/todo-done.js\"\nimport { sendCommand } from \"./handwritten/commands/email/send.js\"\nimport { attachmentCommand } from \"./handwritten/commands/email/attachment.js\"\nimport { VERSION, SPEC_SHA, SPEC_FETCHED_AT } from \"./version.js\"\n\nfunction buildProgram(): Command {\n const program = new Command()\n .name(\"wspc\")\n .description(\"Official CLI for wspc.ai\")\n .version(`wspc ${VERSION} (spec ${SPEC_SHA}, fetched ${SPEC_FETCHED_AT})`)\n // Global output mode flag. Default is pretty when stdout is a TTY,\n // JSON when piped (renderer enforces this). Pass `--json` to force JSON\n // even in a TTY — useful for ad-hoc copy/paste into scripts.\n .option(\"--json\", \"Output raw JSON (machine-readable)\")\n .option(\"--account <email>\", \"Run as a specific account (overrides the active account)\")\n .hook(\"preAction\", (_thisCommand, actionCommand) => {\n const globals = actionCommand.optsWithGlobals()\n if (globals.json) process.env.WSPC_OUTPUT = \"json\"\n // Flag beats WSPC_ACCOUNT env: overwriting process.env achieves the\n // precedence (flag > env) because resolveAccount reads WSPC_ACCOUNT.\n if (globals.account) process.env.WSPC_ACCOUNT = String(globals.account)\n })\n\n program.addCommand(loginCommand)\n program.addCommand(logoutCommand)\n program.addCommand(whoamiCommand)\n program.addCommand(configCommand)\n program.addCommand(accountCommand)\n\n registerGeneratedCommands(program)\n\n const todo = program.commands.find((c) => c.name() === \"todo\")\n if (todo) todo.addCommand(todoDoneCommand)\n\n // Mount handwritten email commands under the generated `email` subtree.\n // They live in handwritten/ because they need behavior (multipart-equivalent\n // base64 attachment encoding, binary stream download) that the codegen layer\n // deliberately doesn't model.\n const email = program.commands.find((c) => c.name() === \"email\")\n if (!email) {\n throw new Error(\"email command tree not found; codegen output may be missing\")\n }\n email.addCommand(sendCommand)\n email.addCommand(attachmentCommand)\n\n return program\n}\n\nexport async function dispatch(argv: string[], { allowRetry = true }: { allowRetry?: boolean } = {}): Promise<void> {\n try {\n await buildProgram().parseAsync(argv)\n } catch (err) {\n const code = err && typeof err === \"object\" ? (err as { code?: string }).code : undefined\n if (code === \"WSPC_AUTH_EXPIRED\") {\n if (allowRetry && process.stdin.isTTY && process.stdout.isTTY) {\n process.stderr.write(\"session expired; re-authenticating...\\n\")\n await buildProgram().parseAsync([\"node\", \"wspc\", \"login\"])\n await dispatch(argv, { allowRetry: false })\n return\n }\n process.stderr.write(`error: ${(err as Error).message}\\n`)\n // exitCode (not process.exit) so Node closes fetch / file streams\n // cleanly — avoids a libuv assertion on Windows when async handles\n // are still in CLOSING state at forced-exit time.\n process.exitCode = 2\n return\n }\n process.stderr.write(`error: ${(err as Error).message ?? err}\\n`)\n process.exitCode = 1\n }\n}\n\ndispatch(process.argv)\n","// AUTO-GENERATED — DO NOT EDIT (source: invite_accept)\nimport { Command } from \"commander\"\nimport { inviteAccept } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const inviteAcceptCommand = new Command(\"accept\")\n .description(\"Accept an invite and switch into the inviting organization\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await inviteAccept({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"invite_accept\", display: {\"shape\":\"object\",\"fields\":[\"id\",\"name\",\"created_at\",\"updated_at\"]} }, result.data)\n })\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { ArrayStyle, ObjectStyle, SerializerOptions } from './pathSerializer.gen';\n\nexport type QuerySerializer = (query: Record<string, unknown>) => string;\n\nexport type BodySerializer = (body: unknown) => unknown;\n\ntype QuerySerializerOptionsObject = {\n allowReserved?: boolean;\n array?: Partial<SerializerOptions<ArrayStyle>>;\n object?: Partial<SerializerOptions<ObjectStyle>>;\n};\n\nexport type QuerySerializerOptions = QuerySerializerOptionsObject & {\n /**\n * Per-parameter serialization overrides. When provided, these settings\n * override the global array/object settings for specific parameter names.\n */\n parameters?: Record<string, QuerySerializerOptionsObject>;\n};\n\nconst serializeFormDataPair = (data: FormData, key: string, value: unknown): void => {\n if (typeof value === 'string' || value instanceof Blob) {\n data.append(key, value);\n } else if (value instanceof Date) {\n data.append(key, value.toISOString());\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nconst serializeUrlSearchParamsPair = (data: URLSearchParams, key: string, value: unknown): void => {\n if (typeof value === 'string') {\n data.append(key, value);\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nexport const formDataBodySerializer = {\n bodySerializer: (body: unknown): FormData => {\n const data = new FormData();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeFormDataPair(data, key, v));\n } else {\n serializeFormDataPair(data, key, value);\n }\n });\n\n return data;\n },\n};\n\nexport const jsonBodySerializer = {\n bodySerializer: (body: unknown): string =>\n JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value)),\n};\n\nexport const urlSearchParamsBodySerializer = {\n bodySerializer: (body: unknown): string => {\n const data = new URLSearchParams();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n } else {\n serializeUrlSearchParamsPair(data, key, value);\n }\n });\n\n return data.toString();\n },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\ntype Slot = 'body' | 'headers' | 'path' | 'query';\n\nexport type Field =\n | {\n in: Exclude<Slot, 'body'>;\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If omitted, we use the same value as `key`.\n */\n map?: string;\n }\n | {\n in: Extract<Slot, 'body'>;\n /**\n * Key isn't required for bodies.\n */\n key?: string;\n map?: string;\n }\n | {\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If `in` is omitted, `map` aliases `key` to the transport layer.\n */\n map: Slot;\n };\n\nexport interface Fields {\n allowExtra?: Partial<Record<Slot, boolean>>;\n args?: ReadonlyArray<Field>;\n}\n\nexport type FieldsConfig = ReadonlyArray<Field | Fields>;\n\nconst extraPrefixesMap: Record<string, Slot> = {\n $body_: 'body',\n $headers_: 'headers',\n $path_: 'path',\n $query_: 'query',\n};\nconst extraPrefixes = Object.entries(extraPrefixesMap);\n\ntype KeyMap = Map<\n string,\n | {\n in: Slot;\n map?: string;\n }\n | {\n in?: never;\n map: Slot;\n }\n>;\n\nconst buildKeyMap = (fields: FieldsConfig, map?: KeyMap): KeyMap => {\n if (!map) {\n map = new Map();\n }\n\n for (const config of fields) {\n if ('in' in config) {\n if (config.key) {\n map.set(config.key, {\n in: config.in,\n map: config.map,\n });\n }\n } else if ('key' in config) {\n map.set(config.key, {\n map: config.map,\n });\n } else if (config.args) {\n buildKeyMap(config.args, map);\n }\n }\n\n return map;\n};\n\ninterface Params {\n body: unknown;\n headers: Record<string, unknown>;\n path: Record<string, unknown>;\n query: Record<string, unknown>;\n}\n\nconst stripEmptySlots = (params: Params) => {\n for (const [slot, value] of Object.entries(params)) {\n if (value && typeof value === 'object' && !Array.isArray(value) && !Object.keys(value).length) {\n delete params[slot as Slot];\n }\n }\n};\n\nexport const buildClientParams = (args: ReadonlyArray<unknown>, fields: FieldsConfig) => {\n const params: Params = {\n body: Object.create(null),\n headers: Object.create(null),\n path: Object.create(null),\n query: Object.create(null),\n };\n\n const map = buildKeyMap(fields);\n\n let config: FieldsConfig[number] | undefined;\n\n for (const [index, arg] of args.entries()) {\n if (fields[index]) {\n config = fields[index];\n }\n\n if (!config) {\n continue;\n }\n\n if ('in' in config) {\n if (config.key) {\n const field = map.get(config.key)!;\n const name = field.map || config.key;\n if (field.in) {\n (params[field.in] as Record<string, unknown>)[name] = arg;\n }\n } else {\n params.body = arg;\n }\n } else {\n for (const [key, value] of Object.entries(arg ?? {})) {\n const field = map.get(key);\n\n if (field) {\n if (field.in) {\n const name = field.map || key;\n (params[field.in] as Record<string, unknown>)[name] = value;\n } else {\n params[field.map] = value;\n }\n } else {\n const extra = extraPrefixes.find(([prefix]) => key.startsWith(prefix));\n\n if (extra) {\n const [prefix, slot] = extra;\n (params[slot] as Record<string, unknown>)[key.slice(prefix.length)] = value;\n } else if ('allowExtra' in config && config.allowExtra) {\n for (const [slot, allowed] of Object.entries(config.allowExtra)) {\n if (allowed) {\n (params[slot as Slot] as Record<string, unknown>)[key] = value;\n break;\n }\n }\n }\n }\n }\n }\n }\n\n stripEmptySlots(params);\n\n return params;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from './types.gen';\n\nexport type ServerSentEventsOptions<TData = unknown> = Omit<RequestInit, 'method'> &\n Pick<Config, 'method' | 'responseTransformer' | 'responseValidator'> & {\n /**\n * Fetch API implementation. You can use this option to provide a custom\n * fetch instance.\n *\n * @default globalThis.fetch\n */\n fetch?: typeof fetch;\n /**\n * Implementing clients can call request interceptors inside this hook.\n */\n onRequest?: (url: string, init: RequestInit) => Promise<Request>;\n /**\n * Callback invoked when a network or parsing error occurs during streaming.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param error The error that occurred.\n */\n onSseError?: (error: unknown) => void;\n /**\n * Callback invoked when an event is streamed from the server.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param event Event streamed from the server.\n * @returns Nothing (void).\n */\n onSseEvent?: (event: StreamEvent<TData>) => void;\n serializedBody?: RequestInit['body'];\n /**\n * Default retry delay in milliseconds.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 3000\n */\n sseDefaultRetryDelay?: number;\n /**\n * Maximum number of retry attempts before giving up.\n */\n sseMaxRetryAttempts?: number;\n /**\n * Maximum retry delay in milliseconds.\n *\n * Applies only when exponential backoff is used.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 30000\n */\n sseMaxRetryDelay?: number;\n /**\n * Optional sleep function for retry backoff.\n *\n * Defaults to using `setTimeout`.\n */\n sseSleepFn?: (ms: number) => Promise<void>;\n url: string;\n };\n\nexport interface StreamEvent<TData = unknown> {\n data: TData;\n event?: string;\n id?: string;\n retry?: number;\n}\n\nexport type ServerSentEventsResult<TData = unknown, TReturn = void, TNext = unknown> = {\n stream: AsyncGenerator<\n TData extends Record<string, unknown> ? TData[keyof TData] : TData,\n TReturn,\n TNext\n >;\n};\n\nexport function createSseClient<TData = unknown>({\n onRequest,\n onSseError,\n onSseEvent,\n responseTransformer,\n responseValidator,\n sseDefaultRetryDelay,\n sseMaxRetryAttempts,\n sseMaxRetryDelay,\n sseSleepFn,\n url,\n ...options\n}: ServerSentEventsOptions): ServerSentEventsResult<TData> {\n let lastEventId: string | undefined;\n\n const sleep = sseSleepFn ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n const createStream = async function* () {\n let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n\n while (true) {\n if (signal.aborted) break;\n\n attempt++;\n\n const headers =\n options.headers instanceof Headers\n ? options.headers\n : new Headers(options.headers as Record<string, string> | undefined);\n\n if (lastEventId !== undefined) {\n headers.set('Last-Event-ID', lastEventId);\n }\n\n try {\n const requestInit: RequestInit = {\n redirect: 'follow',\n ...options,\n body: options.serializedBody,\n headers,\n signal,\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n\n if (!response.ok) throw new Error(`SSE failed: ${response.status} ${response.statusText}`);\n\n if (!response.body) throw new Error('No body in SSE response');\n\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();\n\n let buffer = '';\n\n const abortHandler = () => {\n try {\n reader.cancel();\n } catch {\n // noop\n }\n };\n\n signal.addEventListener('abort', abortHandler);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += value;\n buffer = buffer.replace(/\\r\\n?/g, '\\n'); // normalize line endings\n\n const chunks = buffer.split('\\n\\n');\n buffer = chunks.pop() ?? '';\n\n for (const chunk of chunks) {\n const lines = chunk.split('\\n');\n const dataLines: Array<string> = [];\n let eventName: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n dataLines.push(line.replace(/^data:\\s*/, ''));\n } else if (line.startsWith('event:')) {\n eventName = line.replace(/^event:\\s*/, '');\n } else if (line.startsWith('id:')) {\n lastEventId = line.replace(/^id:\\s*/, '');\n } else if (line.startsWith('retry:')) {\n const parsed = Number.parseInt(line.replace(/^retry:\\s*/, ''), 10);\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n\n let data: unknown;\n let parsedJson = false;\n\n if (dataLines.length) {\n const rawData = dataLines.join('\\n');\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n } catch {\n data = rawData;\n }\n }\n\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay,\n });\n\n if (dataLines.length) {\n yield data as any;\n }\n }\n }\n } finally {\n signal.removeEventListener('abort', abortHandler);\n reader.releaseLock();\n }\n\n break; // exit loop on normal completion\n } catch (error) {\n // connection failed or aborted; retry after delay\n onSseError?.(error);\n\n if (sseMaxRetryAttempts !== undefined && attempt >= sseMaxRetryAttempts) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 30000);\n await sleep(backoff);\n }\n }\n };\n\n const stream = createStream();\n\n return { stream };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions<T> extends SerializePrimitiveOptions, SerializerOptions<T> {}\n\ninterface SerializePrimitiveOptions {\n allowReserved?: boolean;\n name: string;\n}\n\nexport interface SerializerOptions<T> {\n /**\n * @default true\n */\n explode: boolean;\n style: T;\n}\n\nexport type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited';\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = 'label' | 'matrix' | 'simple';\nexport type ObjectStyle = 'form' | 'deepObject';\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n value: string;\n}\n\nexport const separatorArrayExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const separatorArrayNoExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'form':\n return ',';\n case 'pipeDelimited':\n return '|';\n case 'spaceDelimited':\n return '%20';\n default:\n return ',';\n }\n};\n\nexport const separatorObjectExplode = (style: ObjectSeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const serializeArrayParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n}: SerializeOptions<ArraySeparatorStyle> & {\n value: unknown[];\n}) => {\n if (!explode) {\n const joinedValues = (\n allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\n ).join(separatorArrayNoExplode(style));\n switch (style) {\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n case 'simple':\n return joinedValues;\n default:\n return `${name}=${joinedValues}`;\n }\n }\n\n const separator = separatorArrayExplode(style);\n const joinedValues = value\n .map((v) => {\n if (style === 'label' || style === 'simple') {\n return allowReserved ? v : encodeURIComponent(v as string);\n }\n\n return serializePrimitiveParam({\n allowReserved,\n name,\n value: v as string,\n });\n })\n .join(separator);\n return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n allowReserved,\n name,\n value,\n}: SerializePrimitiveParam) => {\n if (value === undefined || value === null) {\n return '';\n }\n\n if (typeof value === 'object') {\n throw new Error(\n 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.',\n );\n }\n\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\n\nexport const serializeObjectParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n valueOnly,\n}: SerializeOptions<ObjectSeparatorStyle> & {\n value: Record<string, unknown> | Date;\n valueOnly?: boolean;\n}) => {\n if (value instanceof Date) {\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n }\n\n if (style !== 'deepObject' && !explode) {\n let values: string[] = [];\n Object.entries(value).forEach(([key, v]) => {\n values = [...values, key, allowReserved ? (v as string) : encodeURIComponent(v as string)];\n });\n const joinedValues = values.join(',');\n switch (style) {\n case 'form':\n return `${name}=${joinedValues}`;\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n default:\n return joinedValues;\n }\n }\n\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value)\n .map(([key, v]) =>\n serializePrimitiveParam({\n allowReserved,\n name: style === 'deepObject' ? `${name}[${key}]` : key,\n value: v as string,\n }),\n )\n .join(separator);\n return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from './bodySerializer.gen';\nimport {\n type ArraySeparatorStyle,\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from './pathSerializer.gen';\n\nexport interface PathSerializer {\n path: Record<string, unknown>;\n url: string;\n}\n\nexport const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {\n let url = _url;\n const matches = _url.match(PATH_PARAM_RE);\n if (matches) {\n for (const match of matches) {\n let explode = false;\n let name = match.substring(1, match.length - 1);\n let style: ArraySeparatorStyle = 'simple';\n\n if (name.endsWith('*')) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n\n if (name.startsWith('.')) {\n name = name.substring(1);\n style = 'label';\n } else if (name.startsWith(';')) {\n name = name.substring(1);\n style = 'matrix';\n }\n\n const value = path[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n url = url.replace(match, serializeArrayParam({ explode, name, style, value }));\n continue;\n }\n\n if (typeof value === 'object') {\n url = url.replace(\n match,\n serializeObjectParam({\n explode,\n name,\n style,\n value: value as Record<string, unknown>,\n valueOnly: true,\n }),\n );\n continue;\n }\n\n if (style === 'matrix') {\n url = url.replace(\n match,\n `;${serializePrimitiveParam({\n name,\n value: value as string,\n })}`,\n );\n continue;\n }\n\n const replaceValue = encodeURIComponent(\n style === 'label' ? `.${value as string}` : (value as string),\n );\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\n\nexport const getUrl = ({\n baseUrl,\n path,\n query,\n querySerializer,\n url: _url,\n}: {\n baseUrl?: string;\n path?: Record<string, unknown>;\n query?: Record<string, unknown>;\n querySerializer: QuerySerializer;\n url: string;\n}) => {\n const pathUrl = _url.startsWith('/') ? _url : `/${_url}`;\n let url = (baseUrl ?? '') + pathUrl;\n if (path) {\n url = defaultPathSerializer({ path, url });\n }\n let search = query ? querySerializer(query) : '';\n if (search.startsWith('?')) {\n search = search.substring(1);\n }\n if (search) {\n url += `?${search}`;\n }\n return url;\n};\n\nexport function getValidRequestBody(options: {\n body?: unknown;\n bodySerializer?: BodySerializer | null;\n serializedBody?: unknown;\n}) {\n const hasBody = options.body !== undefined;\n const isSerializedBody = hasBody && options.bodySerializer;\n\n if (isSerializedBody) {\n if ('serializedBody' in options) {\n const hasSerializedBody =\n options.serializedBody !== undefined && options.serializedBody !== '';\n\n return hasSerializedBody ? options.serializedBody : null;\n }\n\n // not all clients implement a serializedBody property (i.e., client-axios)\n return options.body !== '' ? options.body : null;\n }\n\n // plain/text body\n if (hasBody) {\n return options.body;\n }\n\n // no body was provided\n return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nexport type AuthToken = string | undefined;\n\nexport interface Auth {\n /**\n * Which part of the request do we use to send the auth?\n *\n * @default 'header'\n */\n in?: 'header' | 'query' | 'cookie';\n /**\n * Header or query parameter name.\n *\n * @default 'Authorization'\n */\n name?: string;\n scheme?: 'basic' | 'bearer';\n type: 'apiKey' | 'http';\n}\n\nexport const getAuthToken = async (\n auth: Auth,\n callback: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken,\n): Promise<string | undefined> => {\n const token = typeof callback === 'function' ? await callback(auth) : callback;\n\n if (!token) {\n return;\n }\n\n if (auth.scheme === 'bearer') {\n return `Bearer ${token}`;\n }\n\n if (auth.scheme === 'basic') {\n return `Basic ${btoa(token)}`;\n }\n\n return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from '../core/auth.gen';\nimport type { QuerySerializerOptions } from '../core/bodySerializer.gen';\nimport { jsonBodySerializer } from '../core/bodySerializer.gen';\nimport {\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from '../core/pathSerializer.gen';\nimport { getUrl } from '../core/utils.gen';\nimport type { Client, ClientOptions, Config, RequestOptions } from './types.gen';\n\nexport const createQuerySerializer = <T = unknown>({\n parameters = {},\n ...args\n}: QuerySerializerOptions = {}) => {\n const querySerializer = (queryParams: T) => {\n const search: string[] = [];\n if (queryParams && typeof queryParams === 'object') {\n for (const name in queryParams) {\n const value = queryParams[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n const options = parameters[name] || args;\n\n if (Array.isArray(value)) {\n const serializedArray = serializeArrayParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: 'form',\n value,\n ...options.array,\n });\n if (serializedArray) search.push(serializedArray);\n } else if (typeof value === 'object') {\n const serializedObject = serializeObjectParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: 'deepObject',\n value: value as Record<string, unknown>,\n ...options.object,\n });\n if (serializedObject) search.push(serializedObject);\n } else {\n const serializedPrimitive = serializePrimitiveParam({\n allowReserved: options.allowReserved,\n name,\n value: value as string,\n });\n if (serializedPrimitive) search.push(serializedPrimitive);\n }\n }\n }\n return search.join('&');\n };\n return querySerializer;\n};\n\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (contentType: string | null): Exclude<Config['parseAs'], 'auto'> => {\n if (!contentType) {\n // If no Content-Type header is provided, the best we can do is return the raw response body,\n // which is effectively the same as the 'stream' option.\n return 'stream';\n }\n\n const cleanContent = contentType.split(';')[0]?.trim();\n\n if (!cleanContent) {\n return;\n }\n\n if (cleanContent.startsWith('application/json') || cleanContent.endsWith('+json')) {\n return 'json';\n }\n\n if (cleanContent === 'multipart/form-data') {\n return 'formData';\n }\n\n if (\n ['application/', 'audio/', 'image/', 'video/'].some((type) => cleanContent.startsWith(type))\n ) {\n return 'blob';\n }\n\n if (cleanContent.startsWith('text/')) {\n return 'text';\n }\n\n return;\n};\n\nconst checkForExistence = (\n options: Pick<RequestOptions, 'auth' | 'query'> & {\n headers: Headers;\n },\n name?: string,\n): boolean => {\n if (!name) {\n return false;\n }\n if (\n options.headers.has(name) ||\n options.query?.[name] ||\n options.headers.get('Cookie')?.includes(`${name}=`)\n ) {\n return true;\n }\n return false;\n};\n\nexport async function setAuthParams(\n options: Pick<RequestOptions, 'auth' | 'query' | 'security'> & {\n headers: Headers;\n },\n): Promise<void> {\n for (const auth of options.security ?? []) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n\n const token = await getAuthToken(auth, options.auth);\n\n if (!token) {\n continue;\n }\n\n const name = auth.name ?? 'Authorization';\n\n switch (auth.in) {\n case 'query':\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case 'cookie':\n options.headers.append('Cookie', `${name}=${token}`);\n break;\n case 'header':\n default:\n options.headers.set(name, token);\n break;\n }\n }\n}\n\nexport const buildUrl: Client['buildUrl'] = (options) =>\n getUrl({\n baseUrl: options.baseUrl as string,\n path: options.path,\n query: options.query,\n querySerializer:\n typeof options.querySerializer === 'function'\n ? options.querySerializer\n : createQuerySerializer(options.querySerializer),\n url: options.url,\n });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith('/')) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\n\nexport const mergeHeaders = (\n ...headers: Array<Required<Config>['headers'] | undefined>\n): Headers => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n\n const iterator = header instanceof Headers ? headersEntries(header) : Object.entries(header);\n\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v as string);\n }\n } else if (value !== undefined) {\n // assume object headers are meant to be JSON stringified, i.e., their\n // content value in OpenAPI specification is 'application/json'\n mergedHeaders.set(\n key,\n typeof value === 'object' ? JSON.stringify(value) : (value as string),\n );\n }\n }\n }\n return mergedHeaders;\n};\n\ntype ErrInterceptor<Err, Res, Req, Options> = (\n error: Err,\n /** response may be undefined due to a network error where no response object is produced */\n response: Res | undefined,\n /** request may be undefined, because error may be from building the request object itself */\n request: Req | undefined,\n options: Options,\n) => Err | Promise<Err>;\n\ntype ReqInterceptor<Req, Options> = (request: Req, options: Options) => Req | Promise<Req>;\n\ntype ResInterceptor<Res, Req, Options> = (\n response: Res,\n request: Req,\n options: Options,\n) => Res | Promise<Res>;\n\nclass Interceptors<Interceptor> {\n fns: Array<Interceptor | null> = [];\n\n clear(): void {\n this.fns = [];\n }\n\n eject(id: number | Interceptor): void {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n\n exists(id: number | Interceptor): boolean {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n\n getInterceptorIndex(id: number | Interceptor): number {\n if (typeof id === 'number') {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n\n update(id: number | Interceptor, fn: Interceptor): number | Interceptor | false {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n\n use(fn: Interceptor): number {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n}\n\nexport interface Middleware<Req, Res, Err, Options> {\n error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;\n request: Interceptors<ReqInterceptor<Req, Options>>;\n response: Interceptors<ResInterceptor<Res, Req, Options>>;\n}\n\nexport const createInterceptors = <Req, Res, Err, Options>(): Middleware<\n Req,\n Res,\n Err,\n Options\n> => ({\n error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(),\n request: new Interceptors<ReqInterceptor<Req, Options>>(),\n response: new Interceptors<ResInterceptor<Res, Req, Options>>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: 'form',\n },\n object: {\n explode: true,\n style: 'deepObject',\n },\n});\n\nconst defaultHeaders = {\n 'Content-Type': 'application/json',\n};\n\nexport const createConfig = <T extends ClientOptions = ClientOptions>(\n override: Config<Omit<ClientOptions, keyof T> & T> = {},\n): Config<Omit<ClientOptions, keyof T> & T> => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: 'auto',\n querySerializer: defaultQuerySerializer,\n ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from '../core/serverSentEvents.gen';\nimport type { HttpMethod } from '../core/types.gen';\nimport { getValidRequestBody } from '../core/utils.gen';\nimport type { Client, Config, RequestOptions, ResolvedRequestOptions } from './types.gen';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils.gen';\n\ntype ReqInit = Omit<RequestInit, 'body' | 'headers'> & {\n body?: any;\n headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<Request, Response, unknown, ResolvedRequestOptions>();\n\n const beforeRequest = async <\n TData = unknown,\n TResponseStyle extends 'data' | 'fields' = 'fields',\n ThrowOnError extends boolean = boolean,\n Url extends string = string,\n >(\n options: RequestOptions<TData, TResponseStyle, ThrowOnError, Url>,\n ) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: undefined as string | undefined,\n };\n\n if (opts.security) {\n await setAuthParams(opts);\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body) as string | undefined;\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.serializedBody === '') {\n opts.headers.delete('Content-Type');\n }\n\n const resolvedOpts = opts as typeof opts &\n ResolvedRequestOptions<TResponseStyle, ThrowOnError, Url>;\n const url = buildUrl(resolvedOpts);\n\n return { opts: resolvedOpts, url };\n };\n\n const request: Client['request'] = async (options) => {\n const throwOnError = options.throwOnError ?? _config.throwOnError;\n const responseStyle = options.responseStyle ?? _config.responseStyle;\n\n let request: Request | undefined;\n let response: Response | undefined;\n\n try {\n const { opts, url } = await beforeRequest(options);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n body: getValidRequestBody(opts),\n };\n\n request = new Request(url, requestInit);\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n\n response = await _fetch(request);\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n if (response.status === 204 || response.headers.get('Content-Length') === '0') {\n let emptyData: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'text':\n emptyData = await response[parseAs]();\n break;\n case 'formData':\n emptyData = new FormData();\n break;\n case 'stream':\n emptyData = response.body;\n break;\n case 'json':\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === 'data'\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'json': {\n // Some servers return 200 with no Content-Length and empty body.\n // response.json() would throw; read as text and parse if non-empty.\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n break;\n }\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n throw jsonError ?? textError;\n } catch (error) {\n let finalError = error;\n\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = await fn(finalError, response, request, options as ResolvedRequestOptions);\n }\n }\n\n finalError = finalError || {};\n\n if (throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n request,\n response,\n };\n }\n };\n\n const makeMethodFn = (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn = (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n serializedBody: getValidRequestBody(opts) as BodyInit | null | undefined,\n url,\n });\n };\n\n const _buildUrl: Client['buildUrl'] = (options) => buildUrl({ ..._config, ...options });\n\n return {\n buildUrl: _buildUrl,\n connect: makeMethodFn('CONNECT'),\n delete: makeMethodFn('DELETE'),\n get: makeMethodFn('GET'),\n getConfig,\n head: makeMethodFn('HEAD'),\n interceptors,\n options: makeMethodFn('OPTIONS'),\n patch: makeMethodFn('PATCH'),\n post: makeMethodFn('POST'),\n put: makeMethodFn('PUT'),\n request,\n setConfig,\n sse: {\n connect: makeSseFn('CONNECT'),\n delete: makeSseFn('DELETE'),\n get: makeSseFn('GET'),\n head: makeSseFn('HEAD'),\n options: makeSseFn('OPTIONS'),\n patch: makeSseFn('PATCH'),\n post: makeSseFn('POST'),\n put: makeSseFn('PUT'),\n trace: makeSseFn('TRACE'),\n },\n trace: makeMethodFn('TRACE'),\n } as Client;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { type ClientOptions, type Config, createClient, createConfig } from './client';\nimport type { ClientOptions as ClientOptions2 } from './types.gen';\n\n/**\n * The `createClientConfig()` function will be called on client initialization\n * and the returned object will become the client's initial configuration.\n *\n * You may want to initialize your client this way instead of calling\n * `setConfig()`. This is useful for example if you're using Next.js\n * to ensure your client always has the correct values.\n */\nexport type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (override?: Config<ClientOptions & T>) => Config<Required<ClientOptions> & T>;\n\nexport const client = createClient(createConfig<ClientOptions2>({ baseUrl: 'https://api.wspc.ai' }));\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Client, Options as Options2, TDataShape } from './client';\nimport { client } from './client.gen';\nimport type { AuthMeData, AuthMeErrors, AuthMeResponses, AuthRequestCodeData, AuthRequestCodeErrors, AuthRequestCodeResponses, AuthVerifyCodeData, AuthVerifyCodeErrors, AuthVerifyCodeResponses, EmailAliasCreateData, EmailAliasCreateErrors, EmailAliasCreateResponses, EmailAliasDeleteData, EmailAliasDeleteErrors, EmailAliasDeleteResponses, EmailAliasListData, EmailAliasListErrors, EmailAliasListResponses, EmailAliasRestoreData, EmailAliasRestoreErrors, EmailAliasRestoreResponses, EmailAttachmentGetData, EmailAttachmentGetErrors, EmailAttachmentGetResponses, EmailDeleteData, EmailDeleteErrors, EmailDeleteResponses, EmailDomainCreateData, EmailDomainCreateErrors, EmailDomainCreateResponses, EmailDomainGetData, EmailDomainGetErrors, EmailDomainGetResponses, EmailDomainListData, EmailDomainListErrors, EmailDomainListResponses, EmailDomainVerifyData, EmailDomainVerifyErrors, EmailDomainVerifyResponses, EmailGetData, EmailGetErrors, EmailGetResponses, EmailListData, EmailListErrors, EmailListResponses, EmailMarkReadData, EmailMarkReadErrors, EmailMarkReadResponses, EmailMarkUnreadData, EmailMarkUnreadErrors, EmailMarkUnreadResponses, EmailRestoreData, EmailRestoreErrors, EmailRestoreResponses, EmailSendData, EmailSendErrors, EmailSendResponses, EventCreateData, EventCreateErrors, EventCreateResponses, EventDeleteData, EventDeleteErrors, EventDeleteResponses, EventGetData, EventGetErrors, EventGetResponses, EventIcsDownloadData, EventIcsDownloadErrors, EventIcsDownloadResponses, EventListData, EventListErrors, EventListResponses, EventRestoreData, EventRestoreErrors, EventRestoreResponses, EventUpdateData, EventUpdateErrors, EventUpdateResponses, InviteAcceptData, InviteAcceptErrors, InviteAcceptResponses, InviteGetData, InviteGetErrors, InviteGetResponses, InviteRejectData, InviteRejectErrors, InviteRejectResponses, InvitesListData, InvitesListErrors, InvitesListResponses, KeyCreateData, KeyCreateErrors, KeyCreateResponses, KeyListData, KeyListErrors, KeyListResponses, KeyRevokeData, KeyRevokeErrors, KeyRevokeResponses, KeyUpdateData, KeyUpdateErrors, KeyUpdateResponses, OauthClientRegisterData, OauthClientRegisterErrors, OauthClientRegisterResponses, OauthDeviceAuthorizeData, OauthDeviceAuthorizeErrors, OauthDeviceAuthorizeResponses, OauthMetadataData, OauthMetadataErrors, OauthMetadataOpenidAliasData, OauthMetadataOpenidAliasErrors, OauthMetadataOpenidAliasResponses, OauthMetadataResponses, OauthTokenExchangeData, OauthTokenExchangeErrors, OauthTokenExchangeResponses, OauthTokenRevokeData, OauthTokenRevokeErrors, OauthTokenRevokeResponses, OrgGetData, OrgGetErrors, OrgGetResponses, OrgInviteCreateData, OrgInviteCreateErrors, OrgInviteCreateResponses, OrgInviteRevokeData, OrgInviteRevokeErrors, OrgInviteRevokeResponses, OrgInvitesListData, OrgInvitesListErrors, OrgInvitesListResponses, OrgMemberRemoveData, OrgMemberRemoveErrors, OrgMemberRemoveResponses, OrgMembersListData, OrgMembersListErrors, OrgMembersListResponses, OrgUpdateData, OrgUpdateErrors, OrgUpdateResponses, ProjectCreateData, ProjectCreateErrors, ProjectCreateResponses, ProjectDeleteData, ProjectDeleteErrors, ProjectDeleteResponses, ProjectGetData, ProjectGetErrors, ProjectGetResponses, ProjectListData, ProjectListErrors, ProjectListResponses, ProjectRestoreData, ProjectRestoreErrors, ProjectRestoreResponses, ProjectUpdateData, ProjectUpdateErrors, ProjectUpdateResponses, PushConfigDeleteData, PushConfigDeleteErrors, PushConfigDeleteResponses, PushConfigGetData, PushConfigGetErrors, PushConfigGetResponses, PushConfigSetData, PushConfigSetErrors, PushConfigSetResponses, PushTestData, PushTestErrors, PushTestResponses, RecurrenceRuleCreateData, RecurrenceRuleCreateErrors, RecurrenceRuleCreateResponses, RecurrenceRuleDeleteData, RecurrenceRuleDeleteErrors, RecurrenceRuleDeleteResponses, RecurrenceRuleGetData, RecurrenceRuleGetErrors, RecurrenceRuleGetResponses, RecurrenceRuleListData, RecurrenceRuleListErrors, RecurrenceRuleListResponses, RecurrenceRuleUpdateData, RecurrenceRuleUpdateErrors, RecurrenceRuleUpdateResponses, TodoCommentCreateData, TodoCommentCreateErrors, TodoCommentCreateResponses, TodoCommentDeleteData, TodoCommentDeleteErrors, TodoCommentDeleteResponses, TodoCommentListData, TodoCommentListErrors, TodoCommentListResponses, TodoCommentUpdateData, TodoCommentUpdateErrors, TodoCommentUpdateResponses, TodoCreateData, TodoCreateErrors, TodoCreateResponses, TodoDeleteData, TodoDeleteErrors, TodoDeleteResponses, TodoGetData, TodoGetErrors, TodoGetResponses, TodoListData, TodoListErrors, TodoListResponses, TodoRestoreData, TodoRestoreErrors, TodoRestoreResponses, TodoTypeCreateData, TodoTypeCreateErrors, TodoTypeCreateResponses, TodoTypeDeleteData, TodoTypeDeleteErrors, TodoTypeDeleteResponses, TodoTypeGetData, TodoTypeGetErrors, TodoTypeGetResponses, TodoTypeListData, TodoTypeListErrors, TodoTypeListResponses, TodoTypeRestoreData, TodoTypeRestoreErrors, TodoTypeRestoreResponses, TodoTypeUpdateData, TodoTypeUpdateErrors, TodoTypeUpdateResponses, TodoUpdateData, TodoUpdateErrors, TodoUpdateResponses } from './types.gen';\n\nexport type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown> = Options2<TData, ThrowOnError, TResponse> & {\n /**\n * You can provide a client instance returned by `createClient()` instead of\n * individual options. This might be also useful if you want to implement a\n * custom client.\n */\n client?: Client;\n /**\n * You can pass arbitrary values through the `meta` object. This can be\n * used to access values that aren't defined as part of the SDK function.\n */\n meta?: Record<string, unknown>;\n};\n\n/**\n * Accept an invite and switch into the inviting organization\n *\n * Switches the caller's org to the invite's org and records the previous org. The caller loses access to data scoped to their previous org.\n */\nexport const inviteAccept = <ThrowOnError extends boolean = false>(options: Options<InviteAcceptData, ThrowOnError>) => (options.client ?? client).post<InviteAcceptResponses, InviteAcceptErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/invites/{id}/accept',\n ...options\n});\n\n/**\n * List active API keys\n *\n * ### Overview\n * Returns a list of all active (non-revoked) API keys belonging to the authenticated user. It also includes the `current_key_id` identifying the specific key used to authenticate the current request.\n *\n * ### When to Use\n * - Use this endpoint to view active API keys (e.g., when running `wspc keys list` or displaying API key management screens in user profiles).\n * - Use the `current_key_id` to identify which key is making the current call, facilitating self-rotation or auditing.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Only active keys are returned; keys that have been revoked are filtered out and excluded from the response.\n * - The full secret key is never returned; only the last 4 characters (`key_last4`) are provided for identification.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The provided Bearer token is missing, expired, or invalid. Ensure you are passing a valid, active API key.\n */\nexport const keyList = <ThrowOnError extends boolean = false>(options?: Options<KeyListData, ThrowOnError>) => (options?.client ?? client).get<KeyListResponses, KeyListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/keys',\n ...options\n});\n\n/**\n * Create a new API key (full value returned once)\n *\n * ### Overview\n * Creates and provisions a new long-lived API key for the authenticated user. The complete plaintext API key value (`api_key`) is returned **only once** in this endpoint's response and cannot be retrieved again.\n *\n * ### When to Use\n * - Use this endpoint when a user requests a new API key (e.g., `wspc keys create --label \"My Agent\"`) to isolate access for specific environments, applications, or developers.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Key Limit**: A user is limited to a maximum of 25 active API keys. Requesting a new key beyond this limit will result in a `KEY_LIMIT_EXCEEDED` error.\n * - **Label Validation**: The `label` parameter must be between 1 and 60 characters after trimming whitespace. Failing to provide a valid label results in an `INVALID_LABEL` error.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The Bearer token is missing or invalid.\n * - **400 Bad Request**: The `label` parameter is empty, too long, or missing.\n * - **400 Bad Request (Limit Exceeded)**: The user has hit the maximum limit of 25 active keys. An existing active key must be revoked before creating a new one.\n */\nexport const keyCreate = <ThrowOnError extends boolean = false>(options: Options<KeyCreateData, ThrowOnError>) => (options.client ?? client).post<KeyCreateResponses, KeyCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/keys',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List invites issued by the caller's organization\n *\n * Retrieves a list of all active pending or expired organization invites issued by the caller's organization.\n */\nexport const orgInvitesList = <ThrowOnError extends boolean = false>(options?: Options<OrgInvitesListData, ThrowOnError>) => (options?.client ?? client).get<OrgInvitesListResponses, OrgInvitesListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org/invites',\n ...options\n});\n\n/**\n * Invite an email to join the caller's organization\n *\n * Creates a pending invite for `email` and sends an invite email. Idempotent for an existing pending invite. The invitee accepts after signing in with the invited email.\n */\nexport const orgInviteCreate = <ThrowOnError extends boolean = false>(options?: Options<OrgInviteCreateData, ThrowOnError>) => (options?.client ?? client).post<OrgInviteCreateResponses, OrgInviteCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org/invites',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Start the device authorization grant\n *\n * ### Overview\n * Implements the RFC 8628 (§3.2) device authorization endpoint. It returns a `device_code` (for polling) and a `user_code` with a `verification_uri` for users to approve the client on another device.\n *\n * ### When to Use\n * - Use this endpoint in input-constrained environments (like CLI tools, IoT devices, or headless scripts) where direct web browser redirects are impractical or impossible.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - **Formats**: Accepts both `application/json` and `application/x-www-form-urlencoded` request bodies. The body shape is identical in both encodings.\n *\n * ### Troubleshooting\n * - **400 Bad Request**: The `client_id` is missing, invalid, or does not exist.\n * - **429 Too Many Requests**: Device code request rate has been exceeded.\n */\nexport const oauthDeviceAuthorize = <ThrowOnError extends boolean = false>(options?: Options<OauthDeviceAuthorizeData, ThrowOnError>) => (options?.client ?? client).post<OauthDeviceAuthorizeResponses, OauthDeviceAuthorizeErrors, ThrowOnError>({\n url: '/auth/oauth/device',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get the authenticated user's organization\n *\n * ### Overview\n * Returns the metadata of the organization owned by the authenticated user. In the current version, this represents the user's personal organization space containing all their projects and tokens.\n *\n * ### When to Use\n * - Use this endpoint to retrieve the organization ID and name for display or context setup (e.g., when running `wspc org show` or rendering user dashboards).\n * - Use this to verify that the API token / credentials are linked to a valid organization.\n *\n * ### Constraints\n * - Requires a valid Bearer token (API Key or Session Token) in the `Authorization` header.\n * - In the current API version (v1), every user is automatically provisioned a single personal organization. Selecting or switching organizations is not supported.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The provided Bearer token is missing, expired, or invalid. Verify your `Authorization` header format (`Bearer <token>`).\n * - **403 Forbidden**: The token does not have access to read organization metadata.\n * - **404 Not Found**: The organization associated with this token could not be found or has been deactivated.\n */\nexport const orgGet = <ThrowOnError extends boolean = false>(options?: Options<OrgGetData, ThrowOnError>) => (options?.client ?? client).get<OrgGetResponses, OrgGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org',\n ...options\n});\n\n/**\n * Update the authenticated user's organization\n *\n * ### Overview\n * Updates the metadata (currently, the name) of the organization associated with the authenticated user.\n *\n * ### Constraints\n * - Requires a valid Bearer token.\n * - The organization name cannot be empty or purely whitespace.\n * - Maximum length is capped by `MAX_ORG_NAME_LEN`.\n */\nexport const orgUpdate = <ThrowOnError extends boolean = false>(options?: Options<OrgUpdateData, ThrowOnError>) => (options?.client ?? client).patch<OrgUpdateResponses, OrgUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get a single invite addressed to the caller\n *\n * Retrieves the metadata of a specific organization invite addressed to the caller by its ID.\n */\nexport const inviteGet = <ThrowOnError extends boolean = false>(options: Options<InviteGetData, ThrowOnError>) => (options.client ?? client).get<InviteGetResponses, InviteGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/invites/{id}',\n ...options\n});\n\n/**\n * Fetch the user identified by the bearer token\n *\n * ### Overview\n * Retrieves the stable identity profile (user ID, email, and optional display name) of the user associated with the active Bearer token. Works for both long-lived `wspc_*` API keys and OAuth access tokens.\n *\n * ### When to Use\n * - Use this endpoint (e.g., in `wspc verify` or `wspc whoami`) to confirm that the active environment's API key or OAuth access token remains valid.\n * - Use it in UIs to display the logged-in user's profile details and retrieve the stable `user_id`.\n *\n * ### Constraints\n * - Requires a valid Bearer token (either a long-lived `wspc_*` API key or a temporary OAuth access token) in the `Authorization` header.\n * - **Response Fields**: The `api_key_id` field is only returned if authenticated via a WSPC API key (prefixed with `wspc_`). OAuth access tokens will omit `api_key_id`. `display_name` is omitted if not configured.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The Bearer token is missing, malformed, or has been revoked. Ensure the `Authorization` header matches the `Bearer <token>` format.\n */\nexport const authMe = <ThrowOnError extends boolean = false>(options?: Options<AuthMeData, ThrowOnError>) => (options?.client ?? client).get<AuthMeResponses, AuthMeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me',\n ...options\n});\n\n/**\n * List invites addressed to the authenticated user's email\n *\n * Retrieves all pending or expired organization invites addressed to the caller's verified email address.\n */\nexport const invitesList = <ThrowOnError extends boolean = false>(options?: Options<InvitesListData, ThrowOnError>) => (options?.client ?? client).get<InvitesListResponses, InvitesListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/invites',\n ...options\n});\n\n/**\n * List members of the authenticated user's organization\n *\n * ### Overview\n * Retrieves a paginated list of all members belonging to the authenticated user's organization, including their basic profile information, emails, and roles.\n *\n * ### When to Use\n * - Use this endpoint to list members in command-line tools (e.g., `wspc org members ls`) or to display a team directory in a user dashboard.\n * - Use this to paginate through large lists of organization members using cursor-based pagination.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - In the current version (v1), organizations are single-user only, meaning this endpoint will always return exactly one member (the caller).\n * - **Pagination**: Supports cursor-based pagination. The `limit` query parameter must be a positive integer, defaulting to 50 and capped at a maximum of 100. Pass `cursor` from the previous response's `next_cursor` to fetch subsequent pages.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The Bearer token is invalid or has expired.\n * - **400 Bad Request**: The query parameters `limit` or `cursor` are malformed. Ensure `limit` is an integer between 1 and 100.\n * - **404 Not Found**: The organization associated with this user was not found.\n */\nexport const orgMembersList = <ThrowOnError extends boolean = false>(options?: Options<OrgMembersListData, ThrowOnError>) => (options?.client ?? client).get<OrgMembersListResponses, OrgMembersListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org/members',\n ...options\n});\n\n/**\n * Discover OAuth 2.1 authorization-server metadata\n *\n * ### Overview\n * Exposes the RFC 8414 OAuth 2.1 authorization server metadata document. This enables clients (like MCP servers, custom GPTs, and SDKs) to dynamically discover authorization, token, registration, device, and revocation endpoints instead of hard-coding them.\n *\n * ### When to Use\n * - Use this endpoint on first boot or setup of any OAuth client. To optimize performance, clients should cache this metadata, as it is highly stable per deployment environment.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - Currently advertises PKCE-only public clients (`token_endpoint_auth_methods_supported: [\"none\"]`, `code_challenge_methods_supported: [\"S256\"]`) and a single `wspc:full` scope.\n *\n * ### Troubleshooting\n * - **500 Internal Server Error**: Constructed endpoint URLs are invalid due to server-side configuration issues.\n */\nexport const oauthMetadata = <ThrowOnError extends boolean = false>(options?: Options<OauthMetadataData, ThrowOnError>) => (options?.client ?? client).get<OauthMetadataResponses, OauthMetadataErrors, ThrowOnError>({ url: '/.well-known/oauth-authorization-server', ...options });\n\n/**\n * Discover OAuth metadata (OIDC discovery alias)\n *\n * ### Overview\n * OIDC discovery alias that returns the **same payload** as `GET /.well-known/oauth-authorization-server` (RFC 8414). WSPC is not an OpenID Connect identity provider — it does not issue ID tokens or expose a `userinfo` endpoint — but several MCP SDKs probe `/.well-known/openid-configuration` before falling back to the RFC 8414 path, so this alias is provided to avoid that fallback round-trip.\n *\n * ### When to Use\n * - Prefer `GET /.well-known/oauth-authorization-server` for new clients. Use this alias only if your client library hard-codes the OIDC discovery path.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - Response is byte-for-byte identical to the RFC 8414 endpoint; OIDC-specific fields (`userinfo_endpoint`, `jwks_uri`, `id_token_signing_alg_values_supported`, …) are intentionally absent.\n */\nexport const oauthMetadataOpenidAlias = <ThrowOnError extends boolean = false>(options?: Options<OauthMetadataOpenidAliasData, ThrowOnError>) => (options?.client ?? client).get<OauthMetadataOpenidAliasResponses, OauthMetadataOpenidAliasErrors, ThrowOnError>({ url: '/.well-known/openid-configuration', ...options });\n\n/**\n * Dynamically register an OAuth client\n *\n * ### Overview\n * Implements RFC 7591 dynamic client registration. This endpoint mints a unique `client_id` for a public OAuth client (e.g., an MCP server or third-party integration), enabling it to initiate OAuth authorization or device flows.\n *\n * ### When to Use\n * - Use this endpoint during the first-run installation or setup of an integration to dynamically generate a client identity. Persist the generated `client_id` for subsequent sessions.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - **Public Clients Only**: WSPC only supports public PKCE clients. Client secrets are not generated or returned.\n * - **Redirect URI Matching**: All `redirect_uris` registered here must match exactly with those requested in the authorization endpoint later.\n *\n * ### Troubleshooting\n * - **400 Bad Request / invalid_client_metadata**: The request body is missing required fields like `client_name` or `redirect_uris`, or provides invalid parameters.\n * - **429 Too Many Requests**: Dynamic registration requests from the requesting IP have exceeded the rate limit.\n */\nexport const oauthClientRegister = <ThrowOnError extends boolean = false>(options?: Options<OauthClientRegisterData, ThrowOnError>) => (options?.client ?? client).post<OauthClientRegisterResponses, OauthClientRegisterErrors, ThrowOnError>({\n url: '/auth/oauth/register',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Reject an invite\n *\n * Rejects an organization invite addressed to the caller. The invite will be marked as rejected.\n */\nexport const inviteReject = <ThrowOnError extends boolean = false>(options: Options<InviteRejectData, ThrowOnError>) => (options.client ?? client).post<InviteRejectResponses, InviteRejectErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/invites/{id}/reject',\n ...options\n});\n\n/**\n * Remove a member from the organization\n *\n * ### Overview\n * Removes a member from the authenticated user's organization by their user ID, restoring their original organization ID if applicable.\n *\n * ### Constraints\n * - Requires a valid Bearer token.\n * - Cannot remove the organization creator/owner.\n */\nexport const orgMemberRemove = <ThrowOnError extends boolean = false>(options: Options<OrgMemberRemoveData, ThrowOnError>) => (options.client ?? client).delete<OrgMemberRemoveResponses, OrgMemberRemoveErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org/members/{id}',\n ...options\n});\n\n/**\n * Request an email magic code\n *\n * ### Overview\n * Initiates the passwordless email magic-code authentication flow by sending a short, time-limited numeric verification code to the specified email address.\n *\n * ### When to Use\n * - Use this endpoint as the first step of the CLI login flow (`wspc login`) or any interactive UI where the user initiates authentication by inputting their email address.\n * - Pair this request with `POST /auth/verify-code` once the user retrieves the code from their inbox.\n *\n * ### Constraints\n * - Does not require authentication (public endpoint).\n * - **Security**: The same HTTP 200 response structure is returned regardless of whether the email address is already registered or not. This is an intentional security design to prevent account-existence disclosure (email harvesting).\n * - **Rate Limiting**: This endpoint enforces strict rate limits based on both the requesting IP address and the target email address to prevent abuse. Too many consecutive requests will result in a `RATE_LIMITED` error.\n *\n * ### Troubleshooting\n * - **429 Too Many Requests**: The requesting IP or target email has exceeded the allowable request rate. Wait a few minutes before trying again.\n * - **400 Bad Request**: The `email` payload is malformed or invalid. Verify that the email matches basic email formats.\n */\nexport const authRequestCode = <ThrowOnError extends boolean = false>(options?: Options<AuthRequestCodeData, ThrowOnError>) => (options?.client ?? client).post<AuthRequestCodeResponses, AuthRequestCodeErrors, ThrowOnError>({\n url: '/auth/request-code',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Soft-revoke an API key\n *\n * ### Overview\n * Permanently revokes an active API key by its unique ID. Once revoked, the key becomes immediately invalid and will be rejected by all services.\n *\n * ### When to Use\n * - Use this endpoint to permanently deactivate an API key (e.g., when running `wspc keys revoke <id>`) due to token rotation, key leakage, or decommissioning of a machine/service.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Revocation is permanent and cannot be undone.\n * - A user can revoke any key they own, including the one they are currently using to make the call. If they revoke the current key, subsequent requests using that key will return `401 Unauthorized`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The active token is missing, expired, or invalid.\n * - **404 Not Found**: The specified key ID does not exist, belongs to another user, or has already been revoked.\n * - **400 Bad Request**: The `id` path parameter format is invalid. It must be in the format `key_<ULID>`.\n */\nexport const keyRevoke = <ThrowOnError extends boolean = false>(options: Options<KeyRevokeData, ThrowOnError>) => (options.client ?? client).delete<KeyRevokeResponses, KeyRevokeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/keys/{id}',\n ...options\n});\n\n/**\n * Update an active API key's label\n *\n * ### Overview\n * Updates the human-readable label of an active API key. Only active (non-revoked) keys owned by the authenticated user can be updated.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Label Validation**: The `label` parameter must be between 1 and 60 characters after trimming whitespace. Failing to provide a valid label results in an `INVALID_LABEL` error.\n */\nexport const keyUpdate = <ThrowOnError extends boolean = false>(options: Options<KeyUpdateData, ThrowOnError>) => (options.client ?? client).patch<KeyUpdateResponses, KeyUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/keys/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Revoke an access or refresh token\n *\n * ### Overview\n * Implements the RFC 7009 token revocation endpoint. It immediately and permanently invalidates a specific access or refresh token.\n *\n * ### When to Use\n * - When the user signs out of an OAuth-enabled client, or when the client detects a token leak. Always preferred over letting tokens expire naturally.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - **Privacy & Security**: To prevent token scanning/validation attacks, the server always returns a 200 OK with an empty object, regardless of whether the token actually existed. Do not infer token existence from the response status.\n *\n * ### Troubleshooting\n * - **400 Bad Request / invalid_request**: The `token` parameter is missing from the payload.\n */\nexport const oauthTokenRevoke = <ThrowOnError extends boolean = false>(options?: Options<OauthTokenRevokeData, ThrowOnError>) => (options?.client ?? client).post<OauthTokenRevokeResponses, OauthTokenRevokeErrors, ThrowOnError>({\n url: '/auth/oauth/revoke',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Revoke a pending invite\n *\n * Permanently revokes a pending organization invite. The invitee will no longer be able to accept it.\n */\nexport const orgInviteRevoke = <ThrowOnError extends boolean = false>(options: Options<OrgInviteRevokeData, ThrowOnError>) => (options.client ?? client).delete<OrgInviteRevokeResponses, OrgInviteRevokeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org/invites/{id}',\n ...options\n});\n\n/**\n * Exchange a grant for an access token\n *\n * ### Overview\n * Implements the RFC 6749 OAuth 2.0 token endpoint. It processes token requests for three grant types: `authorization_code` (with PKCE), `refresh_token`, and `urn:ietf:params:oauth:grant-type:device_code` (device flow), issuing an access token and a rotated refresh token upon success.\n *\n * ### When to Use\n * - Use this endpoint to redeem a temporary code or device code for a fresh token pair once the user has approved authentication.\n * - Use this endpoint to rotate and refresh an expiring access token using a refresh token.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - **Refresh Token Rotation**: Old refresh tokens are invalidated immediately upon exchange, and a fresh refresh token is issued.\n * - **PKCE**: For the `authorization_code` grant, a valid `code_verifier` matching the original `code_challenge` must be provided.\n *\n * ### Troubleshooting\n * - **400 Bad Request / invalid_grant**: The authorization code, refresh token, or device code is expired, invalid, or belongs to a different client.\n * - **400 Bad Request / authorization_pending**: Returned when polling for a device code that has not yet been approved by the user. Do not stop polling, but adhere to the polling interval.\n * - **400 Bad Request / slow_down**: Returned when polling the device code faster than the negotiated `interval`. Reduce polling frequency.\n */\nexport const oauthTokenExchange = <ThrowOnError extends boolean = false>(options?: Options<OauthTokenExchangeData, ThrowOnError>) => (options?.client ?? client).post<OauthTokenExchangeResponses, OauthTokenExchangeErrors, ThrowOnError>({\n url: '/auth/oauth/token',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Verify a magic code and issue an API key\n *\n * ### Overview\n * Completes the passwordless login flow by verifying the magic code received via email. If the code is correct, it registers a new user (if not already registered) and issues a long-lived WSPC API key.\n *\n * ### When to Use\n * - Use this endpoint as the second step of the login flow, exchanging the user-provided code and email address for a valid credential.\n * - Store the returned `api_key` securely client-side to authorize subsequent calls to all WSPC services.\n *\n * ### Constraints\n * - Does not require authentication (public endpoint).\n * - **One-time Use & Expiry**: The verification code is single-use and expires after a short period (typically a few minutes). Re-using a code or attempting to guess code values results in `INVALID_CODE` or `CODE_EXPIRED`.\n * - **Account Creation**: If the email address is not linked to an existing account, a new user profile and personal organization are automatically provisioned (`created: true` in response).\n *\n * ### Troubleshooting\n * - **400 Bad Request**: The code has expired (`CODE_EXPIRED`), is incorrect (`INVALID_CODE`), or has already been used. Request a fresh code via `POST /auth/request-code`.\n * - **429 Too Many Requests**: The rate limit for verification attempts on this email address has been exceeded.\n */\nexport const authVerifyCode = <ThrowOnError extends boolean = false>(options?: Options<AuthVerifyCodeData, ThrowOnError>) => (options?.client ?? client).post<AuthVerifyCodeResponses, AuthVerifyCodeErrors, ThrowOnError>({\n url: '/auth/verify-code',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List calendar events\n *\n * ### Overview\n * Return the authenticated user's events, ordered by `start` ascending, with cursor pagination.\n *\n * ### When to Use\n * Render calendar list/grid views, search for specific terms using full-text search, query events within a specific time window, or retrieve historically past events.\n *\n * ### Constraints\n * - **Default Visibility**: By default, soft-deleted events and past events (events where `end` is before the current time) are automatically hidden.\n * - **Time Bounds Override**: Supplying any explicit time bound query parameter (`start_from`, `start_to`, `end_from`, `end_to`) or passing `include_past=true` overrides and disables the implicit past filter.\n * - **Search Scope**: `q` performs a case-insensitive substring search across `title`, `description`, and `location`.\n * - **Pagination**: The `limit` query parameter is clamped to `[1, 200]`; cursor pagination is enabled via the opaque `cursor` parameter.\n *\n * ### Troubleshooting\n * - Returns 400 `VALIDATION_ERROR` if date query bounds are invalid (e.g. `start_from > start_to` or `end_from > end_to`).\n */\nexport const eventList = <ThrowOnError extends boolean = false>(options?: Options<EventListData, ThrowOnError>) => (options?.client ?? client).get<EventListResponses, EventListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events',\n ...options\n});\n\n/**\n * Schedule a calendar event\n *\n * ### Overview\n * Create a new calendar event owned by the authenticated user.\n *\n * ### When to Use\n * Book a meeting, lunch, all-day trip, or any time-bound item. Optionally provide `attendees` to automatically dispatch invitation emails containing an `.ics` REQUEST attachment to each participant as a side effect.\n *\n * ### Constraints\n * - **Format Integrity**: `start` and `end` must be of the exact same type (both ISO 8601 datetimes with offset, or both ISO date-only for all-day).\n * - **Chronological Order**: `end` must be strictly after `start`.\n * - **All-Day boundary**: All-day events use RFC 5545 exclusive end (e.g., a one-day event on June 1st is specified as `start=2026-06-01` and `end=2026-06-02`).\n * - **Attendee Limit**: Up to 50 unique attendees are supported after case-insensitive email address deduplication.\n *\n * ### Troubleshooting\n * - Returns 400 `VALIDATION_ERROR` if `start` and `end` format mismatch, or if `end <= start`.\n * - Returns 400 `ATTENDEE_LIMIT_EXCEEDED` if more than 50 unique attendees are supplied.\n * - Invitation emails are processed and dispatched asynchronously via Cloudflare `waitUntil`; the analytics counter `event_created` is emitted automatically.\n */\nexport const eventCreate = <ThrowOnError extends boolean = false>(options?: Options<EventCreateData, ThrowOnError>) => (options?.client ?? client).post<EventCreateResponses, EventCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Soft-delete a calendar event\n *\n * ### Overview\n * Soft-delete an existing calendar event, hiding it from default listings.\n *\n * ### When to Use\n * Remove an event entirely from the user's historical view and calendar client. If the meeting was cancelled but should remain in history (notifying participants of cancellation), use `PATCH /calendar/events/{id}` with `status: cancelled` instead.\n *\n * ### Constraints\n * - **Optimistic Locking**: Supports optional optimistic locking via `expected_version` in the request body.\n * - **Side Effects**: When soft-deleting an event with attendees, all participants will asynchronously receive a cancellation email containing an `.ics` CANCEL attachment via Cloudflare `waitUntil`.\n * - **Recovery**: The record is preserved in the database as a soft-deleted row and can be brought back using `POST /calendar/events/{id}/restore`.\n *\n * ### Troubleshooting\n * - Returns 404 `NOT_FOUND` if the event does not exist, or has already been soft-deleted.\n * - Returns 409 `VERSION_CONFLICT` if `expected_version` does not match the database value.\n */\nexport const eventDelete = <ThrowOnError extends boolean = false>(options: Options<EventDeleteData, ThrowOnError>) => (options.client ?? client).delete<EventDeleteResponses, EventDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get a calendar event by id\n *\n * ### Overview\n * Fetch a single calendar event by its unique ID, returning the complete record including all attendees.\n *\n * ### When to Use\n * Display a detailed view of an event, or read the latest database state (capturing `version`) prior to executing an optimistic-locked PATCH update.\n *\n * ### Constraints\n * - **Deleted Events**: Soft-deleted events return 404 `NOT_FOUND` by default. You must explicitly pass `include_deleted=true` in the query parameters to retrieve a soft-deleted row.\n * - **ICS Format**: To download the RFC 5545 iCalendar text representation of this event, use `GET /calendar/events/{id}.ics` instead.\n *\n * ### Troubleshooting\n * - Returns 404 `NOT_FOUND` if the event does not exist, is soft-deleted (without `include_deleted=true`), or is owned by another user.\n */\nexport const eventGet = <ThrowOnError extends boolean = false>(options: Options<EventGetData, ThrowOnError>) => (options.client ?? client).get<EventGetResponses, EventGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events/{id}',\n ...options\n});\n\n/**\n * Update a calendar event\n *\n * ### Overview\n * Partially update fields of an existing calendar event. All properties in the request body are optional.\n *\n * ### When to Use\n * Reschedule an event, update its location or notes, cancel the meeting (retaining the record but notifying participants), or replace/update the attendee list.\n *\n * ### Constraints\n * - **Optimistic Locking**: Pass `expected_version` to fail with `VERSION_CONFLICT` if another mutation occurred concurrently since you last read. Omit to let the server force the update.\n * - **Field Clearing**: Pass an empty string `\"\"` for `description`, `location`, or `url` to clear those fields in the database.\n * - **Attendee replacement**: Providing the `attendees` property fully REPLACES the existing participant list. The server automatically diffs participants and asynchronously sends invitations (for newly added), updates (for kept), or cancellations (for removed) via Cloudflare `waitUntil`.\n * - **Validation Rules**: Mismatched start/end formats or chronological order violations will fail the request.\n * - **Attendee Limit**: A maximum of 50 unique attendees is allowed.\n *\n * ### Troubleshooting\n * - Returns 404 `NOT_FOUND` if the event does not exist or is soft-deleted.\n * - Returns 409 `VERSION_CONFLICT` if `expected_version` is provided but stale.\n * - Returns 400 `VALIDATION_ERROR` if `start` and `end` kinds do not match, or if `end <= start`.\n * - Returns 400 `ATTENDEE_LIMIT_EXCEEDED` if unique attendees exceed 50.\n */\nexport const eventUpdate = <ThrowOnError extends boolean = false>(options: Options<EventUpdateData, ThrowOnError>) => (options.client ?? client).patch<EventUpdateResponses, EventUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Download event as `.ics`\n *\n * ### Overview\n * Return a single event rendered as an RFC 5545 `.ics` file suitable for import into major calendar clients.\n *\n * ### When to Use\n * Expose a 'Save to my calendar' link in email notifications, show a download button in a UI, or programmatically forward raw iCalendar text to third parties.\n *\n * ### Constraints\n * - **Router Match**: The path parameter `filename` must be exactly `<event_id>.ics`. The `.ics` suffix is strictly required for the router to match this endpoint ahead of the JSON detail endpoint.\n * - **Response Payload**: The response is plain text containing the iCalendar specification, NOT JSON. The `Content-Type` is set to `text/calendar; charset=utf-8` with `Content-Disposition: inline; filename=\"<event_id>.ics\"`.\n * - **Authentication**: Standard authentication is required (Bearer API key or OAuth access token), as this endpoint is secure.\n *\n * ### Troubleshooting\n * - Returns 404 `NOT_FOUND` if the event does not exist, is soft-deleted, or is owned by another user.\n */\nexport const eventIcsDownload = <ThrowOnError extends boolean = false>(options: Options<EventIcsDownloadData, ThrowOnError>) => (options.client ?? client).get<EventIcsDownloadResponses, EventIcsDownloadErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events/{filename}',\n ...options\n});\n\n/**\n * Restore a soft-deleted event\n *\n * ### Overview\n * Restore a previously soft-deleted calendar event, making it active and visible in default list queries.\n *\n * ### When to Use\n * Recover an event that was accidentally soft-deleted.\n *\n * ### Constraints\n * - **Optimistic Locking**: Supports optional optimistic locking via `expected_version` in the request body.\n * - **Side Effects**: When restoring an event with attendees, all participants will asynchronously receive a new invitation email containing an `.ics` REQUEST attachment via Cloudflare `waitUntil`.\n * - **State Integrity**: You cannot restore a live (non-deleted) event. Restoring a live event is treated as an error.\n *\n * ### Troubleshooting\n * - Returns 404 `NOT_FOUND` if the event does not exist, or is NOT currently soft-deleted.\n * - Returns 409 `VERSION_CONFLICT` if `expected_version` does not match the database value.\n */\nexport const eventRestore = <ThrowOnError extends boolean = false>(options: Options<EventRestoreData, ThrowOnError>) => (options.client ?? client).post<EventRestoreResponses, EventRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events/{id}/restore',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List the caller's aliases\n *\n * ### Overview\n * Retrieves a list of all email receiving aliases owned by the authenticated user.\n *\n * ### When to Use\n * - Use this endpoint to render an alias directory in user profiles or to provide a selection list of verified sender aliases in an email compose interface.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - By default, only active receiving aliases are returned. Pass `include_deleted=true` in the query to also fetch soft-deleted aliases (which have `deleted_at` timestamps set).\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Active token is missing, expired, or invalid.\n */\nexport const emailAliasList = <ThrowOnError extends boolean = false>(options?: Options<EmailAliasListData, ThrowOnError>) => (options?.client ?? client).get<EmailAliasListResponses, EmailAliasListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/aliases',\n ...options\n});\n\n/**\n * Create a receiving alias\n *\n * ### Overview\n * Reserves and provisions a new passwordless/disposable receiving email alias address under the configured WSPC domain or a fully verified organization custom domain. All inbound emails received on this alias will be forwarded into the caller's inbox.\n *\n * ### When to Use\n * - Use this endpoint to spin up a fresh, dedicated email address (e.g., `alice-shop@wspc.app`) for specific websites, newsletters, or contexts to prevent spam or categorize incoming mail.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Alias Formatting**: The local part must be between 5 and 32 characters, start with an alphanumeric character, and only contain letters, numbers, dots, underscores, and hyphens.\n * - **Custom Domains**: If the address uses a non-platform host, that domain must be registered to the caller's organization and have `status = verified`, `sending_status = verified`, and `receiving_status = verified`.\n * - **Limit Check**: Each user is allowed a maximum of 10 active email aliases. Soft-deleted aliases do not count against this quota limit.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Bearer token is missing, invalid, or expired.\n * - **400 Bad Request / INVALID_CHARSET / RESERVED**: The alias local part contains invalid characters, is too short/long, or matches a reserved keyword.\n * - **400 Bad Request / DOMAIN_NOT_FOUND**: The custom domain is not registered to the caller's organization.\n * - **400 Bad Request / UNVERIFIED_DOMAIN**: The custom domain exists but is not verified yet.\n * - **400 Bad Request / CUSTOM_DOMAIN_NOT_READY**: The custom domain exists but has not completed sending or receiving verification.\n * - **409 Conflict / ALIAS_CONFLICT**: An alias with the exact requested email address already exists globally (whether active or soft-deleted by any user).\n * - **429 Too Many Requests / ALIAS_LIMIT_EXCEEDED**: The user has reached the active alias cap limit of 10. A previously deleted alias must be cleaned up or wait for quota availability.\n */\nexport const emailAliasCreate = <ThrowOnError extends boolean = false>(options: Options<EmailAliasCreateData, ThrowOnError>) => (options.client ?? client).post<EmailAliasCreateResponses, EmailAliasCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/aliases',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List cached custom domains\n *\n * ### Overview\n * Returns the caller organization's cached custom email domains from D1. This route does not call the upstream provider.\n *\n * ### When to Use\n * - Use this to render an admin view of all registered domains and their latest known verification state.\n * - Use it to inspect DNS records that were previously fetched during create or verify operations.\n * - The cached state includes DNS ownership, sending readiness, and receiving readiness used by custom-domain alias creation.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Results are scoped to the caller organization and sorted newest-first by creation time.\n */\nexport const emailDomainList = <ThrowOnError extends boolean = false>(options?: Options<EmailDomainListData, ThrowOnError>) => (options?.client ?? client).get<EmailDomainListResponses, EmailDomainListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/domains',\n ...options\n});\n\n/**\n * Register a custom email domain\n *\n * ### Overview\n * Registers a new organization-owned custom email domain with the upstream provider and caches the returned DNS verification records in D1.\n *\n * ### When to Use\n * - Use this endpoint when onboarding a new custom email domain such as `mail.example.com`.\n * - The response contains the DNS records the organization must publish before the domain can be verified.\n * - This route registers the domain and returns DNS records. Custom-domain aliases require `status`, `sending_status`, and `receiving_status` to all be `verified`.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Domain ownership is globally unique across the platform. Once any organization has reserved a domain, another org cannot register it.\n * - This route requires custom domain provider credentials in production because it performs a live provider registration call.\n *\n * ### Troubleshooting\n * - **400 Bad Request / DOMAIN_INVALID / DOMAIN_RESERVED**: The hostname is malformed or belongs to the platform (`wspc.app`, `wspc.ai`, or their subdomains).\n * - **409 Conflict / DOMAIN_CONFLICT**: The domain is already registered by some organization.\n * - **502 Bad Gateway / DOMAIN_PROVIDER_ERROR**: The upstream provider request failed, timed out, or returned an unexpected shape.\n */\nexport const emailDomainCreate = <ThrowOnError extends boolean = false>(options: Options<EmailDomainCreateData, ThrowOnError>) => (options.client ?? client).post<EmailDomainCreateResponses, EmailDomainCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/domains',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Soft-delete an alias\n *\n * ### Overview\n * Soft-deletes a specific active email receiving alias owned by the caller. Once soft-deleted, the alias stops accepting and forwarding any new inbound emails.\n *\n * ### When to Use\n * - Use this endpoint when decommissioning a disposable alias address that is no longer needed or is receiving excessive spam.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Data Retention**: Soft-deletion is immediate. Inbound mail forwarding stops, but historical emails previously received on this alias remain fully readable in the inbox.\n * - **Restoration**: The alias remains globally reserved and cannot be created fresh by anyone; use `POST /email/aliases/{email}/restore` to reactivate.\n * - **Path Parameter**: The `@` character in the `{email}` path parameter must be URL-encoded as `%40`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Missing or invalid token.\n * - **404 Not Found**: No active alias with this exact address was found for the authenticated user, or the alias is already deleted.\n */\nexport const emailAliasDelete = <ThrowOnError extends boolean = false>(options: Options<EmailAliasDeleteData, ThrowOnError>) => (options.client ?? client).delete<EmailAliasDeleteResponses, EmailAliasDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/aliases/{email}',\n ...options\n});\n\n/**\n * Soft-delete inbound emails\n *\n * ### Overview\n * Soft-deletes a batch of inbound emails, moving them to the trash. Soft-deleted emails are immediately excluded from default inbox lists.\n *\n * ### When to Use\n * - Use this endpoint to trash one or more email messages from a user's inbox view.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Accepts 1 to 100 email IDs per call.\n * - Deletion is fully reversible: soft-deleted rows persist in the database and can be undeleted using the restore endpoint.\n * - **Data Cleanup**: Out-of-band background processes eventually purge associated raw MIME source payloads and attachment bytes from R2; deletion does not immediately free storage.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Invalid Bearer token.\n * - **400 Bad Request**: The request body is malformed or exceeds the maximum limit of 100 IDs.\n */\nexport const emailDelete = <ThrowOnError extends boolean = false>(options: Options<EmailDeleteData, ThrowOnError>) => (options.client ?? client).post<EmailDeleteResponses, EmailDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/delete',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Download an attachment by index\n *\n * ### Overview\n * Streams the raw decoded bytes of a parsed attachment belonging to an inbound email. The response body is binary data instead of JSON.\n *\n * ### When to Use\n * - Use this endpoint when a user clicks to download a file attachment (such as an invoice PDF or image) or when an automated agent needs to process a file payload.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Response Headers**: The server sets the HTTP `Content-Type` matching the attachment's parsed MIME format and provides a `Content-Disposition: attachment; filename=\"<filename>\"` header.\n * - **Soft-Deleted Parents**: Downloading files from soft-deleted emails is blocked with a 404 error, unless the query parameter `include_deleted=true` is provided.\n * - **Path Parameter**: The `{idx}` must be a valid 0-based integer index pointing to the attachment list metadata.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Invalid Bearer token.\n * - **404 Not Found / EMAIL_NOT_FOUND**: The specified email ID does not exist or belongs to another user.\n * - **404 Not Found / ATTACHMENT_NOT_FOUND**: The index `{idx}` is out of range for the email's attachment array.\n */\nexport const emailAttachmentGet = <ThrowOnError extends boolean = false>(options: Options<EmailAttachmentGetData, ThrowOnError>) => (options.client ?? client).get<EmailAttachmentGetResponses, EmailAttachmentGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/{id}/attachments/{idx}',\n ...options\n});\n\n/**\n * Get one cached custom domain\n *\n * ### Overview\n * Returns the caller organization's cached state for one custom email domain. This is a pure D1 read and never calls the upstream provider.\n *\n * ### When to Use\n * - Use this to inspect the latest cached DNS records or verification status for a single domain.\n * - This cached view includes ownership, sending readiness, and receiving readiness state for custom-domain alias decisions.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - The `{domain}` path parameter is normalized and validated server-side before lookup.\n *\n * ### Troubleshooting\n * - **400 Bad Request / DOMAIN_INVALID / DOMAIN_RESERVED**: The path hostname is malformed or reserved.\n * - **404 Not Found / DOMAIN_NOT_FOUND**: The domain does not exist or belongs to another organization.\n */\nexport const emailDomainGet = <ThrowOnError extends boolean = false>(options: Options<EmailDomainGetData, ThrowOnError>) => (options.client ?? client).get<EmailDomainGetResponses, EmailDomainGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/domains/{domain}',\n ...options\n});\n\n/**\n * Get an inbound email by id\n *\n * ### Overview\n * Fetches the metadata and plain-text body of a single inbound email by its unique ID. It also returns metadata for all associated attachments and optionally resolves the rendered HTML content.\n *\n * ### When to Use\n * - Use this endpoint to display the complete detail view of an email message.\n * - Use it to extract attachment files or read complex HTML layouts.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **R2 HTML Read**: The HTML body is stored in Object Storage (R2). To fetch it, explicitly pass `include_html=true` (this incurs an extra R2 read charge; leave unset if only plain text is needed).\n * - Returns a 404 error if the email has been soft-deleted, unless `include_deleted=true` is set.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Missing or expired token.\n * - **404 Not Found**: The specified email ID does not exist, belongs to another user, or has been soft-deleted (without `include_deleted=true`).\n */\nexport const emailGet = <ThrowOnError extends boolean = false>(options: Options<EmailGetData, ThrowOnError>) => (options.client ?? client).get<EmailGetResponses, EmailGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/{id}',\n ...options\n});\n\n/**\n * List inbound emails\n *\n * ### Overview\n * Retrieves a paginated directory list of all inbound emails received by the user's active aliases, sorted in descending order of ingestion time (newest first).\n *\n * ### When to Use\n * - Use this endpoint to render mailbox dashboards or inbox streams.\n * - Use query parameters to perform incremental syncs (via `since` timestamp) or to filter incoming mail by read state or target alias email.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Pagination**: Supports cursor-based pagination. Pass the returned `next_cursor` value back as the `cursor` query parameter to list subsequent pages. The `limit` is capped between 1 and 100, defaulting to 20.\n * - By default, soft-deleted emails are hidden. Pass `include_deleted=true` to retrieve them.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Missing, invalid, or expired Bearer token.\n * - **400 Bad Request**: Malformed pagination cursor or invalid query parameters (e.g., non-integer limit).\n */\nexport const emailList = <ThrowOnError extends boolean = false>(options?: Options<EmailListData, ThrowOnError>) => (options?.client ?? client).get<EmailListResponses, EmailListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages',\n ...options\n});\n\n/**\n * Mark inbound emails as read\n *\n * ### Overview\n * Marks a batch of inbound emails as read. This batch operation is fully idempotent.\n *\n * ### When to Use\n * - Use this endpoint when a user opens an email detail view or performs a bulk mark-read action in an inbox dashboard.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Accepts 1 to 100 email IDs in a single call.\n * - **Idempotency**: Already-read IDs are silently processed without generating errors but do not count toward the returned `marked` value. Missing, unauthorized, or soft-deleted IDs will be logged in `not_found`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Invalid or missing Bearer token.\n * - **400 Bad Request**: The request body is malformed or exceeds the maximum limit of 100 IDs.\n */\nexport const emailMarkRead = <ThrowOnError extends boolean = false>(options: Options<EmailMarkReadData, ThrowOnError>) => (options.client ?? client).post<EmailMarkReadResponses, EmailMarkReadErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/read',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Mark inbound emails as unread\n *\n * ### Overview\n * Resets a batch of inbound emails back to an unread state.\n *\n * ### When to Use\n * - Use this endpoint to undo an accidental read marking or to mark messages for later review.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Accepts 1 to 100 email IDs per call. Already-unread IDs are silently ignored but do not contribute to `marked`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Invalid Bearer token.\n * - **400 Bad Request**: Malformed body or ID batch size limit exceeded.\n */\nexport const emailMarkUnread = <ThrowOnError extends boolean = false>(options: Options<EmailMarkUnreadData, ThrowOnError>) => (options.client ?? client).post<EmailMarkUnreadResponses, EmailMarkUnreadErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/unread',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Restore a soft-deleted alias\n *\n * ### Overview\n * Reactivates a previously soft-deleted email receiving alias, immediately resuming mail forwarding to the user's inbox.\n *\n * ### When to Use\n * - Use this endpoint to re-enable a temporarily disabled alias or to recover one that was deleted by mistake.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Quota Check**: Reactivating an alias increases the active alias count towards the user's maximum quota of 10 active aliases. If the limit is exceeded, a `429 ALIAS_LIMIT_EXCEEDED` error is returned.\n * - **Path Parameter**: The `@` character in the path parameter must be URL-encoded as `%40`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Missing or invalid token.\n * - **404 Not Found**: No soft-deleted alias with this exact address was found for the authenticated user.\n * - **429 Too Many Requests / ALIAS_LIMIT_EXCEEDED**: Reactivating this alias would exceed the per-user limit of 10 active aliases.\n */\nexport const emailAliasRestore = <ThrowOnError extends boolean = false>(options: Options<EmailAliasRestoreData, ThrowOnError>) => (options.client ?? client).post<EmailAliasRestoreResponses, EmailAliasRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/aliases/{email}/restore',\n ...options\n});\n\n/**\n * Restore soft-deleted inbound emails\n *\n * ### Overview\n * Restores a batch of soft-deleted inbound emails from the trash, making them reappear in standard inbox lists.\n *\n * ### When to Use\n * - Use this endpoint to recover email messages that were trashed by mistake.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Accepts 1 to 100 email IDs. Already-active IDs are silently ignored.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Invalid token.\n * - **400 Bad Request**: Malformed request or batch limit exceeded.\n */\nexport const emailRestore = <ThrowOnError extends boolean = false>(options: Options<EmailRestoreData, ThrowOnError>) => (options.client ?? client).post<EmailRestoreResponses, EmailRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/restore',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Send an outbound email\n *\n * ### Overview\n * Submits a single outbound email for delivery from one of the caller's active aliases. All details, including attachments (inline base64 blobs or references to existing inbound attachments), are verified before sending. Platform-domain aliases use Cloudflare Email Service; verified custom-domain aliases use pete-mail.\n *\n * ### When to Use\n * - Use this endpoint to send new standalone emails or to reply to threaded inbound messages.\n * - Use this in automated agent pipelines (like calendar invite generation or notifications) and CLI email send utilities.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Size Limits**: Individual attachments must not exceed 5 MiB, and the total size of all attachments per send must be 25 MiB or less.\n * - **Security**: Up to 10 attachments are allowed. Outbound files with dangerous executable extensions (such as `.exe`, `.bat`, `.com`, `.scr`, `.cmd`, `.jar`, `.js`) are strictly blocked.\n * - **Daily Quotas**: Sending is protected by per-user (100 sends/day) and per-alias (50 sends/day) daily quotas. Exceeding them triggers `RATE_LIMITED` or `QUOTA_EXCEEDED` errors.\n * - **Custom Domains**: Platform-domain aliases use Cloudflare Email Service. Verified custom-domain aliases are routed through pete-mail. Custom domains must have `status = verified` and `sending_status = verified` or the send returns `CUSTOM_DOMAIN_NOT_READY`.\n * - **Idempotency**: A stable `idempotency_key` (1-200 characters) must be supplied. Retrying a send with identical content and the same key returns `idempotent_replay: true` without sending duplicates. Reusing the key with changed content returns 409 `IDEMPOTENCY_KEY_REUSED`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Active Bearer token is invalid or has expired.\n * - **404 Not Found**: The requested `from_alias_email` does not exist or has been soft-deleted, or the referenced `in_reply_to_email_id` is missing or belongs to a different user.\n * - **409 Conflict / IDEMPOTENCY_KEY_REUSED**: An identical `idempotency_key` was reused with modified request payload. Use a fresh unique key.\n * - **409 Conflict / CUSTOM_DOMAIN_NOT_READY**: The sender uses a custom domain that has not completed outbound sending verification.\n * - **429 Too Many Requests / RATE_LIMITED**: The per-user rate limit or daily sending quota has been exceeded. Wait for quota reset.\n * - **502 Bad Gateway**: The upstream outbound provider failed or rejected the message. The outbound row is persisted with `status: failed` along with provider-returned logs.\n */\nexport const emailSend = <ThrowOnError extends boolean = false>(options: Options<EmailSendData, ThrowOnError>) => (options.client ?? client).post<EmailSendResponses, EmailSendErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/send',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Verify a custom domain with the provider\n *\n * ### Overview\n * Triggers an upstream provider verification attempt for one custom email domain, refreshes the cached DNS records/status in D1, and returns the updated row.\n * This route refreshes DNS registration and verification state. Custom-domain aliases require `status`, `sending_status`, and `receiving_status` to all be `verified`.\n *\n * ### When to Use\n * - Use this after publishing the required DNS records, or whenever you want to refresh cached provider state explicitly.\n * - If the provider verify call returns incomplete DNS records, the worker performs a follow-up provider read before responding.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - This route requires custom domain provider credentials in production because it performs live provider calls.\n * - Verification is asynchronous provider work; a successful response may still report `status: pending`.\n * - `status: verified` plus `sending_status: verified` enables custom-domain outbound send for active aliases; `receiving_status: verified` is also required before new custom-domain aliases can be created.\n *\n * ### Troubleshooting\n * - **400 Bad Request / DOMAIN_INVALID / DOMAIN_RESERVED**: The path hostname is malformed or reserved.\n * - **404 Not Found / DOMAIN_NOT_FOUND**: The domain does not exist or belongs to another organization.\n * - **502 Bad Gateway / DOMAIN_PROVIDER_ERROR**: Provider verification failed, timed out, or credentials are missing.\n */\nexport const emailDomainVerify = <ThrowOnError extends boolean = false>(options: Options<EmailDomainVerifyData, ThrowOnError>) => (options.client ?? client).post<EmailDomainVerifyResponses, EmailDomainVerifyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/domains/{domain}/verify',\n ...options\n});\n\n/**\n * Remove a push transport\n *\n * ### Overview\n * Delete the configured push transport row, immediately halting push event dispatching for the caller.\n *\n * ### When to Use\n * When a user disconnects their notification channel, turns off push preferences, or resets their transport target.\n *\n * ### Constraints\n * - **Idempotency**: Deleting a transport that has not been registered (or was already deleted) is handled as a no-op, returning 204 `No Content`.\n * - **Side Effects**: Hard-deletes the `(user_id, transport)` configuration record and completely purges all associated test history (`last_test_at` and `last_test_status`).\n * - **Transport Support**: The path parameter must be a recognized transport identifier.\n *\n * ### Troubleshooting\n * - Returns 400 `UNKNOWN_TRANSPORT` if the transport parameter contains an unrecognized transport identifier.\n */\nexport const pushConfigDelete = <ThrowOnError extends boolean = false>(options: Options<PushConfigDeleteData, ThrowOnError>) => (options.client ?? client).delete<PushConfigDeleteResponses, PushConfigDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/push/config/{transport}',\n ...options\n});\n\n/**\n * List the caller's push transports\n *\n * ### Overview\n * Retrieve all active push transport configurations registered for the authenticated user.\n *\n * ### When to Use\n * Render settings page, determine if push notifications are enabled before prompting the user, or fetch historical health check results (`last_test_at` and `last_test_status`).\n *\n * ### Constraints\n * - **List Limitations**: Currently returns at most one active registration row (`telegram`).\n * - **Data Security**: Response payload contains sensitive data (e.g. `target_bot_username`). Callers must handle these values as user secret-equivalent and prevent leakage.\n *\n * ### Troubleshooting\n * - Standard 401 Unauthorized or 403 Forbidden checks if authentication credentials are missing or invalid.\n */\nexport const pushConfigGet = <ThrowOnError extends boolean = false>(options?: Options<PushConfigGetData, ThrowOnError>) => (options?.client ?? client).get<PushConfigGetResponses, PushConfigGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/push/config',\n ...options\n});\n\n/**\n * Register or update a push transport\n *\n * ### Overview\n * Upsert a notification transport configuration for the authenticated user. After registration, wspc can dispatch notifications to the user when registered product events fire.\n *\n * ### When to Use\n * First-time onboarding push configuration setup, or whenever the user updates their transport target details (e.g., pointing notifications to a new Telegram bot username).\n *\n * ### Constraints\n * - **Supported Transports**: Currently only `transport: telegram` is supported.\n * - **Target Validation**: `target_bot_username` must be a valid Telegram bot name starting with `@` followed by 5–32 alphanumeric/underscore characters (`^@[A-Za-z0-9_]{5,32}$`).\n * - **Uniqueness**: Up to one registration row is saved per `(user_id, transport)`. Upserting replaces any existing target config, updating `updated_at` while retaining `created_at`.\n * - **No Side-effect Messages**: Registering a transport does **not** send a test notification; clients should separately trigger `POST /push/test`.\n *\n * ### Troubleshooting\n * - Returns 400 `INVALID_CONFIG` if payload structure is invalid or `target_bot_username` validation fails.\n */\nexport const pushConfigSet = <ThrowOnError extends boolean = false>(options: Options<PushConfigSetData, ThrowOnError>) => (options.client ?? client).post<PushConfigSetResponses, PushConfigSetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/push/config',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Send a test push notification\n *\n * ### Overview\n * Synchronously dispatch a static test message via the requested transport target to verify delivery health.\n *\n * ### When to Use\n * Immediately after executing `POST /push/config` to verify connection legitimacy, or when troubleshooting missing notification claims.\n *\n * ### Constraints\n * - **Target Requirement**: You must have already successfully registered the targeted transport configuration.\n * - **Side Effects**: Sends a single probe message to the upstream provider (e.g. Telegram Bot API). Test details are persisted to the configuration row under `last_test_at` and `last_test_status`.\n * - **No Audit Footprint**: This operation is treated strictly as an integration probe and will not generate a product audit log footprint.\n *\n * ### Troubleshooting\n * - **Upstream Error Handling**: This endpoint returns an HTTP `200 OK` status even if the upstream dispatch fails. Callers must inspect `ok: false` and review `status` and `detail` in the response JSON to verify connection health.\n * - Returns 404 `NO_CONFIG` if the user has not registered configuration details for the requested transport.\n */\nexport const pushTest = <ThrowOnError extends boolean = false>(options: Options<PushTestData, ThrowOnError>) => (options.client ?? client).post<PushTestResponses, PushTestErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/push/test',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List comments on a todo\n *\n * ### 🎯 Overview & Purpose\n * List the comments attached to a todo, oldest-first by default.\n *\n * ### 💡 Key Features & Constraints\n * * **Ordering**: Defaults to chronological (`asc`). Pass `order=desc` for newest-first.\n * * **Soft-deleted**: Hidden by default; pass `include_deleted=true` to include them.\n * * **Pagination**: Use `limit` (max 200, default 50) and `cursor` (the `next_cursor` from a previous response) to page through results. When `next_cursor` is absent in the response, you are on the last page. Returns `{ comments, next_cursor? }`. Changing `order` invalidates a cursor.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target todo does not exist or is soft-deleted.\n * * **`VALIDATION_ERROR`**: Thrown if a cursor was produced with a different `order` than the current request.\n */\nexport const todoCommentList = <ThrowOnError extends boolean = false>(options: Options<TodoCommentListData, ThrowOnError>) => (options.client ?? client).get<TodoCommentListResponses, TodoCommentListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}/comments',\n ...options\n});\n\n/**\n * Add a comment to a todo\n *\n * ### 🎯 Overview & Purpose\n * Attach a free-text comment to a todo. Use this to record progress updates, notes, or remarks as a task moves along.\n *\n * ### 💡 Key Features & Constraints\n * * **Free text**: Comments are plain text up to 10000 characters; there is no separate \"progress\" vs \"remark\" type.\n * * **Authorship**: The author is recorded as the calling user (`user_id`).\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target todo does not exist or is soft-deleted.\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if content is empty or exceeds 10000 characters.\n */\nexport const todoCommentCreate = <ThrowOnError extends boolean = false>(options: Options<TodoCommentCreateData, ThrowOnError>) => (options.client ?? client).post<TodoCommentCreateResponses, TodoCommentCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}/comments',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List projects\n *\n * ### 🎯 Overview & Purpose\n * List all project workspaces available to the authenticated organization or user.\n *\n * ### 🔍 When to Use\n * * Use this to populate project switcher dropdown menus, load side navigation views, or find valid project IDs before listing other scoped resources.\n *\n * ### 💡 Key Features & Constraints\n * * **Archived Visibility**: Soft-deleted projects are omitted from default listings. Pass `include_deleted=true` to include them for auditing or recovery dashboards.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`AUTH_REQUIRED` (HTTP 401)**: Thrown if the caller is not authenticated.\n */\nexport const projectList = <ThrowOnError extends boolean = false>(options?: Options<ProjectListData, ThrowOnError>) => (options?.client ?? client).get<ProjectListResponses, ProjectListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects',\n ...options\n});\n\n/**\n * Create a project\n *\n * ### 🎯 Overview & Purpose\n * Establish a new isolated project workspace.\n *\n * ### 🔍 When to Use\n * * Use this to set up a new domain, team project, or separate workspace area to isolate tasks, custom types, and recurrence rules.\n *\n * ### 💡 Key Features & Constraints\n * * **Project Partitioning**: Projects act as strict boundaries. Custom todo types and recurrence rules created under this project are strictly confined to it.\n * * **Name Uniqueness**: Project names are free-form and do not have to be unique.\n * * **Default Type Inheritance**: Omit `default_todo_type_id` to automatically inherit the Default Project's default task type.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if required fields are missing, if name is empty, or if name length constraints are violated.\n */\nexport const projectCreate = <ThrowOnError extends boolean = false>(options?: Options<ProjectCreateData, ThrowOnError>) => (options?.client ?? client).post<ProjectCreateResponses, ProjectCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List recurring todo rules\n *\n * ### 🎯 Overview & Purpose\n * Return all active recurrence rules within a specific project owned by the caller.\n *\n * ### 🔍 When to Use\n * * Use this to render rule management panels, list scheduled automation templates, or inspect active rules.\n *\n * ### 💡 Key Features & Constraints\n * * **Project Scope**: The `project_id` query parameter is strictly required.\n * * **Exclusion**: Soft-deleted/archived rules are excluded from the response by default.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if `project_id` query filter is omitted.\n */\nexport const recurrenceRuleList = <ThrowOnError extends boolean = false>(options: Options<RecurrenceRuleListData, ThrowOnError>) => (options.client ?? client).get<RecurrenceRuleListResponses, RecurrenceRuleListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/recurrence-rules',\n ...options\n});\n\n/**\n * Create a recurring todo rule\n *\n * ### 🎯 Overview & Purpose\n * Create a recurrence rule that materializes upcoming todo instances on a repeating schedule.\n *\n * ### 🔍 When to Use\n * * Use this to set up recurring work like a weekly Standup, monthly reporting, or cyclical maintenance. The server automatically materializes upcoming todo instances on a 14-day rolling horizon.\n *\n * ### 💡 Key Features & Constraints\n * * **RFC-5545 Conformity**: The `rrule` parameter must be a valid RFC-5545 schedule string (e.g., `FREQ=WEEKLY;BYDAY=MO`) and must **not** include the `DTSTART` or `TZID` directive.\n * * **Anchor Date**: `dtstart` specifies the local calendar starting date (`YYYY-MM-DD`) where the schedule rule is anchored.\n * * **Nesting Constraints**: Recurrence rules can only be bound to root-level tasks. Child tasks (subtasks) cannot have recurrence rules. Setting a child task as a parent will trigger `PARENT_IS_CHILD`.\n * * **Instance Independence**: Once materialized, each todo instance is fully independent with its own `status` and `due_at`.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`RRULE_INVALID` (HTTP 400)**: Thrown if the `rrule` schedule string is broken or contains illegal `DTSTART` directives.\n * * **`PARENT_IS_CHILD` (HTTP 400)**: Thrown if the specified `parent_id` points to a child task.\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if date format is invalid or required fields are missing.\n */\nexport const recurrenceRuleCreate = <ThrowOnError extends boolean = false>(options?: Options<RecurrenceRuleCreateData, ThrowOnError>) => (options?.client ?? client).post<RecurrenceRuleCreateResponses, RecurrenceRuleCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/recurrence-rules',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List todos with filters\n *\n * ### 🎯 Overview & Purpose\n * Return the caller's active or archived todos, with comprehensive options to filter by project, parent task, status, due-date window, and template visibility.\n *\n * ### 🔍 When to Use\n * * Use this to render the main todo board dashboard, query items due in a specific timeframe (using `due_after` and `due_before`), or lazy-load subtasks for an expanded parent todo by passing its ID.\n *\n * ### 💡 Key Features & Constraints\n * * **Required Parameter**: The `project_id` query parameter is strictly required and must match an active project.\n * * **Parent Tasks**: Omitting `parent_id` lists root-level todos by default. Pass a todo id to list direct children of that specific task.\n * * **Multi-Status Filters**: Multi-value `status` query is supported by repeating the parameter, e.g., `?status=open&status=in_progress`.\n * * **Due-Date Windowing**: The `due_after` filter is inclusive, while `due_before` is exclusive, forming a half-open window `[due_after, due_before)`. Both parameters exclude todos with no due date.\n * * **Template & Soft-Delete Visibility**: Soft-deleted todos are hidden unless `include_deleted=true`. Template todos backing recurrence rules are hidden unless `include_templates=true`.\n * * **Custom-Field Filters (`cf.<key>=<value>`)**: Repeatable dynamic-prefix query parameters whose name follows the `cf.<key>` pattern (e.g. `?cf.priority=high&cf.team=eng`). Each pair is ANDed; for `string_array` custom fields the match is positive when the array contains the value. Keys must be declared on the project's todo type schema. Because the prefix is dynamic, these parameters cannot be expressed in the JSON Schema below — clients must construct them from the URL query string directly.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if `project_id` is missing, or if query parameters fail schema validation.\n */\nexport const todoList = <ThrowOnError extends boolean = false>(options: Options<TodoListData, ThrowOnError>) => (options.client ?? client).get<TodoListResponses, TodoListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items',\n ...options\n});\n\n/**\n * Create a todo\n *\n * ### 🎯 Overview & Purpose\n * Create a new todo item under a specified project. This can either be a standalone root-level todo or a nested subtask attached to an existing root todo.\n *\n * ### 🔍 When to Use\n * * Use this to capture a fresh work item, document an ongoing task, or break a larger root todo into subtasks by creating child todos under it.\n *\n * ### 💡 Key Features & Constraints\n * * **One-Level Nesting Limit**: WSPC supports a maximum of one level of task nesting (Root ➔ Child). A root-level todo can have children, but a child todo cannot have further subtasks. Setting a child todo as a parent will fail and trigger a `PARENT_IS_CHILD` error.\n * * **Description Handling**: Passing a non-empty string stores the description; passing `\"\"` explicitly stores an empty string. Passing `null` is strictly rejected.\n * * **Due Date Format**: Accepts an ISO-8601 date-only format (`YYYY-MM-DD`). Pass `\"\"` or omit the field to skip setting a due date.\n * * **Project Binding**: Every todo must belong to a valid active project (`project_id`).\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if required fields are missing, if `due_at` violates the `YYYY-MM-DD` format, or if `title` exceeds 500 characters.\n * * **`PARENT_IS_CHILD` (HTTP 400)**: Thrown if the target `parent_id` refers to a todo that is itself already a child todo.\n * * **`WOULD_CREATE_CYCLE` (HTTP 400)**: Thrown if `parent_id` points to the todo's own ID.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the specified `project_id` or `parent_id` does not exist or has been soft-deleted.\n */\nexport const todoCreate = <ThrowOnError extends boolean = false>(options?: Options<TodoCreateData, ThrowOnError>) => (options?.client ?? client).post<TodoCreateResponses, TodoCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List todo types\n *\n * ### 🎯 Overview & Purpose\n * List custom todo types defined within a project.\n *\n * ### 🔍 When to Use\n * * Use this to populate task type selection dropdown elements or load category metadata for dynamic custom forms.\n *\n * ### 💡 Key Features & Constraints\n * * **Required Parameter**: The `project_id` filter is strictly required and must match an active project.\n * * **Exclusion**: Soft-deleted types are excluded by default. Pass `include_deleted=true` to surface archived rows for a recovery UI.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if `project_id` query parameter is omitted.\n */\nexport const todoTypeList = <ThrowOnError extends boolean = false>(options: Options<TodoTypeListData, ThrowOnError>) => (options.client ?? client).get<TodoTypeListResponses, TodoTypeListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types',\n ...options\n});\n\n/**\n * Create a todo type\n *\n * ### 🎯 Overview & Purpose\n * Create a new custom todo type. This allows you to define specialized category schemas (e.g. \"Bug Report\") and configure custom field constraints.\n *\n * ### 🔍 When to Use\n * * Use this to set up customized task behaviors (e.g. tracking choices, additional metadata, or enforcing hidden fields) tailored to a project.\n *\n * ### 💡 Key Features & Constraints\n * * **Automatic Seeding**: The first project initialization will lazily seed a `Default Project` and a `Default` todo type if they do not already exist.\n * * **Metadata Schema**: Custom field keys mapped here are evaluated during task creation/update.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if required fields are missing or schema constraints are violated.\n */\nexport const todoTypeCreate = <ThrowOnError extends boolean = false>(options?: Options<TodoTypeCreateData, ThrowOnError>) => (options?.client ?? client).post<TodoTypeCreateResponses, TodoTypeCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Soft-delete a comment\n *\n * ### 🎯 Overview & Purpose\n * Soft-delete a comment.\n *\n * ### 💡 Key Features & Constraints\n * * **Soft delete**: The comment is hidden from default listings but retained; there is no restore endpoint.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`COMMENT_NOT_FOUND` (HTTP 404)**: Thrown if the comment id is unknown, already deleted, or not in the caller's organization.\n */\nexport const todoCommentDelete = <ThrowOnError extends boolean = false>(options: Options<TodoCommentDeleteData, ThrowOnError>) => (options.client ?? client).delete<TodoCommentDeleteResponses, TodoCommentDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/comments/{id}',\n ...options\n});\n\n/**\n * Edit a comment\n *\n * ### 🎯 Overview & Purpose\n * Edit the body of an existing comment.\n *\n * ### 💡 Key Features & Constraints\n * * **Last write wins**: There is no optimistic-lock version on comments; the latest edit replaces the content.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`COMMENT_NOT_FOUND` (HTTP 404)**: Thrown if the comment id is unknown, soft-deleted, or not in the caller's organization.\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if content is empty or exceeds 10000 characters.\n */\nexport const todoCommentUpdate = <ThrowOnError extends boolean = false>(options: Options<TodoCommentUpdateData, ThrowOnError>) => (options.client ?? client).patch<TodoCommentUpdateResponses, TodoCommentUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/comments/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Soft-delete a project\n *\n * ### 🎯 Overview & Purpose\n * Soft-delete/archive a project workspace.\n *\n * ### 🔍 When to Use\n * * Use this to archive a completed project and hide it from default listings without losing historical metrics.\n *\n * ### 💡 Key Features & Constraints\n * * **Cascading Effects**: Deleting a project automatically soft-deletes the project record and cascades to soft-delete all todos created under it.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the project ID does not exist or has already been archived.\n */\nexport const projectDelete = <ThrowOnError extends boolean = false>(options: Options<ProjectDeleteData, ThrowOnError>) => (options.client ?? client).delete<ProjectDeleteResponses, ProjectDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects/{id}',\n ...options\n});\n\n/**\n * Get a project by id\n *\n * ### 🎯 Overview & Purpose\n * Retrieve one project workspace by its unique identifier.\n *\n * ### 🔍 When to Use\n * * Use this to fetch the configuration details of a specific project, verify its version, or inspect its metadata before creating other scoped resources under it.\n *\n * ### 💡 Key Features & Constraints\n * * **Soft-Deleted Access**: Soft-deleted projects can still be retrieved directly by ID, but they cannot be used for creating new child resources (todos, todo types, or recurrence rules) until they are fully restored.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the specified project ID does not exist in the caller's organization.\n */\nexport const projectGet = <ThrowOnError extends boolean = false>(options: Options<ProjectGetData, ThrowOnError>) => (options.client ?? client).get<ProjectGetResponses, ProjectGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects/{id}',\n ...options\n});\n\n/**\n * Update a project\n *\n * ### 🎯 Overview & Purpose\n * Modify the name or default settings of an existing project.\n *\n * ### 🔍 When to Use\n * * Use this to rename a project workspace, switch its default task type, or change custom field defaults.\n *\n * ### 💡 Key Features & Constraints\n * * **Optimistic Locking (`expected_version`)**: Pass `expected_version` to enforce optimistic write control. If the database version mismatches, the request fails with `VERSION_CONFLICT`.\n * * **Todo Type Binding**: If updating `default_todo_type_id`, the target type must be active and visible to the caller's organization.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if the provided `expected_version` does not match the database.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the project ID does not exist or has been soft-deleted.\n */\nexport const projectUpdate = <ThrowOnError extends boolean = false>(options: Options<ProjectUpdateData, ThrowOnError>) => (options.client ?? client).patch<ProjectUpdateResponses, ProjectUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Delete a recurring todo rule\n *\n * ### 🎯 Overview & Purpose\n * Soft-delete/delete a recurrence rule to immediately halt future task materialization.\n *\n * ### 🔍 When to Use\n * * Use this to permanently end an ongoing cyclical schedule automation (e.g., when a weekly standby rotation is retired).\n *\n * ### 💡 Key Features & Constraints\n * * **Historic Preservation**: Deleting a rule stops the rolling schedule generations, but **does not** delete or alter todo tasks that have already been materialized. They remain on the user's list.\n * * **Optimistic Locking**: Supports optional `expected_version` checks.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if `expected_version` mismatches the database.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target rule ID does not exist.\n */\nexport const recurrenceRuleDelete = <ThrowOnError extends boolean = false>(options: Options<RecurrenceRuleDeleteData, ThrowOnError>) => (options.client ?? client).delete<RecurrenceRuleDeleteResponses, RecurrenceRuleDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/recurrence-rules/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get a recurring todo rule\n *\n * ### 🎯 Overview & Purpose\n * Fetch a single recurrence rule along with its template todo snapshot and the count of materialized instances.\n *\n * ### 🔍 When to Use\n * * Use this to inspect rule details before editing, preview the task template that future occurrences will copy, or check the current materialization metrics.\n *\n * ### 💡 Key Features & Constraints\n * * **Snapshot Integrity**: The returned template represents a schema template snapshot — modifying the rule (PATCH) only alters future occurrences; already-materialized tasks are never mutated retroactively.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the specified rule ID does not exist.\n */\nexport const recurrenceRuleGet = <ThrowOnError extends boolean = false>(options: Options<RecurrenceRuleGetData, ThrowOnError>) => (options.client ?? client).get<RecurrenceRuleGetResponses, RecurrenceRuleGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/recurrence-rules/{id}',\n ...options\n});\n\n/**\n * Update a recurring todo rule\n *\n * ### 🎯 Overview & Purpose\n * Update the schedule parameters (`rrule`, `dtstart`) or task template attributes (`title`, `description`, `parent_id`) of a recurrence rule.\n *\n * 🔍 When to Use\n * * Use this to shift standup schedules (e.g., from Monday to Friday), update template text details, or change the parent todo mapping for future generated tasks.\n *\n * ### 💡 Key Features & Constraints\n * * **Future-Only Effect**: Modifying the rule only applies to future materialized todo tasks; previously generated tasks remain unaffected.\n * * **Optimistic Locking**: Supports `expected_version` to prevent concurrent modifications from overwriting workspace rule parameters.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if the provided `expected_version` mismatches the database.\n * * **`RRULE_INVALID` (HTTP 400)**: Thrown if the updated schedule string contains illegal syntax or includes `DTSTART`.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target rule ID does not exist.\n */\nexport const recurrenceRuleUpdate = <ThrowOnError extends boolean = false>(options: Options<RecurrenceRuleUpdateData, ThrowOnError>) => (options.client ?? client).patch<RecurrenceRuleUpdateResponses, RecurrenceRuleUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/recurrence-rules/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Soft-delete a todo\n *\n * ### 🎯 Overview & Purpose\n * Soft-delete a todo item so that it no longer appears in active list queries. The record remains in the database and can be recovered later.\n *\n * ### 🔍 When to Use\n * * Use this to hide an item from your active listings without permanently losing the history or metrics.\n *\n * ### 💡 Key Features & Constraints\n * * **Cascading Delete (`cascade`)**: If the target todo has active child subtasks:\n * - If `cascade: false` (default), the deletion will fail and throw a `HAS_CHILDREN` error to prevent accidental orphaned tasks.\n * - If `cascade: true`, the target todo and all its nested child subtasks will be soft-deleted together.\n * * **Optimistic Locking**: You may optionally pass `expected_version` to ensure the todo has not been modified since you last read it.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`HAS_CHILDREN` (HTTP 400)**: Thrown if you attempt to delete a parent todo that has active subtasks without explicitly setting `cascade: true`.\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if `expected_version` is provided and mismatches the database.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target todo `id` does not exist or has already been soft-deleted.\n */\nexport const todoDelete = <ThrowOnError extends boolean = false>(options: Options<TodoDeleteData, ThrowOnError>) => (options.client ?? client).delete<TodoDeleteResponses, TodoDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get a todo by id\n *\n * ### 🎯 Overview & Purpose\n * Fetch the full details of a single todo item by its unique identifier.\n *\n * ### 🔍 When to Use\n * * Use this to confirm the current state of a task, inspect nested field values, or retrieve its current `version` before issuing an optimistic update (PATCH).\n *\n * ### 💡 Key Features & Constraints\n * * **Soft-Deleted Recovery**: A soft-deleted todo will return an HTTP 404 unless the query parameter `?include_deleted=true` is explicitly supplied.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the specified todo `id` does not exist, or has been soft-deleted and the request did not supply `include_deleted=true`.\n */\nexport const todoGet = <ThrowOnError extends boolean = false>(options: Options<TodoGetData, ThrowOnError>) => (options.client ?? client).get<TodoGetResponses, TodoGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}',\n ...options\n});\n\n/**\n * Update a todo\n *\n * ### 🎯 Overview & Purpose\n * Update one or more fields of an existing todo item, such as its title, status, parent todo, due date, or description.\n *\n * ### 🔍 When to Use\n * * Use this to log progress by changing the status (e.g., to `in_progress` or `done`), reschedule due dates, edit title/description, or reassign/move a task by changing its `parent_id`.\n *\n * ### 💡 Key Features & Constraints\n * * **Optimistic Locking (`expected_version`)**: An optional integer representing the version you expect to update. If provided, the server matches it with the current database version. If they match, the update succeeds and increments the version; if they mismatch, a `VERSION_CONFLICT` error is thrown. Omit this field to skip version checking (Last-Write-Wins behavior).\n * * **Parent Re-assignment**: Set `parent_id: null` to move a child todo back to the root level.\n * * **Status Transitions**: Transitioning the `status` to `done` automatically emits a `captureTodoCompleted` analytics event.\n * * **Clearing Fields**: To clear an existing description or due date, explicitly pass `\"\"`. Passing `null` is rejected.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if `expected_version` does not match the current database row version.\n * * **`PARENT_IS_CHILD` (HTTP 400)**: Thrown if the new `parent_id` refers to a todo that is itself already a child todo.\n * * **`WOULD_CREATE_CYCLE` (HTTP 400)**: Thrown if the update attempts to make a parent todo a child of its own descendant.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the todo `id` or the new `parent_id` does not exist or has been soft-deleted.\n */\nexport const todoUpdate = <ThrowOnError extends boolean = false>(options: Options<TodoUpdateData, ThrowOnError>) => (options.client ?? client).patch<TodoUpdateResponses, TodoUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Soft-delete a todo type\n *\n * ### 🎯 Overview & Purpose\n * Soft-delete/archive a custom todo type.\n *\n * ### 🔍 When to Use\n * * Use this to retire a custom task category workspace that is no longer needed.\n *\n * ### 💡 Key Features & Constraints\n * * **Default Type Protection**: The current active default type of a project cannot be deleted. You must assign another type as default first; otherwise the call fails with `CANNOT_DELETE_DEFAULT_TYPE`.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`CANNOT_DELETE_DEFAULT_TYPE` (HTTP 409)**: Thrown if the target todo type is currently the project's default type.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target ID does not exist.\n */\nexport const todoTypeDelete = <ThrowOnError extends boolean = false>(options: Options<TodoTypeDeleteData, ThrowOnError>) => (options.client ?? client).delete<TodoTypeDeleteResponses, TodoTypeDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types/{id}',\n ...options\n});\n\n/**\n * Get a todo type by id\n *\n * ### 🎯 Overview & Purpose\n * Fetch a single custom todo type by its unique identifier.\n *\n * ### 🔍 When to Use\n * * Use this to inspect custom fields schemas, verify type visibility, or validate active field constraints.\n *\n * ### 💡 Key Features & Constraints\n * * **Isolation**: You can only fetch types that belong to your organization.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target ID is unknown or belongs to another organization.\n */\nexport const todoTypeGet = <ThrowOnError extends boolean = false>(options: Options<TodoTypeGetData, ThrowOnError>) => (options.client ?? client).get<TodoTypeGetResponses, TodoTypeGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types/{id}',\n ...options\n});\n\n/**\n * Update a todo type\n *\n * ### 🎯 Overview & Purpose\n * Update a custom todo type's label, core field overrides, or custom field schema definitions.\n *\n * ### 🔍 When to Use\n * * Use this to rename a task category category, hide native todo attributes, or adjust custom data schemas.\n *\n * ### 💡 Key Features & Constraints\n * * **Type Modification Constraints**: Changing the data `type` of an existing custom field key (e.g. converting a string field to a boolean field) is strictly rejected with `CANNOT_CHANGE_FIELD_TYPE`. To migrate, remove the key and re-add it under a brand new name.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`CANNOT_CHANGE_FIELD_TYPE` (HTTP 422)**: Thrown if you attempt to modify the declared data type of an existing custom field key.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target ID does not exist.\n */\nexport const todoTypeUpdate = <ThrowOnError extends boolean = false>(options: Options<TodoTypeUpdateData, ThrowOnError>) => (options.client ?? client).patch<TodoTypeUpdateResponses, TodoTypeUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Restore a soft-deleted project\n *\n * ### 🎯 Overview & Purpose\n * Restore a previously soft-deleted project workspace.\n *\n * ### 🔍 When to Use\n * * Use this to bring an archived project back into active listings and restore its capacity to host new child resources.\n *\n * ### 💡 Key Features & Constraints\n * * **No ID Alteration**: Restoring a project fully recovers the record without changing its stable ID or history.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the project ID does not exist.\n */\nexport const projectRestore = <ThrowOnError extends boolean = false>(options: Options<ProjectRestoreData, ThrowOnError>) => (options.client ?? client).post<ProjectRestoreResponses, ProjectRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects/{id}/restore',\n ...options\n});\n\n/**\n * Restore a soft-deleted todo\n *\n * ### 🎯 Overview & Purpose\n * Reverse a previous soft-delete. The todo (and optionally its descendants) is recovered back to the active list.\n *\n * ### 🔍 When to Use\n * * Use this to recover a task deleted by mistake, or pull a task out of the trash to continue active work.\n *\n * ### 💡 Key Features & Constraints\n * * **Orphan Warning**: If the restored todo's parent is still in the trash, the call succeeds but returns `parent_in_trash_warning: true`, signaling that the restored todo is currently orphaned from a visible ancestor.\n * * **Cascading Restore (`cascade`)**: If `cascade: true` is provided, all descendants still in the trash are also restored. Otherwise, descendants are left in the trash, and their count is reported back in `descendants_in_trash_count`.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if `expected_version` is supplied and mismatches the database.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target todo `id` does not exist or has already been permanently purged.\n */\nexport const todoRestore = <ThrowOnError extends boolean = false>(options: Options<TodoRestoreData, ThrowOnError>) => (options.client ?? client).post<TodoRestoreResponses, TodoRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}/restore',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Restore a soft-deleted todo type\n *\n * ### 🎯 Overview & Purpose\n * Restore a previously archived/soft-deleted custom todo type.\n *\n * ### 🔍 When to Use\n * * Use this to bring a retired task category back into active status.\n *\n * ### 💡 Key Features & Constraints\n * * **Task Re-Attachment**: Restoring a type clears its `deleted_at` timestamp. Todo items previously assigned to this type immediately become active and validated under this recovered category schema.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target ID does not exist.\n */\nexport const todoTypeRestore = <ThrowOnError extends boolean = false>(options: Options<TodoTypeRestoreData, ThrowOnError>) => (options.client ?? client).post<TodoTypeRestoreResponses, TodoTypeRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types/{id}/restore',\n ...options\n});\n","import { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join } from \"node:path\"\n\nexport const LEGACY_ACCOUNT_KEY = \"(default)\"\n\nexport interface AccountCreds {\n email: string\n user_id?: string\n refresh_token?: string\n access_token?: string\n access_token_expires_at?: number\n api_key?: string // legacy / escape hatch\n actor?: \"user\" | \"agent\"\n agent_label?: string\n}\n\nexport interface EnvConfig {\n api_base: string\n // RFC 7591 dynamically registered OAuth public client — server-level app\n // identity, shared by every account on this env. Kept across logout.\n client_id?: string\n current_account?: string // email of the active account in this env\n accounts: Record<string, AccountCreds>\n}\n\nexport interface WspcConfig {\n schema_version?: 2\n current_env?: string\n envs: Record<string, EnvConfig>\n}\n\nconst DEFAULT_DIR = join(homedir(), \".wspc\")\n\n// Fields that lived at env level in v1 and now belong on an account.\nconst V1_CRED_KEYS = [\n \"refresh_token\",\n \"access_token\",\n \"access_token_expires_at\",\n \"api_key\",\n \"actor\",\n \"agent_label\",\n] as const\n\nfunction migrateEnv(raw: Record<string, unknown>): EnvConfig {\n const api_base = typeof raw.api_base === \"string\" ? raw.api_base : \"\"\n const env: EnvConfig = { api_base, accounts: {} }\n if (typeof raw.client_id === \"string\") env.client_id = raw.client_id\n\n // Already v2: trust its accounts/current_account as-is.\n if (raw.accounts && typeof raw.accounts === \"object\") {\n env.accounts = raw.accounts as Record<string, AccountCreds>\n if (typeof raw.current_account === \"string\") env.current_account = raw.current_account\n return env\n }\n\n // v1: fold any env-level creds into accounts[(default)].\n const hasCreds = V1_CRED_KEYS.some((k) => raw[k] !== undefined)\n if (hasCreds) {\n const creds: AccountCreds = { email: LEGACY_ACCOUNT_KEY }\n for (const k of V1_CRED_KEYS) {\n if (raw[k] !== undefined) (creds as unknown as Record<string, unknown>)[k] = raw[k]\n }\n env.accounts[LEGACY_ACCOUNT_KEY] = creds\n env.current_account = LEGACY_ACCOUNT_KEY\n }\n return env\n}\n\nfunction normalize(parsed: unknown): WspcConfig {\n if (typeof parsed !== \"object\" || parsed === null) return { envs: {} }\n const obj = parsed as Record<string, unknown>\n if (typeof obj.envs !== \"object\" || obj.envs === null) return { envs: {} }\n const envs: Record<string, EnvConfig> = {}\n for (const [name, rawEnv] of Object.entries(obj.envs as Record<string, unknown>)) {\n if (typeof rawEnv === \"object\" && rawEnv !== null) {\n envs[name] = migrateEnv(rawEnv as Record<string, unknown>)\n }\n }\n const out: WspcConfig = { schema_version: 2, envs }\n if (typeof obj.current_env === \"string\") out.current_env = obj.current_env\n return out\n}\n\n/**\n * Rename the migration placeholder account `(default)` to its real email once\n * /auth/me resolves it. Returns true if a rename happened. No-op otherwise.\n */\nexport function rekeyLegacyAccount(\n config: WspcConfig,\n envName: string,\n email: string,\n userId?: string,\n): boolean {\n if (email === LEGACY_ACCOUNT_KEY) return false\n const env = config.envs[envName]\n const legacy = env?.accounts?.[LEGACY_ACCOUNT_KEY]\n if (!env || !legacy) return false\n delete env.accounts[LEGACY_ACCOUNT_KEY]\n // Don't clobber an already-real account that shares this email (e.g. a login\n // created it before the placeholder was cleaned up) — just drop the placeholder.\n if (!env.accounts[email]) {\n env.accounts[email] = { ...legacy, email, ...(userId ? { user_id: userId } : {}) }\n }\n if (env.current_account === LEGACY_ACCOUNT_KEY) env.current_account = email\n return true\n}\n\nexport class ConfigStore {\n private readonly configDir: string\n private readonly configFile: string\n\n constructor(opts: { configDir?: string } = {}) {\n this.configDir = opts.configDir ?? DEFAULT_DIR\n this.configFile = join(this.configDir, \"config.json\")\n }\n\n async read(): Promise<WspcConfig> {\n try {\n const buf = await fs.readFile(this.configFile, \"utf8\")\n return normalize(JSON.parse(buf))\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ENOENT\") return { envs: {} }\n throw e\n }\n }\n\n async write(config: WspcConfig): Promise<void> {\n await fs.mkdir(this.configDir, { recursive: true, mode: 0o700 })\n if (process.platform !== \"win32\") {\n await fs.chmod(this.configDir, 0o700).catch(() => {})\n }\n await fs.writeFile(this.configFile, JSON.stringify(config, null, 2) + \"\\n\", { mode: 0o600 })\n }\n\n async currentEnv(): Promise<{ name: string; config: EnvConfig } | undefined> {\n const c = await this.read()\n const name = c.current_env\n if (!name) return undefined\n const env = c.envs[name]\n if (!env) return undefined\n return { name, config: env }\n }\n}\n","// AUTO-GENERATED by scripts/sync-spec.ts — DO NOT EDIT\nexport const VERSION = \"0.0.11\"\nexport const SPEC_SHA = \"5ae5d422\"\nexport const SPEC_FETCHED_AT = \"2026-06-09T04:35:08.355Z\"\nexport const API_BASE = \"https://api.wspc.ai\"\n","import { createClient, createConfig } from \"./generated/sdk/client/index.js\"\nimport type { Client } from \"./generated/sdk/client/index.js\"\nimport { createAuthInterceptor } from \"./handwritten/auth/sdk-auth.js\"\nimport {\n todoCreate,\n todoList,\n todoGet,\n todoUpdate,\n todoDelete,\n projectCreate,\n projectList,\n todoTypeList,\n recurrenceRuleList,\n} from \"./generated/sdk/sdk.gen.js\"\nimport type {\n TodoCreateData,\n TodoListData,\n TodoUpdateData,\n ProjectCreateData,\n TodoTypeListData,\n RecurrenceRuleListData,\n} from \"./generated/sdk/types.gen.js\"\nimport { API_BASE, VERSION, SPEC_SHA, SPEC_FETCHED_AT } from \"./version.js\"\n\nexport { VERSION, SPEC_SHA, SPEC_FETCHED_AT, API_BASE }\n\nexport type WspcClientOptions =\n | { apiKey: string; baseUrl?: string }\n | {\n accessToken: string\n refreshToken: string\n /**\n * OAuth client_id this token pair was issued to. The wspc CLI registers\n * a public client via RFC 7591 on first login and stores the id; library\n * callers must pass whatever client_id matches their tokens (refresh\n * grants require it).\n */\n clientId: string\n onTokenRefresh?: (next: { accessToken: string; refreshToken: string; expiresAt: number }) => void | Promise<void>\n baseUrl?: string\n }\n\nexport class WspcAuthExpiredError extends Error {\n readonly code = \"WSPC_AUTH_EXPIRED\" as const\n constructor(message = \"wspc credentials expired; re-authenticate via `wspc login`\") {\n super(message)\n this.name = \"WspcAuthExpiredError\"\n }\n}\n\nexport class WspcClient {\n readonly todos: TodosResource\n readonly todoProjects: TodoProjectsResource\n readonly todoTypes: TodoTypesResource\n readonly todoRules: TodoRulesResource\n\n constructor(opts: WspcClientOptions) {\n const client = createClient(\n createConfig({\n baseUrl: \"baseUrl\" in opts ? (opts.baseUrl ?? API_BASE) : API_BASE,\n // Auth interceptor wires in Task 17; v0 placeholder.\n ...buildAuthOptions(opts),\n }),\n )\n this.todos = new TodosResource(client)\n this.todoProjects = new TodoProjectsResource(client)\n this.todoTypes = new TodoTypesResource(client)\n this.todoRules = new TodoRulesResource(client)\n }\n}\n\nfunction buildAuthOptions(opts: WspcClientOptions): object {\n const interceptor =\n \"apiKey\" in opts\n ? createAuthInterceptor({ apiKey: opts.apiKey })\n : createAuthInterceptor({\n accessToken: opts.accessToken,\n refreshToken: opts.refreshToken,\n baseUrl: opts.baseUrl ?? API_BASE,\n clientId: opts.clientId,\n onTokenRefresh: opts.onTokenRefresh ?? (() => {}),\n })\n // Hey API 0.97 client.gen.ts uses opts.fetch as the underlying fetch impl.\n // Routing every SDK call through interceptor.execute handles bearer injection\n // and transparent refresh-on-401.\n return {\n fetch: ((input: RequestInfo | URL, init?: RequestInit) =>\n interceptor.execute(new Request(input as RequestInfo, init))) as typeof fetch,\n }\n}\n\nclass TodosResource {\n constructor(private client: Client) {}\n async create(body: TodoCreateData[\"body\"]) {\n const res = await todoCreate({ client: this.client, body })\n return res.data\n }\n async list(query: TodoListData[\"query\"]) {\n const res = await todoList({ client: this.client, query })\n return res.data\n }\n async get(id: string) {\n const res = await todoGet({ client: this.client, path: { id } })\n return res.data\n }\n async update(id: string, body: TodoUpdateData[\"body\"]) {\n const res = await todoUpdate({ client: this.client, path: { id }, body })\n return res.data\n }\n async delete(id: string) {\n await todoDelete({ client: this.client, path: { id } })\n }\n}\n\nclass TodoProjectsResource {\n constructor(private client: Client) {}\n async create(body: ProjectCreateData[\"body\"]) {\n const res = await projectCreate({ client: this.client, body })\n return res.data\n }\n async list() {\n const res = await projectList({ client: this.client })\n return res.data\n }\n}\n\nclass TodoTypesResource {\n constructor(private client: Client) {}\n async list(query: TodoTypeListData[\"query\"]) {\n const res = await todoTypeList({ client: this.client, query })\n return res.data\n }\n}\n\nclass TodoRulesResource {\n constructor(private client: Client) {}\n async list(query: RecurrenceRuleListData[\"query\"]) {\n const res = await recurrenceRuleList({ client: this.client, query })\n return res.data\n }\n}\n","import { WspcAuthExpiredError } from \"../../index.js\"\n\nexport type AuthMode =\n | { apiKey: string }\n | {\n accessToken: string\n refreshToken: string\n baseUrl: string\n clientId: string\n onTokenRefresh: (next: { accessToken: string; refreshToken: string; expiresAt: number }) => void | Promise<void>\n fetchImpl?: typeof fetch\n now?: () => number\n }\n\nexport interface AuthInterceptor {\n onRequest(req: Request): Promise<Request>\n execute(req: Request): Promise<Response>\n}\n\nexport function createAuthInterceptor(mode: AuthMode): AuthInterceptor {\n if (\"apiKey\" in mode) {\n const apiKey = mode.apiKey\n return {\n async onRequest(req) {\n req.headers.set(\"authorization\", `Bearer ${apiKey}`)\n return req\n },\n async execute(req) {\n const out = await this.onRequest(req.clone())\n return fetch(out)\n },\n }\n }\n\n let accessToken = mode.accessToken\n let refreshToken = mode.refreshToken\n const fetchImpl = mode.fetchImpl ?? fetch\n const now = mode.now ?? Date.now\n\n return {\n async onRequest(req) {\n req.headers.set(\"authorization\", `Bearer ${accessToken}`)\n return req\n },\n async execute(req) {\n const first = await fetchImpl(await this.onRequest(req.clone()))\n if (first.status !== 401) return first\n\n const refreshRes = await fetchImpl(`${mode.baseUrl}/auth/oauth/token`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n client_id: mode.clientId,\n }),\n })\n if (!refreshRes.ok) {\n throw new WspcAuthExpiredError()\n }\n const tokens = (await refreshRes.json()) as {\n access_token: string\n refresh_token: string\n expires_in: number\n }\n accessToken = tokens.access_token\n refreshToken = tokens.refresh_token\n await mode.onTokenRefresh({\n accessToken,\n refreshToken,\n expiresAt: now() + tokens.expires_in * 1000,\n })\n return fetchImpl(await this.onRequest(req.clone()))\n },\n }\n}\n","import type { AccountCreds, WspcConfig } from \"../config/index.js\"\n\nexport interface ResolvedAccount {\n envName: string\n apiBase: string\n clientId?: string\n email: string\n creds: AccountCreds\n}\n\nconst NOT_LOGGED_IN = \"not logged in: run `wspc login` first\"\n\n/**\n * Decide which account a command runs as, by precedence:\n * 1. opts.accountOverride (--account flag / WSPC_ACCOUNT env)\n * 2. env.current_account (interactive active account)\n * 3. the sole account, if exactly one exists\n * 4. error\n */\nexport function resolveAccount(\n config: WspcConfig,\n opts: { accountOverride?: string } = {},\n): ResolvedAccount {\n const envName = config.current_env\n if (!envName || !config.envs[envName]) throw new Error(NOT_LOGGED_IN)\n const env = config.envs[envName]\n const accounts = env.accounts ?? {}\n const emails = Object.keys(accounts)\n\n let email: string | undefined\n const override = opts.accountOverride\n if (override) {\n if (!accounts[override]) {\n throw new Error(\n `no account '${override}' in env '${envName}'. Run \\`wspc account ls\\` or \\`wspc login\\`.`,\n )\n }\n email = override\n } else if (env.current_account && accounts[env.current_account]) {\n email = env.current_account\n } else if (emails.length === 1) {\n email = emails[0]\n } else if (emails.length === 0) {\n throw new Error(NOT_LOGGED_IN)\n } else {\n throw new Error(\n `multiple accounts in env '${envName}'; specify --account <email> or run \\`wspc account switch <email>\\`.`,\n )\n }\n\n if (email === undefined) throw new Error(NOT_LOGGED_IN)\n const creds = accounts[email]\n if (!creds) throw new Error(NOT_LOGGED_IN)\n if (!creds.api_key && !(creds.access_token && creds.refresh_token)) {\n throw new Error(NOT_LOGGED_IN)\n }\n return { envName, apiBase: env.api_base, clientId: env.client_id, email, creds }\n}\n","import { ConfigStore } from \"../config/index.js\"\nimport { createClient, createConfig } from \"../../generated/sdk/client/index.js\"\nimport { createAuthInterceptor } from \"./sdk-auth.js\"\nimport { resolveAccount } from \"./resolve-account.js\"\n\nexport interface AuthedFetch {\n fetch: typeof fetch\n baseUrl: string\n}\n\nexport interface LoadedClient {\n _rawClient: ReturnType<typeof createClient>\n}\n\nfunction buildInterceptor(\n store: ConfigStore,\n resolved: ReturnType<typeof resolveAccount>,\n): ReturnType<typeof createAuthInterceptor> {\n const { envName, apiBase, clientId, email, creds } = resolved\n if (creds.api_key) {\n return createAuthInterceptor({ apiKey: creds.api_key })\n }\n if (!clientId) {\n throw new Error(\n \"config has OAuth tokens but no client_id — run `wspc logout && wspc login` to re-register\",\n )\n }\n return createAuthInterceptor({\n accessToken: creds.access_token!,\n refreshToken: creds.refresh_token!,\n baseUrl: apiBase,\n clientId,\n onTokenRefresh: async ({ accessToken, refreshToken, expiresAt }) => {\n const cfg = await store.read()\n const a = cfg.envs[envName]?.accounts?.[email]\n if (!a) return\n a.access_token = accessToken\n a.refresh_token = refreshToken\n a.access_token_expires_at = expiresAt\n await store.write(cfg)\n },\n })\n}\n\nexport async function loadSdkClient(opts: { store?: ConfigStore } = {}): Promise<LoadedClient> {\n const store = opts.store ?? new ConfigStore()\n const config = await store.read()\n const resolved = resolveAccount(config, { accountOverride: process.env.WSPC_ACCOUNT })\n const interceptor = buildInterceptor(store, resolved)\n\n const rawClient = createClient(\n createConfig({\n baseUrl: resolved.apiBase,\n fetch: ((input: RequestInfo | URL, init?: RequestInit) =>\n interceptor.execute(new Request(input as RequestInfo, init))) as typeof fetch,\n }),\n )\n return { _rawClient: rawClient }\n}\n\nexport async function loadAuthedFetch(opts: { store?: ConfigStore } = {}): Promise<AuthedFetch> {\n const store = opts.store ?? new ConfigStore()\n const config = await store.read()\n const resolved = resolveAccount(config, { accountOverride: process.env.WSPC_ACCOUNT })\n const interceptor = buildInterceptor(store, resolved)\n\n const authedFetch: typeof fetch = (input, init) =>\n interceptor.execute(new Request(input as RequestInfo, init))\n return { fetch: authedFetch, baseUrl: resolved.apiBase }\n}\n","/**\n * Lightweight ANSI + table primitives shared by all renderers. No external\n * dependencies — keep it that way; the CLI's value prop is being a small\n * single-file install. Anything that needs heavy formatting belongs in a\n * specific renderer, not here.\n */\n\nconst ESC = \"\\x1b[\"\n\n// ---------- colour / weight ----------\n\n/** Honour NO_COLOR (https://no-color.org) and non-TTY destinations. */\nfunction colourEnabled(): boolean {\n if (process.env.NO_COLOR) return false\n if (process.env.FORCE_COLOR) return true\n return !!process.stdout.isTTY\n}\n\nfunction wrap(code: string, s: string): string {\n if (!colourEnabled()) return s\n return `${ESC}${code}m${s}${ESC}0m`\n}\n\nexport const dim = (s: string): string => wrap(\"2\", s)\nexport const bold = (s: string): string => wrap(\"1\", s)\nexport const green = (s: string): string => wrap(\"32\", s)\nexport const yellow = (s: string): string => wrap(\"33\", s)\nexport const red = (s: string): string => wrap(\"31\", s)\nexport const gray = (s: string): string => wrap(\"90\", s)\nexport const cyan = (s: string): string => wrap(\"36\", s)\n\nexport function colorise(s: string, color?: string): string {\n switch (color) {\n case \"green\":\n return green(s)\n case \"yellow\":\n return yellow(s)\n case \"red\":\n return red(s)\n case \"gray\":\n return gray(s)\n case \"cyan\":\n return cyan(s)\n case \"dim\":\n return dim(s)\n case \"bold\":\n return bold(s)\n default:\n return s\n }\n}\n\n// ---------- value formatters ----------\n\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g\n\n/** Count visible width ignoring ANSI codes. CJK width approximated as 2. */\nexport function visibleWidth(s: string): number {\n const stripped = s.replace(ANSI_RE, \"\")\n let w = 0\n for (const ch of stripped) {\n const code = ch.codePointAt(0)!\n // Rough CJK detection — sufficient for column alignment of titles/labels\n // that may mix English with Chinese; we don't aim for full UAX #11 here.\n if (code >= 0x1100 && code <= 0x115f) w += 2\n else if (code >= 0x2e80 && code <= 0x9fff) w += 2\n else if (code >= 0xac00 && code <= 0xd7a3) w += 2\n else if (code >= 0xf900 && code <= 0xfaff) w += 2\n else if (code >= 0xff00 && code <= 0xff60) w += 2\n else if (code >= 0xffe0 && code <= 0xffe6) w += 2\n else w += 1\n }\n return w\n}\n\nfunction padEndVisible(s: string, target: number): string {\n const w = visibleWidth(s)\n if (w >= target) return s\n return s + \" \".repeat(target - w)\n}\n\n/**\n * Truncate to `max` *visible* width, appending `…`. Ignores any ANSI escapes\n * (callers should pass raw strings; styling should wrap the truncated result).\n */\nexport function truncate(s: string, max = 50): string {\n if (visibleWidth(s) <= max) return s\n // Trim character-by-character. Not perfect for embedded ANSI mid-string,\n // but format hints today only colour the cell wholesale.\n let out = \"\"\n let w = 0\n for (const ch of s.replace(ANSI_RE, \"\")) {\n const cw = visibleWidth(ch)\n if (w + cw + 1 > max) break\n out += ch\n w += cw\n }\n return out + \"…\"\n}\n\n/**\n * Render an id with visual emphasis on the scannable prefix while keeping\n * the full id intact for copy-paste — `tod_01HW3K4N` shown normally,\n * `9V5G6Z8C2Q7B1Y0M3F` dimmed. Terminal text selection still picks up the\n * whole string so users can copy from the table directly and use it as a\n * parameter to other commands.\n *\n * Naming note: the spec contract key is `\"id-short\"` for historical reasons\n * (the original implementation truncated). The wire name is kept stable so\n * the spec doesn't churn; the behaviour evolved when truncation turned out\n * to bite users who copied the visible prefix and got a NOT_FOUND.\n */\nexport function idShort(s: string): string {\n if (!s) return s\n const us = s.indexOf(\"_\")\n const prefixEnd = us >= 0 ? us + 9 : 12\n if (s.length <= prefixEnd) return s\n return s.slice(0, prefixEnd) + dim(s.slice(prefixEnd))\n}\n\n/**\n * Common todo / task status enums → icon + colour. Unknown values fall\n * through to the raw string so the spec can add new statuses without\n * shipping a CLI bump first.\n */\nexport function statusBadge(s: string): string {\n switch (s) {\n case \"open\":\n return gray(\"○ open\")\n case \"in_progress\":\n return yellow(\"◐ in_progress\")\n case \"done\":\n return green(\"✓ done\")\n case \"cancelled\":\n case \"canceled\":\n return red(\"✕ \" + s)\n default:\n return s\n }\n}\n\n/**\n * Render a boolean flag (e.g. `is_read`) as a dim \"read\" / bright \"unread\"\n * badge. Accepts the raw boolean rather than a string so the format applies\n * cleanly to JSON-shaped data.\n */\nexport function boolBadge(value: unknown): string {\n if (value === true) return dim(\"✓ read\")\n if (value === false) return \"● unread\"\n return String(value)\n}\n\n/**\n * Render a timestamp as relative time. Accepts epoch-ms numbers (preferred —\n * matches the wspc API convention), ISO 8601 strings, or date-only strings.\n * Returns the raw input on parse failure rather than throwing, so a bad cell\n * doesn't crash the whole table.\n */\nexport function relativeTime(value: unknown, now: number = Date.now()): string {\n let ms: number\n if (typeof value === \"number\") {\n ms = value\n } else if (typeof value === \"string\") {\n // Accept \"2026-06-01\" (date-only) and full ISO; both parse via Date.\n const parsed = Date.parse(value)\n if (Number.isNaN(parsed)) return value\n ms = parsed\n } else {\n return String(value)\n }\n const diff = ms - now\n const abs = Math.abs(diff)\n const future = diff > 0\n\n const MINUTE = 60 * 1000\n const HOUR = 60 * MINUTE\n const DAY = 24 * HOUR\n const WEEK = 7 * DAY\n const MONTH = 30 * DAY\n\n let amount: number\n let unit: string\n if (abs < MINUTE) return \"just now\"\n if (abs < HOUR) {\n amount = Math.round(abs / MINUTE)\n unit = \"m\"\n } else if (abs < DAY) {\n amount = Math.round(abs / HOUR)\n unit = \"h\"\n } else if (abs < WEEK) {\n amount = Math.round(abs / DAY)\n unit = \"d\"\n } else if (abs < MONTH) {\n amount = Math.round(abs / WEEK)\n unit = \"w\"\n } else {\n amount = Math.round(abs / MONTH)\n unit = \"mo\"\n }\n return future ? `in ${amount}${unit}` : `${amount}${unit} ago`\n}\n\n/**\n * Wrap `text` to `width` visible columns, returning one string per output\n * line. Existing newlines in `text` are preserved (each source line is wrapped\n * independently, blank lines kept). English wraps at spaces; a single token\n * wider than `width` (long URLs, spaceless CJK runs) is hard-broken by visible\n * width using the same `visibleWidth` ruler the tables use, so CJK columns line\n * up the same way they do elsewhere. No external dependency by design.\n *\n * `width` is the visible-column budget; values <= 0 fall back to 80. A token\n * wider than `width` is broken one max-fitting chunk at a time (at least one\n * character per line, so wrapping always progresses).\n */\nexport function wrapToWidth(text: string, width: number): string[] {\n const limit = width > 0 ? width : 80\n const out: string[] = []\n for (const line of text.split(\"\\n\")) {\n if (line.length === 0) {\n out.push(\"\")\n continue\n }\n let cur = \"\"\n for (let word of line.split(\" \")) {\n // Hard-break a word that cannot fit on a line by itself.\n while (visibleWidth(word) > limit) {\n let head = \"\"\n for (const ch of word) {\n if (head && visibleWidth(head + ch) > limit) break\n head += ch\n if (visibleWidth(head) >= limit) break\n }\n if (cur) {\n out.push(cur)\n cur = \"\"\n }\n out.push(head)\n word = word.slice(head.length)\n }\n const sep = cur ? \" \" : \"\"\n if (cur && visibleWidth(cur + sep + word) > limit) {\n out.push(cur)\n cur = word\n } else {\n cur = cur + sep + word\n }\n }\n if (cur) out.push(cur)\n }\n return out\n}\n\n// ---------- table ----------\n\n/**\n * Render an aligned text table to a string (with trailing newline). Column\n * widths are chosen from the widest visible content per column. Caller is\n * responsible for any pre-formatting (truncation, colour, badges).\n */\nexport function table(headers: string[], rows: string[][]): string {\n if (rows.length === 0) {\n return \"\"\n }\n const widths: number[] = headers.map((h, i) => {\n let w = visibleWidth(h)\n for (const r of rows) {\n const cell = r[i] ?? \"\"\n const cw = visibleWidth(cell)\n if (cw > w) w = cw\n }\n return w\n })\n const sep = \" \"\n const lines: string[] = []\n // Header: dimmed, uppercase already supplied by caller.\n lines.push(headers.map((h, i) => dim(padEndVisible(h, widths[i] ?? 0))).join(sep))\n for (const r of rows) {\n lines.push(r.map((c, i) => padEndVisible(c ?? \"\", widths[i] ?? 0)).join(sep))\n }\n return lines.join(\"\\n\") + \"\\n\"\n}\n","/**\n * Output dispatch entry point. Generated CLI commands call `render({ kind,\n * display }, data)` instead of dumping JSON directly. The dispatcher walks a\n * three-tier fallback chain:\n *\n * 1. Specific renderer registered for `kind` (handwritten, opt-in)\n * 2. Generic renderer driven by spec `display` hints (covers most ops)\n * 3. Generic renderer with schema-shape auto-detect (no hints needed)\n * 4. JSON (final safety net)\n *\n * JSON is also forced when output is being piped/redirected, when the user\n * passes `--json`, or via `WSPC_OUTPUT=json` — so machine consumers and AI\n * agents always get a parseable shape regardless of which tier handled the\n * pretty path.\n */\n\nimport {\n boolBadge,\n colorise,\n dim,\n green,\n idShort,\n relativeTime,\n statusBadge,\n table,\n truncate,\n visibleWidth,\n wrapToWidth,\n} from \"./primitives.js\"\nimport type {\n RenderContext,\n Renderer,\n XCliDisplay,\n XCliFormat,\n} from \"./types.js\"\n\n/**\n * Registry of specific renderers, keyed by `kind`. Intentionally empty at\n * boot — register from a side-effecting module (`renderers/index.ts`) when\n * we need custom output for a specific operation. Until then, every command\n * flows through the generic renderer.\n */\nconst SPECIFIC_RENDERERS: Record<string, Renderer> = {}\n\n/** Public API for tests / future bootstrap modules to plug renderers in. */\nexport function registerRenderer(kind: string, renderer: Renderer): void {\n SPECIFIC_RENDERERS[kind] = renderer\n}\n\nexport function render(ctx: RenderContext, data: unknown): void {\n if (data === undefined) return\n // `raw` shape is for passthrough payloads like `.ics` text where any\n // wrapping (JSON quoting, table, key/value) would corrupt the content.\n // It wins over both TTY auto-detection and explicit `--json`/WSPC_OUTPUT\n // because the upstream HTTP body is already the user-facing artifact;\n // re-encoding it as a JSON string is never what the caller wants.\n if (ctx.display?.shape === \"raw\") {\n const s = typeof data === \"string\" ? data : String(data)\n process.stdout.write(s)\n if (!s.endsWith(\"\\n\")) process.stdout.write(\"\\n\")\n return\n }\n if (shouldOutputJson()) {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\")\n return\n }\n // Drill into the wrapper key for pretty mode only. JSON output above\n // intentionally preserves the full server payload.\n const target = drillDataPath(data, ctx.display?.dataPath)\n const specific = SPECIFIC_RENDERERS[ctx.kind]\n if (specific) {\n specific(target, ctx.display)\n return\n }\n renderGeneric(target, ctx.display)\n}\n\nfunction drillDataPath(data: unknown, dataPath: string | undefined): unknown {\n if (!dataPath) return data\n if (data === null || typeof data !== \"object\") return data\n const value = (data as Record<string, unknown>)[dataPath]\n // If the wrapper key is missing, fall back to the original payload so the\n // user still sees something useful instead of \"undefined\".\n return value === undefined ? data : value\n}\n\nfunction shouldOutputJson(): boolean {\n // Explicit overrides win over TTY detection so users can force either\n // mode in CI logs, screenshots, captured output, or AI-driven tooling.\n if (process.env.WSPC_OUTPUT === \"json\") return true\n if (process.env.WSPC_OUTPUT === \"pretty\") return false\n // The codegen wires `--json` to flip WSPC_OUTPUT=json before the action.\n if (!process.stdout.isTTY) {\n // Pipe / redirect — machine consumer. Default to JSON so scripts /\n // `jq` / AI agents get a parseable shape without opting in.\n return true\n }\n return false\n}\n\n// ---------- generic renderer ----------\n\nfunction termWidth(): number {\n const c = process.stdout.columns\n return typeof c === \"number\" && c > 0 ? c : 80\n}\n\nfunction renderGeneric(data: unknown, hints?: XCliDisplay): void {\n const shape = hints?.shape ?? detectShape(data)\n if (shape === \"list\") {\n renderList(data, hints)\n } else if (shape === \"object\") {\n renderObject(data, hints)\n } else {\n renderScalar(data)\n }\n}\n\nfunction detectShape(data: unknown): \"list\" | \"object\" | \"scalar\" {\n if (Array.isArray(data)) return \"list\"\n if (typeof data === \"object\" && data !== null) {\n // wspc list responses wrap items in a single array property, e.g.\n // `{ todos: [...] }` or `{ projects: [...] }`. We treat any object with\n // exactly one array-valued top-level key as a list.\n const keys = Object.keys(data)\n const arrayKeys = keys.filter((k) => Array.isArray((data as Record<string, unknown>)[k]))\n if (arrayKeys.length === 1) return \"list\"\n return \"object\"\n }\n return \"scalar\"\n}\n\nfunction extractItems(data: unknown): unknown[] {\n if (Array.isArray(data)) return data\n if (typeof data === \"object\" && data !== null) {\n for (const v of Object.values(data)) {\n if (Array.isArray(v)) return v\n }\n }\n return []\n}\n\nfunction renderList(data: unknown, hints?: XCliDisplay): void {\n const items = extractItems(data)\n if (items.length === 0) {\n process.stdout.write(dim(\" \" + (hints?.emptyMessage ?? \"no items\")) + \"\\n\")\n return\n }\n const first = items[0] as Record<string, unknown>\n const columns = pickColumns(first, hints?.columns)\n const format = hints?.format ?? {}\n const headers = columns.map((c) => c.toUpperCase())\n const rows = items.map((item) =>\n columns.map((col) =>\n formatCell((item as Record<string, unknown>)[col], format[col], hints?.enumColorMap?.[col]),\n ),\n )\n process.stdout.write(table(headers, rows))\n}\n\nfunction pickColumns(first: Record<string, unknown>, hint?: string[]): string[] {\n if (hint && hint.length > 0) return hint.filter((c) => c in first)\n // Auto-pick: prefer well-known leading fields, then any other scalar field,\n // capped at 5 to avoid runaway-wide tables.\n const PREFERRED = [\"id\", \"name\", \"title\", \"label\", \"status\", \"due_at\", \"created_at\"]\n const present = new Set(Object.keys(first))\n const ordered = [\n ...PREFERRED.filter((k) => present.has(k) && isScalar(first[k])),\n ...Object.keys(first).filter(\n (k) => !PREFERRED.includes(k) && isScalar(first[k]),\n ),\n ]\n return ordered.slice(0, 5)\n}\n\n/**\n * Render an object as key/value rows (two-space indent). Exported so\n * handwritten renderers (e.g. `wspc whoami`) can compose multiple object\n * sections without re-implementing the field/format pipeline.\n */\nexport function renderObject(data: unknown, hints?: XCliDisplay): void {\n if (typeof data !== \"object\" || data === null) {\n renderScalar(data)\n return\n }\n // Many wspc responses wrap the resource in a single-key envelope\n // (`{ todo: {...} }`). Peel one level so the user sees fields directly.\n let obj = data as Record<string, unknown>\n const topKeys = Object.keys(obj)\n if (topKeys.length === 1) {\n const onlyKey = topKeys[0] as string\n const inner = obj[onlyKey]\n if (inner && typeof inner === \"object\" && !Array.isArray(inner)) {\n obj = inner as Record<string, unknown>\n }\n }\n const fields =\n hints?.fields?.filter((f) => f in obj) ??\n Object.keys(obj).filter((k) => isScalar(obj[k]))\n if (fields.length === 0) {\n // Nothing scalar to show — fall through to JSON so the user still sees\n // something useful instead of an empty block.\n process.stdout.write(JSON.stringify(obj, null, 2) + \"\\n\")\n return\n }\n const format = hints?.format ?? {}\n // When user explicitly whitelisted fields, respect that and skip arrays.\n // Otherwise show array fields as indented sub-lists after the scalar rows\n // so users see attendees / tags / etc. without resorting to --json.\n const arrayFields = hints?.fields\n ? []\n : Object.keys(obj).filter(\n (k) => Array.isArray(obj[k]) && (obj[k] as unknown[]).length > 0,\n )\n\n // Format every scalar field up front (object mode never truncates), then\n // classify: short single-line values stay as aligned two-column rows; values\n // with newlines or wider than the available column go to indented blocks\n // rendered last, so the compact id/status/timestamp rows stay scannable.\n const formatted: Array<[string, string]> = fields.map((f) => [\n f,\n formatCell(obj[f], format[f], hints?.enumColorMap?.[f], { noTruncate: true }),\n ])\n const labelWidth = Math.max(\n ...formatted.map(([f]) => f.length),\n ...arrayFields.map((f) => f.length),\n 0,\n )\n const tw = termWidth()\n const avail = tw - (2 + labelWidth + 2)\n const inlineFinal: Array<[string, string]> = []\n const blocks: Array<[string, string]> = []\n for (const [f, value] of formatted) {\n if (value.includes(\"\\n\") || visibleWidth(value) > avail) {\n blocks.push([f, value])\n } else {\n inlineFinal.push([f, value])\n }\n }\n\n for (const [f, value] of inlineFinal) {\n process.stdout.write(` ${dim(f.padEnd(labelWidth))} ${value}\\n`)\n }\n for (const f of arrayFields) {\n const uncapped = f === \"children\" || f === \"comments\"\n const max = uncapped ? Number.POSITIVE_INFINITY : ARRAY_FIELD_MAX_ITEMS\n renderArrayField(f, obj[f] as unknown[], labelWidth, max)\n }\n const hadAbove = inlineFinal.length > 0 || arrayFields.length > 0\n blocks.forEach(([f, value], i) => {\n if (hadAbove || i > 0) process.stdout.write(\"\\n\")\n process.stdout.write(` ${dim(f)}\\n`)\n for (const line of wrapToWidth(value, tw - 4)) {\n process.stdout.write(` ${line}\\n`)\n }\n })\n if (hints?.secretField) {\n const value = obj[hints.secretField]\n if (value !== undefined) {\n process.stdout.write(\"\\n\")\n process.stdout.write(colorise(\"⚠ This is the only time you'll see this key. Save it now.\", \"yellow\") + \"\\n\")\n process.stdout.write(\"\\n\")\n process.stdout.write(\" To use it as the active env credential:\\n\")\n process.stdout.write(` wspc env add <name> --api-key ${value}\\n`)\n }\n }\n}\n\nconst ARRAY_FIELD_MAX_ITEMS = 10\n\nfunction renderArrayField(\n name: string,\n items: unknown[],\n labelWidth: number,\n max: number = ARRAY_FIELD_MAX_ITEMS,\n): void {\n const count = items.length\n const header = `${count} ${count === 1 ? \"item\" : \"items\"}`\n process.stdout.write(` ${dim(name.padEnd(labelWidth))} ${header}\\n`)\n const shown = items.slice(0, max)\n shown.forEach((item, i) => {\n process.stdout.write(` ${dim(`${i + 1}.`)} ${formatArrayItem(item)}\\n`)\n })\n if (count > shown.length) {\n process.stdout.write(` ${dim(`... and ${count - shown.length} more`)}\\n`)\n }\n}\n\nfunction formatArrayItem(item: unknown): string {\n if (item === null) return dim(\"null\")\n if (typeof item !== \"object\") return String(item)\n const todo = formatTodoLike(item)\n if (todo !== null) return todo\n const comment = formatCommentLike(item)\n if (comment !== null) return comment\n const attendee = formatAttendeeLike(item)\n if (attendee !== null) return attendee\n return JSON.stringify(item)\n}\n\n/**\n * Recognize a child-todo shape ({ id, title, status }) and render it as a\n * one-line subtask: short id, status badge, title. Returns null when the input\n * isn't todo-like so the caller can fall back to compact JSON.\n */\nfunction formatTodoLike(item: unknown): string | null {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return null\n const rec = item as Record<string, unknown>\n if (typeof rec.id !== \"string\" || typeof rec.title !== \"string\") return null\n const id = idShort(rec.id)\n const status = typeof rec.status === \"string\" ? statusBadge(rec.status) : \"\"\n return status ? `${id} ${status} ${rec.title}` : `${id} ${rec.title}`\n}\n\n/**\n * Recognize a comment shape ({ id, content }) and render it as a one-line row:\n * short id, relative time, a truncated content snippet (the full body can be\n * thousands of chars, so the inline list shows a preview only). Returns null\n * when the input isn't comment-like so the caller can fall back.\n */\nfunction formatCommentLike(item: unknown): string | null {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return null\n const rec = item as Record<string, unknown>\n if (typeof rec.id !== \"string\" || typeof rec.content !== \"string\") return null\n const id = idShort(rec.id)\n const when = rec.created_at !== undefined ? `${relativeTime(rec.created_at)} ` : \"\"\n const snippet = truncate(rec.content, 60)\n return `${id} ${when}${snippet}`\n}\n\n/**\n * Recognize the common `{ email, display_name? }` attendee shape and render\n * it the way humans expect (\"Alice <alice@example.com>\"). Returns null when\n * the input doesn't look like an attendee so the caller can fall back to\n * compact JSON.\n */\nfunction formatAttendeeLike(item: unknown): string | null {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return null\n const rec = item as Record<string, unknown>\n const email = typeof rec.email === \"string\" ? rec.email : null\n if (!email) return null\n const name =\n typeof rec.display_name === \"string\" && rec.display_name.length > 0\n ? rec.display_name\n : null\n return name ? `${name} <${email}>` : `<${email}>`\n}\n\nfunction renderScalar(data: unknown): void {\n if (data === null) {\n process.stdout.write(dim(\"null\") + \"\\n\")\n return\n }\n if (typeof data === \"boolean\") {\n process.stdout.write((data ? green(\"true\") : dim(\"false\")) + \"\\n\")\n return\n }\n if (typeof data === \"object\") {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\")\n return\n }\n process.stdout.write(String(data) + \"\\n\")\n}\n\nfunction isScalar(v: unknown): boolean {\n return v === null || (typeof v !== \"object\" && typeof v !== \"function\")\n}\n\nfunction formatCell(\n value: unknown,\n fmt?: XCliFormat,\n colorMap?: Record<string, { label: string; color: string }>,\n opts?: { noTruncate?: boolean },\n): string {\n if (fmt !== \"enum-badge\" && (value === undefined || value === null)) return dim(\"—\")\n switch (fmt) {\n case \"id-short\":\n return idShort(String(value))\n case \"status-badge\":\n return statusBadge(String(value))\n case \"relative-time\":\n return relativeTime(value)\n case \"truncate\":\n // `truncate` is a list/column-width hint only. In object (`show`) mode the\n // caller passes noTruncate so single-item views render the full value.\n return opts?.noTruncate ? String(value) : truncate(String(value), 50)\n case \"bool-badge\":\n return boolBadge(value)\n case \"enum-badge\": {\n const map = colorMap ?? {}\n const key = (value === null || value === undefined) ? \"null\" : String(value)\n const entry = map[key] ?? map[\"*\"]\n if (!entry) {\n return value === undefined || value === null ? dim(\"—\") : String(value)\n }\n const label = entry.label.replace(\"<value>\", String(value))\n return colorise(label, entry.color)\n }\n default:\n if (typeof value === \"object\") return JSON.stringify(value)\n return String(value)\n }\n}\n","// AUTO-GENERATED — DO NOT EDIT (source: key_create)\nimport { Command } from \"commander\"\nimport { keyCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const keyCreateCommand = new Command(\"create\")\n .description(\"Create a new API key (full value returned once)\")\n .option(\"--label <value>\", \"label\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await keyCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n label: opts.label,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"key_create\", display: {\"shape\":\"object\",\"fields\":[\"id\",\"label\",\"api_key\",\"created_at\"],\"format\":{\"id\":\"id-short\",\"created_at\":\"relative-time\"},\"secretField\":\"api_key\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: key_list)\nimport { Command } from \"commander\"\nimport { keyList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const keyListCommand = new Command(\"ls\")\n .description(\"List active API keys\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await keyList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"key_list\", display: {\"shape\":\"list\",\"dataPath\":\"keys\",\"columns\":[\"id\",\"label\",\"last_4\",\"created_at\",\"last_used_at\"],\"format\":{\"id\":\"id-short\",\"created_at\":\"relative-time\",\"last_used_at\":\"relative-time\"},\"emptyMessage\":\"(no API keys)\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_invite_create)\nimport { Command } from \"commander\"\nimport { orgInviteCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const orgInviteCreateCommand = new Command(\"invite\")\n .description(\"Invite an email to join the caller's organization\")\n .option(\"--email <value>\", \"email\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await orgInviteCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n email: opts.email,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_invite_create\", display: {\"shape\":\"object\",\"fields\":[\"id\",\"email\",\"state\",\"expires_at\",\"invite_url\"]} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_invites_list)\nimport { Command } from \"commander\"\nimport { orgInvitesList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const orgInvitesListCommand = new Command(\"invites\")\n .description(\"List invites issued by the caller's organization\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await orgInvitesList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_invites_list\", display: {\"shape\":\"list\",\"dataPath\":\"invites\",\"columns\":[\"id\",\"email\",\"state\",\"expires_at\"],\"format\":{\"id\":\"id-short\",\"expires_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_get)\nimport { Command } from \"commander\"\nimport { orgGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const orgGetCommand = new Command(\"show\")\n .description(\"Get the authenticated user's organization\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await orgGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_get\", display: {\"shape\":\"object\",\"fields\":[\"id\",\"name\",\"created_at\",\"updated_at\"],\"format\":{\"id\":\"id-short\",\"name\":\"truncate\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_update)\nimport { Command } from \"commander\"\nimport { orgUpdate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const orgUpdateCommand = new Command(\"rename\")\n .description(\"Update the authenticated user's organization\")\n .option(\"--name <value>\", \"name\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await orgUpdate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n name: opts.name,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_update\", display: {\"shape\":\"object\",\"fields\":[\"id\",\"name\",\"created_at\",\"updated_at\"],\"format\":{\"id\":\"id-short\",\"name\":\"truncate\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: invite_get)\nimport { Command } from \"commander\"\nimport { inviteGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const inviteGetCommand = new Command(\"show\")\n .description(\"Get a single invite addressed to the caller\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await inviteGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"invite_get\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: auth_me)\nimport { Command } from \"commander\"\nimport { authMe } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const authMeCommand = new Command(\"me\")\n .description(\"Fetch the user identified by the bearer token\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await authMe({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"auth_me\", display: {\"shape\":\"object\",\"fields\":[\"user_id\",\"email\",\"display_name\",\"api_key_id\"],\"format\":{\"user_id\":\"id-short\",\"api_key_id\":\"id-short\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: invites_list)\nimport { Command } from \"commander\"\nimport { invitesList } from \"../sdk/index.js\"\nimport { loadSdkClient } from \"../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../handwritten/output/render.js\"\n\nexport const invitesListCommand = new Command(\"invites\")\n .description(\"List invites addressed to the authenticated user's email\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await invitesList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"invites_list\", display: {\"shape\":\"list\",\"dataPath\":\"invites\",\"columns\":[\"id\",\"org_name\",\"inviter_email\",\"state\",\"expires_at\"],\"format\":{\"id\":\"id-short\",\"expires_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_members_list)\nimport { Command } from \"commander\"\nimport { orgMembersList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const orgMembersListCommand = new Command(\"members\")\n .description(\"List members of the authenticated user's organization\")\n .option(\"--cursor <value>\", \"cursor\")\n .option(\"--limit <value>\", \"limit\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await orgMembersList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n cursor: opts.cursor,\n limit: opts.limit,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_members_list\", display: {\"shape\":\"list\",\"dataPath\":\"members\",\"columns\":[\"user_id\",\"email\",\"display_name\",\"joined_at\"],\"format\":{\"user_id\":\"id-short\",\"joined_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: invite_reject)\nimport { Command } from \"commander\"\nimport { inviteReject } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const inviteRejectCommand = new Command(\"reject\")\n .description(\"Reject an invite\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await inviteReject({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"invite_reject\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: key_revoke)\nimport { Command } from \"commander\"\nimport { keyRevoke } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const keyRevokeCommand = new Command(\"rm\")\n .description(\"Soft-revoke an API key\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await keyRevoke({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"key_revoke\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: key_update)\nimport { Command } from \"commander\"\nimport { keyUpdate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const keyUpdateCommand = new Command(\"edit\")\n .description(\"Update an active API key's label\")\n .argument(\"<id>\", \"id\")\n .option(\"--label <value>\", \"label\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await keyUpdate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n label: opts.label,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"key_update\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_invite_revoke)\nimport { Command } from \"commander\"\nimport { orgInviteRevoke } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const orgInviteRevokeCommand = new Command(\"revoke\")\n .description(\"Revoke a pending invite\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await orgInviteRevoke({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_invite_revoke\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: event_create)\nimport { Command } from \"commander\"\nimport { eventCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\nimport { parseTimeInput, resolveTimezone } from \"../../../handwritten/utils/parse-time.js\"\nimport { parseDateOnly, inclusiveEndToExclusive } from \"../../../handwritten/utils/parse-date.js\"\nimport { parseAttendee } from \"../../../handwritten/utils/parse-attendee.js\"\n\nexport const eventCreateCommand = new Command(\"add\")\n .description(\"Schedule a calendar event\")\n .argument(\"<title>\", \"title\")\n .option(\"--description <value>\", \"description\")\n .option(\"--start <value>\", \"start\")\n .option(\"--end <value>\", \"end\")\n .option(\"-l, --location <value>\", \"location\")\n .option(\"-u, --url <value>\", \"url\")\n .option(\"--status <value>\", \"status\")\n .option(\"--attendee <value>\", \"attendee\", (val: string, memo: string[]) => { memo.push(val); return memo }, [] as string[])\n .option(\"--all-day\", \"all_day\")\n .option(\"--tz <zone>\", \"IANA timezone for relative time parsing\")\n .action(async (title, opts) => {\n const zone = resolveTimezone(opts.tz as string | undefined)\n let startValue: string | undefined\n if (opts.start !== undefined) {\n if (opts.allDay) {\n startValue = parseDateOnly(opts.start as string)\n } else {\n startValue = parseTimeInput(opts.start as string, zone).toISO() ?? undefined\n }\n }\n let endValue: string | undefined\n if (opts.end !== undefined) {\n if (opts.allDay) {\n endValue = inclusiveEndToExclusive(opts.end as string)\n } else {\n endValue = parseTimeInput(opts.end as string, zone).toISO() ?? undefined\n }\n }\n const attendeeRaw = opts.attendee as string[]\n const attendees = attendeeRaw.length > 0 ? attendeeRaw.map(parseAttendee) : undefined\n const client = await loadSdkClient()\n const result = await eventCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n title,\n description: opts.description,\n start: startValue as string,\n end: endValue as string,\n location: opts.location,\n url: opts.url,\n status: opts.status,\n attendees: attendees,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_create\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"status\":\"status-badge\",\"start\":\"relative-time\",\"end\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","import * as chrono from \"chrono-node\"\nimport { DateTime } from \"luxon\"\n\nexport class ParseTimeError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"ParseTimeError\"\n }\n}\n\nexport function resolveTimezone(\n flag: string | undefined,\n env: Record<string, string | undefined> = process.env,\n): string {\n return flag ?? env.WSPC_TZ ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n}\n\nconst HAS_OFFSET = /(Z|[+-]\\d{2}:?\\d{2})$/\n\nexport function parseTimeInput(input: string, zone: string): DateTime {\n // Only fast-path ISO strings that carry an explicit offset/Z. Naive ISO\n // (e.g. \"2026-05-12T10:00\") would land in the system zone with setZone:true,\n // not the caller's `zone`. Let those fall through to chrono + fromObject.\n if (HAS_OFFSET.test(input)) {\n const iso = DateTime.fromISO(input, { setZone: true })\n if (iso.isValid) return iso\n }\n\n const nowInZone = DateTime.now().setZone(zone)\n const refDate = new Date(\n nowInZone.year,\n nowInZone.month - 1,\n nowInZone.day,\n nowInZone.hour,\n nowInZone.minute,\n nowInZone.second,\n nowInZone.millisecond,\n )\n const start = chrono.parse(input, refDate, { forwardDate: true })[0]?.start\n if (!start) {\n throw new ParseTimeError(\n `Cannot parse time: \"${input}\". Use ISO 8601 (e.g. 2026-05-12T10:00+08:00) or natural language (e.g. \"tomorrow 10am\").`,\n )\n }\n return DateTime.fromObject(\n {\n year: start.get(\"year\") ?? nowInZone.year,\n month: start.get(\"month\") ?? nowInZone.month,\n day: start.get(\"day\") ?? nowInZone.day,\n hour: start.get(\"hour\") ?? 0,\n minute: start.get(\"minute\") ?? 0,\n second: start.get(\"second\") ?? 0,\n },\n { zone },\n )\n}\n","import { DateTime } from \"luxon\"\n\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}$/\n\nexport class ParseDateError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"ParseDateError\"\n }\n}\n\nexport function parseDateOnly(input: string): string {\n if (!ISO_DATE.test(input)) {\n throw new ParseDateError(\n `Cannot parse date: \"${input}\". Use YYYY-MM-DD (e.g. 2026-05-10) when --all-day is set.`,\n )\n }\n const dt = DateTime.fromISO(input)\n if (!dt.isValid) {\n throw new ParseDateError(`Invalid date: \"${input}\".`)\n }\n return input\n}\n\nexport function inclusiveEndToExclusive(date: string): string {\n return DateTime.fromISO(parseDateOnly(date)).plus({ days: 1 }).toISODate()!\n}\n\nexport function exclusiveEndToInclusive(date: string): string {\n return DateTime.fromISO(parseDateOnly(date)).minus({ days: 1 }).toISODate()!\n}\n","export interface Attendee {\n email: string\n display_name?: string\n}\n\nexport function parseAttendee(input: string): Attendee {\n const match = input.match(/^(.*?)\\s*<(.*?)>$/)\n if (match) {\n const display_name = match[1]!.trim()\n const email = match[2]!.trim()\n return display_name ? { email, display_name } : { email }\n }\n return { email: input.trim() }\n}\n","// AUTO-GENERATED — DO NOT EDIT (source: event_list)\nimport { Command } from \"commander\"\nimport { eventList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\nimport { parseTimeInput, resolveTimezone } from \"../../../handwritten/utils/parse-time.js\"\n\nexport const eventListCommand = new Command(\"ls\")\n .description(\"List calendar events\")\n .option(\"--q <value>\", \"q\")\n .option(\"--from <value>\", \"from\")\n .option(\"--to <value>\", \"to\")\n .option(\"--end-from <value>\", \"end_from\")\n .option(\"--end-to <value>\", \"end_to\")\n .option(\"--cursor <value>\", \"cursor\")\n .option(\"--limit <value>\", \"limit\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .option(\"--include-past <value>\", \"include_past\")\n .option(\"--tz <zone>\", \"IANA timezone for relative time parsing\")\n .action(async (opts) => {\n const zone = resolveTimezone(opts.tz as string | undefined)\n let fromValue: string | undefined\n if (opts.from !== undefined) {\n fromValue = parseTimeInput(opts.from as string, zone).toISO() ?? undefined\n }\n let toValue: string | undefined\n if (opts.to !== undefined) {\n toValue = parseTimeInput(opts.to as string, zone).toISO() ?? undefined\n }\n const client = await loadSdkClient()\n const result = await eventList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n q: opts.q,\n start_from: fromValue,\n start_to: toValue,\n end_from: opts.endFrom,\n end_to: opts.endTo,\n cursor: opts.cursor,\n limit: opts.limit,\n include_deleted: opts.includeDeleted,\n include_past: opts.includePast,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"status\",\"title\",\"start\",\"end\"],\"format\":{\"id\":\"id-short\",\"status\":\"status-badge\",\"title\":\"truncate\",\"start\":\"relative-time\",\"end\":\"relative-time\"},\"emptyMessage\":\"no events\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: event_delete)\nimport { Command } from \"commander\"\nimport { eventDelete } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const eventDeleteCommand = new Command(\"rm\")\n .description(\"Soft-delete a calendar event\")\n .argument(\"<id>\", \"id\")\n .option(\"--expected-version <value>\", \"expected_version\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await eventDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n expected_version: opts.expectedVersion,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_delete\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: event_get)\nimport { Command } from \"commander\"\nimport { eventGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const eventGetCommand = new Command(\"show\")\n .description(\"Get a calendar event by id\")\n .argument(\"<id>\", \"id\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await eventGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n query: {\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_get\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"status\":\"status-badge\",\"start\":\"relative-time\",\"end\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: event_update)\nimport { Command } from \"commander\"\nimport { eventUpdate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\nimport { parseTimeInput, resolveTimezone } from \"../../../handwritten/utils/parse-time.js\"\nimport { parseDateOnly, inclusiveEndToExclusive } from \"../../../handwritten/utils/parse-date.js\"\nimport { parseAttendee } from \"../../../handwritten/utils/parse-attendee.js\"\n\nexport const eventUpdateCommand = new Command(\"set\")\n .description(\"Update a calendar event\")\n .argument(\"<id>\", \"id\")\n .option(\"--expected-version <value>\", \"expected_version\")\n .option(\"--title <value>\", \"title\")\n .option(\"--description <value>\", \"description\")\n .option(\"--start <value>\", \"start\")\n .option(\"--end <value>\", \"end\")\n .option(\"-l, --location <value>\", \"location\")\n .option(\"-u, --url <value>\", \"url\")\n .option(\"--status <value>\", \"status\")\n .option(\"--attendee <value>\", \"attendee\", (val: string, memo: string[]) => { memo.push(val); return memo }, [] as string[])\n .option(\"--all-day\", \"all_day\")\n .option(\"--tz <zone>\", \"IANA timezone for relative time parsing\")\n .action(async (id, opts) => {\n const zone = resolveTimezone(opts.tz as string | undefined)\n let startValue: string | undefined\n if (opts.start !== undefined) {\n if (opts.allDay) {\n startValue = parseDateOnly(opts.start as string)\n } else {\n startValue = parseTimeInput(opts.start as string, zone).toISO() ?? undefined\n }\n }\n let endValue: string | undefined\n if (opts.end !== undefined) {\n if (opts.allDay) {\n endValue = inclusiveEndToExclusive(opts.end as string)\n } else {\n endValue = parseTimeInput(opts.end as string, zone).toISO() ?? undefined\n }\n }\n const attendeeRaw = opts.attendee as string[]\n const attendees = attendeeRaw.length > 0 ? attendeeRaw.map(parseAttendee) : undefined\n const client = await loadSdkClient()\n const result = await eventUpdate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n expected_version: opts.expectedVersion,\n title: opts.title,\n description: opts.description,\n start: startValue,\n end: endValue,\n location: opts.location,\n url: opts.url,\n status: opts.status,\n attendees: attendees,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_update\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"status\":\"status-badge\",\"start\":\"relative-time\",\"end\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: event_ics_download)\nimport { Command } from \"commander\"\nimport { eventIcsDownload } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const eventIcsDownloadCommand = new Command(\"ics\")\n .description(\"Download event as `.ics`\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await eventIcsDownload({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n filename: `${id}.ics`,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_ics_download\", display: {\"shape\":\"raw\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_alias_create)\nimport { Command } from \"commander\"\nimport { emailAliasCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailAliasCreateCommand = new Command(\"add\")\n .description(\"Create a receiving alias\")\n .argument(\"<email>\", \"email\")\n .action(async (email, opts) => {\n const client = await loadSdkClient()\n const result = await emailAliasCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n email,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_alias_create\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"created_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_alias_list)\nimport { Command } from \"commander\"\nimport { emailAliasList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailAliasListCommand = new Command(\"ls\")\n .description(\"List the caller's aliases\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await emailAliasList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_alias_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"email\",\"label\",\"created_at\"],\"format\":{\"id\":\"id-short\",\"label\":\"truncate\",\"created_at\":\"relative-time\"},\"emptyMessage\":\"no aliases\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_domain_create)\nimport { Command } from \"commander\"\nimport { emailDomainCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailDomainCreateCommand = new Command(\"add\")\n .description(\"Register a custom email domain\")\n .argument(\"<domain>\", \"domain\")\n .action(async (domain, opts) => {\n const client = await loadSdkClient()\n const result = await emailDomainCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n domain,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_domain_create\", display: {\"shape\":\"object\",\"format\":{\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"verified_at\":\"relative-time\"},\"dataPath\":\"domain\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_domain_list)\nimport { Command } from \"commander\"\nimport { emailDomainList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailDomainListCommand = new Command(\"ls\")\n .description(\"List cached custom domains\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await emailDomainList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_domain_list\", display: {\"shape\":\"list\",\"columns\":[\"domain\",\"status\",\"sending_status\",\"receiving_status\",\"updated_at\"],\"format\":{\"updated_at\":\"relative-time\",\"verified_at\":\"relative-time\"},\"emptyMessage\":\"no domains\",\"dataPath\":\"domains\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_alias_delete)\nimport { Command } from \"commander\"\nimport { emailAliasDelete } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailAliasDeleteCommand = new Command(\"rm\")\n .description(\"Soft-delete an alias\")\n .argument(\"<email>\", \"email\")\n .action(async (email, opts) => {\n const client = await loadSdkClient()\n const result = await emailAliasDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n email,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_alias_delete\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"created_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_delete)\nimport { Command } from \"commander\"\nimport { emailDelete } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailDeleteCommand = new Command(\"rm\")\n .description(\"Soft-delete inbound emails\")\n .argument(\"<id...>\", \"id\")\n .action(async (id, opts) => {\n const idRaw = id as string[]\n const ids = idRaw.length > 0 ? idRaw : undefined\n const client = await loadSdkClient()\n const result = await emailDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n ids: ids as string[],\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_delete\", display: {\"shape\":\"object\",\"format\":{}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_domain_get)\nimport { Command } from \"commander\"\nimport { emailDomainGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailDomainGetCommand = new Command(\"show\")\n .description(\"Get one cached custom domain\")\n .argument(\"<domain>\", \"domain\")\n .action(async (domain, opts) => {\n const client = await loadSdkClient()\n const result = await emailDomainGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n domain,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_domain_get\", display: {\"shape\":\"object\",\"format\":{\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"verified_at\":\"relative-time\"},\"dataPath\":\"domain\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_get)\nimport { Command } from \"commander\"\nimport { emailGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailGetCommand = new Command(\"show\")\n .description(\"Get an inbound email by id\")\n .argument(\"<id>\", \"id\")\n .option(\"--include-html <value>\", \"include_html\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await emailGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n query: {\n include_html: opts.includeHtml,\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_get\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"org_id\":\"id-short\",\"user_id\":\"id-short\",\"received_at\":\"relative-time\",\"created_at\":\"relative-time\",\"read_at\":\"relative-time\",\"deleted_at\":\"relative-time\",\"is_read\":\"bool-badge\"},\"dataPath\":\"email\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_list)\nimport { Command } from \"commander\"\nimport { emailList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailListCommand = new Command(\"ls\")\n .description(\"List inbound emails\")\n .option(\"--limit <value>\", \"limit\")\n .option(\"--alias-email <value>\", \"alias_email\")\n .option(\"--unread-only <value>\", \"unread_only\")\n .option(\"--since <value>\", \"since\")\n .option(\"--cursor <value>\", \"cursor\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await emailList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n limit: opts.limit,\n alias_email: opts.aliasEmail,\n unread_only: opts.unreadOnly,\n since: opts.since,\n cursor: opts.cursor,\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"from_addr\",\"subject\",\"is_read\",\"received_at\"],\"format\":{\"id\":\"id-short\",\"from_addr\":\"truncate\",\"subject\":\"truncate\",\"is_read\":\"bool-badge\",\"received_at\":\"relative-time\"},\"emptyMessage\":\"no emails\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_mark_read)\nimport { Command } from \"commander\"\nimport { emailMarkRead } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailMarkReadCommand = new Command(\"read\")\n .description(\"Mark inbound emails as read\")\n .argument(\"<id...>\", \"id\")\n .action(async (id, opts) => {\n const idRaw = id as string[]\n const ids = idRaw.length > 0 ? idRaw : undefined\n const client = await loadSdkClient()\n const result = await emailMarkRead({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n ids: ids as string[],\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_mark_read\", display: {\"shape\":\"object\",\"format\":{}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_mark_unread)\nimport { Command } from \"commander\"\nimport { emailMarkUnread } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailMarkUnreadCommand = new Command(\"unread\")\n .description(\"Mark inbound emails as unread\")\n .argument(\"<id...>\", \"id\")\n .action(async (id, opts) => {\n const idRaw = id as string[]\n const ids = idRaw.length > 0 ? idRaw : undefined\n const client = await loadSdkClient()\n const result = await emailMarkUnread({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n ids: ids as string[],\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_mark_unread\", display: {\"shape\":\"object\",\"format\":{}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_domain_verify)\nimport { Command } from \"commander\"\nimport { emailDomainVerify } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailDomainVerifyCommand = new Command(\"verify\")\n .description(\"Verify a custom domain with the provider\")\n .argument(\"<domain>\", \"domain\")\n .action(async (domain, opts) => {\n const client = await loadSdkClient()\n const result = await emailDomainVerify({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n domain,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_domain_verify\", display: {\"shape\":\"object\",\"format\":{\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"verified_at\":\"relative-time\"},\"dataPath\":\"domain\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: push_config_delete)\nimport { Command } from \"commander\"\nimport { pushConfigDelete } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const pushConfigDeleteCommand = new Command(\"rm\")\n .description(\"Remove a push transport\")\n .argument(\"<transport>\", \"transport\")\n .action(async (transport, opts) => {\n const client = await loadSdkClient()\n const result = await pushConfigDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n transport,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"push_config_delete\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: push_config_set)\nimport { Command } from \"commander\"\nimport { pushConfigSet } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const pushConfigSetCommand = new Command(\"set\")\n .description(\"Register or update a push transport\")\n .option(\"--transport <value>\", \"transport\")\n .option(\"--target-bot-username <value>\", \"target_bot_username\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await pushConfigSet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n config: {\n transport: opts.transport,\n target_bot_username: opts.targetBotUsername,\n },\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"push_config_set\", display: {\"shape\":\"object\",\"fields\":[\"transport\",\"target_bot_username\"],\"format\":{\"transport\":\"truncate\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: push_config_get)\nimport { Command } from \"commander\"\nimport { pushConfigGet } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const pushConfigGetCommand = new Command(\"show\")\n .description(\"List the caller's push transports\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await pushConfigGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"push_config_get\", display: {\"shape\":\"list\",\"dataPath\":\"configs\",\"columns\":[\"transport\",\"target_bot_username\",\"last_test_at\",\"last_test_status\"],\"format\":{\"transport\":\"truncate\",\"last_test_at\":\"relative-time\",\"last_test_status\":\"enum-badge\"},\"enumColorMap\":{\"last_test_status\":{\"ok\":{\"label\":\"✓ ok\",\"color\":\"green\"},\"*\":{\"label\":\"✕ <value>\",\"color\":\"red\"},\"null\":{\"label\":\"—\",\"color\":\"dim\"}}},\"emptyMessage\":\"(no push transports registered)\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: push_test)\nimport { Command } from \"commander\"\nimport { pushTest } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const pushTestCommand = new Command(\"test\")\n .description(\"Send a test push notification\")\n .option(\"--transport <value>\", \"transport\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await pushTest({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n transport: opts.transport,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"push_test\", display: {\"shape\":\"object\",\"fields\":[\"ok\",\"status\",\"detail\",\"durationMs\"],\"format\":{\"ok\":\"bool-badge\"}} }, result.data)\n if (result.data?.ok === false) {\n process.exit(1)\n }\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_comment_create)\nimport { Command } from \"commander\"\nimport { todoCommentCreate } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const todoCommentCreateCommand = new Command(\"add\")\n .description(\"Add a comment to a todo\")\n .argument(\"<id>\", \"id\")\n .argument(\"<content>\", \"content\")\n .action(async (id, content, opts) => {\n const client = await loadSdkClient()\n const result = await todoCommentCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n content,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_comment_create\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"todo_id\":\"id-short\",\"user_id\":\"id-short\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_comment_list)\nimport { Command } from \"commander\"\nimport { todoCommentList } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const todoCommentListCommand = new Command(\"ls\")\n .description(\"List comments on a todo\")\n .argument(\"<id>\", \"id\")\n .option(\"--order <value>\", \"order\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .option(\"--limit <value>\", \"limit\")\n .option(\"--cursor <value>\", \"cursor\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await todoCommentList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n query: {\n order: opts.order,\n include_deleted: opts.includeDeleted,\n limit: opts.limit,\n cursor: opts.cursor,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_comment_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"content\",\"created_at\"],\"format\":{\"id\":\"id-short\",\"content\":\"truncate\",\"created_at\":\"relative-time\"},\"emptyMessage\":\"no comments\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: project_create)\nimport { Command } from \"commander\"\nimport { projectCreate } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const projectCreateCommand = new Command(\"add\")\n .description(\"Create a project\")\n .argument(\"<name>\", \"name\")\n .option(\"--default-todo-type-id <value>\", \"default_todo_type_id\")\n .action(async (name, opts) => {\n const client = await loadSdkClient()\n const result = await projectCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n name,\n default_todo_type_id: opts.defaultTodoTypeId,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"project_create\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"org_id\":\"id-short\",\"creator_user_id\":\"id-short\",\"default_todo_type_id\":\"id-short\",\"name\":\"truncate\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: project_list)\nimport { Command } from \"commander\"\nimport { projectList } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const projectListCommand = new Command(\"ls\")\n .description(\"List projects\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await projectList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"project_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"name\",\"default_todo_type_id\"],\"format\":{\"id\":\"id-short\",\"name\":\"truncate\",\"default_todo_type_id\":\"id-short\"},\"emptyMessage\":\"no projects\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: recurrence_rule_list)\nimport { Command } from \"commander\"\nimport { recurrenceRuleList } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const recurrenceRuleListCommand = new Command(\"ls\")\n .description(\"List recurring todo rules\")\n .option(\"--project-id <value>\", \"project_id\")\n .option(\"--user-id <value>\", \"user_id\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await recurrenceRuleList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n project_id: opts.projectId,\n user_id: opts.userId,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"recurrence_rule_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"rrule\",\"dtstart\"],\"format\":{\"id\":\"id-short\",\"rrule\":\"truncate\"},\"emptyMessage\":\"no recurrence rules\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_create)\nimport { Command } from \"commander\"\nimport { todoCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const todoCreateCommand = new Command(\"add\")\n .description(\"Create a todo\")\n .argument(\"<title>\", \"title\")\n .option(\"-p, --project <value>\", \"project_id\")\n .option(\"--description <value>\", \"description\")\n .option(\"--parent-id <value>\", \"parent_id\")\n .option(\"--status <value>\", \"status\")\n .option(\"--due-at <value>\", \"due_at\")\n .option(\"--type-id <value>\", \"type_id\")\n .option(\"--custom-fields <value>\", \"custom_fields\")\n .action(async (title, opts) => {\n const client = await loadSdkClient()\n const result = await todoCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n title,\n project_id: opts.project,\n description: opts.description,\n parent_id: opts.parentId,\n status: opts.status,\n due_at: opts.dueAt,\n type_id: opts.typeId,\n custom_fields: opts.customFields,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_create\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"project_id\":\"id-short\",\"parent_id\":\"id-short\",\"type_id\":\"id-short\",\"status\":\"status-badge\",\"due_at\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_list)\nimport { Command } from \"commander\"\nimport { todoList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const todoListCommand = new Command(\"ls\")\n .description(\"List todos with filters\")\n .option(\"-p, --project <value>\", \"project_id\")\n .option(\"--user-id <value>\", \"user_id\")\n .option(\"--parent-id <value>\", \"parent_id\")\n .option(\"-s, --status <value>\", \"status\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .option(\"--include-templates <value>\", \"include_templates\")\n .option(\"--due-after <value>\", \"due_after\")\n .option(\"--due-before <value>\", \"due_before\")\n .option(\"--type-id <value>\", \"type_id\")\n .option(\"--sort-by <value>\", \"sort_by\")\n .option(\"--order <value>\", \"order\")\n .option(\"--include-orphan-fields <value>\", \"include_orphan_fields\")\n .option(\"--limit <value>\", \"limit\")\n .option(\"--cursor <value>\", \"cursor\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await todoList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n project_id: opts.project,\n user_id: opts.userId,\n parent_id: opts.parentId,\n status: opts.status,\n include_deleted: opts.includeDeleted,\n include_templates: opts.includeTemplates,\n due_after: opts.dueAfter,\n due_before: opts.dueBefore,\n type_id: opts.typeId,\n sort_by: opts.sortBy,\n order: opts.order,\n include_orphan_fields: opts.includeOrphanFields,\n limit: opts.limit,\n cursor: opts.cursor,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"status\",\"title\",\"due_at\"],\"format\":{\"id\":\"id-short\",\"status\":\"status-badge\",\"title\":\"truncate\",\"due_at\":\"relative-time\"},\"emptyMessage\":\"no todos\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_type_list)\nimport { Command } from \"commander\"\nimport { todoTypeList } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const todoTypeListCommand = new Command(\"ls\")\n .description(\"List todo types\")\n .option(\"--project-id <value>\", \"project_id\")\n .option(\"--user-id <value>\", \"user_id\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await todoTypeList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n project_id: opts.projectId,\n user_id: opts.userId,\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_type_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"label\"],\"format\":{\"id\":\"id-short\",\"label\":\"truncate\"},\"emptyMessage\":\"no todo types\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_comment_delete)\nimport { Command } from \"commander\"\nimport { todoCommentDelete } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const todoCommentDeleteCommand = new Command(\"rm\")\n .description(\"Soft-delete a comment\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await todoCommentDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_comment_delete\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"todo_id\":\"id-short\",\"user_id\":\"id-short\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_comment_update)\nimport { Command } from \"commander\"\nimport { todoCommentUpdate } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const todoCommentUpdateCommand = new Command(\"edit\")\n .description(\"Edit a comment\")\n .argument(\"<id>\", \"id\")\n .argument(\"<content>\", \"content\")\n .action(async (id, content, opts) => {\n const client = await loadSdkClient()\n const result = await todoCommentUpdate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n content,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_comment_update\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"todo_id\":\"id-short\",\"user_id\":\"id-short\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_delete)\nimport { Command } from \"commander\"\nimport { todoDelete } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const todoDeleteCommand = new Command(\"rm\")\n .description(\"Soft-delete a todo\")\n .argument(\"<id>\", \"id\")\n .option(\"--expected-version <value>\", \"expected_version\")\n .option(\"--cascade <value>\", \"cascade\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await todoDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n expected_version: opts.expectedVersion,\n cascade: opts.cascade,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_delete\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"project_id\":\"id-short\",\"parent_id\":\"id-short\",\"type_id\":\"id-short\",\"status\":\"status-badge\",\"due_at\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_get)\nimport { Command } from \"commander\"\nimport { todoGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const todoGetCommand = new Command(\"show\")\n .description(\"Get a todo by id\")\n .argument(\"<id>\", \"id\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .option(\"--include-orphan-fields <value>\", \"include_orphan_fields\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await todoGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n query: {\n include_deleted: opts.includeDeleted,\n include_orphan_fields: opts.includeOrphanFields,\n include: \"children,comments\",\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_get\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"project_id\":\"id-short\",\"parent_id\":\"id-short\",\"type_id\":\"id-short\",\"status\":\"status-badge\",\"due_at\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_update)\nimport { Command } from \"commander\"\nimport { todoUpdate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const todoUpdateCommand = new Command(\"update\")\n .description(\"Update a todo\")\n .argument(\"<id>\", \"id\")\n .option(\"--expected-version <value>\", \"expected_version\")\n .option(\"--title <value>\", \"title\")\n .option(\"--description <value>\", \"description\")\n .option(\"--parent-id <value>\", \"parent_id\")\n .option(\"--status <value>\", \"status\")\n .option(\"--due-at <value>\", \"due_at\")\n .option(\"--type-id <value>\", \"type_id\")\n .option(\"--custom-fields <value>\", \"custom_fields\")\n .option(\"--user-id <value>\", \"user_id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await todoUpdate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n expected_version: opts.expectedVersion,\n title: opts.title,\n description: opts.description,\n parent_id: opts.parentId,\n status: opts.status,\n due_at: opts.dueAt,\n type_id: opts.typeId,\n custom_fields: opts.customFields,\n user_id: opts.userId,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_update\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"project_id\":\"id-short\",\"parent_id\":\"id-short\",\"type_id\":\"id-short\",\"status\":\"status-badge\",\"due_at\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT\nimport { Command } from \"commander\"\nimport { inviteAcceptCommand } from \"./invite/accept.js\"\nimport { keyCreateCommand } from \"./keys/create.js\"\nimport { keyListCommand } from \"./keys/ls.js\"\nimport { orgInviteCreateCommand } from \"./org/invite.js\"\nimport { orgInvitesListCommand } from \"./org/invites.js\"\nimport { orgGetCommand } from \"./org/show.js\"\nimport { orgUpdateCommand } from \"./org/rename.js\"\nimport { inviteGetCommand } from \"./invite/show.js\"\nimport { authMeCommand } from \"./auth/me.js\"\nimport { invitesListCommand } from \"./invites.js\"\nimport { orgMembersListCommand } from \"./org/members.js\"\nimport { inviteRejectCommand } from \"./invite/reject.js\"\nimport { keyRevokeCommand } from \"./keys/rm.js\"\nimport { keyUpdateCommand } from \"./keys/edit.js\"\nimport { orgInviteRevokeCommand } from \"./org/invite/revoke.js\"\nimport { eventCreateCommand } from \"./event/add.js\"\nimport { eventListCommand } from \"./event/ls.js\"\nimport { eventDeleteCommand } from \"./event/rm.js\"\nimport { eventGetCommand } from \"./event/show.js\"\nimport { eventUpdateCommand } from \"./event/set.js\"\nimport { eventIcsDownloadCommand } from \"./event/ics.js\"\nimport { emailAliasCreateCommand } from \"./alias/add.js\"\nimport { emailAliasListCommand } from \"./alias/ls.js\"\nimport { emailDomainCreateCommand } from \"./domain/add.js\"\nimport { emailDomainListCommand } from \"./domain/ls.js\"\nimport { emailAliasDeleteCommand } from \"./alias/rm.js\"\nimport { emailDeleteCommand } from \"./email/rm.js\"\nimport { emailDomainGetCommand } from \"./domain/show.js\"\nimport { emailGetCommand } from \"./email/show.js\"\nimport { emailListCommand } from \"./email/ls.js\"\nimport { emailMarkReadCommand } from \"./email/read.js\"\nimport { emailMarkUnreadCommand } from \"./email/unread.js\"\nimport { emailDomainVerifyCommand } from \"./domain/verify.js\"\nimport { pushConfigDeleteCommand } from \"./push/config/rm.js\"\nimport { pushConfigSetCommand } from \"./push/config/set.js\"\nimport { pushConfigGetCommand } from \"./push/config/show.js\"\nimport { pushTestCommand } from \"./push/test.js\"\nimport { todoCommentCreateCommand } from \"./todo/comment/add.js\"\nimport { todoCommentListCommand } from \"./todo/comment/ls.js\"\nimport { projectCreateCommand } from \"./todo/project/add.js\"\nimport { projectListCommand } from \"./todo/project/ls.js\"\nimport { recurrenceRuleListCommand } from \"./todo/rule/ls.js\"\nimport { todoCreateCommand } from \"./todo/add.js\"\nimport { todoListCommand } from \"./todo/ls.js\"\nimport { todoTypeListCommand } from \"./todo/type/ls.js\"\nimport { todoCommentDeleteCommand } from \"./todo/comment/rm.js\"\nimport { todoCommentUpdateCommand } from \"./todo/comment/edit.js\"\nimport { todoDeleteCommand } from \"./todo/rm.js\"\nimport { todoGetCommand } from \"./todo/show.js\"\nimport { todoUpdateCommand } from \"./todo/update.js\"\n\nexport function registerGeneratedCommands(root: Command): void {\n const root_invite = root.command(\"invite\").description(\"invite commands\")\n root_invite.addCommand(inviteAcceptCommand)\n root_invite.addCommand(inviteGetCommand)\n root_invite.addCommand(inviteRejectCommand)\n const root_keys = root.command(\"keys\").description(\"keys commands\")\n root_keys.addCommand(keyCreateCommand)\n root_keys.addCommand(keyListCommand)\n root_keys.addCommand(keyRevokeCommand)\n root_keys.addCommand(keyUpdateCommand)\n const root_org = root.command(\"org\").description(\"org commands\")\n const root_org_invite = root_org.command(\"invite\").description(\"invite commands\")\n root_org_invite.addCommand(orgInviteCreateCommand)\n root_org_invite.addCommand(orgInviteRevokeCommand)\n root_org.addCommand(orgInvitesListCommand)\n root_org.addCommand(orgGetCommand)\n root_org.addCommand(orgUpdateCommand)\n root_org.addCommand(orgMembersListCommand)\n const root_auth = root.command(\"auth\").description(\"auth commands\")\n root_auth.addCommand(authMeCommand)\n root.addCommand(invitesListCommand)\n const root_event = root.command(\"event\").description(\"event commands\")\n root_event.addCommand(eventCreateCommand)\n root_event.addCommand(eventListCommand)\n root_event.addCommand(eventDeleteCommand)\n root_event.addCommand(eventGetCommand)\n root_event.addCommand(eventUpdateCommand)\n root_event.addCommand(eventIcsDownloadCommand)\n const root_alias = root.command(\"alias\").description(\"alias commands\")\n root_alias.addCommand(emailAliasCreateCommand)\n root_alias.addCommand(emailAliasListCommand)\n root_alias.addCommand(emailAliasDeleteCommand)\n const root_domain = root.command(\"domain\").description(\"domain commands\")\n root_domain.addCommand(emailDomainCreateCommand)\n root_domain.addCommand(emailDomainListCommand)\n root_domain.addCommand(emailDomainGetCommand)\n root_domain.addCommand(emailDomainVerifyCommand)\n const root_email = root.command(\"email\").description(\"email commands\")\n root_email.addCommand(emailDeleteCommand)\n root_email.addCommand(emailGetCommand)\n root_email.addCommand(emailListCommand)\n root_email.addCommand(emailMarkReadCommand)\n root_email.addCommand(emailMarkUnreadCommand)\n const root_push = root.command(\"push\").description(\"push commands\")\n const root_push_config = root_push.command(\"config\").description(\"config commands\")\n root_push_config.addCommand(pushConfigDeleteCommand)\n root_push_config.addCommand(pushConfigSetCommand)\n root_push_config.addCommand(pushConfigGetCommand)\n root_push.addCommand(pushTestCommand)\n const root_todo = root.command(\"todo\").description(\"todo commands\")\n const root_todo_comment = root_todo.command(\"comment\").description(\"comment commands\")\n root_todo_comment.addCommand(todoCommentCreateCommand)\n root_todo_comment.addCommand(todoCommentListCommand)\n root_todo_comment.addCommand(todoCommentDeleteCommand)\n root_todo_comment.addCommand(todoCommentUpdateCommand)\n const root_todo_project = root_todo.command(\"project\").description(\"project commands\")\n root_todo_project.addCommand(projectCreateCommand)\n root_todo_project.addCommand(projectListCommand)\n const root_todo_rule = root_todo.command(\"rule\").description(\"rule commands\")\n root_todo_rule.addCommand(recurrenceRuleListCommand)\n root_todo.addCommand(todoCreateCommand)\n root_todo.addCommand(todoListCommand)\n const root_todo_type = root_todo.command(\"type\").description(\"type commands\")\n root_todo_type.addCommand(todoTypeListCommand)\n root_todo.addCommand(todoDeleteCommand)\n root_todo.addCommand(todoGetCommand)\n root_todo.addCommand(todoUpdateCommand)\n}\n","import { Command } from \"commander\"\nimport { ConfigStore } from \"../config/index.js\"\nimport { runLogin } from \"../auth/login.js\"\nimport { API_BASE } from \"../../version.js\"\n\nexport const loginCommand = new Command(\"login\")\n .description(\"Log in via OAuth device flow (default) or API key\")\n .option(\"--api-key <key>\", \"Log in with a wspc API key (escape hatch)\")\n .option(\"--json\", \"Emit machine-readable events to stdout\")\n .action(async (opts: { apiKey?: string; json?: boolean }) => {\n const store = new ConfigStore()\n const output = opts.json\n ? { write: () => {}, writeJson: (e: Record<string, unknown>) => process.stdout.write(JSON.stringify(e) + \"\\n\") }\n : {\n write: (s: string) => process.stdout.write(s + \"\\n\"),\n writeJson: () => {},\n }\n await runLogin({\n store,\n baseUrl: API_BASE,\n apiKey: opts.apiKey,\n output,\n })\n })\n","export interface DeviceFlowPrompt {\n verification_uri: string\n verification_uri_complete: string\n user_code: string\n expires_in: number\n}\n\nexport interface DeviceFlowResult {\n access_token: string\n refresh_token: string\n expires_in: number\n token_type: string\n}\n\nexport interface RunDeviceFlowOptions {\n baseUrl: string\n clientId: string\n onPrompt: (prompt: DeviceFlowPrompt) => void\n fetchImpl?: typeof fetch\n sleepMs?: (ms: number) => Promise<void>\n}\n\nconst DEFAULT_SLEEP = (ms: number) => new Promise<void>((r) => setTimeout(r, ms))\n\nexport async function runDeviceFlow(opts: RunDeviceFlowOptions): Promise<DeviceFlowResult> {\n const fetchImpl = opts.fetchImpl ?? fetch\n const sleep = opts.sleepMs ?? DEFAULT_SLEEP\n\n // 1. Request device code.\n const codeRes = await fetchImpl(`${opts.baseUrl}/auth/oauth/device`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({ client_id: opts.clientId }),\n })\n if (!codeRes.ok) {\n throw new Error(`device_authorization_failed: HTTP ${codeRes.status}`)\n }\n const codeJson = (await codeRes.json()) as {\n device_code: string\n user_code: string\n verification_uri: string\n verification_uri_complete: string\n expires_in: number\n interval: number\n }\n\n opts.onPrompt({\n verification_uri: codeJson.verification_uri,\n verification_uri_complete: codeJson.verification_uri_complete,\n user_code: codeJson.user_code,\n expires_in: codeJson.expires_in,\n })\n\n // 2. Poll token endpoint.\n const deadline = Date.now() + codeJson.expires_in * 1000\n let interval = codeJson.interval\n while (Date.now() < deadline) {\n await sleep(interval * 1000)\n const tokenRes = await fetchImpl(`${opts.baseUrl}/auth/oauth/token`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: codeJson.device_code,\n client_id: opts.clientId,\n }),\n })\n if (tokenRes.ok) {\n return (await tokenRes.json()) as DeviceFlowResult\n }\n // Server may return either RFC 8628 string form { error: \"authorization_pending\" }\n // or wspc's envelope { error: { code: \"AUTHORIZATION_PENDING\", message } }. Handle both.\n const errBody = (await tokenRes.json().catch(() => ({}))) as {\n error?: string | { code?: string }\n }\n const rawCode =\n typeof errBody.error === \"string\" ? errBody.error : (errBody.error?.code ?? \"\")\n const errCode = rawCode.toLowerCase()\n switch (errCode) {\n case \"authorization_pending\":\n continue\n case \"slow_down\":\n interval += 5\n continue\n case \"access_denied\":\n case \"expired_token\":\n throw new Error(`device_flow_${errCode}`)\n default:\n throw new Error(`device_flow_error: ${errCode || \"unknown\"} (HTTP ${tokenRes.status})`)\n }\n }\n throw new Error(\"device_flow_timeout\")\n}\n","import type { ConfigStore } from \"../config/index.js\"\n\nconst DEFAULT_CLIENT_NAME = \"wspc CLI\"\n// Device flow doesn't use redirect, but RFC 7591 requires a value.\nconst DEFAULT_REDIRECT_URI = \"http://localhost\"\n\nexport interface EnsureClientIdOptions {\n store: ConfigStore\n envName: string\n baseUrl: string\n fetchImpl?: typeof fetch\n clientName?: string\n}\n\ninterface RegisterResponse {\n client_id: string\n}\n\n/**\n * Returns the OAuth `client_id` stored under `envName`, registering a new\n * public client via RFC 7591 `/auth/oauth/register` and persisting the\n * resulting id if none exists yet. Re-running is idempotent: stored id wins.\n */\nexport async function ensureClientId(opts: EnsureClientIdOptions): Promise<string> {\n const fetchImpl = opts.fetchImpl ?? fetch\n const c = await opts.store.read()\n const existing = c.envs[opts.envName]?.client_id\n if (existing) return existing\n\n const res = await fetchImpl(`${opts.baseUrl}/auth/oauth/register`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n client_name: opts.clientName ?? DEFAULT_CLIENT_NAME,\n redirect_uris: [DEFAULT_REDIRECT_URI],\n token_endpoint_auth_method: \"none\",\n grant_types: [\"refresh_token\", \"urn:ietf:params:oauth:grant-type:device_code\"],\n }),\n })\n if (!res.ok) {\n throw new Error(`client_registration_failed: HTTP ${res.status}`)\n }\n const body = (await res.json()) as RegisterResponse\n if (!body.client_id) throw new Error(\"client_registration_failed: missing client_id in response\")\n\n // Re-read in case other fields were updated between read and now.\n const fresh = await opts.store.read()\n const env = fresh.envs[opts.envName] ?? { api_base: opts.baseUrl, accounts: {} }\n env.client_id = body.client_id\n fresh.envs[opts.envName] = env\n await opts.store.write(fresh)\n return body.client_id\n}\n","export interface MeResult {\n user_id: string\n email: string\n}\n\n/**\n * GET /auth/me with a bearer token (OAuth access token OR api key). Used at\n * login time to discover the account's email, which is the config map key.\n */\nexport async function fetchMe(opts: {\n baseUrl: string\n token: string\n fetchImpl?: typeof fetch\n}): Promise<MeResult> {\n const f = opts.fetchImpl ?? fetch\n const res = await f(`${opts.baseUrl}/auth/me`, {\n headers: { authorization: `Bearer ${opts.token}` },\n })\n if (!res.ok) throw new Error(`auth_me_failed: HTTP ${res.status}`)\n const body = (await res.json().catch(() => ({}))) as { user_id?: string; email?: string }\n if (!body.user_id || !body.email) {\n throw new Error(\"auth_me_failed: missing user_id/email in response\")\n }\n return { user_id: body.user_id, email: body.email }\n}\n","import type { ConfigStore, EnvConfig, WspcConfig } from \"../config/index.js\"\nimport { LEGACY_ACCOUNT_KEY } from \"../config/index.js\"\nimport { runDeviceFlow, type DeviceFlowResult } from \"./device-flow.js\"\nimport { ensureClientId } from \"./client-registration.js\"\nimport { fetchMe as defaultFetchMe } from \"./fetch-me.js\"\n\nexport interface LoginOutput {\n write(line: string): void\n writeJson(event: Record<string, unknown>): void\n}\n\nexport interface RunLoginOptions {\n store: ConfigStore\n baseUrl: string\n output: LoginOutput\n envName?: string\n clientId?: string\n ensureClient?: (envName: string) => Promise<string>\n deviceFlow?: (opts: {\n baseUrl: string\n clientId: string\n onPrompt: (p: unknown) => void\n }) => Promise<DeviceFlowResult>\n now?: () => number\n apiKey?: string\n fetchMe?: (opts: { baseUrl: string; token: string }) => Promise<{ user_id: string; email: string }>\n}\n\nfunction getOrCreateEnv(c: WspcConfig, envName: string, apiBase: string): EnvConfig {\n const existing = c.envs[envName]\n if (existing) {\n existing.api_base = apiBase\n existing.accounts ??= {}\n return existing\n }\n const fresh: EnvConfig = { api_base: apiBase, accounts: {} }\n c.envs[envName] = fresh\n return fresh\n}\n\nexport async function runLogin(opts: RunLoginOptions): Promise<void> {\n const envName = opts.envName ?? \"prod\"\n const now = opts.now ?? Date.now\n const me = opts.fetchMe ?? ((o: { baseUrl: string; token: string }) => defaultFetchMe(o))\n\n if (opts.apiKey) {\n const who = await me({ baseUrl: opts.baseUrl, token: opts.apiKey })\n const c = await opts.store.read()\n const env = getOrCreateEnv(c, envName, opts.baseUrl)\n const prev = env.accounts[who.email] ?? { email: who.email }\n const acct = (env.accounts[who.email] = {\n ...prev,\n email: who.email,\n user_id: who.user_id,\n api_key: opts.apiKey,\n })\n // api-key login is mutually exclusive with stored OAuth tokens.\n delete acct.refresh_token\n delete acct.access_token\n delete acct.access_token_expires_at\n env.current_account = who.email\n if (who.email !== LEGACY_ACCOUNT_KEY) delete env.accounts[LEGACY_ACCOUNT_KEY]\n c.current_env = envName\n await opts.store.write(c)\n opts.output.write(`✓ logged in (api key) as ${who.email} → env \"${envName}\"`)\n return\n }\n\n const ensureClient =\n opts.ensureClient ??\n ((env: string) => ensureClientId({ store: opts.store, envName: env, baseUrl: opts.baseUrl }))\n const clientId = opts.clientId ?? (await ensureClient(envName))\n const flow = opts.deviceFlow ?? runDeviceFlow\n\n const result = await flow({\n baseUrl: opts.baseUrl,\n clientId,\n onPrompt: (p) => {\n const prompt = p as { verification_uri: string; user_code: string; expires_in: number }\n opts.output.writeJson({ event: \"device_code_issued\", ...prompt })\n opts.output.write(`\\n=== wspc login ===`)\n opts.output.write(`verification_uri: ${prompt.verification_uri}`)\n opts.output.write(`user_code: ${prompt.user_code}`)\n opts.output.write(`expires_in: ${prompt.expires_in}`)\n opts.output.write(`=== waiting for approval ===\\n`)\n },\n })\n\n const who = await me({ baseUrl: opts.baseUrl, token: result.access_token })\n\n // Re-read: ensureClient may have written client_id while we ran the flow.\n const c = await opts.store.read()\n const env = getOrCreateEnv(c, envName, opts.baseUrl)\n const prev = env.accounts[who.email] ?? { email: who.email }\n const acct = (env.accounts[who.email] = {\n ...prev,\n email: who.email,\n user_id: who.user_id,\n refresh_token: result.refresh_token,\n access_token: result.access_token,\n access_token_expires_at: now() + result.expires_in * 1000,\n })\n // login is OAuth now — drop any stale api_key on this account.\n delete acct.api_key\n env.current_account = who.email\n if (who.email !== LEGACY_ACCOUNT_KEY) delete env.accounts[LEGACY_ACCOUNT_KEY]\n c.current_env = envName\n await opts.store.write(c)\n opts.output.writeJson({ event: \"login_success\", email: who.email })\n opts.output.write(`✓ logged in as ${who.email} → env \"${envName}\"`)\n}\n","import { Command } from \"commander\"\nimport { ConfigStore } from \"../config/index.js\"\nimport { runLogout } from \"../auth/logout.js\"\n\nexport const logoutCommand = new Command(\"logout\")\n .description(\"Log out an account (default: the active account in the current env)\")\n .argument(\"[email]\", \"Email of the account to log out\")\n .option(\"--all\", \"Log out every account in the current env\")\n .action(async (email: string | undefined, opts: { all?: boolean }) => {\n const res = await runLogout({ store: new ConfigStore(), email, all: opts.all })\n if (res.removed.length === 0) {\n process.stdout.write(\"nothing to log out\\n\")\n return\n }\n process.stdout.write(`✓ logged out: ${res.removed.join(\", \")}\\n`)\n if (res.newActive) process.stdout.write(`active account is now ${res.newActive}\\n`)\n })\n","import type { ConfigStore } from \"../config/index.js\"\n\nexport interface RunLogoutOptions {\n store: ConfigStore\n envName?: string\n email?: string\n all?: boolean\n}\n\nexport interface RunLogoutResult {\n removed: string[]\n newActive?: string\n}\n\n/**\n * Remove account(s) from an env's `accounts` map.\n * - all:true → remove every account\n * - email:\"x@y\" → remove that specific account\n * - neither → remove the active account (or the sole one)\n * When the active account is removed and exactly one remains, it is promoted\n * to active; if more than one remains, active is cleared (requires switch).\n */\nexport async function runLogout(opts: RunLogoutOptions): Promise<RunLogoutResult> {\n const c = await opts.store.read()\n const envName = opts.envName ?? c.current_env\n if (!envName || !c.envs[envName]) return { removed: [] }\n const env = c.envs[envName]\n env.accounts ??= {}\n\n if (opts.all) {\n const removed = Object.keys(env.accounts)\n env.accounts = {}\n env.current_account = undefined\n await opts.store.write(c)\n return { removed }\n }\n\n const target =\n opts.email ??\n env.current_account ??\n (Object.keys(env.accounts).length === 1 ? Object.keys(env.accounts)[0] : undefined)\n\n if (!target || !env.accounts[target]) return { removed: [] }\n\n delete env.accounts[target]\n if (env.current_account === target) {\n const remaining = Object.keys(env.accounts)\n env.current_account = remaining.length === 1 ? remaining[0] : undefined\n }\n await opts.store.write(c)\n return { removed: [target], newActive: env.current_account }\n}\n","import { Command } from \"commander\"\nimport { ConfigStore, rekeyLegacyAccount } from \"../config/index.js\"\nimport { loadSdkClient } from \"../auth/load-sdk-client.js\"\nimport { resolveAccount } from \"../auth/resolve-account.js\"\nimport { authMe, orgGet } from \"../../generated/sdk/index.js\"\nimport { render, registerRenderer, renderObject } from \"../output/render.js\"\nimport { bold, dim } from \"../output/primitives.js\"\nimport type { XCliDisplay } from \"../output/types.js\"\nimport { WspcAuthExpiredError } from \"../../index.js\"\n\nconst ENV_DISPLAY: XCliDisplay = {\n shape: \"object\",\n fields: [\"name\", \"api_base\", \"account\", \"actor\", \"agent_label\"],\n}\nconst USER_DISPLAY: XCliDisplay = {\n shape: \"object\",\n fields: [\"user_id\", \"email\", \"display_name\", \"api_key_id\"],\n format: { user_id: \"id-short\", api_key_id: \"id-short\" },\n}\nconst ORG_DISPLAY: XCliDisplay = {\n shape: \"object\",\n fields: [\"id\", \"name\", \"created_at\", \"updated_at\"],\n format: { id: \"id-short\", name: \"truncate\", created_at: \"relative-time\", updated_at: \"relative-time\" },\n}\n\ninterface WhoamiPayload {\n env: Record<string, unknown>\n user: Record<string, unknown>\n org?: Record<string, unknown>\n}\n\nregisterRenderer(\"whoami\", (data) => {\n const d = data as WhoamiPayload\n process.stdout.write(bold(\"ENV\") + \"\\n\")\n renderObject(d.env, ENV_DISPLAY)\n process.stdout.write(\"\\n\" + bold(\"USER\") + \"\\n\")\n renderObject(d.user, USER_DISPLAY)\n if (d.org) {\n process.stdout.write(\"\\n\" + bold(\"ORG\") + \"\\n\")\n renderObject(d.org, ORG_DISPLAY)\n }\n})\n\n/** Rename the migration placeholder to the real email once /auth/me resolves. */\nexport async function backfillActiveEmail(\n store: ConfigStore,\n envName: string,\n email: string,\n userId?: string,\n): Promise<void> {\n const cfg = await store.read()\n if (rekeyLegacyAccount(cfg, envName, email, userId)) {\n await store.write(cfg)\n }\n}\n\nexport const whoamiCommand = new Command(\"whoami\")\n .description(\"Show the active env, signed-in account, and organization\")\n .action(async () => {\n const store = new ConfigStore()\n const config = await store.read()\n\n let resolved: ReturnType<typeof resolveAccount>\n let sdkClient: Awaited<ReturnType<typeof loadSdkClient>>\n try {\n resolved = resolveAccount(config, { accountOverride: process.env.WSPC_ACCOUNT })\n sdkClient = await loadSdkClient({ store })\n } catch {\n printLoggedOut()\n return\n }\n const client = (sdkClient as unknown as { _rawClient: unknown })._rawClient\n\n let user: Record<string, unknown>\n let org: Record<string, unknown> | undefined\n try {\n const [meResult, orgResult] = await Promise.all([\n authMe({ client: client as never }),\n orgGet({ client: client as never }).catch(() => null),\n ])\n if (meResult.error || !meResult.response?.ok || !meResult.data) {\n printLoggedOut()\n return\n }\n user = meResult.data as Record<string, unknown>\n if (orgResult && orgResult.response?.ok && orgResult.data) {\n org = orgResult.data as Record<string, unknown>\n }\n } catch (e) {\n if (e instanceof WspcAuthExpiredError) {\n printLoggedOut()\n return\n }\n throw e\n }\n\n // Opportunistic migration backfill: if we ran as the \"(default)\" placeholder,\n // rename it now that /auth/me gave us the real email.\n if (typeof user.email === \"string\") {\n await backfillActiveEmail(store, resolved.envName, user.email, user.user_id as string | undefined)\n }\n\n const env: Record<string, unknown> = {\n name: resolved.envName,\n api_base: resolved.apiBase,\n account: typeof user.email === \"string\" ? user.email : resolved.email,\n }\n if (resolved.creds.actor) env.actor = resolved.creds.actor\n if (resolved.creds.agent_label) env.agent_label = resolved.creds.agent_label\n\n render({ kind: \"whoami\" }, { env, user, ...(org ? { org } : {}) })\n })\n\nfunction printLoggedOut(): void {\n process.stderr.write(dim('not logged in. run \"wspc login\".') + \"\\n\")\n process.exitCode = 1\n}\n","import { Command } from \"commander\"\nimport { ConfigStore } from \"../config/index.js\"\nimport { resolveAccount } from \"../auth/resolve-account.js\"\nimport { render, registerRenderer } from \"../output/render.js\"\nimport { dim, green, table } from \"../output/primitives.js\"\n\nexport const configCommand = new Command(\"config\").description(\"Manage wspc local config\")\n\ninterface ConfigShowPayload {\n current_env?: string\n envs: Array<{\n name: string\n api_base: string\n active_account?: string\n accounts: number\n auth: \"api_key\" | \"oauth\" | \"none\"\n }>\n}\n\nregisterRenderer(\"config_show\", (data) => {\n const d = data as ConfigShowPayload\n if (d.envs.length === 0) {\n process.stdout.write(dim(' no envs configured. run \"wspc login\".') + \"\\n\")\n return\n }\n const headers = [\"\", \"ENV\", \"API BASE\", \"ACTIVE ACCOUNT\", \"ACCOUNTS\", \"AUTH\"]\n const rows = d.envs.map((e) => [\n e.name === d.current_env ? green(\"✓\") : \" \",\n e.name,\n e.api_base,\n e.active_account ?? dim(\"—\"),\n String(e.accounts),\n e.auth === \"none\" ? dim(\"none\") : e.auth,\n ])\n process.stdout.write(table(headers, rows))\n})\n\n/** Set a config field on the active account of the current env. Exported for tests. */\nexport async function setConfigKey(store: ConfigStore, key: string, value: string): Promise<void> {\n const c = await store.read()\n const resolved = resolveAccount(c, { accountOverride: process.env.WSPC_ACCOUNT })\n const env = c.envs[resolved.envName]\n if (!env) throw new Error(`env \"${resolved.envName}\" not found`)\n const acct = env.accounts[resolved.email]\n if (!acct) throw new Error(`account \"${resolved.email}\" not found`)\n switch (key) {\n case \"actor\":\n if (value !== \"user\" && value !== \"agent\") throw new Error(\"actor must be 'user' or 'agent'\")\n acct.actor = value\n break\n case \"agent-label\":\n acct.agent_label = value\n break\n default:\n throw new Error(`unknown config key: ${key}`)\n }\n await store.write(c)\n}\n\nconfigCommand\n .command(\"show\")\n .description(\"List configured envs (tokens redacted, current marked with ✓)\")\n .action(async () => {\n const c = await new ConfigStore().read()\n const envs = Object.entries(c.envs ?? {}).map(([name, env]) => {\n const active = env.current_account ? env.accounts?.[env.current_account] : undefined\n return {\n name,\n api_base: env.api_base,\n ...(env.current_account !== undefined ? { active_account: env.current_account } : {}),\n accounts: Object.keys(env.accounts ?? {}).length,\n auth: (active?.api_key\n ? \"api_key\"\n : active?.access_token\n ? \"oauth\"\n : \"none\") as \"api_key\" | \"oauth\" | \"none\",\n }\n })\n render(\n { kind: \"config_show\" },\n { ...(c.current_env !== undefined ? { current_env: c.current_env } : {}), envs },\n )\n })\n\nconfigCommand\n .command(\"set <key> <value>\")\n .description(\"Set a field on the active account (actor, agent-label, ...)\")\n .action(async (key: string, value: string) => {\n await setConfigKey(new ConfigStore(), key, value)\n process.stdout.write(`✓ set ${key}=${value}\\n`)\n })\n\nconfigCommand\n .command(\"use <env>\")\n .description(\"Switch current_env\")\n .action(async (env: string) => {\n const store = new ConfigStore()\n const c = await store.read()\n if (!c.envs[env]) throw new Error(`env \"${env}\" not found`)\n c.current_env = env\n await store.write(c)\n process.stdout.write(`✓ current_env=${env}\\n`)\n })\n","import { Command } from \"commander\"\nimport { ConfigStore } from \"../config/index.js\"\nimport { render, registerRenderer } from \"../output/render.js\"\nimport { dim, green, table } from \"../output/primitives.js\"\n\nexport interface AccountRow {\n email: string\n user_id?: string\n actor?: \"user\" | \"agent\"\n auth: \"oauth\" | \"api_key\" | \"none\"\n active: boolean\n}\n\nexport async function listAccounts(store: ConfigStore): Promise<AccountRow[]> {\n const c = await store.read()\n const envName = c.current_env\n if (!envName || !c.envs[envName]) return []\n const env = c.envs[envName]\n return Object.values(env.accounts ?? {}).map((a) => ({\n email: a.email,\n user_id: a.user_id,\n actor: a.actor,\n auth: a.api_key ? \"api_key\" : a.access_token ? \"oauth\" : \"none\",\n active: env.current_account === a.email,\n }))\n}\n\nexport async function switchAccount(store: ConfigStore, email: string): Promise<void> {\n const c = await store.read()\n const envName = c.current_env\n if (!envName || !c.envs[envName]) throw new Error(\"no current env; run `wspc login` first\")\n const env = c.envs[envName]\n if (!env.accounts?.[email]) {\n throw new Error(`no account '${email}' in env '${envName}'. Run \\`wspc account ls\\` or \\`wspc login\\`.`)\n }\n env.current_account = email\n await store.write(c)\n}\n\nregisterRenderer(\"account_ls\", (data) => {\n const rows = (data as { accounts: AccountRow[] }).accounts\n if (rows.length === 0) {\n process.stdout.write(dim(' no accounts. run \"wspc login\".') + \"\\n\")\n return\n }\n const headers = [\"\", \"EMAIL\", \"USER\", \"ACTOR\", \"AUTH\"]\n const body = rows.map((r) => [\n r.active ? green(\"✓\") : \" \",\n r.email,\n r.user_id ?? dim(\"—\"),\n r.actor ?? dim(\"—\"),\n r.auth === \"none\" ? dim(\"none\") : r.auth,\n ])\n process.stdout.write(table(headers, body))\n})\n\nexport const accountCommand = new Command(\"account\").description(\"Manage logged-in accounts\")\n\naccountCommand\n .command(\"ls\")\n .description(\"List accounts in the current env (active marked with ✓)\")\n .action(async () => {\n const accounts = await listAccounts(new ConfigStore())\n render({ kind: \"account_ls\" }, { accounts })\n })\n\naccountCommand\n .command(\"switch <email>\")\n .description(\"Set the active account for the current env\")\n .action(async (email: string) => {\n await switchAccount(new ConfigStore(), email)\n process.stdout.write(`✓ active account is now ${email}\\n`)\n })\n","import { Command } from \"commander\"\nimport { loadSdkClient } from \"../auth/load-sdk-client.js\"\nimport { todoUpdate } from \"../../generated/sdk/index.js\"\nimport { render } from \"../output/render.js\"\nimport type { XCliDisplay } from \"../output/types.js\"\n\n/**\n * Mirrors the `display` block on the spec's `todo_update` operation. We\n * pin it here rather than reaching into the auto-generated `todo update`\n * command file because the generated file's exact identifier layout is an\n * implementation detail of the codegen. If the spec adds fields, this\n * object lags by one PR — same trade-off as the generated commands take.\n */\nconst TODO_UPDATE_DISPLAY: XCliDisplay = {\n shape: \"object\",\n format: {\n id: \"id-short\",\n user_id: \"id-short\",\n project_id: \"id-short\",\n parent_id: \"id-short\",\n type_id: \"id-short\",\n title: \"truncate\",\n description: \"truncate\",\n status: \"status-badge\",\n due_at: \"relative-time\",\n created_at: \"relative-time\",\n updated_at: \"relative-time\",\n deleted_at: \"relative-time\",\n },\n}\n\nexport const todoDoneCommand = new Command(\"done\")\n .description(\"Mark a todo done (sugar for `update <id> --status done`)\")\n .argument(\"<id>\", \"Todo id\")\n .action(async (id: string) => {\n const client = await loadSdkClient()\n const result = await todoUpdate({\n client: client._rawClient,\n path: { id },\n body: { status: \"done\" } as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_update\", display: TODO_UPDATE_DISPLAY }, result.data)\n })\n","import { Command } from \"commander\"\nimport { readFile, stat } from \"node:fs/promises\"\nimport { basename } from \"node:path\"\nimport { emailSend } from \"../../../generated/sdk/index.js\"\nimport { loadSdkClient } from \"../../auth/load-sdk-client.js\"\nimport { mimeFromExt } from \"../../utils/mime-from-ext.js\"\nimport { render } from \"../../output/render.js\"\n\nconst MAX_PER_ATTACHMENT = 5 * 1024 * 1024\nconst MAX_TOTAL_ATTACHMENT = 25 * 1024 * 1024\nconst MAX_TEXT_BYTES = 100 * 1024\nconst INBOUND_REF_RE = /^[a-z]+_[A-Z0-9]+:\\d+$/\n\ntype Attachment =\n | { filename: string; content_type: string; content_base64: string }\n | { from_inbound_email_id: string; idx: number }\n\nasync function resolveAttachment(input: string): Promise<{ att: Attachment; size: number }> {\n // Try as file first; fall back to ref regex.\n try {\n const s = await stat(input)\n if (s.isFile()) {\n if (s.size > MAX_PER_ATTACHMENT) {\n throw new Error(`Attachment ${input} (${s.size} bytes) exceeds 5 MiB limit.`)\n }\n const buf = await readFile(input)\n return {\n att: {\n filename: basename(input),\n content_type: mimeFromExt(input),\n content_base64: buf.toString(\"base64\"),\n },\n size: s.size,\n }\n }\n } catch {\n // not a readable file — try ref\n }\n if (INBOUND_REF_RE.test(input)) {\n const [emlId, idxStr] = input.split(\":\")\n return { att: { from_inbound_email_id: emlId!, idx: Number(idxStr) }, size: 0 }\n }\n throw new Error(\n `--attach ${input}: neither a readable file nor a valid <prefix>_<ulid>:<idx> reference.`,\n )\n}\n\nexport const sendCommand = new Command(\"send\")\n .description(\"Send an outbound email\")\n .requiredOption(\"--from <alias-email>\", \"alias email to send from\")\n .option(\"--to <addr...>\", \"recipient address (repeatable)\", [])\n .option(\"--subject <text>\", \"subject\")\n .option(\"--text <body>\", \"plain-text body\")\n .option(\"--text-file <path>\", \"read text body from file\")\n .option(\"--reply <id>\", \"inbound email id to reply to\")\n .option(\"--attach <path-or-ref...>\", \"attachment (file path or eml_xxx:idx)\", [])\n .requiredOption(\"--idempotency-key <key>\", \"idempotency key\")\n .action(async (opts) => {\n const isReply = Boolean(opts.reply)\n const to = opts.to as string[]\n const attachInputs = opts.attach as string[]\n\n // Resolve text source — mutually exclusive options\n if (opts.text && opts.textFile) {\n process.stderr.write(\"--text and --text-file are mutually exclusive\\n\")\n process.exitCode = 1\n return\n }\n let text: string | undefined = opts.text\n if (opts.textFile) {\n text = await readFile(opts.textFile as string, \"utf8\")\n }\n if (!text) {\n process.stderr.write(\"--text or --text-file is required\\n\")\n process.exitCode = 1\n return\n }\n if (Buffer.byteLength(text, \"utf8\") > MAX_TEXT_BYTES) {\n process.stderr.write(\"text body exceeds 100 KiB\\n\")\n process.exitCode = 1\n return\n }\n\n // Validate fresh-mode required fields\n if (!isReply) {\n if (to.length === 0) {\n process.stderr.write(\"--to is required (or use --reply for thread replies)\\n\")\n process.exitCode = 1\n return\n }\n if (!opts.subject) {\n process.stderr.write(\"--subject is required (or use --reply for thread replies)\\n\")\n process.exitCode = 1\n return\n }\n }\n\n // Resolve attachments\n const attachments: Attachment[] = []\n let total = 0\n for (const input of attachInputs) {\n try {\n const { att, size } = await resolveAttachment(input)\n total += size\n attachments.push(att)\n } catch (e) {\n process.stderr.write(`${(e as Error).message}\\n`)\n process.exitCode = 1\n return\n }\n }\n if (total > MAX_TOTAL_ATTACHMENT) {\n process.stderr.write(`Attachments total ${total} bytes exceeds 25 MiB limit.\\n`)\n process.exitCode = 1\n return\n }\n\n const body: Record<string, unknown> = {\n from_alias_email: opts.from,\n text,\n idempotency_key: opts.idempotencyKey,\n }\n if (isReply) {\n body.in_reply_to_email_id = opts.reply\n } else {\n body.to = to\n body.subject = opts.subject\n }\n if (attachments.length > 0) body.attachments = attachments\n\n const client = await loadSdkClient()\n const result = await emailSend({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body,\n } as never)\n\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render(\n { kind: \"object\", display: { shape: \"object\", format: { id: \"id-short\" } } },\n result.data!.email,\n )\n })\n","import { extname } from \"node:path\"\n\nconst MIME_BY_EXT: Record<string, string> = {\n pdf: \"application/pdf\",\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n txt: \"text/plain\",\n csv: \"text/csv\",\n md: \"text/markdown\",\n html: \"text/html\",\n json: \"application/json\",\n ics: \"text/calendar\",\n zip: \"application/zip\",\n}\n\n/**\n * Map a filename's extension to a likely MIME type, falling back to\n * `application/octet-stream` for unknown extensions. The table is small on\n * purpose — `wspc-cli` deliberately avoids the `mime-types` dependency. Add\n * entries only when a real user complaint surfaces.\n */\nexport function mimeFromExt(filename: string): string {\n const ext = extname(filename).slice(1).toLowerCase()\n return MIME_BY_EXT[ext] ?? \"application/octet-stream\"\n}\n","import { Command } from \"commander\"\nimport { createWriteStream } from \"node:fs\"\nimport { Readable } from \"node:stream\"\nimport { pipeline } from \"node:stream/promises\"\nimport { loadAuthedFetch } from \"../../auth/load-sdk-client.js\"\nimport { parseContentDispositionFilename } from \"../../utils/parse-content-disposition.js\"\n\nexport const attachmentCommand = new Command(\"attachment\")\n .description(\"Download an inbound email attachment by index\")\n .argument(\"<email-id>\")\n .argument(\"<idx>\")\n .option(\"--output <path>\", \"output file path\")\n .option(\"--include-deleted\", \"allow downloads from soft-deleted parent emails\")\n .action(async (emailId: string, idxArg: string, opts) => {\n const idx = Number(idxArg)\n if (!Number.isInteger(idx) || idx < 0) {\n process.stderr.write(`<idx> must be a non-negative integer (got \"${idxArg}\")\\n`)\n process.exitCode = 1\n return\n }\n\n const { fetch: authedFetch, baseUrl } = await loadAuthedFetch()\n const url = new URL(`/email/messages/${emailId}/attachments/${idx}`, baseUrl)\n if (opts.includeDeleted) url.searchParams.set(\"include_deleted\", \"true\")\n\n const res = await authedFetch(url)\n\n if (!res.ok) {\n const text = await res.text()\n process.stderr.write(`HTTP ${res.status}: ${text}\\n`)\n process.exitCode = 1\n return\n }\n\n const filename =\n opts.output ??\n parseContentDispositionFilename(res.headers.get(\"content-disposition\")) ??\n `${emailId}-${idx}.bin`\n\n if (!res.body) {\n process.stderr.write(\"response has no body\\n\")\n process.exitCode = 1\n return\n }\n\n const sink = createWriteStream(filename)\n await pipeline(Readable.fromWeb(res.body as never), sink)\n process.stdout.write(`Saved ${filename}\\n`)\n })\n","/**\n * Extract the `filename=` token from a Content-Disposition header.\n * Supports both quoted (`filename=\"x.pdf\"`) and unquoted (`filename=x.pdf`)\n * tokens. RFC 5987 `filename*=UTF-8''...` is NOT supported in v1 — the\n * server does not currently emit it.\n */\nexport function parseContentDispositionFilename(\n header: string | null | undefined,\n): string | undefined {\n if (!header) return undefined\n if (!header.toLowerCase().startsWith(\"attachment\")) return undefined\n const quoted = header.match(/filename=\"([^\"]+)\"/i)\n if (quoted) return quoted[1]\n const unquoted = header.match(/filename=([^;\\s]+)/i)\n if (unquoted) return unquoted[1]\n return undefined\n}\n"],"mappings":"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","names":["Command","joinedValues","config","request","url","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","DateTime","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","who","c","env","prev","acct","Command","Command","Command","Command","Command","client","Command","Command","Command","Command","Command","Command","client","Command","Command","client","Command","Command","Command"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/generated/cli/invite/accept.ts","../src/generated/sdk/core/bodySerializer.gen.ts","../src/generated/sdk/core/params.gen.ts","../src/generated/sdk/core/serverSentEvents.gen.ts","../src/generated/sdk/core/pathSerializer.gen.ts","../src/generated/sdk/core/utils.gen.ts","../src/generated/sdk/core/auth.gen.ts","../src/generated/sdk/client/utils.gen.ts","../src/generated/sdk/client/client.gen.ts","../src/generated/sdk/client.gen.ts","../src/generated/sdk/sdk.gen.ts","../src/handwritten/config/index.ts","../src/version.ts","../src/index.ts","../src/handwritten/auth/sdk-auth.ts","../src/handwritten/auth/resolve-account.ts","../src/handwritten/auth/load-sdk-client.ts","../src/handwritten/output/primitives.ts","../src/handwritten/output/render.ts","../src/generated/cli/keys/create.ts","../src/generated/cli/keys/ls.ts","../src/generated/cli/org/invite.ts","../src/generated/cli/org/invites.ts","../src/generated/cli/org/show.ts","../src/generated/cli/org/rename.ts","../src/generated/cli/invite/show.ts","../src/generated/cli/auth/me.ts","../src/generated/cli/invites.ts","../src/generated/cli/org/members.ts","../src/generated/cli/invite/reject.ts","../src/generated/cli/keys/rm.ts","../src/generated/cli/keys/edit.ts","../src/generated/cli/org/invite/revoke.ts","../src/generated/cli/event/add.ts","../src/handwritten/utils/parse-time.ts","../src/handwritten/utils/parse-date.ts","../src/handwritten/utils/parse-attendee.ts","../src/generated/cli/event/ls.ts","../src/generated/cli/event/rm.ts","../src/generated/cli/event/show.ts","../src/generated/cli/event/set.ts","../src/generated/cli/event/ics.ts","../src/generated/cli/alias/add.ts","../src/generated/cli/alias/ls.ts","../src/generated/cli/domain/add.ts","../src/generated/cli/domain/ls.ts","../src/generated/cli/alias/rm.ts","../src/generated/cli/email/rm.ts","../src/generated/cli/domain/show.ts","../src/generated/cli/email/show.ts","../src/generated/cli/email/ls.ts","../src/generated/cli/email/read.ts","../src/generated/cli/email/unread.ts","../src/generated/cli/domain/verify.ts","../src/generated/cli/push/config/rm.ts","../src/generated/cli/push/config/set.ts","../src/generated/cli/push/config/show.ts","../src/generated/cli/push/test.ts","../src/generated/cli/todo/comment/add.ts","../src/generated/cli/todo/comment/ls.ts","../src/generated/cli/todo/project/add.ts","../src/generated/cli/todo/project/ls.ts","../src/generated/cli/todo/rule/add.ts","../src/generated/cli/todo/rule/ls.ts","../src/generated/cli/todo/add.ts","../src/handwritten/utils/parse-json-field.ts","../src/generated/cli/todo/ls.ts","../src/generated/cli/todo/type/ls.ts","../src/generated/cli/todo/comment/rm.ts","../src/generated/cli/todo/comment/edit.ts","../src/generated/cli/todo/rule/rm.ts","../src/generated/cli/todo/rule/show.ts","../src/generated/cli/todo/rm.ts","../src/generated/cli/todo/show.ts","../src/generated/cli/todo/update.ts","../src/generated/cli/index.ts","../src/handwritten/commands/login.ts","../src/handwritten/auth/device-flow.ts","../src/handwritten/auth/client-registration.ts","../src/handwritten/auth/fetch-me.ts","../src/handwritten/auth/login.ts","../src/handwritten/commands/logout.ts","../src/handwritten/auth/logout.ts","../src/handwritten/commands/whoami.ts","../src/handwritten/commands/config.ts","../src/handwritten/commands/account.ts","../src/handwritten/commands/todo-done.ts","../src/handwritten/commands/email/send.ts","../src/handwritten/utils/mime-from-ext.ts","../src/handwritten/commands/email/attachment.ts","../src/handwritten/utils/parse-content-disposition.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\"\nimport { registerGeneratedCommands } from \"./generated/cli/index.js\"\nimport { loginCommand } from \"./handwritten/commands/login.js\"\nimport { logoutCommand } from \"./handwritten/commands/logout.js\"\nimport { whoamiCommand } from \"./handwritten/commands/whoami.js\"\nimport { configCommand } from \"./handwritten/commands/config.js\"\nimport { accountCommand } from \"./handwritten/commands/account.js\"\nimport { todoDoneCommand } from \"./handwritten/commands/todo-done.js\"\nimport { sendCommand } from \"./handwritten/commands/email/send.js\"\nimport { attachmentCommand } from \"./handwritten/commands/email/attachment.js\"\nimport { VERSION, SPEC_SHA, SPEC_FETCHED_AT } from \"./version.js\"\n\nfunction buildProgram(): Command {\n const program = new Command()\n .name(\"wspc\")\n .description(\"Official CLI for wspc.ai\")\n .version(`wspc ${VERSION} (spec ${SPEC_SHA}, fetched ${SPEC_FETCHED_AT})`)\n // Global output mode flag. Default is pretty when stdout is a TTY,\n // JSON when piped (renderer enforces this). Pass `--json` to force JSON\n // even in a TTY — useful for ad-hoc copy/paste into scripts.\n .option(\"--json\", \"Output raw JSON (machine-readable)\")\n .option(\"--account <email>\", \"Run as a specific account (overrides the active account)\")\n .hook(\"preAction\", (_thisCommand, actionCommand) => {\n const globals = actionCommand.optsWithGlobals()\n if (globals.json) process.env.WSPC_OUTPUT = \"json\"\n // Flag beats WSPC_ACCOUNT env: overwriting process.env achieves the\n // precedence (flag > env) because resolveAccount reads WSPC_ACCOUNT.\n if (globals.account) process.env.WSPC_ACCOUNT = String(globals.account)\n })\n\n program.addCommand(loginCommand)\n program.addCommand(logoutCommand)\n program.addCommand(whoamiCommand)\n program.addCommand(configCommand)\n program.addCommand(accountCommand)\n\n registerGeneratedCommands(program)\n\n const todo = program.commands.find((c) => c.name() === \"todo\")\n if (todo) todo.addCommand(todoDoneCommand)\n\n // Mount handwritten email commands under the generated `email` subtree.\n // They live in handwritten/ because they need behavior (multipart-equivalent\n // base64 attachment encoding, binary stream download) that the codegen layer\n // deliberately doesn't model.\n const email = program.commands.find((c) => c.name() === \"email\")\n if (!email) {\n throw new Error(\"email command tree not found; codegen output may be missing\")\n }\n email.addCommand(sendCommand)\n email.addCommand(attachmentCommand)\n\n return program\n}\n\nexport async function dispatch(argv: string[], { allowRetry = true }: { allowRetry?: boolean } = {}): Promise<void> {\n try {\n await buildProgram().parseAsync(argv)\n } catch (err) {\n const code = err && typeof err === \"object\" ? (err as { code?: string }).code : undefined\n if (code === \"WSPC_AUTH_EXPIRED\") {\n if (allowRetry && process.stdin.isTTY && process.stdout.isTTY) {\n process.stderr.write(\"session expired; re-authenticating...\\n\")\n await buildProgram().parseAsync([\"node\", \"wspc\", \"login\"])\n await dispatch(argv, { allowRetry: false })\n return\n }\n process.stderr.write(`error: ${(err as Error).message}\\n`)\n // exitCode (not process.exit) so Node closes fetch / file streams\n // cleanly — avoids a libuv assertion on Windows when async handles\n // are still in CLOSING state at forced-exit time.\n process.exitCode = 2\n return\n }\n process.stderr.write(`error: ${(err as Error).message ?? err}\\n`)\n process.exitCode = 1\n }\n}\n\ndispatch(process.argv)\n","// AUTO-GENERATED — DO NOT EDIT (source: invite_accept)\nimport { Command } from \"commander\"\nimport { inviteAccept } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const inviteAcceptCommand = new Command(\"accept\")\n .description(\"Accept an invite and switch into the inviting organization\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await inviteAccept({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"invite_accept\", display: {\"shape\":\"object\",\"fields\":[\"id\",\"name\",\"created_at\",\"updated_at\"]} }, result.data)\n })\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { ArrayStyle, ObjectStyle, SerializerOptions } from './pathSerializer.gen';\n\nexport type QuerySerializer = (query: Record<string, unknown>) => string;\n\nexport type BodySerializer = (body: unknown) => unknown;\n\ntype QuerySerializerOptionsObject = {\n allowReserved?: boolean;\n array?: Partial<SerializerOptions<ArrayStyle>>;\n object?: Partial<SerializerOptions<ObjectStyle>>;\n};\n\nexport type QuerySerializerOptions = QuerySerializerOptionsObject & {\n /**\n * Per-parameter serialization overrides. When provided, these settings\n * override the global array/object settings for specific parameter names.\n */\n parameters?: Record<string, QuerySerializerOptionsObject>;\n};\n\nconst serializeFormDataPair = (data: FormData, key: string, value: unknown): void => {\n if (typeof value === 'string' || value instanceof Blob) {\n data.append(key, value);\n } else if (value instanceof Date) {\n data.append(key, value.toISOString());\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nconst serializeUrlSearchParamsPair = (data: URLSearchParams, key: string, value: unknown): void => {\n if (typeof value === 'string') {\n data.append(key, value);\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nexport const formDataBodySerializer = {\n bodySerializer: (body: unknown): FormData => {\n const data = new FormData();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeFormDataPair(data, key, v));\n } else {\n serializeFormDataPair(data, key, value);\n }\n });\n\n return data;\n },\n};\n\nexport const jsonBodySerializer = {\n bodySerializer: (body: unknown): string =>\n JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value)),\n};\n\nexport const urlSearchParamsBodySerializer = {\n bodySerializer: (body: unknown): string => {\n const data = new URLSearchParams();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n } else {\n serializeUrlSearchParamsPair(data, key, value);\n }\n });\n\n return data.toString();\n },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\ntype Slot = 'body' | 'headers' | 'path' | 'query';\n\nexport type Field =\n | {\n in: Exclude<Slot, 'body'>;\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If omitted, we use the same value as `key`.\n */\n map?: string;\n }\n | {\n in: Extract<Slot, 'body'>;\n /**\n * Key isn't required for bodies.\n */\n key?: string;\n map?: string;\n }\n | {\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If `in` is omitted, `map` aliases `key` to the transport layer.\n */\n map: Slot;\n };\n\nexport interface Fields {\n allowExtra?: Partial<Record<Slot, boolean>>;\n args?: ReadonlyArray<Field>;\n}\n\nexport type FieldsConfig = ReadonlyArray<Field | Fields>;\n\nconst extraPrefixesMap: Record<string, Slot> = {\n $body_: 'body',\n $headers_: 'headers',\n $path_: 'path',\n $query_: 'query',\n};\nconst extraPrefixes = Object.entries(extraPrefixesMap);\n\ntype KeyMap = Map<\n string,\n | {\n in: Slot;\n map?: string;\n }\n | {\n in?: never;\n map: Slot;\n }\n>;\n\nconst buildKeyMap = (fields: FieldsConfig, map?: KeyMap): KeyMap => {\n if (!map) {\n map = new Map();\n }\n\n for (const config of fields) {\n if ('in' in config) {\n if (config.key) {\n map.set(config.key, {\n in: config.in,\n map: config.map,\n });\n }\n } else if ('key' in config) {\n map.set(config.key, {\n map: config.map,\n });\n } else if (config.args) {\n buildKeyMap(config.args, map);\n }\n }\n\n return map;\n};\n\ninterface Params {\n body: unknown;\n headers: Record<string, unknown>;\n path: Record<string, unknown>;\n query: Record<string, unknown>;\n}\n\nconst stripEmptySlots = (params: Params) => {\n for (const [slot, value] of Object.entries(params)) {\n if (value && typeof value === 'object' && !Array.isArray(value) && !Object.keys(value).length) {\n delete params[slot as Slot];\n }\n }\n};\n\nexport const buildClientParams = (args: ReadonlyArray<unknown>, fields: FieldsConfig) => {\n const params: Params = {\n body: Object.create(null),\n headers: Object.create(null),\n path: Object.create(null),\n query: Object.create(null),\n };\n\n const map = buildKeyMap(fields);\n\n let config: FieldsConfig[number] | undefined;\n\n for (const [index, arg] of args.entries()) {\n if (fields[index]) {\n config = fields[index];\n }\n\n if (!config) {\n continue;\n }\n\n if ('in' in config) {\n if (config.key) {\n const field = map.get(config.key)!;\n const name = field.map || config.key;\n if (field.in) {\n (params[field.in] as Record<string, unknown>)[name] = arg;\n }\n } else {\n params.body = arg;\n }\n } else {\n for (const [key, value] of Object.entries(arg ?? {})) {\n const field = map.get(key);\n\n if (field) {\n if (field.in) {\n const name = field.map || key;\n (params[field.in] as Record<string, unknown>)[name] = value;\n } else {\n params[field.map] = value;\n }\n } else {\n const extra = extraPrefixes.find(([prefix]) => key.startsWith(prefix));\n\n if (extra) {\n const [prefix, slot] = extra;\n (params[slot] as Record<string, unknown>)[key.slice(prefix.length)] = value;\n } else if ('allowExtra' in config && config.allowExtra) {\n for (const [slot, allowed] of Object.entries(config.allowExtra)) {\n if (allowed) {\n (params[slot as Slot] as Record<string, unknown>)[key] = value;\n break;\n }\n }\n }\n }\n }\n }\n }\n\n stripEmptySlots(params);\n\n return params;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from './types.gen';\n\nexport type ServerSentEventsOptions<TData = unknown> = Omit<RequestInit, 'method'> &\n Pick<Config, 'method' | 'responseTransformer' | 'responseValidator'> & {\n /**\n * Fetch API implementation. You can use this option to provide a custom\n * fetch instance.\n *\n * @default globalThis.fetch\n */\n fetch?: typeof fetch;\n /**\n * Implementing clients can call request interceptors inside this hook.\n */\n onRequest?: (url: string, init: RequestInit) => Promise<Request>;\n /**\n * Callback invoked when a network or parsing error occurs during streaming.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param error The error that occurred.\n */\n onSseError?: (error: unknown) => void;\n /**\n * Callback invoked when an event is streamed from the server.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param event Event streamed from the server.\n * @returns Nothing (void).\n */\n onSseEvent?: (event: StreamEvent<TData>) => void;\n serializedBody?: RequestInit['body'];\n /**\n * Default retry delay in milliseconds.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 3000\n */\n sseDefaultRetryDelay?: number;\n /**\n * Maximum number of retry attempts before giving up.\n */\n sseMaxRetryAttempts?: number;\n /**\n * Maximum retry delay in milliseconds.\n *\n * Applies only when exponential backoff is used.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 30000\n */\n sseMaxRetryDelay?: number;\n /**\n * Optional sleep function for retry backoff.\n *\n * Defaults to using `setTimeout`.\n */\n sseSleepFn?: (ms: number) => Promise<void>;\n url: string;\n };\n\nexport interface StreamEvent<TData = unknown> {\n data: TData;\n event?: string;\n id?: string;\n retry?: number;\n}\n\nexport type ServerSentEventsResult<TData = unknown, TReturn = void, TNext = unknown> = {\n stream: AsyncGenerator<\n TData extends Record<string, unknown> ? TData[keyof TData] : TData,\n TReturn,\n TNext\n >;\n};\n\nexport function createSseClient<TData = unknown>({\n onRequest,\n onSseError,\n onSseEvent,\n responseTransformer,\n responseValidator,\n sseDefaultRetryDelay,\n sseMaxRetryAttempts,\n sseMaxRetryDelay,\n sseSleepFn,\n url,\n ...options\n}: ServerSentEventsOptions): ServerSentEventsResult<TData> {\n let lastEventId: string | undefined;\n\n const sleep = sseSleepFn ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n const createStream = async function* () {\n let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n\n while (true) {\n if (signal.aborted) break;\n\n attempt++;\n\n const headers =\n options.headers instanceof Headers\n ? options.headers\n : new Headers(options.headers as Record<string, string> | undefined);\n\n if (lastEventId !== undefined) {\n headers.set('Last-Event-ID', lastEventId);\n }\n\n try {\n const requestInit: RequestInit = {\n redirect: 'follow',\n ...options,\n body: options.serializedBody,\n headers,\n signal,\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n\n if (!response.ok) throw new Error(`SSE failed: ${response.status} ${response.statusText}`);\n\n if (!response.body) throw new Error('No body in SSE response');\n\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();\n\n let buffer = '';\n\n const abortHandler = () => {\n try {\n reader.cancel();\n } catch {\n // noop\n }\n };\n\n signal.addEventListener('abort', abortHandler);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += value;\n buffer = buffer.replace(/\\r\\n?/g, '\\n'); // normalize line endings\n\n const chunks = buffer.split('\\n\\n');\n buffer = chunks.pop() ?? '';\n\n for (const chunk of chunks) {\n const lines = chunk.split('\\n');\n const dataLines: Array<string> = [];\n let eventName: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n dataLines.push(line.replace(/^data:\\s*/, ''));\n } else if (line.startsWith('event:')) {\n eventName = line.replace(/^event:\\s*/, '');\n } else if (line.startsWith('id:')) {\n lastEventId = line.replace(/^id:\\s*/, '');\n } else if (line.startsWith('retry:')) {\n const parsed = Number.parseInt(line.replace(/^retry:\\s*/, ''), 10);\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n\n let data: unknown;\n let parsedJson = false;\n\n if (dataLines.length) {\n const rawData = dataLines.join('\\n');\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n } catch {\n data = rawData;\n }\n }\n\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay,\n });\n\n if (dataLines.length) {\n yield data as any;\n }\n }\n }\n } finally {\n signal.removeEventListener('abort', abortHandler);\n reader.releaseLock();\n }\n\n break; // exit loop on normal completion\n } catch (error) {\n // connection failed or aborted; retry after delay\n onSseError?.(error);\n\n if (sseMaxRetryAttempts !== undefined && attempt >= sseMaxRetryAttempts) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 30000);\n await sleep(backoff);\n }\n }\n };\n\n const stream = createStream();\n\n return { stream };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions<T> extends SerializePrimitiveOptions, SerializerOptions<T> {}\n\ninterface SerializePrimitiveOptions {\n allowReserved?: boolean;\n name: string;\n}\n\nexport interface SerializerOptions<T> {\n /**\n * @default true\n */\n explode: boolean;\n style: T;\n}\n\nexport type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited';\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = 'label' | 'matrix' | 'simple';\nexport type ObjectStyle = 'form' | 'deepObject';\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n value: string;\n}\n\nexport const separatorArrayExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const separatorArrayNoExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'form':\n return ',';\n case 'pipeDelimited':\n return '|';\n case 'spaceDelimited':\n return '%20';\n default:\n return ',';\n }\n};\n\nexport const separatorObjectExplode = (style: ObjectSeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const serializeArrayParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n}: SerializeOptions<ArraySeparatorStyle> & {\n value: unknown[];\n}) => {\n if (!explode) {\n const joinedValues = (\n allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\n ).join(separatorArrayNoExplode(style));\n switch (style) {\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n case 'simple':\n return joinedValues;\n default:\n return `${name}=${joinedValues}`;\n }\n }\n\n const separator = separatorArrayExplode(style);\n const joinedValues = value\n .map((v) => {\n if (style === 'label' || style === 'simple') {\n return allowReserved ? v : encodeURIComponent(v as string);\n }\n\n return serializePrimitiveParam({\n allowReserved,\n name,\n value: v as string,\n });\n })\n .join(separator);\n return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n allowReserved,\n name,\n value,\n}: SerializePrimitiveParam) => {\n if (value === undefined || value === null) {\n return '';\n }\n\n if (typeof value === 'object') {\n throw new Error(\n 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.',\n );\n }\n\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\n\nexport const serializeObjectParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n valueOnly,\n}: SerializeOptions<ObjectSeparatorStyle> & {\n value: Record<string, unknown> | Date;\n valueOnly?: boolean;\n}) => {\n if (value instanceof Date) {\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n }\n\n if (style !== 'deepObject' && !explode) {\n let values: string[] = [];\n Object.entries(value).forEach(([key, v]) => {\n values = [...values, key, allowReserved ? (v as string) : encodeURIComponent(v as string)];\n });\n const joinedValues = values.join(',');\n switch (style) {\n case 'form':\n return `${name}=${joinedValues}`;\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n default:\n return joinedValues;\n }\n }\n\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value)\n .map(([key, v]) =>\n serializePrimitiveParam({\n allowReserved,\n name: style === 'deepObject' ? `${name}[${key}]` : key,\n value: v as string,\n }),\n )\n .join(separator);\n return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from './bodySerializer.gen';\nimport {\n type ArraySeparatorStyle,\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from './pathSerializer.gen';\n\nexport interface PathSerializer {\n path: Record<string, unknown>;\n url: string;\n}\n\nexport const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {\n let url = _url;\n const matches = _url.match(PATH_PARAM_RE);\n if (matches) {\n for (const match of matches) {\n let explode = false;\n let name = match.substring(1, match.length - 1);\n let style: ArraySeparatorStyle = 'simple';\n\n if (name.endsWith('*')) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n\n if (name.startsWith('.')) {\n name = name.substring(1);\n style = 'label';\n } else if (name.startsWith(';')) {\n name = name.substring(1);\n style = 'matrix';\n }\n\n const value = path[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n url = url.replace(match, serializeArrayParam({ explode, name, style, value }));\n continue;\n }\n\n if (typeof value === 'object') {\n url = url.replace(\n match,\n serializeObjectParam({\n explode,\n name,\n style,\n value: value as Record<string, unknown>,\n valueOnly: true,\n }),\n );\n continue;\n }\n\n if (style === 'matrix') {\n url = url.replace(\n match,\n `;${serializePrimitiveParam({\n name,\n value: value as string,\n })}`,\n );\n continue;\n }\n\n const replaceValue = encodeURIComponent(\n style === 'label' ? `.${value as string}` : (value as string),\n );\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\n\nexport const getUrl = ({\n baseUrl,\n path,\n query,\n querySerializer,\n url: _url,\n}: {\n baseUrl?: string;\n path?: Record<string, unknown>;\n query?: Record<string, unknown>;\n querySerializer: QuerySerializer;\n url: string;\n}) => {\n const pathUrl = _url.startsWith('/') ? _url : `/${_url}`;\n let url = (baseUrl ?? '') + pathUrl;\n if (path) {\n url = defaultPathSerializer({ path, url });\n }\n let search = query ? querySerializer(query) : '';\n if (search.startsWith('?')) {\n search = search.substring(1);\n }\n if (search) {\n url += `?${search}`;\n }\n return url;\n};\n\nexport function getValidRequestBody(options: {\n body?: unknown;\n bodySerializer?: BodySerializer | null;\n serializedBody?: unknown;\n}) {\n const hasBody = options.body !== undefined;\n const isSerializedBody = hasBody && options.bodySerializer;\n\n if (isSerializedBody) {\n if ('serializedBody' in options) {\n const hasSerializedBody =\n options.serializedBody !== undefined && options.serializedBody !== '';\n\n return hasSerializedBody ? options.serializedBody : null;\n }\n\n // not all clients implement a serializedBody property (i.e., client-axios)\n return options.body !== '' ? options.body : null;\n }\n\n // plain/text body\n if (hasBody) {\n return options.body;\n }\n\n // no body was provided\n return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nexport type AuthToken = string | undefined;\n\nexport interface Auth {\n /**\n * Which part of the request do we use to send the auth?\n *\n * @default 'header'\n */\n in?: 'header' | 'query' | 'cookie';\n /**\n * Header or query parameter name.\n *\n * @default 'Authorization'\n */\n name?: string;\n scheme?: 'basic' | 'bearer';\n type: 'apiKey' | 'http';\n}\n\nexport const getAuthToken = async (\n auth: Auth,\n callback: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken,\n): Promise<string | undefined> => {\n const token = typeof callback === 'function' ? await callback(auth) : callback;\n\n if (!token) {\n return;\n }\n\n if (auth.scheme === 'bearer') {\n return `Bearer ${token}`;\n }\n\n if (auth.scheme === 'basic') {\n return `Basic ${btoa(token)}`;\n }\n\n return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from '../core/auth.gen';\nimport type { QuerySerializerOptions } from '../core/bodySerializer.gen';\nimport { jsonBodySerializer } from '../core/bodySerializer.gen';\nimport {\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from '../core/pathSerializer.gen';\nimport { getUrl } from '../core/utils.gen';\nimport type { Client, ClientOptions, Config, RequestOptions } from './types.gen';\n\nexport const createQuerySerializer = <T = unknown>({\n parameters = {},\n ...args\n}: QuerySerializerOptions = {}) => {\n const querySerializer = (queryParams: T) => {\n const search: string[] = [];\n if (queryParams && typeof queryParams === 'object') {\n for (const name in queryParams) {\n const value = queryParams[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n const options = parameters[name] || args;\n\n if (Array.isArray(value)) {\n const serializedArray = serializeArrayParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: 'form',\n value,\n ...options.array,\n });\n if (serializedArray) search.push(serializedArray);\n } else if (typeof value === 'object') {\n const serializedObject = serializeObjectParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: 'deepObject',\n value: value as Record<string, unknown>,\n ...options.object,\n });\n if (serializedObject) search.push(serializedObject);\n } else {\n const serializedPrimitive = serializePrimitiveParam({\n allowReserved: options.allowReserved,\n name,\n value: value as string,\n });\n if (serializedPrimitive) search.push(serializedPrimitive);\n }\n }\n }\n return search.join('&');\n };\n return querySerializer;\n};\n\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (contentType: string | null): Exclude<Config['parseAs'], 'auto'> => {\n if (!contentType) {\n // If no Content-Type header is provided, the best we can do is return the raw response body,\n // which is effectively the same as the 'stream' option.\n return 'stream';\n }\n\n const cleanContent = contentType.split(';')[0]?.trim();\n\n if (!cleanContent) {\n return;\n }\n\n if (cleanContent.startsWith('application/json') || cleanContent.endsWith('+json')) {\n return 'json';\n }\n\n if (cleanContent === 'multipart/form-data') {\n return 'formData';\n }\n\n if (\n ['application/', 'audio/', 'image/', 'video/'].some((type) => cleanContent.startsWith(type))\n ) {\n return 'blob';\n }\n\n if (cleanContent.startsWith('text/')) {\n return 'text';\n }\n\n return;\n};\n\nconst checkForExistence = (\n options: Pick<RequestOptions, 'auth' | 'query'> & {\n headers: Headers;\n },\n name?: string,\n): boolean => {\n if (!name) {\n return false;\n }\n if (\n options.headers.has(name) ||\n options.query?.[name] ||\n options.headers.get('Cookie')?.includes(`${name}=`)\n ) {\n return true;\n }\n return false;\n};\n\nexport async function setAuthParams(\n options: Pick<RequestOptions, 'auth' | 'query' | 'security'> & {\n headers: Headers;\n },\n): Promise<void> {\n for (const auth of options.security ?? []) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n\n const token = await getAuthToken(auth, options.auth);\n\n if (!token) {\n continue;\n }\n\n const name = auth.name ?? 'Authorization';\n\n switch (auth.in) {\n case 'query':\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case 'cookie':\n options.headers.append('Cookie', `${name}=${token}`);\n break;\n case 'header':\n default:\n options.headers.set(name, token);\n break;\n }\n }\n}\n\nexport const buildUrl: Client['buildUrl'] = (options) =>\n getUrl({\n baseUrl: options.baseUrl as string,\n path: options.path,\n query: options.query,\n querySerializer:\n typeof options.querySerializer === 'function'\n ? options.querySerializer\n : createQuerySerializer(options.querySerializer),\n url: options.url,\n });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith('/')) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\n\nexport const mergeHeaders = (\n ...headers: Array<Required<Config>['headers'] | undefined>\n): Headers => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n\n const iterator = header instanceof Headers ? headersEntries(header) : Object.entries(header);\n\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v as string);\n }\n } else if (value !== undefined) {\n // assume object headers are meant to be JSON stringified, i.e., their\n // content value in OpenAPI specification is 'application/json'\n mergedHeaders.set(\n key,\n typeof value === 'object' ? JSON.stringify(value) : (value as string),\n );\n }\n }\n }\n return mergedHeaders;\n};\n\ntype ErrInterceptor<Err, Res, Req, Options> = (\n error: Err,\n /** response may be undefined due to a network error where no response object is produced */\n response: Res | undefined,\n /** request may be undefined, because error may be from building the request object itself */\n request: Req | undefined,\n options: Options,\n) => Err | Promise<Err>;\n\ntype ReqInterceptor<Req, Options> = (request: Req, options: Options) => Req | Promise<Req>;\n\ntype ResInterceptor<Res, Req, Options> = (\n response: Res,\n request: Req,\n options: Options,\n) => Res | Promise<Res>;\n\nclass Interceptors<Interceptor> {\n fns: Array<Interceptor | null> = [];\n\n clear(): void {\n this.fns = [];\n }\n\n eject(id: number | Interceptor): void {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n\n exists(id: number | Interceptor): boolean {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n\n getInterceptorIndex(id: number | Interceptor): number {\n if (typeof id === 'number') {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n\n update(id: number | Interceptor, fn: Interceptor): number | Interceptor | false {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n\n use(fn: Interceptor): number {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n}\n\nexport interface Middleware<Req, Res, Err, Options> {\n error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;\n request: Interceptors<ReqInterceptor<Req, Options>>;\n response: Interceptors<ResInterceptor<Res, Req, Options>>;\n}\n\nexport const createInterceptors = <Req, Res, Err, Options>(): Middleware<\n Req,\n Res,\n Err,\n Options\n> => ({\n error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(),\n request: new Interceptors<ReqInterceptor<Req, Options>>(),\n response: new Interceptors<ResInterceptor<Res, Req, Options>>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: 'form',\n },\n object: {\n explode: true,\n style: 'deepObject',\n },\n});\n\nconst defaultHeaders = {\n 'Content-Type': 'application/json',\n};\n\nexport const createConfig = <T extends ClientOptions = ClientOptions>(\n override: Config<Omit<ClientOptions, keyof T> & T> = {},\n): Config<Omit<ClientOptions, keyof T> & T> => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: 'auto',\n querySerializer: defaultQuerySerializer,\n ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from '../core/serverSentEvents.gen';\nimport type { HttpMethod } from '../core/types.gen';\nimport { getValidRequestBody } from '../core/utils.gen';\nimport type { Client, Config, RequestOptions, ResolvedRequestOptions } from './types.gen';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils.gen';\n\ntype ReqInit = Omit<RequestInit, 'body' | 'headers'> & {\n body?: any;\n headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<Request, Response, unknown, ResolvedRequestOptions>();\n\n const beforeRequest = async <\n TData = unknown,\n TResponseStyle extends 'data' | 'fields' = 'fields',\n ThrowOnError extends boolean = boolean,\n Url extends string = string,\n >(\n options: RequestOptions<TData, TResponseStyle, ThrowOnError, Url>,\n ) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: undefined as string | undefined,\n };\n\n if (opts.security) {\n await setAuthParams(opts);\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body) as string | undefined;\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.serializedBody === '') {\n opts.headers.delete('Content-Type');\n }\n\n const resolvedOpts = opts as typeof opts &\n ResolvedRequestOptions<TResponseStyle, ThrowOnError, Url>;\n const url = buildUrl(resolvedOpts);\n\n return { opts: resolvedOpts, url };\n };\n\n const request: Client['request'] = async (options) => {\n const throwOnError = options.throwOnError ?? _config.throwOnError;\n const responseStyle = options.responseStyle ?? _config.responseStyle;\n\n let request: Request | undefined;\n let response: Response | undefined;\n\n try {\n const { opts, url } = await beforeRequest(options);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n body: getValidRequestBody(opts),\n };\n\n request = new Request(url, requestInit);\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n\n response = await _fetch(request);\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n if (response.status === 204 || response.headers.get('Content-Length') === '0') {\n let emptyData: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'text':\n emptyData = await response[parseAs]();\n break;\n case 'formData':\n emptyData = new FormData();\n break;\n case 'stream':\n emptyData = response.body;\n break;\n case 'json':\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === 'data'\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'json': {\n // Some servers return 200 with no Content-Length and empty body.\n // response.json() would throw; read as text and parse if non-empty.\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n break;\n }\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n throw jsonError ?? textError;\n } catch (error) {\n let finalError = error;\n\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = await fn(finalError, response, request, options as ResolvedRequestOptions);\n }\n }\n\n finalError = finalError || {};\n\n if (throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n request,\n response,\n };\n }\n };\n\n const makeMethodFn = (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn = (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n serializedBody: getValidRequestBody(opts) as BodyInit | null | undefined,\n url,\n });\n };\n\n const _buildUrl: Client['buildUrl'] = (options) => buildUrl({ ..._config, ...options });\n\n return {\n buildUrl: _buildUrl,\n connect: makeMethodFn('CONNECT'),\n delete: makeMethodFn('DELETE'),\n get: makeMethodFn('GET'),\n getConfig,\n head: makeMethodFn('HEAD'),\n interceptors,\n options: makeMethodFn('OPTIONS'),\n patch: makeMethodFn('PATCH'),\n post: makeMethodFn('POST'),\n put: makeMethodFn('PUT'),\n request,\n setConfig,\n sse: {\n connect: makeSseFn('CONNECT'),\n delete: makeSseFn('DELETE'),\n get: makeSseFn('GET'),\n head: makeSseFn('HEAD'),\n options: makeSseFn('OPTIONS'),\n patch: makeSseFn('PATCH'),\n post: makeSseFn('POST'),\n put: makeSseFn('PUT'),\n trace: makeSseFn('TRACE'),\n },\n trace: makeMethodFn('TRACE'),\n } as Client;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { type ClientOptions, type Config, createClient, createConfig } from './client';\nimport type { ClientOptions as ClientOptions2 } from './types.gen';\n\n/**\n * The `createClientConfig()` function will be called on client initialization\n * and the returned object will become the client's initial configuration.\n *\n * You may want to initialize your client this way instead of calling\n * `setConfig()`. This is useful for example if you're using Next.js\n * to ensure your client always has the correct values.\n */\nexport type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (override?: Config<ClientOptions & T>) => Config<Required<ClientOptions> & T>;\n\nexport const client = createClient(createConfig<ClientOptions2>({ baseUrl: 'https://api.wspc.ai' }));\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Client, Options as Options2, TDataShape } from './client';\nimport { client } from './client.gen';\nimport type { AuthMeData, AuthMeErrors, AuthMeResponses, AuthRequestCodeData, AuthRequestCodeErrors, AuthRequestCodeResponses, AuthVerifyCodeData, AuthVerifyCodeErrors, AuthVerifyCodeResponses, EmailAliasCreateData, EmailAliasCreateErrors, EmailAliasCreateResponses, EmailAliasDeleteData, EmailAliasDeleteErrors, EmailAliasDeleteResponses, EmailAliasListData, EmailAliasListErrors, EmailAliasListResponses, EmailAliasRestoreData, EmailAliasRestoreErrors, EmailAliasRestoreResponses, EmailAttachmentGetData, EmailAttachmentGetErrors, EmailAttachmentGetResponses, EmailDeleteData, EmailDeleteErrors, EmailDeleteResponses, EmailDomainCreateData, EmailDomainCreateErrors, EmailDomainCreateResponses, EmailDomainGetData, EmailDomainGetErrors, EmailDomainGetResponses, EmailDomainListData, EmailDomainListErrors, EmailDomainListResponses, EmailDomainVerifyData, EmailDomainVerifyErrors, EmailDomainVerifyResponses, EmailGetData, EmailGetErrors, EmailGetResponses, EmailListData, EmailListErrors, EmailListResponses, EmailMarkReadData, EmailMarkReadErrors, EmailMarkReadResponses, EmailMarkUnreadData, EmailMarkUnreadErrors, EmailMarkUnreadResponses, EmailRestoreData, EmailRestoreErrors, EmailRestoreResponses, EmailSendData, EmailSendErrors, EmailSendResponses, EventCreateData, EventCreateErrors, EventCreateResponses, EventDeleteData, EventDeleteErrors, EventDeleteResponses, EventGetData, EventGetErrors, EventGetResponses, EventIcsDownloadData, EventIcsDownloadErrors, EventIcsDownloadResponses, EventListData, EventListErrors, EventListResponses, EventRestoreData, EventRestoreErrors, EventRestoreResponses, EventUpdateData, EventUpdateErrors, EventUpdateResponses, InviteAcceptData, InviteAcceptErrors, InviteAcceptResponses, InviteGetData, InviteGetErrors, InviteGetResponses, InviteRejectData, InviteRejectErrors, InviteRejectResponses, InvitesListData, InvitesListErrors, InvitesListResponses, KeyCreateData, KeyCreateErrors, KeyCreateResponses, KeyListData, KeyListErrors, KeyListResponses, KeyRevokeData, KeyRevokeErrors, KeyRevokeResponses, KeyUpdateData, KeyUpdateErrors, KeyUpdateResponses, OauthClientRegisterData, OauthClientRegisterErrors, OauthClientRegisterResponses, OauthDeviceAuthorizeData, OauthDeviceAuthorizeErrors, OauthDeviceAuthorizeResponses, OauthMetadataData, OauthMetadataErrors, OauthMetadataOpenidAliasData, OauthMetadataOpenidAliasErrors, OauthMetadataOpenidAliasResponses, OauthMetadataResponses, OauthTokenExchangeData, OauthTokenExchangeErrors, OauthTokenExchangeResponses, OauthTokenRevokeData, OauthTokenRevokeErrors, OauthTokenRevokeResponses, OrgGetData, OrgGetErrors, OrgGetResponses, OrgInviteCreateData, OrgInviteCreateErrors, OrgInviteCreateResponses, OrgInviteRevokeData, OrgInviteRevokeErrors, OrgInviteRevokeResponses, OrgInvitesListData, OrgInvitesListErrors, OrgInvitesListResponses, OrgMemberRemoveData, OrgMemberRemoveErrors, OrgMemberRemoveResponses, OrgMembersListData, OrgMembersListErrors, OrgMembersListResponses, OrgUpdateData, OrgUpdateErrors, OrgUpdateResponses, ProjectCreateData, ProjectCreateErrors, ProjectCreateResponses, ProjectDeleteData, ProjectDeleteErrors, ProjectDeleteResponses, ProjectGetData, ProjectGetErrors, ProjectGetResponses, ProjectListData, ProjectListErrors, ProjectListResponses, ProjectRestoreData, ProjectRestoreErrors, ProjectRestoreResponses, ProjectUpdateData, ProjectUpdateErrors, ProjectUpdateResponses, PushConfigDeleteData, PushConfigDeleteErrors, PushConfigDeleteResponses, PushConfigGetData, PushConfigGetErrors, PushConfigGetResponses, PushConfigSetData, PushConfigSetErrors, PushConfigSetResponses, PushTestData, PushTestErrors, PushTestResponses, RecurrenceRuleCreateData, RecurrenceRuleCreateErrors, RecurrenceRuleCreateResponses, RecurrenceRuleDeleteData, RecurrenceRuleDeleteErrors, RecurrenceRuleDeleteResponses, RecurrenceRuleGetData, RecurrenceRuleGetErrors, RecurrenceRuleGetResponses, RecurrenceRuleListData, RecurrenceRuleListErrors, RecurrenceRuleListResponses, RecurrenceRuleUpdateData, RecurrenceRuleUpdateErrors, RecurrenceRuleUpdateResponses, TodoCommentCreateData, TodoCommentCreateErrors, TodoCommentCreateResponses, TodoCommentDeleteData, TodoCommentDeleteErrors, TodoCommentDeleteResponses, TodoCommentListData, TodoCommentListErrors, TodoCommentListResponses, TodoCommentUpdateData, TodoCommentUpdateErrors, TodoCommentUpdateResponses, TodoCreateData, TodoCreateErrors, TodoCreateResponses, TodoDeleteData, TodoDeleteErrors, TodoDeleteResponses, TodoGetData, TodoGetErrors, TodoGetResponses, TodoListData, TodoListErrors, TodoListResponses, TodoRestoreData, TodoRestoreErrors, TodoRestoreResponses, TodoTypeCreateData, TodoTypeCreateErrors, TodoTypeCreateResponses, TodoTypeDeleteData, TodoTypeDeleteErrors, TodoTypeDeleteResponses, TodoTypeGetData, TodoTypeGetErrors, TodoTypeGetResponses, TodoTypeListData, TodoTypeListErrors, TodoTypeListResponses, TodoTypeRestoreData, TodoTypeRestoreErrors, TodoTypeRestoreResponses, TodoTypeUpdateData, TodoTypeUpdateErrors, TodoTypeUpdateResponses, TodoUpdateData, TodoUpdateErrors, TodoUpdateResponses } from './types.gen';\n\nexport type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown> = Options2<TData, ThrowOnError, TResponse> & {\n /**\n * You can provide a client instance returned by `createClient()` instead of\n * individual options. This might be also useful if you want to implement a\n * custom client.\n */\n client?: Client;\n /**\n * You can pass arbitrary values through the `meta` object. This can be\n * used to access values that aren't defined as part of the SDK function.\n */\n meta?: Record<string, unknown>;\n};\n\n/**\n * Accept an invite and switch into the inviting organization\n *\n * Switches the caller's org to the invite's org and records the previous org. The caller loses access to data scoped to their previous org.\n */\nexport const inviteAccept = <ThrowOnError extends boolean = false>(options: Options<InviteAcceptData, ThrowOnError>) => (options.client ?? client).post<InviteAcceptResponses, InviteAcceptErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/invites/{id}/accept',\n ...options\n});\n\n/**\n * List active API keys\n *\n * ### Overview\n * Returns a list of all active (non-revoked) API keys belonging to the authenticated user. It also includes the `current_key_id` identifying the specific key used to authenticate the current request.\n *\n * ### When to Use\n * - Use this endpoint to view active API keys (e.g., when running `wspc keys list` or displaying API key management screens in user profiles).\n * - Use the `current_key_id` to identify which key is making the current call, facilitating self-rotation or auditing.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Only active keys are returned; keys that have been revoked are filtered out and excluded from the response.\n * - The full secret key is never returned; only the last 4 characters (`key_last4`) are provided for identification.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The provided Bearer token is missing, expired, or invalid. Ensure you are passing a valid, active API key.\n */\nexport const keyList = <ThrowOnError extends boolean = false>(options?: Options<KeyListData, ThrowOnError>) => (options?.client ?? client).get<KeyListResponses, KeyListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/keys',\n ...options\n});\n\n/**\n * Create a new API key (full value returned once)\n *\n * ### Overview\n * Creates and provisions a new long-lived API key for the authenticated user. The complete plaintext API key value (`api_key`) is returned **only once** in this endpoint's response and cannot be retrieved again.\n *\n * ### When to Use\n * - Use this endpoint when a user requests a new API key (e.g., `wspc keys create --label \"My Agent\"`) to isolate access for specific environments, applications, or developers.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Key Limit**: A user is limited to a maximum of 25 active API keys. Requesting a new key beyond this limit will result in a `KEY_LIMIT_EXCEEDED` error.\n * - **Label Validation**: The `label` parameter must be between 1 and 60 characters after trimming whitespace. Failing to provide a valid label results in an `INVALID_LABEL` error.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The Bearer token is missing or invalid.\n * - **400 Bad Request**: The `label` parameter is empty, too long, or missing.\n * - **400 Bad Request (Limit Exceeded)**: The user has hit the maximum limit of 25 active keys. An existing active key must be revoked before creating a new one.\n */\nexport const keyCreate = <ThrowOnError extends boolean = false>(options: Options<KeyCreateData, ThrowOnError>) => (options.client ?? client).post<KeyCreateResponses, KeyCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/keys',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List invites issued by the caller's organization\n *\n * Retrieves a list of all active pending or expired organization invites issued by the caller's organization.\n */\nexport const orgInvitesList = <ThrowOnError extends boolean = false>(options?: Options<OrgInvitesListData, ThrowOnError>) => (options?.client ?? client).get<OrgInvitesListResponses, OrgInvitesListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org/invites',\n ...options\n});\n\n/**\n * Invite an email to join the caller's organization\n *\n * Creates a pending invite for `email` and sends an invite email. Idempotent for an existing pending invite. The invitee accepts after signing in with the invited email.\n */\nexport const orgInviteCreate = <ThrowOnError extends boolean = false>(options?: Options<OrgInviteCreateData, ThrowOnError>) => (options?.client ?? client).post<OrgInviteCreateResponses, OrgInviteCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org/invites',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Start the device authorization grant\n *\n * ### Overview\n * Implements the RFC 8628 (§3.2) device authorization endpoint. It returns a `device_code` (for polling) and a `user_code` with a `verification_uri` for users to approve the client on another device.\n *\n * ### When to Use\n * - Use this endpoint in input-constrained environments (like CLI tools, IoT devices, or headless scripts) where direct web browser redirects are impractical or impossible.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - **Formats**: Accepts both `application/json` and `application/x-www-form-urlencoded` request bodies. The body shape is identical in both encodings.\n *\n * ### Troubleshooting\n * - **400 Bad Request**: The `client_id` is missing, invalid, or does not exist.\n * - **429 Too Many Requests**: Device code request rate has been exceeded.\n */\nexport const oauthDeviceAuthorize = <ThrowOnError extends boolean = false>(options?: Options<OauthDeviceAuthorizeData, ThrowOnError>) => (options?.client ?? client).post<OauthDeviceAuthorizeResponses, OauthDeviceAuthorizeErrors, ThrowOnError>({\n url: '/auth/oauth/device',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get the authenticated user's organization\n *\n * ### Overview\n * Returns the metadata of the organization owned by the authenticated user. In the current version, this represents the user's personal organization space containing all their projects and tokens.\n *\n * ### When to Use\n * - Use this endpoint to retrieve the organization ID and name for display or context setup (e.g., when running `wspc org show` or rendering user dashboards).\n * - Use this to verify that the API token / credentials are linked to a valid organization.\n *\n * ### Constraints\n * - Requires a valid Bearer token (API Key or Session Token) in the `Authorization` header.\n * - In the current API version (v1), every user is automatically provisioned a single personal organization. Selecting or switching organizations is not supported.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The provided Bearer token is missing, expired, or invalid. Verify your `Authorization` header format (`Bearer <token>`).\n * - **403 Forbidden**: The token does not have access to read organization metadata.\n * - **404 Not Found**: The organization associated with this token could not be found or has been deactivated.\n */\nexport const orgGet = <ThrowOnError extends boolean = false>(options?: Options<OrgGetData, ThrowOnError>) => (options?.client ?? client).get<OrgGetResponses, OrgGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org',\n ...options\n});\n\n/**\n * Update the authenticated user's organization\n *\n * ### Overview\n * Updates the metadata (currently, the name) of the organization associated with the authenticated user.\n *\n * ### Constraints\n * - Requires a valid Bearer token.\n * - The organization name cannot be empty or purely whitespace.\n * - Maximum length is capped by `MAX_ORG_NAME_LEN`.\n */\nexport const orgUpdate = <ThrowOnError extends boolean = false>(options?: Options<OrgUpdateData, ThrowOnError>) => (options?.client ?? client).patch<OrgUpdateResponses, OrgUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Get a single invite addressed to the caller\n *\n * Retrieves the metadata of a specific organization invite addressed to the caller by its ID.\n */\nexport const inviteGet = <ThrowOnError extends boolean = false>(options: Options<InviteGetData, ThrowOnError>) => (options.client ?? client).get<InviteGetResponses, InviteGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/invites/{id}',\n ...options\n});\n\n/**\n * Fetch the user identified by the bearer token\n *\n * ### Overview\n * Retrieves the stable identity profile (user ID, email, and optional display name) of the user associated with the active Bearer token. Works for both long-lived `wspc_*` API keys and OAuth access tokens.\n *\n * ### When to Use\n * - Use this endpoint (e.g., in `wspc verify` or `wspc whoami`) to confirm that the active environment's API key or OAuth access token remains valid.\n * - Use it in UIs to display the logged-in user's profile details and retrieve the stable `user_id`.\n *\n * ### Constraints\n * - Requires a valid Bearer token (either a long-lived `wspc_*` API key or a temporary OAuth access token) in the `Authorization` header.\n * - **Response Fields**: The `api_key_id` field is only returned if authenticated via a WSPC API key (prefixed with `wspc_`). OAuth access tokens will omit `api_key_id`. `display_name` is omitted if not configured.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The Bearer token is missing, malformed, or has been revoked. Ensure the `Authorization` header matches the `Bearer <token>` format.\n */\nexport const authMe = <ThrowOnError extends boolean = false>(options?: Options<AuthMeData, ThrowOnError>) => (options?.client ?? client).get<AuthMeResponses, AuthMeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me',\n ...options\n});\n\n/**\n * List invites addressed to the authenticated user's email\n *\n * Retrieves all pending or expired organization invites addressed to the caller's verified email address.\n */\nexport const invitesList = <ThrowOnError extends boolean = false>(options?: Options<InvitesListData, ThrowOnError>) => (options?.client ?? client).get<InvitesListResponses, InvitesListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/invites',\n ...options\n});\n\n/**\n * List members of the authenticated user's organization\n *\n * ### Overview\n * Retrieves a paginated list of all members belonging to the authenticated user's organization, including their basic profile information, emails, and roles.\n *\n * ### When to Use\n * - Use this endpoint to list members in command-line tools (e.g., `wspc org members ls`) or to display a team directory in a user dashboard.\n * - Use this to paginate through large lists of organization members using cursor-based pagination.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - In the current version (v1), organizations are single-user only, meaning this endpoint will always return exactly one member (the caller).\n * - **Pagination**: Supports cursor-based pagination. The `limit` query parameter must be a positive integer, defaulting to 50 and capped at a maximum of 100. Pass `cursor` from the previous response's `next_cursor` to fetch subsequent pages.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The Bearer token is invalid or has expired.\n * - **400 Bad Request**: The query parameters `limit` or `cursor` are malformed. Ensure `limit` is an integer between 1 and 100.\n * - **404 Not Found**: The organization associated with this user was not found.\n */\nexport const orgMembersList = <ThrowOnError extends boolean = false>(options?: Options<OrgMembersListData, ThrowOnError>) => (options?.client ?? client).get<OrgMembersListResponses, OrgMembersListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org/members',\n ...options\n});\n\n/**\n * Discover OAuth 2.1 authorization-server metadata\n *\n * ### Overview\n * Exposes the RFC 8414 OAuth 2.1 authorization server metadata document. This enables clients (like MCP servers, custom GPTs, and SDKs) to dynamically discover authorization, token, registration, device, and revocation endpoints instead of hard-coding them.\n *\n * ### When to Use\n * - Use this endpoint on first boot or setup of any OAuth client. To optimize performance, clients should cache this metadata, as it is highly stable per deployment environment.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - Currently advertises PKCE-only public clients (`token_endpoint_auth_methods_supported: [\"none\"]`, `code_challenge_methods_supported: [\"S256\"]`) and a single `wspc:full` scope.\n *\n * ### Troubleshooting\n * - **500 Internal Server Error**: Constructed endpoint URLs are invalid due to server-side configuration issues.\n */\nexport const oauthMetadata = <ThrowOnError extends boolean = false>(options?: Options<OauthMetadataData, ThrowOnError>) => (options?.client ?? client).get<OauthMetadataResponses, OauthMetadataErrors, ThrowOnError>({ url: '/.well-known/oauth-authorization-server', ...options });\n\n/**\n * Discover OAuth metadata (OIDC discovery alias)\n *\n * ### Overview\n * OIDC discovery alias that returns the **same payload** as `GET /.well-known/oauth-authorization-server` (RFC 8414). WSPC is not an OpenID Connect identity provider — it does not issue ID tokens or expose a `userinfo` endpoint — but several MCP SDKs probe `/.well-known/openid-configuration` before falling back to the RFC 8414 path, so this alias is provided to avoid that fallback round-trip.\n *\n * ### When to Use\n * - Prefer `GET /.well-known/oauth-authorization-server` for new clients. Use this alias only if your client library hard-codes the OIDC discovery path.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - Response is byte-for-byte identical to the RFC 8414 endpoint; OIDC-specific fields (`userinfo_endpoint`, `jwks_uri`, `id_token_signing_alg_values_supported`, …) are intentionally absent.\n */\nexport const oauthMetadataOpenidAlias = <ThrowOnError extends boolean = false>(options?: Options<OauthMetadataOpenidAliasData, ThrowOnError>) => (options?.client ?? client).get<OauthMetadataOpenidAliasResponses, OauthMetadataOpenidAliasErrors, ThrowOnError>({ url: '/.well-known/openid-configuration', ...options });\n\n/**\n * Dynamically register an OAuth client\n *\n * ### Overview\n * Implements RFC 7591 dynamic client registration. This endpoint mints a unique `client_id` for a public OAuth client (e.g., an MCP server or third-party integration), enabling it to initiate OAuth authorization or device flows.\n *\n * ### When to Use\n * - Use this endpoint during the first-run installation or setup of an integration to dynamically generate a client identity. Persist the generated `client_id` for subsequent sessions.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - **Public Clients Only**: WSPC only supports public PKCE clients. Client secrets are not generated or returned.\n * - **Redirect URI Matching**: All `redirect_uris` registered here must match exactly with those requested in the authorization endpoint later.\n *\n * ### Troubleshooting\n * - **400 Bad Request / invalid_client_metadata**: The request body is missing required fields like `client_name` or `redirect_uris`, or provides invalid parameters.\n * - **429 Too Many Requests**: Dynamic registration requests from the requesting IP have exceeded the rate limit.\n */\nexport const oauthClientRegister = <ThrowOnError extends boolean = false>(options?: Options<OauthClientRegisterData, ThrowOnError>) => (options?.client ?? client).post<OauthClientRegisterResponses, OauthClientRegisterErrors, ThrowOnError>({\n url: '/auth/oauth/register',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Reject an invite\n *\n * Rejects an organization invite addressed to the caller. The invite will be marked as rejected.\n */\nexport const inviteReject = <ThrowOnError extends boolean = false>(options: Options<InviteRejectData, ThrowOnError>) => (options.client ?? client).post<InviteRejectResponses, InviteRejectErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/invites/{id}/reject',\n ...options\n});\n\n/**\n * Remove a member from the organization\n *\n * ### Overview\n * Removes a member from the authenticated user's organization by their user ID, restoring their original organization ID if applicable.\n *\n * ### Constraints\n * - Requires a valid Bearer token.\n * - Cannot remove the organization creator/owner.\n */\nexport const orgMemberRemove = <ThrowOnError extends boolean = false>(options: Options<OrgMemberRemoveData, ThrowOnError>) => (options.client ?? client).delete<OrgMemberRemoveResponses, OrgMemberRemoveErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org/members/{id}',\n ...options\n});\n\n/**\n * Request an email magic code\n *\n * ### Overview\n * Initiates the passwordless email magic-code authentication flow by sending a short, time-limited numeric verification code to the specified email address.\n *\n * ### When to Use\n * - Use this endpoint as the first step of the CLI login flow (`wspc login`) or any interactive UI where the user initiates authentication by inputting their email address.\n * - Pair this request with `POST /auth/verify-code` once the user retrieves the code from their inbox.\n *\n * ### Constraints\n * - Does not require authentication (public endpoint).\n * - **Security**: The same HTTP 200 response structure is returned regardless of whether the email address is already registered or not. This is an intentional security design to prevent account-existence disclosure (email harvesting).\n * - **Rate Limiting**: This endpoint enforces strict rate limits based on both the requesting IP address and the target email address to prevent abuse. Too many consecutive requests will result in a `RATE_LIMITED` error.\n *\n * ### Troubleshooting\n * - **429 Too Many Requests**: The requesting IP or target email has exceeded the allowable request rate. Wait a few minutes before trying again.\n * - **400 Bad Request**: The `email` payload is malformed or invalid. Verify that the email matches basic email formats.\n */\nexport const authRequestCode = <ThrowOnError extends boolean = false>(options?: Options<AuthRequestCodeData, ThrowOnError>) => (options?.client ?? client).post<AuthRequestCodeResponses, AuthRequestCodeErrors, ThrowOnError>({\n url: '/auth/request-code',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Soft-revoke an API key\n *\n * ### Overview\n * Permanently revokes an active API key by its unique ID. Once revoked, the key becomes immediately invalid and will be rejected by all services.\n *\n * ### When to Use\n * - Use this endpoint to permanently deactivate an API key (e.g., when running `wspc keys revoke <id>`) due to token rotation, key leakage, or decommissioning of a machine/service.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Revocation is permanent and cannot be undone.\n * - A user can revoke any key they own, including the one they are currently using to make the call. If they revoke the current key, subsequent requests using that key will return `401 Unauthorized`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: The active token is missing, expired, or invalid.\n * - **404 Not Found**: The specified key ID does not exist, belongs to another user, or has already been revoked.\n * - **400 Bad Request**: The `id` path parameter format is invalid. It must be in the format `key_<ULID>`.\n */\nexport const keyRevoke = <ThrowOnError extends boolean = false>(options: Options<KeyRevokeData, ThrowOnError>) => (options.client ?? client).delete<KeyRevokeResponses, KeyRevokeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/keys/{id}',\n ...options\n});\n\n/**\n * Update an active API key's label\n *\n * ### Overview\n * Updates the human-readable label of an active API key. Only active (non-revoked) keys owned by the authenticated user can be updated.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Label Validation**: The `label` parameter must be between 1 and 60 characters after trimming whitespace. Failing to provide a valid label results in an `INVALID_LABEL` error.\n */\nexport const keyUpdate = <ThrowOnError extends boolean = false>(options: Options<KeyUpdateData, ThrowOnError>) => (options.client ?? client).patch<KeyUpdateResponses, KeyUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/keys/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Revoke an access or refresh token\n *\n * ### Overview\n * Implements the RFC 7009 token revocation endpoint. It immediately and permanently invalidates a specific access or refresh token.\n *\n * ### When to Use\n * - When the user signs out of an OAuth-enabled client, or when the client detects a token leak. Always preferred over letting tokens expire naturally.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - **Privacy & Security**: To prevent token scanning/validation attacks, the server always returns a 200 OK with an empty object, regardless of whether the token actually existed. Do not infer token existence from the response status.\n *\n * ### Troubleshooting\n * - **400 Bad Request / invalid_request**: The `token` parameter is missing from the payload.\n */\nexport const oauthTokenRevoke = <ThrowOnError extends boolean = false>(options?: Options<OauthTokenRevokeData, ThrowOnError>) => (options?.client ?? client).post<OauthTokenRevokeResponses, OauthTokenRevokeErrors, ThrowOnError>({\n url: '/auth/oauth/revoke',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Revoke a pending invite\n *\n * Permanently revokes a pending organization invite. The invitee will no longer be able to accept it.\n */\nexport const orgInviteRevoke = <ThrowOnError extends boolean = false>(options: Options<OrgInviteRevokeData, ThrowOnError>) => (options.client ?? client).delete<OrgInviteRevokeResponses, OrgInviteRevokeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/auth/me/org/invites/{id}',\n ...options\n});\n\n/**\n * Exchange a grant for an access token\n *\n * ### Overview\n * Implements the RFC 6749 OAuth 2.0 token endpoint. It processes token requests for three grant types: `authorization_code` (with PKCE), `refresh_token`, and `urn:ietf:params:oauth:grant-type:device_code` (device flow), issuing an access token and a rotated refresh token upon success.\n *\n * ### When to Use\n * - Use this endpoint to redeem a temporary code or device code for a fresh token pair once the user has approved authentication.\n * - Use this endpoint to rotate and refresh an expiring access token using a refresh token.\n *\n * ### Constraints\n * - Public endpoint (no authentication required).\n * - **Refresh Token Rotation**: Old refresh tokens are invalidated immediately upon exchange, and a fresh refresh token is issued.\n * - **PKCE**: For the `authorization_code` grant, a valid `code_verifier` matching the original `code_challenge` must be provided.\n *\n * ### Troubleshooting\n * - **400 Bad Request / invalid_grant**: The authorization code, refresh token, or device code is expired, invalid, or belongs to a different client.\n * - **400 Bad Request / authorization_pending**: Returned when polling for a device code that has not yet been approved by the user. Do not stop polling, but adhere to the polling interval.\n * - **400 Bad Request / slow_down**: Returned when polling the device code faster than the negotiated `interval`. Reduce polling frequency.\n */\nexport const oauthTokenExchange = <ThrowOnError extends boolean = false>(options?: Options<OauthTokenExchangeData, ThrowOnError>) => (options?.client ?? client).post<OauthTokenExchangeResponses, OauthTokenExchangeErrors, ThrowOnError>({\n url: '/auth/oauth/token',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Verify a magic code and issue an API key\n *\n * ### Overview\n * Completes the passwordless login flow by verifying the magic code received via email. If the code is correct, it registers a new user (if not already registered) and issues a long-lived WSPC API key.\n *\n * ### When to Use\n * - Use this endpoint as the second step of the login flow, exchanging the user-provided code and email address for a valid credential.\n * - Store the returned `api_key` securely client-side to authorize subsequent calls to all WSPC services.\n *\n * ### Constraints\n * - Does not require authentication (public endpoint).\n * - **One-time Use & Expiry**: The verification code is single-use and expires after a short period (typically a few minutes). Re-using a code or attempting to guess code values results in `INVALID_CODE` or `CODE_EXPIRED`.\n * - **Account Creation**: If the email address is not linked to an existing account, a new user profile and personal organization are automatically provisioned (`created: true` in response).\n *\n * ### Troubleshooting\n * - **400 Bad Request**: The code has expired (`CODE_EXPIRED`), is incorrect (`INVALID_CODE`), or has already been used. Request a fresh code via `POST /auth/request-code`.\n * - **429 Too Many Requests**: The rate limit for verification attempts on this email address has been exceeded.\n */\nexport const authVerifyCode = <ThrowOnError extends boolean = false>(options?: Options<AuthVerifyCodeData, ThrowOnError>) => (options?.client ?? client).post<AuthVerifyCodeResponses, AuthVerifyCodeErrors, ThrowOnError>({\n url: '/auth/verify-code',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List calendar events\n *\n * ### Overview\n * Return the authenticated user's events, ordered by `start` ascending, with cursor pagination.\n *\n * ### When to Use\n * Render calendar list/grid views, search for specific terms using full-text search, query events within a specific time window, or retrieve historically past events.\n *\n * ### Constraints\n * - **Default Visibility**: By default, soft-deleted events and past events (events where `end` is before the current time) are automatically hidden.\n * - **Time Bounds Override**: Supplying any explicit time bound query parameter (`start_from`, `start_to`, `end_from`, `end_to`) or passing `include_past=true` overrides and disables the implicit past filter.\n * - **Search Scope**: `q` performs a case-insensitive substring search across `title`, `description`, and `location`.\n * - **Pagination**: The `limit` query parameter is clamped to `[1, 200]`; cursor pagination is enabled via the opaque `cursor` parameter.\n *\n * ### Troubleshooting\n * - Returns 400 `VALIDATION_ERROR` if date query bounds are invalid (e.g. `start_from > start_to` or `end_from > end_to`).\n */\nexport const eventList = <ThrowOnError extends boolean = false>(options?: Options<EventListData, ThrowOnError>) => (options?.client ?? client).get<EventListResponses, EventListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events',\n ...options\n});\n\n/**\n * Schedule a calendar event\n *\n * ### Overview\n * Create a new calendar event owned by the authenticated user.\n *\n * ### When to Use\n * Book a meeting, lunch, all-day trip, or any time-bound item. Optionally provide `attendees` to automatically dispatch invitation emails containing an `.ics` REQUEST attachment to each participant as a side effect.\n *\n * ### Constraints\n * - **Format Integrity**: `start` and `end` must be of the exact same type (both ISO 8601 datetimes with offset, or both ISO date-only for all-day).\n * - **Chronological Order**: `end` must be strictly after `start`.\n * - **All-Day boundary**: All-day events use RFC 5545 exclusive end (e.g., a one-day event on June 1st is specified as `start=2026-06-01` and `end=2026-06-02`).\n * - **Attendee Limit**: Up to 50 unique attendees are supported after case-insensitive email address deduplication.\n *\n * ### Troubleshooting\n * - Returns 400 `VALIDATION_ERROR` if `start` and `end` format mismatch, or if `end <= start`.\n * - Returns 400 `ATTENDEE_LIMIT_EXCEEDED` if more than 50 unique attendees are supplied.\n * - Invitation emails are processed and dispatched asynchronously via Cloudflare `waitUntil`; the analytics counter `event_created` is emitted automatically.\n */\nexport const eventCreate = <ThrowOnError extends boolean = false>(options?: Options<EventCreateData, ThrowOnError>) => (options?.client ?? client).post<EventCreateResponses, EventCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Soft-delete a calendar event\n *\n * ### Overview\n * Soft-delete an existing calendar event, hiding it from default listings.\n *\n * ### When to Use\n * Remove an event entirely from the user's historical view and calendar client. If the meeting was cancelled but should remain in history (notifying participants of cancellation), use `PATCH /calendar/events/{id}` with `status: cancelled` instead.\n *\n * ### Constraints\n * - **Optimistic Locking**: Supports optional optimistic locking via `expected_version` in the request body.\n * - **Side Effects**: When soft-deleting an event with attendees, all participants will asynchronously receive a cancellation email containing an `.ics` CANCEL attachment via Cloudflare `waitUntil`.\n * - **Recovery**: The record is preserved in the database as a soft-deleted row and can be brought back using `POST /calendar/events/{id}/restore`.\n *\n * ### Troubleshooting\n * - Returns 404 `NOT_FOUND` if the event does not exist, or has already been soft-deleted.\n * - Returns 409 `VERSION_CONFLICT` if `expected_version` does not match the database value.\n */\nexport const eventDelete = <ThrowOnError extends boolean = false>(options: Options<EventDeleteData, ThrowOnError>) => (options.client ?? client).delete<EventDeleteResponses, EventDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get a calendar event by id\n *\n * ### Overview\n * Fetch a single calendar event by its unique ID, returning the complete record including all attendees.\n *\n * ### When to Use\n * Display a detailed view of an event, or read the latest database state (capturing `version`) prior to executing an optimistic-locked PATCH update.\n *\n * ### Constraints\n * - **Deleted Events**: Soft-deleted events return 404 `NOT_FOUND` by default. You must explicitly pass `include_deleted=true` in the query parameters to retrieve a soft-deleted row.\n * - **ICS Format**: To download the RFC 5545 iCalendar text representation of this event, use `GET /calendar/events/{id}.ics` instead.\n *\n * ### Troubleshooting\n * - Returns 404 `NOT_FOUND` if the event does not exist, is soft-deleted (without `include_deleted=true`), or is owned by another user.\n */\nexport const eventGet = <ThrowOnError extends boolean = false>(options: Options<EventGetData, ThrowOnError>) => (options.client ?? client).get<EventGetResponses, EventGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events/{id}',\n ...options\n});\n\n/**\n * Update a calendar event\n *\n * ### Overview\n * Partially update fields of an existing calendar event. All properties in the request body are optional.\n *\n * ### When to Use\n * Reschedule an event, update its location or notes, cancel the meeting (retaining the record but notifying participants), or replace/update the attendee list.\n *\n * ### Constraints\n * - **Optimistic Locking**: Pass `expected_version` to fail with `VERSION_CONFLICT` if another mutation occurred concurrently since you last read. Omit to let the server force the update.\n * - **Field Clearing**: Pass an empty string `\"\"` for `description`, `location`, or `url` to clear those fields in the database.\n * - **Attendee replacement**: Providing the `attendees` property fully REPLACES the existing participant list. The server automatically diffs participants and asynchronously sends invitations (for newly added), updates (for kept), or cancellations (for removed) via Cloudflare `waitUntil`.\n * - **Validation Rules**: Mismatched start/end formats or chronological order violations will fail the request.\n * - **Attendee Limit**: A maximum of 50 unique attendees is allowed.\n *\n * ### Troubleshooting\n * - Returns 404 `NOT_FOUND` if the event does not exist or is soft-deleted.\n * - Returns 409 `VERSION_CONFLICT` if `expected_version` is provided but stale.\n * - Returns 400 `VALIDATION_ERROR` if `start` and `end` kinds do not match, or if `end <= start`.\n * - Returns 400 `ATTENDEE_LIMIT_EXCEEDED` if unique attendees exceed 50.\n */\nexport const eventUpdate = <ThrowOnError extends boolean = false>(options: Options<EventUpdateData, ThrowOnError>) => (options.client ?? client).patch<EventUpdateResponses, EventUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Download event as `.ics`\n *\n * ### Overview\n * Return a single event rendered as an RFC 5545 `.ics` file suitable for import into major calendar clients.\n *\n * ### When to Use\n * Expose a 'Save to my calendar' link in email notifications, show a download button in a UI, or programmatically forward raw iCalendar text to third parties.\n *\n * ### Constraints\n * - **Router Match**: The path parameter `filename` must be exactly `<event_id>.ics`. The `.ics` suffix is strictly required for the router to match this endpoint ahead of the JSON detail endpoint.\n * - **Response Payload**: The response is plain text containing the iCalendar specification, NOT JSON. The `Content-Type` is set to `text/calendar; charset=utf-8` with `Content-Disposition: inline; filename=\"<event_id>.ics\"`.\n * - **Authentication**: Standard authentication is required (Bearer API key or OAuth access token), as this endpoint is secure.\n *\n * ### Troubleshooting\n * - Returns 404 `NOT_FOUND` if the event does not exist, is soft-deleted, or is owned by another user.\n */\nexport const eventIcsDownload = <ThrowOnError extends boolean = false>(options: Options<EventIcsDownloadData, ThrowOnError>) => (options.client ?? client).get<EventIcsDownloadResponses, EventIcsDownloadErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events/{filename}',\n ...options\n});\n\n/**\n * Restore a soft-deleted event\n *\n * ### Overview\n * Restore a previously soft-deleted calendar event, making it active and visible in default list queries.\n *\n * ### When to Use\n * Recover an event that was accidentally soft-deleted.\n *\n * ### Constraints\n * - **Optimistic Locking**: Supports optional optimistic locking via `expected_version` in the request body.\n * - **Side Effects**: When restoring an event with attendees, all participants will asynchronously receive a new invitation email containing an `.ics` REQUEST attachment via Cloudflare `waitUntil`.\n * - **State Integrity**: You cannot restore a live (non-deleted) event. Restoring a live event is treated as an error.\n *\n * ### Troubleshooting\n * - Returns 404 `NOT_FOUND` if the event does not exist, or is NOT currently soft-deleted.\n * - Returns 409 `VERSION_CONFLICT` if `expected_version` does not match the database value.\n */\nexport const eventRestore = <ThrowOnError extends boolean = false>(options: Options<EventRestoreData, ThrowOnError>) => (options.client ?? client).post<EventRestoreResponses, EventRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/events/{id}/restore',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List the caller's aliases\n *\n * ### Overview\n * Retrieves a list of all email receiving aliases owned by the authenticated user.\n *\n * ### When to Use\n * - Use this endpoint to render an alias directory in user profiles or to provide a selection list of verified sender aliases in an email compose interface.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - By default, only active receiving aliases are returned. Pass `include_deleted=true` in the query to also fetch soft-deleted aliases (which have `deleted_at` timestamps set).\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Active token is missing, expired, or invalid.\n */\nexport const emailAliasList = <ThrowOnError extends boolean = false>(options?: Options<EmailAliasListData, ThrowOnError>) => (options?.client ?? client).get<EmailAliasListResponses, EmailAliasListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/aliases',\n ...options\n});\n\n/**\n * Create a receiving alias\n *\n * ### Overview\n * Reserves and provisions a new passwordless/disposable receiving email alias address under the configured WSPC domain or a fully verified organization custom domain. All inbound emails received on this alias will be forwarded into the caller's inbox.\n *\n * ### When to Use\n * - Use this endpoint to spin up a fresh, dedicated email address (e.g., `alice-shop@wspc.app`) for specific websites, newsletters, or contexts to prevent spam or categorize incoming mail.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Alias Formatting**: The local part must be between 5 and 32 characters, start with an alphanumeric character, and only contain letters, numbers, dots, underscores, and hyphens.\n * - **Custom Domains**: If the address uses a non-platform host, that domain must be registered to the caller's organization and have `status = verified`, `sending_status = verified`, and `receiving_status = verified`.\n * - **Limit Check**: Each user is allowed a maximum of 10 active email aliases. Soft-deleted aliases do not count against this quota limit.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Bearer token is missing, invalid, or expired.\n * - **400 Bad Request / INVALID_CHARSET / RESERVED**: The alias local part contains invalid characters, is too short/long, or matches a reserved keyword.\n * - **400 Bad Request / DOMAIN_NOT_FOUND**: The custom domain is not registered to the caller's organization.\n * - **400 Bad Request / UNVERIFIED_DOMAIN**: The custom domain exists but is not verified yet.\n * - **400 Bad Request / CUSTOM_DOMAIN_NOT_READY**: The custom domain exists but has not completed sending or receiving verification.\n * - **409 Conflict / ALIAS_CONFLICT**: An alias with the exact requested email address already exists globally (whether active or soft-deleted by any user).\n * - **429 Too Many Requests / ALIAS_LIMIT_EXCEEDED**: The user has reached the active alias cap limit of 10. A previously deleted alias must be cleaned up or wait for quota availability.\n */\nexport const emailAliasCreate = <ThrowOnError extends boolean = false>(options: Options<EmailAliasCreateData, ThrowOnError>) => (options.client ?? client).post<EmailAliasCreateResponses, EmailAliasCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/aliases',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List cached custom domains\n *\n * ### Overview\n * Returns the caller organization's cached custom email domains from D1. This route does not call the upstream provider.\n *\n * ### When to Use\n * - Use this to render an admin view of all registered domains and their latest known verification state.\n * - Use it to inspect DNS records that were previously fetched during create or verify operations.\n * - The cached state includes DNS ownership, sending readiness, and receiving readiness used by custom-domain alias creation.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Results are scoped to the caller organization and sorted newest-first by creation time.\n */\nexport const emailDomainList = <ThrowOnError extends boolean = false>(options?: Options<EmailDomainListData, ThrowOnError>) => (options?.client ?? client).get<EmailDomainListResponses, EmailDomainListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/domains',\n ...options\n});\n\n/**\n * Register a custom email domain\n *\n * ### Overview\n * Registers a new organization-owned custom email domain with the upstream provider and caches the returned DNS verification records in D1.\n *\n * ### When to Use\n * - Use this endpoint when onboarding a new custom email domain such as `mail.example.com`.\n * - The response contains the DNS records the organization must publish before the domain can be verified.\n * - This route registers the domain and returns DNS records. Custom-domain aliases require `status`, `sending_status`, and `receiving_status` to all be `verified`.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Domain ownership is globally unique across the platform. Once any organization has reserved a domain, another org cannot register it.\n * - This route requires custom domain provider credentials in production because it performs a live provider registration call.\n *\n * ### Troubleshooting\n * - **400 Bad Request / DOMAIN_INVALID / DOMAIN_RESERVED**: The hostname is malformed or belongs to the platform (`wspc.app`, `wspc.ai`, or their subdomains).\n * - **409 Conflict / DOMAIN_CONFLICT**: The domain is already registered by some organization.\n * - **502 Bad Gateway / DOMAIN_PROVIDER_ERROR**: The upstream provider request failed, timed out, or returned an unexpected shape.\n */\nexport const emailDomainCreate = <ThrowOnError extends boolean = false>(options: Options<EmailDomainCreateData, ThrowOnError>) => (options.client ?? client).post<EmailDomainCreateResponses, EmailDomainCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/domains',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Soft-delete an alias\n *\n * ### Overview\n * Soft-deletes a specific active email receiving alias owned by the caller. Once soft-deleted, the alias stops accepting and forwarding any new inbound emails.\n *\n * ### When to Use\n * - Use this endpoint when decommissioning a disposable alias address that is no longer needed or is receiving excessive spam.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Data Retention**: Soft-deletion is immediate. Inbound mail forwarding stops, but historical emails previously received on this alias remain fully readable in the inbox.\n * - **Restoration**: The alias remains globally reserved and cannot be created fresh by anyone; use `POST /email/aliases/{email}/restore` to reactivate.\n * - **Path Parameter**: The `@` character in the `{email}` path parameter must be URL-encoded as `%40`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Missing or invalid token.\n * - **404 Not Found**: No active alias with this exact address was found for the authenticated user, or the alias is already deleted.\n */\nexport const emailAliasDelete = <ThrowOnError extends boolean = false>(options: Options<EmailAliasDeleteData, ThrowOnError>) => (options.client ?? client).delete<EmailAliasDeleteResponses, EmailAliasDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/aliases/{email}',\n ...options\n});\n\n/**\n * Soft-delete inbound emails\n *\n * ### Overview\n * Soft-deletes a batch of inbound emails, moving them to the trash. Soft-deleted emails are immediately excluded from default inbox lists.\n *\n * ### When to Use\n * - Use this endpoint to trash one or more email messages from a user's inbox view.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Accepts 1 to 100 email IDs per call.\n * - Deletion is fully reversible: soft-deleted rows persist in the database and can be undeleted using the restore endpoint.\n * - **Data Cleanup**: Out-of-band background processes eventually purge associated raw MIME source payloads and attachment bytes from R2; deletion does not immediately free storage.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Invalid Bearer token.\n * - **400 Bad Request**: The request body is malformed or exceeds the maximum limit of 100 IDs.\n */\nexport const emailDelete = <ThrowOnError extends boolean = false>(options: Options<EmailDeleteData, ThrowOnError>) => (options.client ?? client).post<EmailDeleteResponses, EmailDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/delete',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Download an attachment by index\n *\n * ### Overview\n * Streams the raw decoded bytes of a parsed attachment belonging to an inbound email. The response body is binary data instead of JSON.\n *\n * ### When to Use\n * - Use this endpoint when a user clicks to download a file attachment (such as an invoice PDF or image) or when an automated agent needs to process a file payload.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Response Headers**: The server sets the HTTP `Content-Type` matching the attachment's parsed MIME format and provides a `Content-Disposition: attachment; filename=\"<filename>\"` header.\n * - **Soft-Deleted Parents**: Downloading files from soft-deleted emails is blocked with a 404 error, unless the query parameter `include_deleted=true` is provided.\n * - **Path Parameter**: The `{idx}` must be a valid 0-based integer index pointing to the attachment list metadata.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Invalid Bearer token.\n * - **404 Not Found / EMAIL_NOT_FOUND**: The specified email ID does not exist or belongs to another user.\n * - **404 Not Found / ATTACHMENT_NOT_FOUND**: The index `{idx}` is out of range for the email's attachment array.\n */\nexport const emailAttachmentGet = <ThrowOnError extends boolean = false>(options: Options<EmailAttachmentGetData, ThrowOnError>) => (options.client ?? client).get<EmailAttachmentGetResponses, EmailAttachmentGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/{id}/attachments/{idx}',\n ...options\n});\n\n/**\n * Get one cached custom domain\n *\n * ### Overview\n * Returns the caller organization's cached state for one custom email domain. This is a pure D1 read and never calls the upstream provider.\n *\n * ### When to Use\n * - Use this to inspect the latest cached DNS records or verification status for a single domain.\n * - This cached view includes ownership, sending readiness, and receiving readiness state for custom-domain alias decisions.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - The `{domain}` path parameter is normalized and validated server-side before lookup.\n *\n * ### Troubleshooting\n * - **400 Bad Request / DOMAIN_INVALID / DOMAIN_RESERVED**: The path hostname is malformed or reserved.\n * - **404 Not Found / DOMAIN_NOT_FOUND**: The domain does not exist or belongs to another organization.\n */\nexport const emailDomainGet = <ThrowOnError extends boolean = false>(options: Options<EmailDomainGetData, ThrowOnError>) => (options.client ?? client).get<EmailDomainGetResponses, EmailDomainGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/domains/{domain}',\n ...options\n});\n\n/**\n * Get an inbound email by id\n *\n * ### Overview\n * Fetches the metadata and plain-text body of a single inbound email by its unique ID. It also returns metadata for all associated attachments and optionally resolves the rendered HTML content.\n *\n * ### When to Use\n * - Use this endpoint to display the complete detail view of an email message.\n * - Use it to extract attachment files or read complex HTML layouts.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **R2 HTML Read**: The HTML body is stored in Object Storage (R2). To fetch it, explicitly pass `include_html=true` (this incurs an extra R2 read charge; leave unset if only plain text is needed).\n * - Returns a 404 error if the email has been soft-deleted, unless `include_deleted=true` is set.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Missing or expired token.\n * - **404 Not Found**: The specified email ID does not exist, belongs to another user, or has been soft-deleted (without `include_deleted=true`).\n */\nexport const emailGet = <ThrowOnError extends boolean = false>(options: Options<EmailGetData, ThrowOnError>) => (options.client ?? client).get<EmailGetResponses, EmailGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/{id}',\n ...options\n});\n\n/**\n * List inbound emails\n *\n * ### Overview\n * Retrieves a paginated directory list of all inbound emails received by the user's active aliases, sorted in descending order of ingestion time (newest first).\n *\n * ### When to Use\n * - Use this endpoint to render mailbox dashboards or inbox streams.\n * - Use query parameters to perform incremental syncs (via `since` timestamp) or to filter incoming mail by read state or target alias email.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Pagination**: Supports cursor-based pagination. Pass the returned `next_cursor` value back as the `cursor` query parameter to list subsequent pages. The `limit` is capped between 1 and 100, defaulting to 20.\n * - By default, soft-deleted emails are hidden. Pass `include_deleted=true` to retrieve them.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Missing, invalid, or expired Bearer token.\n * - **400 Bad Request**: Malformed pagination cursor or invalid query parameters (e.g., non-integer limit).\n */\nexport const emailList = <ThrowOnError extends boolean = false>(options?: Options<EmailListData, ThrowOnError>) => (options?.client ?? client).get<EmailListResponses, EmailListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages',\n ...options\n});\n\n/**\n * Mark inbound emails as read\n *\n * ### Overview\n * Marks a batch of inbound emails as read. This batch operation is fully idempotent.\n *\n * ### When to Use\n * - Use this endpoint when a user opens an email detail view or performs a bulk mark-read action in an inbox dashboard.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Accepts 1 to 100 email IDs in a single call.\n * - **Idempotency**: Already-read IDs are silently processed without generating errors but do not count toward the returned `marked` value. Missing, unauthorized, or soft-deleted IDs will be logged in `not_found`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Invalid or missing Bearer token.\n * - **400 Bad Request**: The request body is malformed or exceeds the maximum limit of 100 IDs.\n */\nexport const emailMarkRead = <ThrowOnError extends boolean = false>(options: Options<EmailMarkReadData, ThrowOnError>) => (options.client ?? client).post<EmailMarkReadResponses, EmailMarkReadErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/read',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Mark inbound emails as unread\n *\n * ### Overview\n * Resets a batch of inbound emails back to an unread state.\n *\n * ### When to Use\n * - Use this endpoint to undo an accidental read marking or to mark messages for later review.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Accepts 1 to 100 email IDs per call. Already-unread IDs are silently ignored but do not contribute to `marked`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Invalid Bearer token.\n * - **400 Bad Request**: Malformed body or ID batch size limit exceeded.\n */\nexport const emailMarkUnread = <ThrowOnError extends boolean = false>(options: Options<EmailMarkUnreadData, ThrowOnError>) => (options.client ?? client).post<EmailMarkUnreadResponses, EmailMarkUnreadErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/unread',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Restore a soft-deleted alias\n *\n * ### Overview\n * Reactivates a previously soft-deleted email receiving alias, immediately resuming mail forwarding to the user's inbox.\n *\n * ### When to Use\n * - Use this endpoint to re-enable a temporarily disabled alias or to recover one that was deleted by mistake.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Quota Check**: Reactivating an alias increases the active alias count towards the user's maximum quota of 10 active aliases. If the limit is exceeded, a `429 ALIAS_LIMIT_EXCEEDED` error is returned.\n * - **Path Parameter**: The `@` character in the path parameter must be URL-encoded as `%40`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Missing or invalid token.\n * - **404 Not Found**: No soft-deleted alias with this exact address was found for the authenticated user.\n * - **429 Too Many Requests / ALIAS_LIMIT_EXCEEDED**: Reactivating this alias would exceed the per-user limit of 10 active aliases.\n */\nexport const emailAliasRestore = <ThrowOnError extends boolean = false>(options: Options<EmailAliasRestoreData, ThrowOnError>) => (options.client ?? client).post<EmailAliasRestoreResponses, EmailAliasRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/aliases/{email}/restore',\n ...options\n});\n\n/**\n * Restore soft-deleted inbound emails\n *\n * ### Overview\n * Restores a batch of soft-deleted inbound emails from the trash, making them reappear in standard inbox lists.\n *\n * ### When to Use\n * - Use this endpoint to recover email messages that were trashed by mistake.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - Accepts 1 to 100 email IDs. Already-active IDs are silently ignored.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Invalid token.\n * - **400 Bad Request**: Malformed request or batch limit exceeded.\n */\nexport const emailRestore = <ThrowOnError extends boolean = false>(options: Options<EmailRestoreData, ThrowOnError>) => (options.client ?? client).post<EmailRestoreResponses, EmailRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/restore',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Send an outbound email\n *\n * ### Overview\n * Submits a single outbound email for delivery from one of the caller's active aliases. All details, including attachments (inline base64 blobs or references to existing inbound attachments), are verified before sending. Platform-domain aliases use Cloudflare Email Service; verified custom-domain aliases use pete-mail.\n *\n * ### When to Use\n * - Use this endpoint to send new standalone emails or to reply to threaded inbound messages.\n * - Use this in automated agent pipelines (like calendar invite generation or notifications) and CLI email send utilities.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - **Size Limits**: Individual attachments must not exceed 5 MiB, and the total size of all attachments per send must be 25 MiB or less.\n * - **Security**: Up to 10 attachments are allowed. Outbound files with dangerous executable extensions (such as `.exe`, `.bat`, `.com`, `.scr`, `.cmd`, `.jar`, `.js`) are strictly blocked.\n * - **Daily Quotas**: Sending is protected by per-user (100 sends/day) and per-alias (50 sends/day) daily quotas. Exceeding them triggers `RATE_LIMITED` or `QUOTA_EXCEEDED` errors.\n * - **Custom Domains**: Platform-domain aliases use Cloudflare Email Service. Verified custom-domain aliases are routed through pete-mail. Custom domains must have `status = verified` and `sending_status = verified` or the send returns `CUSTOM_DOMAIN_NOT_READY`.\n * - **Idempotency**: A stable `idempotency_key` (1-200 characters) must be supplied. Retrying a send with identical content and the same key returns `idempotent_replay: true` without sending duplicates. Reusing the key with changed content returns 409 `IDEMPOTENCY_KEY_REUSED`.\n *\n * ### Troubleshooting\n * - **401 Unauthorized**: Active Bearer token is invalid or has expired.\n * - **404 Not Found**: The requested `from_alias_email` does not exist or has been soft-deleted, or the referenced `in_reply_to_email_id` is missing or belongs to a different user.\n * - **409 Conflict / IDEMPOTENCY_KEY_REUSED**: An identical `idempotency_key` was reused with modified request payload. Use a fresh unique key.\n * - **409 Conflict / CUSTOM_DOMAIN_NOT_READY**: The sender uses a custom domain that has not completed outbound sending verification.\n * - **429 Too Many Requests / RATE_LIMITED**: The per-user rate limit or daily sending quota has been exceeded. Wait for quota reset.\n * - **502 Bad Gateway**: The upstream outbound provider failed or rejected the message. The outbound row is persisted with `status: failed` along with provider-returned logs.\n */\nexport const emailSend = <ThrowOnError extends boolean = false>(options: Options<EmailSendData, ThrowOnError>) => (options.client ?? client).post<EmailSendResponses, EmailSendErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/messages/send',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Verify a custom domain with the provider\n *\n * ### Overview\n * Triggers an upstream provider verification attempt for one custom email domain, refreshes the cached DNS records/status in D1, and returns the updated row.\n * This route refreshes DNS registration and verification state. Custom-domain aliases require `status`, `sending_status`, and `receiving_status` to all be `verified`.\n *\n * ### When to Use\n * - Use this after publishing the required DNS records, or whenever you want to refresh cached provider state explicitly.\n * - If the provider verify call returns incomplete DNS records, the worker performs a follow-up provider read before responding.\n *\n * ### Constraints\n * - Requires a valid Bearer token in the `Authorization` header.\n * - This route requires custom domain provider credentials in production because it performs live provider calls.\n * - Verification is asynchronous provider work; a successful response may still report `status: pending`.\n * - `status: verified` plus `sending_status: verified` enables custom-domain outbound send for active aliases; `receiving_status: verified` is also required before new custom-domain aliases can be created.\n *\n * ### Troubleshooting\n * - **400 Bad Request / DOMAIN_INVALID / DOMAIN_RESERVED**: The path hostname is malformed or reserved.\n * - **404 Not Found / DOMAIN_NOT_FOUND**: The domain does not exist or belongs to another organization.\n * - **502 Bad Gateway / DOMAIN_PROVIDER_ERROR**: Provider verification failed, timed out, or credentials are missing.\n */\nexport const emailDomainVerify = <ThrowOnError extends boolean = false>(options: Options<EmailDomainVerifyData, ThrowOnError>) => (options.client ?? client).post<EmailDomainVerifyResponses, EmailDomainVerifyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/email/domains/{domain}/verify',\n ...options\n});\n\n/**\n * Remove a push transport\n *\n * ### Overview\n * Delete the configured push transport row, immediately halting push event dispatching for the caller.\n *\n * ### When to Use\n * When a user disconnects their notification channel, turns off push preferences, or resets their transport target.\n *\n * ### Constraints\n * - **Idempotency**: Deleting a transport that has not been registered (or was already deleted) is handled as a no-op, returning 204 `No Content`.\n * - **Side Effects**: Hard-deletes the `(user_id, transport)` configuration record and completely purges all associated test history (`last_test_at` and `last_test_status`).\n * - **Transport Support**: The path parameter must be a recognized transport identifier.\n *\n * ### Troubleshooting\n * - Returns 400 `UNKNOWN_TRANSPORT` if the transport parameter contains an unrecognized transport identifier.\n */\nexport const pushConfigDelete = <ThrowOnError extends boolean = false>(options: Options<PushConfigDeleteData, ThrowOnError>) => (options.client ?? client).delete<PushConfigDeleteResponses, PushConfigDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/push/config/{transport}',\n ...options\n});\n\n/**\n * List the caller's push transports\n *\n * ### Overview\n * Retrieve all active push transport configurations registered for the authenticated user.\n *\n * ### When to Use\n * Render settings page, determine if push notifications are enabled before prompting the user, or fetch historical health check results (`last_test_at` and `last_test_status`).\n *\n * ### Constraints\n * - **List Limitations**: Currently returns at most one active registration row (`telegram`).\n * - **Data Security**: Response payload contains sensitive data (e.g. `target_bot_username`). Callers must handle these values as user secret-equivalent and prevent leakage.\n *\n * ### Troubleshooting\n * - Standard 401 Unauthorized or 403 Forbidden checks if authentication credentials are missing or invalid.\n */\nexport const pushConfigGet = <ThrowOnError extends boolean = false>(options?: Options<PushConfigGetData, ThrowOnError>) => (options?.client ?? client).get<PushConfigGetResponses, PushConfigGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/push/config',\n ...options\n});\n\n/**\n * Register or update a push transport\n *\n * ### Overview\n * Upsert a notification transport configuration for the authenticated user. After registration, wspc can dispatch notifications to the user when registered product events fire.\n *\n * ### When to Use\n * First-time onboarding push configuration setup, or whenever the user updates their transport target details (e.g., pointing notifications to a new Telegram bot username).\n *\n * ### Constraints\n * - **Supported Transports**: Currently only `transport: telegram` is supported.\n * - **Target Validation**: `target_bot_username` must be a valid Telegram bot name starting with `@` followed by 5–32 alphanumeric/underscore characters (`^@[A-Za-z0-9_]{5,32}$`).\n * - **Uniqueness**: Up to one registration row is saved per `(user_id, transport)`. Upserting replaces any existing target config, updating `updated_at` while retaining `created_at`.\n * - **No Side-effect Messages**: Registering a transport does **not** send a test notification; clients should separately trigger `POST /push/test`.\n *\n * ### Troubleshooting\n * - Returns 400 `INVALID_CONFIG` if payload structure is invalid or `target_bot_username` validation fails.\n */\nexport const pushConfigSet = <ThrowOnError extends boolean = false>(options: Options<PushConfigSetData, ThrowOnError>) => (options.client ?? client).post<PushConfigSetResponses, PushConfigSetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/push/config',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Send a test push notification\n *\n * ### Overview\n * Synchronously dispatch a static test message via the requested transport target to verify delivery health.\n *\n * ### When to Use\n * Immediately after executing `POST /push/config` to verify connection legitimacy, or when troubleshooting missing notification claims.\n *\n * ### Constraints\n * - **Target Requirement**: You must have already successfully registered the targeted transport configuration.\n * - **Side Effects**: Sends a single probe message to the upstream provider (e.g. Telegram Bot API). Test details are persisted to the configuration row under `last_test_at` and `last_test_status`.\n * - **No Audit Footprint**: This operation is treated strictly as an integration probe and will not generate a product audit log footprint.\n *\n * ### Troubleshooting\n * - **Upstream Error Handling**: This endpoint returns an HTTP `200 OK` status even if the upstream dispatch fails. Callers must inspect `ok: false` and review `status` and `detail` in the response JSON to verify connection health.\n * - Returns 404 `NO_CONFIG` if the user has not registered configuration details for the requested transport.\n */\nexport const pushTest = <ThrowOnError extends boolean = false>(options: Options<PushTestData, ThrowOnError>) => (options.client ?? client).post<PushTestResponses, PushTestErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/push/test',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List comments on a todo\n *\n * ### 🎯 Overview & Purpose\n * List the comments attached to a todo, oldest-first by default.\n *\n * ### 💡 Key Features & Constraints\n * * **Ordering**: Defaults to chronological (`asc`). Pass `order=desc` for newest-first.\n * * **Soft-deleted**: Hidden by default; pass `include_deleted=true` to include them.\n * * **Pagination**: Use `limit` (max 200, default 50) and `cursor` (the `next_cursor` from a previous response) to page through results. When `next_cursor` is absent in the response, you are on the last page. Returns `{ comments, next_cursor? }`. Changing `order` invalidates a cursor.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target todo does not exist or is soft-deleted.\n * * **`VALIDATION_ERROR`**: Thrown if a cursor was produced with a different `order` than the current request.\n */\nexport const todoCommentList = <ThrowOnError extends boolean = false>(options: Options<TodoCommentListData, ThrowOnError>) => (options.client ?? client).get<TodoCommentListResponses, TodoCommentListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}/comments',\n ...options\n});\n\n/**\n * Add a comment to a todo\n *\n * ### 🎯 Overview & Purpose\n * Attach a free-text comment to a todo. Use this to record progress updates, notes, or remarks as a task moves along.\n *\n * ### 💡 Key Features & Constraints\n * * **Free text**: Comments are plain text up to 10000 characters; there is no separate \"progress\" vs \"remark\" type.\n * * **Authorship**: The author is recorded as the calling user (`user_id`).\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target todo does not exist or is soft-deleted.\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if content is empty or exceeds 10000 characters.\n */\nexport const todoCommentCreate = <ThrowOnError extends boolean = false>(options: Options<TodoCommentCreateData, ThrowOnError>) => (options.client ?? client).post<TodoCommentCreateResponses, TodoCommentCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}/comments',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * List projects\n *\n * ### 🎯 Overview & Purpose\n * List all project workspaces available to the authenticated organization or user.\n *\n * ### 🔍 When to Use\n * * Use this to populate project switcher dropdown menus, load side navigation views, or find valid project IDs before listing other scoped resources.\n *\n * ### 💡 Key Features & Constraints\n * * **Archived Visibility**: Soft-deleted projects are omitted from default listings. Pass `include_deleted=true` to include them for auditing or recovery dashboards.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`AUTH_REQUIRED` (HTTP 401)**: Thrown if the caller is not authenticated.\n */\nexport const projectList = <ThrowOnError extends boolean = false>(options?: Options<ProjectListData, ThrowOnError>) => (options?.client ?? client).get<ProjectListResponses, ProjectListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects',\n ...options\n});\n\n/**\n * Create a project\n *\n * ### 🎯 Overview & Purpose\n * Establish a new isolated project workspace.\n *\n * ### 🔍 When to Use\n * * Use this to set up a new domain, team project, or separate workspace area to isolate tasks, custom types, and recurrence rules.\n *\n * ### 💡 Key Features & Constraints\n * * **Project Partitioning**: Projects act as strict boundaries. Custom todo types and recurrence rules created under this project are strictly confined to it.\n * * **Name Uniqueness**: Project names are free-form and do not have to be unique.\n * * **Default Type Inheritance**: Omit `default_todo_type_id` to automatically inherit the Default Project's default task type.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if required fields are missing, if name is empty, or if name length constraints are violated.\n */\nexport const projectCreate = <ThrowOnError extends boolean = false>(options?: Options<ProjectCreateData, ThrowOnError>) => (options?.client ?? client).post<ProjectCreateResponses, ProjectCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List recurring todo rules\n *\n * ### 🎯 Overview & Purpose\n * Return all active recurrence rules within a specific project owned by the caller.\n *\n * ### 🔍 When to Use\n * * Use this to render rule management panels, list scheduled automation templates, or inspect active rules.\n *\n * ### 💡 Key Features & Constraints\n * * **Project Scope**: The `project_id` query parameter is strictly required.\n * * **Exclusion**: Soft-deleted/archived rules are excluded from the response by default.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if `project_id` query filter is omitted.\n */\nexport const recurrenceRuleList = <ThrowOnError extends boolean = false>(options: Options<RecurrenceRuleListData, ThrowOnError>) => (options.client ?? client).get<RecurrenceRuleListResponses, RecurrenceRuleListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/recurrence-rules',\n ...options\n});\n\n/**\n * Create a recurring todo rule\n *\n * ### 🎯 Overview & Purpose\n * Create a recurrence rule that materializes upcoming todo instances on a repeating schedule.\n *\n * ### 🔍 When to Use\n * * Use this to set up recurring work like a weekly Standup, monthly reporting, or cyclical maintenance. The server automatically materializes upcoming todo instances on a 14-day rolling horizon.\n *\n * ### 💡 Key Features & Constraints\n * * **RFC-5545 Conformity**: The `rrule` parameter must be a valid RFC-5545 schedule string (e.g., `FREQ=WEEKLY;BYDAY=MO`) and must **not** include the `DTSTART` or `TZID` directive.\n * * **Anchor Date**: `dtstart` specifies the local calendar starting date (`YYYY-MM-DD`) where the schedule rule is anchored.\n * * **Nesting Constraints**: Recurrence rules can only be bound to root-level tasks. Child tasks (subtasks) cannot have recurrence rules. Setting a child task as a parent will trigger `PARENT_IS_CHILD`.\n * * **Instance Independence**: Once materialized, each todo instance is fully independent with its own `status` and `due_at`.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`RRULE_INVALID` (HTTP 400)**: Thrown if the `rrule` schedule string is broken or contains illegal `DTSTART` directives.\n * * **`PARENT_IS_CHILD` (HTTP 400)**: Thrown if the specified `parent_id` points to a child task.\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if date format is invalid or required fields are missing.\n */\nexport const recurrenceRuleCreate = <ThrowOnError extends boolean = false>(options?: Options<RecurrenceRuleCreateData, ThrowOnError>) => (options?.client ?? client).post<RecurrenceRuleCreateResponses, RecurrenceRuleCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/recurrence-rules',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List todos with filters\n *\n * ### 🎯 Overview & Purpose\n * Return the caller's active or archived todos, with comprehensive options to filter by project, parent task, status, due-date window, and template visibility.\n *\n * ### 🔍 When to Use\n * * Use this to render the main todo board dashboard, query items due in a specific timeframe (using `due_after` and `due_before`), or lazy-load subtasks for an expanded parent todo by passing its ID.\n *\n * ### 💡 Key Features & Constraints\n * * **Required Parameter**: The `project_id` query parameter is strictly required and must match an active project.\n * * **Parent Tasks**: Omitting `parent_id` lists root-level todos by default. Pass a todo id to list direct children of that specific task.\n * * **Multi-Status Filters**: Multi-value `status` query is supported by repeating the parameter, e.g., `?status=open&status=in_progress`.\n * * **Due-Date Windowing**: The `due_after` filter is inclusive, while `due_before` is exclusive, forming a half-open window `[due_after, due_before)`. Both parameters exclude todos with no due date.\n * * **Template & Soft-Delete Visibility**: Soft-deleted todos are hidden unless `include_deleted=true`. Template todos backing recurrence rules are hidden unless `include_templates=true`.\n * * **Custom-Field Filters (`cf.<key>=<value>`)**: Repeatable dynamic-prefix query parameters whose name follows the `cf.<key>` pattern (e.g. `?cf.priority=high&cf.team=eng`). Each pair is ANDed; for `string_array` custom fields the match is positive when the array contains the value. Keys must be declared on the project's todo type schema. Because the prefix is dynamic, these parameters cannot be expressed in the JSON Schema below — clients must construct them from the URL query string directly.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if `project_id` is missing, or if query parameters fail schema validation.\n */\nexport const todoList = <ThrowOnError extends boolean = false>(options: Options<TodoListData, ThrowOnError>) => (options.client ?? client).get<TodoListResponses, TodoListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items',\n ...options\n});\n\n/**\n * Create a todo\n *\n * ### 🎯 Overview & Purpose\n * Create a new todo item under a specified project. This can either be a standalone root-level todo or a nested subtask attached to an existing root todo.\n *\n * ### 🔍 When to Use\n * * Use this to capture a fresh work item, document an ongoing task, or break a larger root todo into subtasks by creating child todos under it.\n *\n * ### 💡 Key Features & Constraints\n * * **One-Level Nesting Limit**: WSPC supports a maximum of one level of task nesting (Root ➔ Child). A root-level todo can have children, but a child todo cannot have further subtasks. Setting a child todo as a parent will fail and trigger a `PARENT_IS_CHILD` error.\n * * **Description Handling**: Passing a non-empty string stores the description; passing `\"\"` explicitly stores an empty string. Passing `null` is strictly rejected.\n * * **Due Date Format**: Accepts an ISO-8601 date-only format (`YYYY-MM-DD`). Pass `\"\"` or omit the field to skip setting a due date.\n * * **Project Binding**: Every todo must belong to a valid active project (`project_id`).\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if required fields are missing, if `due_at` violates the `YYYY-MM-DD` format, or if `title` exceeds 500 characters.\n * * **`PARENT_IS_CHILD` (HTTP 400)**: Thrown if the target `parent_id` refers to a todo that is itself already a child todo.\n * * **`WOULD_CREATE_CYCLE` (HTTP 400)**: Thrown if `parent_id` points to the todo's own ID.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the specified `project_id` or `parent_id` does not exist or has been soft-deleted.\n */\nexport const todoCreate = <ThrowOnError extends boolean = false>(options?: Options<TodoCreateData, ThrowOnError>) => (options?.client ?? client).post<TodoCreateResponses, TodoCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * List todo types\n *\n * ### 🎯 Overview & Purpose\n * List custom todo types defined within a project.\n *\n * ### 🔍 When to Use\n * * Use this to populate task type selection dropdown elements or load category metadata for dynamic custom forms.\n *\n * ### 💡 Key Features & Constraints\n * * **Required Parameter**: The `project_id` filter is strictly required and must match an active project.\n * * **Exclusion**: Soft-deleted types are excluded by default. Pass `include_deleted=true` to surface archived rows for a recovery UI.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if `project_id` query parameter is omitted.\n */\nexport const todoTypeList = <ThrowOnError extends boolean = false>(options: Options<TodoTypeListData, ThrowOnError>) => (options.client ?? client).get<TodoTypeListResponses, TodoTypeListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types',\n ...options\n});\n\n/**\n * Create a todo type\n *\n * ### 🎯 Overview & Purpose\n * Create a new custom todo type. This allows you to define specialized category schemas (e.g. \"Bug Report\") and configure custom field constraints.\n *\n * ### 🔍 When to Use\n * * Use this to set up customized task behaviors (e.g. tracking choices, additional metadata, or enforcing hidden fields) tailored to a project.\n *\n * ### 💡 Key Features & Constraints\n * * **Automatic Seeding**: The first project initialization will lazily seed a `Default Project` and a `Default` todo type if they do not already exist.\n * * **Metadata Schema**: Custom field keys mapped here are evaluated during task creation/update.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if required fields are missing or schema constraints are violated.\n */\nexport const todoTypeCreate = <ThrowOnError extends boolean = false>(options?: Options<TodoTypeCreateData, ThrowOnError>) => (options?.client ?? client).post<TodoTypeCreateResponses, TodoTypeCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n});\n\n/**\n * Soft-delete a comment\n *\n * ### 🎯 Overview & Purpose\n * Soft-delete a comment.\n *\n * ### 💡 Key Features & Constraints\n * * **Soft delete**: The comment is hidden from default listings but retained; there is no restore endpoint.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`COMMENT_NOT_FOUND` (HTTP 404)**: Thrown if the comment id is unknown, already deleted, or not in the caller's organization.\n */\nexport const todoCommentDelete = <ThrowOnError extends boolean = false>(options: Options<TodoCommentDeleteData, ThrowOnError>) => (options.client ?? client).delete<TodoCommentDeleteResponses, TodoCommentDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/comments/{id}',\n ...options\n});\n\n/**\n * Edit a comment\n *\n * ### 🎯 Overview & Purpose\n * Edit the body of an existing comment.\n *\n * ### 💡 Key Features & Constraints\n * * **Last write wins**: There is no optimistic-lock version on comments; the latest edit replaces the content.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`COMMENT_NOT_FOUND` (HTTP 404)**: Thrown if the comment id is unknown, soft-deleted, or not in the caller's organization.\n * * **`VALIDATION_ERROR` (HTTP 400)**: Thrown if content is empty or exceeds 10000 characters.\n */\nexport const todoCommentUpdate = <ThrowOnError extends boolean = false>(options: Options<TodoCommentUpdateData, ThrowOnError>) => (options.client ?? client).patch<TodoCommentUpdateResponses, TodoCommentUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/comments/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Soft-delete a project\n *\n * ### 🎯 Overview & Purpose\n * Soft-delete/archive a project workspace.\n *\n * ### 🔍 When to Use\n * * Use this to archive a completed project and hide it from default listings without losing historical metrics.\n *\n * ### 💡 Key Features & Constraints\n * * **Cascading Effects**: Deleting a project automatically soft-deletes the project record and cascades to soft-delete all todos created under it.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the project ID does not exist or has already been archived.\n */\nexport const projectDelete = <ThrowOnError extends boolean = false>(options: Options<ProjectDeleteData, ThrowOnError>) => (options.client ?? client).delete<ProjectDeleteResponses, ProjectDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects/{id}',\n ...options\n});\n\n/**\n * Get a project by id\n *\n * ### 🎯 Overview & Purpose\n * Retrieve one project workspace by its unique identifier.\n *\n * ### 🔍 When to Use\n * * Use this to fetch the configuration details of a specific project, verify its version, or inspect its metadata before creating other scoped resources under it.\n *\n * ### 💡 Key Features & Constraints\n * * **Soft-Deleted Access**: Soft-deleted projects can still be retrieved directly by ID, but they cannot be used for creating new child resources (todos, todo types, or recurrence rules) until they are fully restored.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the specified project ID does not exist in the caller's organization.\n */\nexport const projectGet = <ThrowOnError extends boolean = false>(options: Options<ProjectGetData, ThrowOnError>) => (options.client ?? client).get<ProjectGetResponses, ProjectGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects/{id}',\n ...options\n});\n\n/**\n * Update a project\n *\n * ### 🎯 Overview & Purpose\n * Modify the name or default settings of an existing project.\n *\n * ### 🔍 When to Use\n * * Use this to rename a project workspace, switch its default task type, or change custom field defaults.\n *\n * ### 💡 Key Features & Constraints\n * * **Optimistic Locking (`expected_version`)**: Pass `expected_version` to enforce optimistic write control. If the database version mismatches, the request fails with `VERSION_CONFLICT`.\n * * **Todo Type Binding**: If updating `default_todo_type_id`, the target type must be active and visible to the caller's organization.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if the provided `expected_version` does not match the database.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the project ID does not exist or has been soft-deleted.\n */\nexport const projectUpdate = <ThrowOnError extends boolean = false>(options: Options<ProjectUpdateData, ThrowOnError>) => (options.client ?? client).patch<ProjectUpdateResponses, ProjectUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Delete a recurring todo rule\n *\n * ### 🎯 Overview & Purpose\n * Soft-delete/delete a recurrence rule to immediately halt future task materialization.\n *\n * ### 🔍 When to Use\n * * Use this to permanently end an ongoing cyclical schedule automation (e.g., when a weekly standby rotation is retired).\n *\n * ### 💡 Key Features & Constraints\n * * **Historic Preservation**: Deleting a rule stops the rolling schedule generations, but **does not** delete or alter todo tasks that have already been materialized. They remain on the user's list.\n * * **Optimistic Locking**: Supports optional `expected_version` checks.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if `expected_version` mismatches the database.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target rule ID does not exist.\n */\nexport const recurrenceRuleDelete = <ThrowOnError extends boolean = false>(options: Options<RecurrenceRuleDeleteData, ThrowOnError>) => (options.client ?? client).delete<RecurrenceRuleDeleteResponses, RecurrenceRuleDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/recurrence-rules/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get a recurring todo rule\n *\n * ### 🎯 Overview & Purpose\n * Fetch a single recurrence rule along with its template todo snapshot and the count of materialized instances.\n *\n * ### 🔍 When to Use\n * * Use this to inspect rule details before editing, preview the task template that future occurrences will copy, or check the current materialization metrics.\n *\n * ### 💡 Key Features & Constraints\n * * **Snapshot Integrity**: The returned template represents a schema template snapshot — modifying the rule (PATCH) only alters future occurrences; already-materialized tasks are never mutated retroactively.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the specified rule ID does not exist.\n */\nexport const recurrenceRuleGet = <ThrowOnError extends boolean = false>(options: Options<RecurrenceRuleGetData, ThrowOnError>) => (options.client ?? client).get<RecurrenceRuleGetResponses, RecurrenceRuleGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/recurrence-rules/{id}',\n ...options\n});\n\n/**\n * Update a recurring todo rule\n *\n * ### 🎯 Overview & Purpose\n * Update the schedule parameters (`rrule`, `dtstart`) or task template attributes (`title`, `description`, `parent_id`) of a recurrence rule.\n *\n * 🔍 When to Use\n * * Use this to shift standup schedules (e.g., from Monday to Friday), update template text details, or change the parent todo mapping for future generated tasks.\n *\n * ### 💡 Key Features & Constraints\n * * **Future-Only Effect**: Modifying the rule only applies to future materialized todo tasks; previously generated tasks remain unaffected.\n * * **Optimistic Locking**: Supports `expected_version` to prevent concurrent modifications from overwriting workspace rule parameters.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if the provided `expected_version` mismatches the database.\n * * **`RRULE_INVALID` (HTTP 400)**: Thrown if the updated schedule string contains illegal syntax or includes `DTSTART`.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target rule ID does not exist.\n */\nexport const recurrenceRuleUpdate = <ThrowOnError extends boolean = false>(options: Options<RecurrenceRuleUpdateData, ThrowOnError>) => (options.client ?? client).patch<RecurrenceRuleUpdateResponses, RecurrenceRuleUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/recurrence-rules/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Soft-delete a todo\n *\n * ### 🎯 Overview & Purpose\n * Soft-delete a todo item so that it no longer appears in active list queries. The record remains in the database and can be recovered later.\n *\n * ### 🔍 When to Use\n * * Use this to hide an item from your active listings without permanently losing the history or metrics.\n *\n * ### 💡 Key Features & Constraints\n * * **Cascading Delete (`cascade`)**: If the target todo has active child subtasks:\n * - If `cascade: false` (default), the deletion will fail and throw a `HAS_CHILDREN` error to prevent accidental orphaned tasks.\n * - If `cascade: true`, the target todo and all its nested child subtasks will be soft-deleted together.\n * * **Optimistic Locking**: You may optionally pass `expected_version` to ensure the todo has not been modified since you last read it.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`HAS_CHILDREN` (HTTP 400)**: Thrown if you attempt to delete a parent todo that has active subtasks without explicitly setting `cascade: true`.\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if `expected_version` is provided and mismatches the database.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target todo `id` does not exist or has already been soft-deleted.\n */\nexport const todoDelete = <ThrowOnError extends boolean = false>(options: Options<TodoDeleteData, ThrowOnError>) => (options.client ?? client).delete<TodoDeleteResponses, TodoDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Get a todo by id\n *\n * ### 🎯 Overview & Purpose\n * Fetch the full details of a single todo item by its unique identifier.\n *\n * ### 🔍 When to Use\n * * Use this to confirm the current state of a task, inspect nested field values, or retrieve its current `version` before issuing an optimistic update (PATCH).\n *\n * ### 💡 Key Features & Constraints\n * * **Soft-Deleted Recovery**: A soft-deleted todo will return an HTTP 404 unless the query parameter `?include_deleted=true` is explicitly supplied.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the specified todo `id` does not exist, or has been soft-deleted and the request did not supply `include_deleted=true`.\n */\nexport const todoGet = <ThrowOnError extends boolean = false>(options: Options<TodoGetData, ThrowOnError>) => (options.client ?? client).get<TodoGetResponses, TodoGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}',\n ...options\n});\n\n/**\n * Update a todo\n *\n * ### 🎯 Overview & Purpose\n * Update one or more fields of an existing todo item, such as its title, status, parent todo, due date, or description.\n *\n * ### 🔍 When to Use\n * * Use this to log progress by changing the status (e.g., to `in_progress` or `done`), reschedule due dates, edit title/description, or reassign/move a task by changing its `parent_id`.\n *\n * ### 💡 Key Features & Constraints\n * * **Optimistic Locking (`expected_version`)**: An optional integer representing the version you expect to update. If provided, the server matches it with the current database version. If they match, the update succeeds and increments the version; if they mismatch, a `VERSION_CONFLICT` error is thrown. Omit this field to skip version checking (Last-Write-Wins behavior).\n * * **Parent Re-assignment**: Set `parent_id: null` to move a child todo back to the root level.\n * * **Status Transitions**: Transitioning the `status` to `done` automatically emits a `captureTodoCompleted` analytics event.\n * * **Clearing Fields**: To clear an existing description or due date, explicitly pass `\"\"`. Passing `null` is rejected.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if `expected_version` does not match the current database row version.\n * * **`PARENT_IS_CHILD` (HTTP 400)**: Thrown if the new `parent_id` refers to a todo that is itself already a child todo.\n * * **`WOULD_CREATE_CYCLE` (HTTP 400)**: Thrown if the update attempts to make a parent todo a child of its own descendant.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the todo `id` or the new `parent_id` does not exist or has been soft-deleted.\n */\nexport const todoUpdate = <ThrowOnError extends boolean = false>(options: Options<TodoUpdateData, ThrowOnError>) => (options.client ?? client).patch<TodoUpdateResponses, TodoUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Soft-delete a todo type\n *\n * ### 🎯 Overview & Purpose\n * Soft-delete/archive a custom todo type.\n *\n * ### 🔍 When to Use\n * * Use this to retire a custom task category workspace that is no longer needed.\n *\n * ### 💡 Key Features & Constraints\n * * **Default Type Protection**: The current active default type of a project cannot be deleted. You must assign another type as default first; otherwise the call fails with `CANNOT_DELETE_DEFAULT_TYPE`.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`CANNOT_DELETE_DEFAULT_TYPE` (HTTP 409)**: Thrown if the target todo type is currently the project's default type.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target ID does not exist.\n */\nexport const todoTypeDelete = <ThrowOnError extends boolean = false>(options: Options<TodoTypeDeleteData, ThrowOnError>) => (options.client ?? client).delete<TodoTypeDeleteResponses, TodoTypeDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types/{id}',\n ...options\n});\n\n/**\n * Get a todo type by id\n *\n * ### 🎯 Overview & Purpose\n * Fetch a single custom todo type by its unique identifier.\n *\n * ### 🔍 When to Use\n * * Use this to inspect custom fields schemas, verify type visibility, or validate active field constraints.\n *\n * ### 💡 Key Features & Constraints\n * * **Isolation**: You can only fetch types that belong to your organization.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target ID is unknown or belongs to another organization.\n */\nexport const todoTypeGet = <ThrowOnError extends boolean = false>(options: Options<TodoTypeGetData, ThrowOnError>) => (options.client ?? client).get<TodoTypeGetResponses, TodoTypeGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types/{id}',\n ...options\n});\n\n/**\n * Update a todo type\n *\n * ### 🎯 Overview & Purpose\n * Update a custom todo type's label, core field overrides, or custom field schema definitions.\n *\n * ### 🔍 When to Use\n * * Use this to rename a task category category, hide native todo attributes, or adjust custom data schemas.\n *\n * ### 💡 Key Features & Constraints\n * * **Type Modification Constraints**: Changing the data `type` of an existing custom field key (e.g. converting a string field to a boolean field) is strictly rejected with `CANNOT_CHANGE_FIELD_TYPE`. To migrate, remove the key and re-add it under a brand new name.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`CANNOT_CHANGE_FIELD_TYPE` (HTTP 422)**: Thrown if you attempt to modify the declared data type of an existing custom field key.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target ID does not exist.\n */\nexport const todoTypeUpdate = <ThrowOnError extends boolean = false>(options: Options<TodoTypeUpdateData, ThrowOnError>) => (options.client ?? client).patch<TodoTypeUpdateResponses, TodoTypeUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Restore a soft-deleted project\n *\n * ### 🎯 Overview & Purpose\n * Restore a previously soft-deleted project workspace.\n *\n * ### 🔍 When to Use\n * * Use this to bring an archived project back into active listings and restore its capacity to host new child resources.\n *\n * ### 💡 Key Features & Constraints\n * * **No ID Alteration**: Restoring a project fully recovers the record without changing its stable ID or history.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the project ID does not exist.\n */\nexport const projectRestore = <ThrowOnError extends boolean = false>(options: Options<ProjectRestoreData, ThrowOnError>) => (options.client ?? client).post<ProjectRestoreResponses, ProjectRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/projects/{id}/restore',\n ...options\n});\n\n/**\n * Restore a soft-deleted todo\n *\n * ### 🎯 Overview & Purpose\n * Reverse a previous soft-delete. The todo (and optionally its descendants) is recovered back to the active list.\n *\n * ### 🔍 When to Use\n * * Use this to recover a task deleted by mistake, or pull a task out of the trash to continue active work.\n *\n * ### 💡 Key Features & Constraints\n * * **Orphan Warning**: If the restored todo's parent is still in the trash, the call succeeds but returns `parent_in_trash_warning: true`, signaling that the restored todo is currently orphaned from a visible ancestor.\n * * **Cascading Restore (`cascade`)**: If `cascade: true` is provided, all descendants still in the trash are also restored. Otherwise, descendants are left in the trash, and their count is reported back in `descendants_in_trash_count`.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`VERSION_CONFLICT` (HTTP 409)**: Thrown if `expected_version` is supplied and mismatches the database.\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target todo `id` does not exist or has already been permanently purged.\n */\nexport const todoRestore = <ThrowOnError extends boolean = false>(options: Options<TodoRestoreData, ThrowOnError>) => (options.client ?? client).post<TodoRestoreResponses, TodoRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/items/{id}/restore',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n});\n\n/**\n * Restore a soft-deleted todo type\n *\n * ### 🎯 Overview & Purpose\n * Restore a previously archived/soft-deleted custom todo type.\n *\n * ### 🔍 When to Use\n * * Use this to bring a retired task category back into active status.\n *\n * ### 💡 Key Features & Constraints\n * * **Task Re-Attachment**: Restoring a type clears its `deleted_at` timestamp. Todo items previously assigned to this type immediately become active and validated under this recovered category schema.\n *\n * ### ⚠️ Common Errors & Troubleshooting\n * * **`NOT_FOUND` (HTTP 404)**: Thrown if the target ID does not exist.\n */\nexport const todoTypeRestore = <ThrowOnError extends boolean = false>(options: Options<TodoTypeRestoreData, ThrowOnError>) => (options.client ?? client).post<TodoTypeRestoreResponses, TodoTypeRestoreErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/todo/types/{id}/restore',\n ...options\n});\n","import { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join } from \"node:path\"\n\nexport const LEGACY_ACCOUNT_KEY = \"(default)\"\n\nexport interface AccountCreds {\n email: string\n user_id?: string\n refresh_token?: string\n access_token?: string\n access_token_expires_at?: number\n api_key?: string // legacy / escape hatch\n actor?: \"user\" | \"agent\"\n agent_label?: string\n}\n\nexport interface EnvConfig {\n api_base: string\n // RFC 7591 dynamically registered OAuth public client — server-level app\n // identity, shared by every account on this env. Kept across logout.\n client_id?: string\n current_account?: string // email of the active account in this env\n accounts: Record<string, AccountCreds>\n}\n\nexport interface WspcConfig {\n schema_version?: 2\n current_env?: string\n envs: Record<string, EnvConfig>\n}\n\nconst DEFAULT_DIR = join(homedir(), \".wspc\")\n\n// Fields that lived at env level in v1 and now belong on an account.\nconst V1_CRED_KEYS = [\n \"refresh_token\",\n \"access_token\",\n \"access_token_expires_at\",\n \"api_key\",\n \"actor\",\n \"agent_label\",\n] as const\n\nfunction migrateEnv(raw: Record<string, unknown>): EnvConfig {\n const api_base = typeof raw.api_base === \"string\" ? raw.api_base : \"\"\n const env: EnvConfig = { api_base, accounts: {} }\n if (typeof raw.client_id === \"string\") env.client_id = raw.client_id\n\n // Already v2: trust its accounts/current_account as-is.\n if (raw.accounts && typeof raw.accounts === \"object\") {\n env.accounts = raw.accounts as Record<string, AccountCreds>\n if (typeof raw.current_account === \"string\") env.current_account = raw.current_account\n return env\n }\n\n // v1: fold any env-level creds into accounts[(default)].\n const hasCreds = V1_CRED_KEYS.some((k) => raw[k] !== undefined)\n if (hasCreds) {\n const creds: AccountCreds = { email: LEGACY_ACCOUNT_KEY }\n for (const k of V1_CRED_KEYS) {\n if (raw[k] !== undefined) (creds as unknown as Record<string, unknown>)[k] = raw[k]\n }\n env.accounts[LEGACY_ACCOUNT_KEY] = creds\n env.current_account = LEGACY_ACCOUNT_KEY\n }\n return env\n}\n\nfunction normalize(parsed: unknown): WspcConfig {\n if (typeof parsed !== \"object\" || parsed === null) return { envs: {} }\n const obj = parsed as Record<string, unknown>\n if (typeof obj.envs !== \"object\" || obj.envs === null) return { envs: {} }\n const envs: Record<string, EnvConfig> = {}\n for (const [name, rawEnv] of Object.entries(obj.envs as Record<string, unknown>)) {\n if (typeof rawEnv === \"object\" && rawEnv !== null) {\n envs[name] = migrateEnv(rawEnv as Record<string, unknown>)\n }\n }\n const out: WspcConfig = { schema_version: 2, envs }\n if (typeof obj.current_env === \"string\") out.current_env = obj.current_env\n return out\n}\n\n/**\n * Rename the migration placeholder account `(default)` to its real email once\n * /auth/me resolves it. Returns true if a rename happened. No-op otherwise.\n */\nexport function rekeyLegacyAccount(\n config: WspcConfig,\n envName: string,\n email: string,\n userId?: string,\n): boolean {\n if (email === LEGACY_ACCOUNT_KEY) return false\n const env = config.envs[envName]\n const legacy = env?.accounts?.[LEGACY_ACCOUNT_KEY]\n if (!env || !legacy) return false\n delete env.accounts[LEGACY_ACCOUNT_KEY]\n // Don't clobber an already-real account that shares this email (e.g. a login\n // created it before the placeholder was cleaned up) — just drop the placeholder.\n if (!env.accounts[email]) {\n env.accounts[email] = { ...legacy, email, ...(userId ? { user_id: userId } : {}) }\n }\n if (env.current_account === LEGACY_ACCOUNT_KEY) env.current_account = email\n return true\n}\n\nexport class ConfigStore {\n private readonly configDir: string\n private readonly configFile: string\n\n constructor(opts: { configDir?: string } = {}) {\n this.configDir = opts.configDir ?? DEFAULT_DIR\n this.configFile = join(this.configDir, \"config.json\")\n }\n\n async read(): Promise<WspcConfig> {\n try {\n const buf = await fs.readFile(this.configFile, \"utf8\")\n return normalize(JSON.parse(buf))\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ENOENT\") return { envs: {} }\n throw e\n }\n }\n\n async write(config: WspcConfig): Promise<void> {\n await fs.mkdir(this.configDir, { recursive: true, mode: 0o700 })\n if (process.platform !== \"win32\") {\n await fs.chmod(this.configDir, 0o700).catch(() => {})\n }\n await fs.writeFile(this.configFile, JSON.stringify(config, null, 2) + \"\\n\", { mode: 0o600 })\n }\n\n async currentEnv(): Promise<{ name: string; config: EnvConfig } | undefined> {\n const c = await this.read()\n const name = c.current_env\n if (!name) return undefined\n const env = c.envs[name]\n if (!env) return undefined\n return { name, config: env }\n }\n}\n","// AUTO-GENERATED by scripts/sync-spec.ts — DO NOT EDIT\nexport const VERSION = \"0.0.13\"\nexport const SPEC_SHA = \"7842b7a9\"\nexport const SPEC_FETCHED_AT = \"2026-06-09T08:10:52.164Z\"\nexport const API_BASE = \"https://api.wspc.ai\"\n","import { createClient, createConfig } from \"./generated/sdk/client/index.js\"\nimport type { Client } from \"./generated/sdk/client/index.js\"\nimport { createAuthInterceptor } from \"./handwritten/auth/sdk-auth.js\"\nimport {\n todoCreate,\n todoList,\n todoGet,\n todoUpdate,\n todoDelete,\n projectCreate,\n projectList,\n todoTypeList,\n recurrenceRuleList,\n} from \"./generated/sdk/sdk.gen.js\"\nimport type {\n TodoCreateData,\n TodoListData,\n TodoUpdateData,\n ProjectCreateData,\n TodoTypeListData,\n RecurrenceRuleListData,\n} from \"./generated/sdk/types.gen.js\"\nimport { API_BASE, VERSION, SPEC_SHA, SPEC_FETCHED_AT } from \"./version.js\"\n\nexport { VERSION, SPEC_SHA, SPEC_FETCHED_AT, API_BASE }\n\nexport type WspcClientOptions =\n | { apiKey: string; baseUrl?: string }\n | {\n accessToken: string\n refreshToken: string\n /**\n * OAuth client_id this token pair was issued to. The wspc CLI registers\n * a public client via RFC 7591 on first login and stores the id; library\n * callers must pass whatever client_id matches their tokens (refresh\n * grants require it).\n */\n clientId: string\n onTokenRefresh?: (next: { accessToken: string; refreshToken: string; expiresAt: number }) => void | Promise<void>\n baseUrl?: string\n }\n\nexport class WspcAuthExpiredError extends Error {\n readonly code = \"WSPC_AUTH_EXPIRED\" as const\n constructor(message = \"wspc credentials expired; re-authenticate via `wspc login`\") {\n super(message)\n this.name = \"WspcAuthExpiredError\"\n }\n}\n\nexport class WspcClient {\n readonly todos: TodosResource\n readonly todoProjects: TodoProjectsResource\n readonly todoTypes: TodoTypesResource\n readonly todoRules: TodoRulesResource\n\n constructor(opts: WspcClientOptions) {\n const client = createClient(\n createConfig({\n baseUrl: \"baseUrl\" in opts ? (opts.baseUrl ?? API_BASE) : API_BASE,\n // Auth interceptor wires in Task 17; v0 placeholder.\n ...buildAuthOptions(opts),\n }),\n )\n this.todos = new TodosResource(client)\n this.todoProjects = new TodoProjectsResource(client)\n this.todoTypes = new TodoTypesResource(client)\n this.todoRules = new TodoRulesResource(client)\n }\n}\n\nfunction buildAuthOptions(opts: WspcClientOptions): object {\n const interceptor =\n \"apiKey\" in opts\n ? createAuthInterceptor({ apiKey: opts.apiKey })\n : createAuthInterceptor({\n accessToken: opts.accessToken,\n refreshToken: opts.refreshToken,\n baseUrl: opts.baseUrl ?? API_BASE,\n clientId: opts.clientId,\n onTokenRefresh: opts.onTokenRefresh ?? (() => {}),\n })\n // Hey API 0.97 client.gen.ts uses opts.fetch as the underlying fetch impl.\n // Routing every SDK call through interceptor.execute handles bearer injection\n // and transparent refresh-on-401.\n return {\n fetch: ((input: RequestInfo | URL, init?: RequestInit) =>\n interceptor.execute(new Request(input as RequestInfo, init))) as typeof fetch,\n }\n}\n\nclass TodosResource {\n constructor(private client: Client) {}\n async create(body: TodoCreateData[\"body\"]) {\n const res = await todoCreate({ client: this.client, body })\n return res.data\n }\n async list(query: TodoListData[\"query\"]) {\n const res = await todoList({ client: this.client, query })\n return res.data\n }\n async get(id: string) {\n const res = await todoGet({ client: this.client, path: { id } })\n return res.data\n }\n async update(id: string, body: TodoUpdateData[\"body\"]) {\n const res = await todoUpdate({ client: this.client, path: { id }, body })\n return res.data\n }\n async delete(id: string) {\n await todoDelete({ client: this.client, path: { id } })\n }\n}\n\nclass TodoProjectsResource {\n constructor(private client: Client) {}\n async create(body: ProjectCreateData[\"body\"]) {\n const res = await projectCreate({ client: this.client, body })\n return res.data\n }\n async list() {\n const res = await projectList({ client: this.client })\n return res.data\n }\n}\n\nclass TodoTypesResource {\n constructor(private client: Client) {}\n async list(query: TodoTypeListData[\"query\"]) {\n const res = await todoTypeList({ client: this.client, query })\n return res.data\n }\n}\n\nclass TodoRulesResource {\n constructor(private client: Client) {}\n async list(query: RecurrenceRuleListData[\"query\"]) {\n const res = await recurrenceRuleList({ client: this.client, query })\n return res.data\n }\n}\n","import { WspcAuthExpiredError } from \"../../index.js\"\n\nexport type AuthMode =\n | { apiKey: string }\n | {\n accessToken: string\n refreshToken: string\n baseUrl: string\n clientId: string\n onTokenRefresh: (next: { accessToken: string; refreshToken: string; expiresAt: number }) => void | Promise<void>\n fetchImpl?: typeof fetch\n now?: () => number\n }\n\nexport interface AuthInterceptor {\n onRequest(req: Request): Promise<Request>\n execute(req: Request): Promise<Response>\n}\n\nexport function createAuthInterceptor(mode: AuthMode): AuthInterceptor {\n if (\"apiKey\" in mode) {\n const apiKey = mode.apiKey\n return {\n async onRequest(req) {\n req.headers.set(\"authorization\", `Bearer ${apiKey}`)\n return req\n },\n async execute(req) {\n const out = await this.onRequest(req.clone())\n return fetch(out)\n },\n }\n }\n\n let accessToken = mode.accessToken\n let refreshToken = mode.refreshToken\n const fetchImpl = mode.fetchImpl ?? fetch\n const now = mode.now ?? Date.now\n\n return {\n async onRequest(req) {\n req.headers.set(\"authorization\", `Bearer ${accessToken}`)\n return req\n },\n async execute(req) {\n const first = await fetchImpl(await this.onRequest(req.clone()))\n if (first.status !== 401) return first\n\n const refreshRes = await fetchImpl(`${mode.baseUrl}/auth/oauth/token`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n client_id: mode.clientId,\n }),\n })\n if (!refreshRes.ok) {\n throw new WspcAuthExpiredError()\n }\n const tokens = (await refreshRes.json()) as {\n access_token: string\n refresh_token: string\n expires_in: number\n }\n accessToken = tokens.access_token\n refreshToken = tokens.refresh_token\n await mode.onTokenRefresh({\n accessToken,\n refreshToken,\n expiresAt: now() + tokens.expires_in * 1000,\n })\n return fetchImpl(await this.onRequest(req.clone()))\n },\n }\n}\n","import type { AccountCreds, WspcConfig } from \"../config/index.js\"\n\nexport interface ResolvedAccount {\n envName: string\n apiBase: string\n clientId?: string\n email: string\n creds: AccountCreds\n}\n\nconst NOT_LOGGED_IN = \"not logged in: run `wspc login` first\"\n\n/**\n * Decide which account a command runs as, by precedence:\n * 1. opts.accountOverride (--account flag / WSPC_ACCOUNT env)\n * 2. env.current_account (interactive active account)\n * 3. the sole account, if exactly one exists\n * 4. error\n */\nexport function resolveAccount(\n config: WspcConfig,\n opts: { accountOverride?: string } = {},\n): ResolvedAccount {\n const envName = config.current_env\n if (!envName || !config.envs[envName]) throw new Error(NOT_LOGGED_IN)\n const env = config.envs[envName]\n const accounts = env.accounts ?? {}\n const emails = Object.keys(accounts)\n\n let email: string | undefined\n const override = opts.accountOverride\n if (override) {\n if (!accounts[override]) {\n throw new Error(\n `no account '${override}' in env '${envName}'. Run \\`wspc account ls\\` or \\`wspc login\\`.`,\n )\n }\n email = override\n } else if (env.current_account && accounts[env.current_account]) {\n email = env.current_account\n } else if (emails.length === 1) {\n email = emails[0]\n } else if (emails.length === 0) {\n throw new Error(NOT_LOGGED_IN)\n } else {\n throw new Error(\n `multiple accounts in env '${envName}'; specify --account <email> or run \\`wspc account switch <email>\\`.`,\n )\n }\n\n if (email === undefined) throw new Error(NOT_LOGGED_IN)\n const creds = accounts[email]\n if (!creds) throw new Error(NOT_LOGGED_IN)\n if (!creds.api_key && !(creds.access_token && creds.refresh_token)) {\n throw new Error(NOT_LOGGED_IN)\n }\n return { envName, apiBase: env.api_base, clientId: env.client_id, email, creds }\n}\n","import { ConfigStore } from \"../config/index.js\"\nimport { createClient, createConfig } from \"../../generated/sdk/client/index.js\"\nimport { createAuthInterceptor } from \"./sdk-auth.js\"\nimport { resolveAccount } from \"./resolve-account.js\"\n\nexport interface AuthedFetch {\n fetch: typeof fetch\n baseUrl: string\n}\n\nexport interface LoadedClient {\n _rawClient: ReturnType<typeof createClient>\n}\n\nfunction buildInterceptor(\n store: ConfigStore,\n resolved: ReturnType<typeof resolveAccount>,\n): ReturnType<typeof createAuthInterceptor> {\n const { envName, apiBase, clientId, email, creds } = resolved\n if (creds.api_key) {\n return createAuthInterceptor({ apiKey: creds.api_key })\n }\n if (!clientId) {\n throw new Error(\n \"config has OAuth tokens but no client_id — run `wspc logout && wspc login` to re-register\",\n )\n }\n return createAuthInterceptor({\n accessToken: creds.access_token!,\n refreshToken: creds.refresh_token!,\n baseUrl: apiBase,\n clientId,\n onTokenRefresh: async ({ accessToken, refreshToken, expiresAt }) => {\n const cfg = await store.read()\n const a = cfg.envs[envName]?.accounts?.[email]\n if (!a) return\n a.access_token = accessToken\n a.refresh_token = refreshToken\n a.access_token_expires_at = expiresAt\n await store.write(cfg)\n },\n })\n}\n\nexport async function loadSdkClient(opts: { store?: ConfigStore } = {}): Promise<LoadedClient> {\n const store = opts.store ?? new ConfigStore()\n const config = await store.read()\n const resolved = resolveAccount(config, { accountOverride: process.env.WSPC_ACCOUNT })\n const interceptor = buildInterceptor(store, resolved)\n\n const rawClient = createClient(\n createConfig({\n baseUrl: resolved.apiBase,\n fetch: ((input: RequestInfo | URL, init?: RequestInit) =>\n interceptor.execute(new Request(input as RequestInfo, init))) as typeof fetch,\n }),\n )\n return { _rawClient: rawClient }\n}\n\nexport async function loadAuthedFetch(opts: { store?: ConfigStore } = {}): Promise<AuthedFetch> {\n const store = opts.store ?? new ConfigStore()\n const config = await store.read()\n const resolved = resolveAccount(config, { accountOverride: process.env.WSPC_ACCOUNT })\n const interceptor = buildInterceptor(store, resolved)\n\n const authedFetch: typeof fetch = (input, init) =>\n interceptor.execute(new Request(input as RequestInfo, init))\n return { fetch: authedFetch, baseUrl: resolved.apiBase }\n}\n","/**\n * Lightweight ANSI + table primitives shared by all renderers. No external\n * dependencies — keep it that way; the CLI's value prop is being a small\n * single-file install. Anything that needs heavy formatting belongs in a\n * specific renderer, not here.\n */\n\nconst ESC = \"\\x1b[\"\n\n// ---------- colour / weight ----------\n\n/** Honour NO_COLOR (https://no-color.org) and non-TTY destinations. */\nfunction colourEnabled(): boolean {\n if (process.env.NO_COLOR) return false\n if (process.env.FORCE_COLOR) return true\n return !!process.stdout.isTTY\n}\n\nfunction wrap(code: string, s: string): string {\n if (!colourEnabled()) return s\n return `${ESC}${code}m${s}${ESC}0m`\n}\n\nexport const dim = (s: string): string => wrap(\"2\", s)\nexport const bold = (s: string): string => wrap(\"1\", s)\nexport const green = (s: string): string => wrap(\"32\", s)\nexport const yellow = (s: string): string => wrap(\"33\", s)\nexport const red = (s: string): string => wrap(\"31\", s)\nexport const gray = (s: string): string => wrap(\"90\", s)\nexport const cyan = (s: string): string => wrap(\"36\", s)\n\nexport function colorise(s: string, color?: string): string {\n switch (color) {\n case \"green\":\n return green(s)\n case \"yellow\":\n return yellow(s)\n case \"red\":\n return red(s)\n case \"gray\":\n return gray(s)\n case \"cyan\":\n return cyan(s)\n case \"dim\":\n return dim(s)\n case \"bold\":\n return bold(s)\n default:\n return s\n }\n}\n\n// ---------- value formatters ----------\n\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g\n\n/** Count visible width ignoring ANSI codes. CJK width approximated as 2. */\nexport function visibleWidth(s: string): number {\n const stripped = s.replace(ANSI_RE, \"\")\n let w = 0\n for (const ch of stripped) {\n const code = ch.codePointAt(0)!\n // Rough CJK detection — sufficient for column alignment of titles/labels\n // that may mix English with Chinese; we don't aim for full UAX #11 here.\n if (code >= 0x1100 && code <= 0x115f) w += 2\n else if (code >= 0x2e80 && code <= 0x9fff) w += 2\n else if (code >= 0xac00 && code <= 0xd7a3) w += 2\n else if (code >= 0xf900 && code <= 0xfaff) w += 2\n else if (code >= 0xff00 && code <= 0xff60) w += 2\n else if (code >= 0xffe0 && code <= 0xffe6) w += 2\n else w += 1\n }\n return w\n}\n\nfunction padEndVisible(s: string, target: number): string {\n const w = visibleWidth(s)\n if (w >= target) return s\n return s + \" \".repeat(target - w)\n}\n\n/**\n * Truncate to `max` *visible* width, appending `…`. Ignores any ANSI escapes\n * (callers should pass raw strings; styling should wrap the truncated result).\n */\nexport function truncate(s: string, max = 50): string {\n if (visibleWidth(s) <= max) return s\n // Trim character-by-character. Not perfect for embedded ANSI mid-string,\n // but format hints today only colour the cell wholesale.\n let out = \"\"\n let w = 0\n for (const ch of s.replace(ANSI_RE, \"\")) {\n const cw = visibleWidth(ch)\n if (w + cw + 1 > max) break\n out += ch\n w += cw\n }\n return out + \"…\"\n}\n\n/**\n * Render an id with visual emphasis on the scannable prefix while keeping\n * the full id intact for copy-paste — `tod_01HW3K4N` shown normally,\n * `9V5G6Z8C2Q7B1Y0M3F` dimmed. Terminal text selection still picks up the\n * whole string so users can copy from the table directly and use it as a\n * parameter to other commands.\n *\n * Naming note: the spec contract key is `\"id-short\"` for historical reasons\n * (the original implementation truncated). The wire name is kept stable so\n * the spec doesn't churn; the behaviour evolved when truncation turned out\n * to bite users who copied the visible prefix and got a NOT_FOUND.\n */\nexport function idShort(s: string): string {\n if (!s) return s\n const us = s.indexOf(\"_\")\n const prefixEnd = us >= 0 ? us + 9 : 12\n if (s.length <= prefixEnd) return s\n return s.slice(0, prefixEnd) + dim(s.slice(prefixEnd))\n}\n\n/**\n * Common todo / task status enums → icon + colour. Unknown values fall\n * through to the raw string so the spec can add new statuses without\n * shipping a CLI bump first.\n */\nexport function statusBadge(s: string): string {\n switch (s) {\n case \"open\":\n return gray(\"○ open\")\n case \"in_progress\":\n return yellow(\"◐ in_progress\")\n case \"done\":\n return green(\"✓ done\")\n case \"cancelled\":\n case \"canceled\":\n return red(\"✕ \" + s)\n default:\n return s\n }\n}\n\n/**\n * Render a boolean flag (e.g. `is_read`) as a dim \"read\" / bright \"unread\"\n * badge. Accepts the raw boolean rather than a string so the format applies\n * cleanly to JSON-shaped data.\n */\nexport function boolBadge(value: unknown): string {\n if (value === true) return dim(\"✓ read\")\n if (value === false) return \"● unread\"\n return String(value)\n}\n\n/**\n * Render a timestamp as relative time. Accepts epoch-ms numbers (preferred —\n * matches the wspc API convention), ISO 8601 strings, or date-only strings.\n * Returns the raw input on parse failure rather than throwing, so a bad cell\n * doesn't crash the whole table.\n */\nexport function relativeTime(value: unknown, now: number = Date.now()): string {\n let ms: number\n if (typeof value === \"number\") {\n ms = value\n } else if (typeof value === \"string\") {\n // Accept \"2026-06-01\" (date-only) and full ISO; both parse via Date.\n const parsed = Date.parse(value)\n if (Number.isNaN(parsed)) return value\n ms = parsed\n } else {\n return String(value)\n }\n const diff = ms - now\n const abs = Math.abs(diff)\n const future = diff > 0\n\n const MINUTE = 60 * 1000\n const HOUR = 60 * MINUTE\n const DAY = 24 * HOUR\n const WEEK = 7 * DAY\n const MONTH = 30 * DAY\n\n let amount: number\n let unit: string\n if (abs < MINUTE) return \"just now\"\n if (abs < HOUR) {\n amount = Math.round(abs / MINUTE)\n unit = \"m\"\n } else if (abs < DAY) {\n amount = Math.round(abs / HOUR)\n unit = \"h\"\n } else if (abs < WEEK) {\n amount = Math.round(abs / DAY)\n unit = \"d\"\n } else if (abs < MONTH) {\n amount = Math.round(abs / WEEK)\n unit = \"w\"\n } else {\n amount = Math.round(abs / MONTH)\n unit = \"mo\"\n }\n return future ? `in ${amount}${unit}` : `${amount}${unit} ago`\n}\n\n/**\n * Wrap `text` to `width` visible columns, returning one string per output\n * line. Existing newlines in `text` are preserved (each source line is wrapped\n * independently, blank lines kept). English wraps at spaces; a single token\n * wider than `width` (long URLs, spaceless CJK runs) is hard-broken by visible\n * width using the same `visibleWidth` ruler the tables use, so CJK columns line\n * up the same way they do elsewhere. No external dependency by design.\n *\n * `width` is the visible-column budget; values <= 0 fall back to 80. A token\n * wider than `width` is broken one max-fitting chunk at a time (at least one\n * character per line, so wrapping always progresses).\n */\nexport function wrapToWidth(text: string, width: number): string[] {\n const limit = width > 0 ? width : 80\n const out: string[] = []\n for (const line of text.split(\"\\n\")) {\n if (line.length === 0) {\n out.push(\"\")\n continue\n }\n let cur = \"\"\n for (let word of line.split(\" \")) {\n // Hard-break a word that cannot fit on a line by itself.\n while (visibleWidth(word) > limit) {\n let head = \"\"\n for (const ch of word) {\n if (head && visibleWidth(head + ch) > limit) break\n head += ch\n if (visibleWidth(head) >= limit) break\n }\n if (cur) {\n out.push(cur)\n cur = \"\"\n }\n out.push(head)\n word = word.slice(head.length)\n }\n const sep = cur ? \" \" : \"\"\n if (cur && visibleWidth(cur + sep + word) > limit) {\n out.push(cur)\n cur = word\n } else {\n cur = cur + sep + word\n }\n }\n if (cur) out.push(cur)\n }\n return out\n}\n\n// ---------- table ----------\n\n/**\n * Render an aligned text table to a string (with trailing newline). Column\n * widths are chosen from the widest visible content per column. Caller is\n * responsible for any pre-formatting (truncation, colour, badges).\n */\nexport function table(headers: string[], rows: string[][]): string {\n if (rows.length === 0) {\n return \"\"\n }\n const widths: number[] = headers.map((h, i) => {\n let w = visibleWidth(h)\n for (const r of rows) {\n const cell = r[i] ?? \"\"\n const cw = visibleWidth(cell)\n if (cw > w) w = cw\n }\n return w\n })\n const sep = \" \"\n const lines: string[] = []\n // Header: dimmed, uppercase already supplied by caller.\n lines.push(headers.map((h, i) => dim(padEndVisible(h, widths[i] ?? 0))).join(sep))\n for (const r of rows) {\n lines.push(r.map((c, i) => padEndVisible(c ?? \"\", widths[i] ?? 0)).join(sep))\n }\n return lines.join(\"\\n\") + \"\\n\"\n}\n","/**\n * Output dispatch entry point. Generated CLI commands call `render({ kind,\n * display }, data)` instead of dumping JSON directly. The dispatcher walks a\n * three-tier fallback chain:\n *\n * 1. Specific renderer registered for `kind` (handwritten, opt-in)\n * 2. Generic renderer driven by spec `display` hints (covers most ops)\n * 3. Generic renderer with schema-shape auto-detect (no hints needed)\n * 4. JSON (final safety net)\n *\n * JSON is also forced when output is being piped/redirected, when the user\n * passes `--json`, or via `WSPC_OUTPUT=json` — so machine consumers and AI\n * agents always get a parseable shape regardless of which tier handled the\n * pretty path.\n */\n\nimport {\n boolBadge,\n colorise,\n dim,\n green,\n idShort,\n relativeTime,\n statusBadge,\n table,\n truncate,\n visibleWidth,\n wrapToWidth,\n} from \"./primitives.js\"\nimport type {\n RenderContext,\n Renderer,\n XCliDisplay,\n XCliFormat,\n} from \"./types.js\"\n\n/**\n * Registry of specific renderers, keyed by `kind`. Intentionally empty at\n * boot — register from a side-effecting module (`renderers/index.ts`) when\n * we need custom output for a specific operation. Until then, every command\n * flows through the generic renderer.\n */\nconst SPECIFIC_RENDERERS: Record<string, Renderer> = {}\n\n/** Public API for tests / future bootstrap modules to plug renderers in. */\nexport function registerRenderer(kind: string, renderer: Renderer): void {\n SPECIFIC_RENDERERS[kind] = renderer\n}\n\nexport function render(ctx: RenderContext, data: unknown): void {\n if (data === undefined) return\n // `raw` shape is for passthrough payloads like `.ics` text where any\n // wrapping (JSON quoting, table, key/value) would corrupt the content.\n // It wins over both TTY auto-detection and explicit `--json`/WSPC_OUTPUT\n // because the upstream HTTP body is already the user-facing artifact;\n // re-encoding it as a JSON string is never what the caller wants.\n if (ctx.display?.shape === \"raw\") {\n const s = typeof data === \"string\" ? data : String(data)\n process.stdout.write(s)\n if (!s.endsWith(\"\\n\")) process.stdout.write(\"\\n\")\n return\n }\n if (shouldOutputJson()) {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\")\n return\n }\n // Drill into the wrapper key for pretty mode only. JSON output above\n // intentionally preserves the full server payload.\n const target = drillDataPath(data, ctx.display?.dataPath)\n const specific = SPECIFIC_RENDERERS[ctx.kind]\n if (specific) {\n specific(target, ctx.display)\n } else {\n renderGeneric(target, ctx.display)\n }\n // Pass original `data` (the full response wrapper) so top-level\n // next_cursor / children_next_cursor / comments_next_cursor are visible.\n renderPaginationFooter(data)\n}\n\nfunction renderPaginationFooter(data: unknown): void {\n if (data === null || typeof data !== \"object\") return\n const d = data as Record<string, unknown>\n if (typeof d.next_cursor === \"string\" && d.next_cursor.length > 0) {\n process.stdout.write(dim(` … more results — re-run with --cursor ${d.next_cursor}`) + \"\\n\")\n }\n const id = typeof d.id === \"string\" ? d.id : \"<id>\"\n if (typeof d.children_next_cursor === \"string\" && d.children_next_cursor.length > 0) {\n process.stdout.write(dim(` … more children — wspc todo ls --parent ${id}`) + \"\\n\")\n }\n if (typeof d.comments_next_cursor === \"string\" && d.comments_next_cursor.length > 0) {\n process.stdout.write(dim(` … more comments — wspc todo comment ls ${id}`) + \"\\n\")\n }\n}\n\nfunction drillDataPath(data: unknown, dataPath: string | undefined): unknown {\n if (!dataPath) return data\n if (data === null || typeof data !== \"object\") return data\n const value = (data as Record<string, unknown>)[dataPath]\n // If the wrapper key is missing, fall back to the original payload so the\n // user still sees something useful instead of \"undefined\".\n return value === undefined ? data : value\n}\n\nfunction shouldOutputJson(): boolean {\n // Explicit overrides win over TTY detection so users can force either\n // mode in CI logs, screenshots, captured output, or AI-driven tooling.\n if (process.env.WSPC_OUTPUT === \"json\") return true\n if (process.env.WSPC_OUTPUT === \"pretty\") return false\n // The codegen wires `--json` to flip WSPC_OUTPUT=json before the action.\n if (!process.stdout.isTTY) {\n // Pipe / redirect — machine consumer. Default to JSON so scripts /\n // `jq` / AI agents get a parseable shape without opting in.\n return true\n }\n return false\n}\n\n// ---------- generic renderer ----------\n\nfunction termWidth(): number {\n const c = process.stdout.columns\n return typeof c === \"number\" && c > 0 ? c : 80\n}\n\nfunction renderGeneric(data: unknown, hints?: XCliDisplay): void {\n const shape = hints?.shape ?? detectShape(data)\n if (shape === \"list\") {\n renderList(data, hints)\n } else if (shape === \"object\") {\n renderObject(data, hints)\n } else {\n renderScalar(data)\n }\n}\n\nfunction detectShape(data: unknown): \"list\" | \"object\" | \"scalar\" {\n if (Array.isArray(data)) return \"list\"\n if (typeof data === \"object\" && data !== null) {\n // wspc list responses wrap items in a single array property, e.g.\n // `{ todos: [...] }` or `{ projects: [...] }`. We treat any object with\n // exactly one array-valued top-level key as a list.\n const keys = Object.keys(data)\n const arrayKeys = keys.filter((k) => Array.isArray((data as Record<string, unknown>)[k]))\n if (arrayKeys.length === 1) return \"list\"\n return \"object\"\n }\n return \"scalar\"\n}\n\nfunction extractItems(data: unknown): unknown[] {\n if (Array.isArray(data)) return data\n if (typeof data === \"object\" && data !== null) {\n for (const v of Object.values(data)) {\n if (Array.isArray(v)) return v\n }\n }\n return []\n}\n\nfunction renderList(data: unknown, hints?: XCliDisplay): void {\n const items = extractItems(data)\n if (items.length === 0) {\n process.stdout.write(dim(\" \" + (hints?.emptyMessage ?? \"no items\")) + \"\\n\")\n return\n }\n const first = items[0] as Record<string, unknown>\n const columns = pickColumns(first, hints?.columns)\n const format = hints?.format ?? {}\n const headers = columns.map((c) => c.toUpperCase())\n const rows = items.map((item) =>\n columns.map((col) =>\n formatCell((item as Record<string, unknown>)[col], format[col], hints?.enumColorMap?.[col]),\n ),\n )\n process.stdout.write(table(headers, rows))\n}\n\nfunction pickColumns(first: Record<string, unknown>, hint?: string[]): string[] {\n if (hint && hint.length > 0) return hint.filter((c) => c in first)\n // Auto-pick: prefer well-known leading fields, then any other scalar field,\n // capped at 5 to avoid runaway-wide tables.\n const PREFERRED = [\"id\", \"name\", \"title\", \"label\", \"status\", \"due_at\", \"created_at\"]\n const present = new Set(Object.keys(first))\n const ordered = [\n ...PREFERRED.filter((k) => present.has(k) && isScalar(first[k])),\n ...Object.keys(first).filter(\n (k) => !PREFERRED.includes(k) && isScalar(first[k]),\n ),\n ]\n return ordered.slice(0, 5)\n}\n\n/**\n * Render an object as key/value rows (two-space indent). Exported so\n * handwritten renderers (e.g. `wspc whoami`) can compose multiple object\n * sections without re-implementing the field/format pipeline.\n */\nexport function renderObject(data: unknown, hints?: XCliDisplay): void {\n if (typeof data !== \"object\" || data === null) {\n renderScalar(data)\n return\n }\n // Many wspc responses wrap the resource in a single-key envelope\n // (`{ todo: {...} }`). Peel one level so the user sees fields directly.\n let obj = data as Record<string, unknown>\n const topKeys = Object.keys(obj)\n if (topKeys.length === 1) {\n const onlyKey = topKeys[0] as string\n const inner = obj[onlyKey]\n if (inner && typeof inner === \"object\" && !Array.isArray(inner)) {\n obj = inner as Record<string, unknown>\n }\n }\n const fields =\n hints?.fields?.filter((f) => f in obj) ??\n Object.keys(obj).filter((k) => isScalar(obj[k]))\n if (fields.length === 0) {\n // Nothing scalar to show — fall through to JSON so the user still sees\n // something useful instead of an empty block.\n process.stdout.write(JSON.stringify(obj, null, 2) + \"\\n\")\n return\n }\n const format = hints?.format ?? {}\n // When user explicitly whitelisted fields, respect that and skip arrays.\n // Otherwise show array fields as indented sub-lists after the scalar rows\n // so users see attendees / tags / etc. without resorting to --json.\n const arrayFields = hints?.fields\n ? []\n : Object.keys(obj).filter(\n (k) => Array.isArray(obj[k]) && (obj[k] as unknown[]).length > 0,\n )\n\n // Format every scalar field up front (object mode never truncates), then\n // classify: short single-line values stay as aligned two-column rows; values\n // with newlines or wider than the available column go to indented blocks\n // rendered last, so the compact id/status/timestamp rows stay scannable.\n const formatted: Array<[string, string]> = fields.map((f) => [\n f,\n formatCell(obj[f], format[f], hints?.enumColorMap?.[f], { noTruncate: true }),\n ])\n const labelWidth = Math.max(\n ...formatted.map(([f]) => f.length),\n ...arrayFields.map((f) => f.length),\n 0,\n )\n const tw = termWidth()\n const avail = tw - (2 + labelWidth + 2)\n const inlineFinal: Array<[string, string]> = []\n const blocks: Array<[string, string]> = []\n for (const [f, value] of formatted) {\n if (value.includes(\"\\n\") || visibleWidth(value) > avail) {\n blocks.push([f, value])\n } else {\n inlineFinal.push([f, value])\n }\n }\n\n for (const [f, value] of inlineFinal) {\n process.stdout.write(` ${dim(f.padEnd(labelWidth))} ${value}\\n`)\n }\n for (const f of arrayFields) {\n const uncapped = f === \"children\" || f === \"comments\"\n const max = uncapped ? Number.POSITIVE_INFINITY : ARRAY_FIELD_MAX_ITEMS\n renderArrayField(f, obj[f] as unknown[], labelWidth, max)\n }\n const hadAbove = inlineFinal.length > 0 || arrayFields.length > 0\n blocks.forEach(([f, value], i) => {\n if (hadAbove || i > 0) process.stdout.write(\"\\n\")\n process.stdout.write(` ${dim(f)}\\n`)\n for (const line of wrapToWidth(value, tw - 4)) {\n process.stdout.write(` ${line}\\n`)\n }\n })\n if (hints?.secretField) {\n const value = obj[hints.secretField]\n if (value !== undefined) {\n process.stdout.write(\"\\n\")\n process.stdout.write(colorise(\"⚠ This is the only time you'll see this key. Save it now.\", \"yellow\") + \"\\n\")\n process.stdout.write(\"\\n\")\n process.stdout.write(\" To use it as the active env credential:\\n\")\n process.stdout.write(` wspc env add <name> --api-key ${value}\\n`)\n }\n }\n}\n\nconst ARRAY_FIELD_MAX_ITEMS = 10\n\nfunction renderArrayField(\n name: string,\n items: unknown[],\n labelWidth: number,\n max: number = ARRAY_FIELD_MAX_ITEMS,\n): void {\n const count = items.length\n const header = `${count} ${count === 1 ? \"item\" : \"items\"}`\n process.stdout.write(` ${dim(name.padEnd(labelWidth))} ${header}\\n`)\n const shown = items.slice(0, max)\n shown.forEach((item, i) => {\n process.stdout.write(` ${dim(`${i + 1}.`)} ${formatArrayItem(item)}\\n`)\n })\n if (count > shown.length) {\n process.stdout.write(` ${dim(`... and ${count - shown.length} more`)}\\n`)\n }\n}\n\nfunction formatArrayItem(item: unknown): string {\n if (item === null) return dim(\"null\")\n if (typeof item !== \"object\") return String(item)\n const todo = formatTodoLike(item)\n if (todo !== null) return todo\n const comment = formatCommentLike(item)\n if (comment !== null) return comment\n const attendee = formatAttendeeLike(item)\n if (attendee !== null) return attendee\n return JSON.stringify(item)\n}\n\n/**\n * Recognize a child-todo shape ({ id, title, status }) and render it as a\n * one-line subtask: short id, status badge, title. Returns null when the input\n * isn't todo-like so the caller can fall back to compact JSON.\n */\nfunction formatTodoLike(item: unknown): string | null {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return null\n const rec = item as Record<string, unknown>\n if (typeof rec.id !== \"string\" || typeof rec.title !== \"string\") return null\n const id = idShort(rec.id)\n const status = typeof rec.status === \"string\" ? statusBadge(rec.status) : \"\"\n return status ? `${id} ${status} ${rec.title}` : `${id} ${rec.title}`\n}\n\n/**\n * Recognize a comment shape ({ id, content }) and render it as a one-line row:\n * short id, relative time, a truncated content snippet (the full body can be\n * thousands of chars, so the inline list shows a preview only). Returns null\n * when the input isn't comment-like so the caller can fall back.\n */\nfunction formatCommentLike(item: unknown): string | null {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return null\n const rec = item as Record<string, unknown>\n if (typeof rec.id !== \"string\" || typeof rec.content !== \"string\") return null\n const id = idShort(rec.id)\n const when = rec.created_at !== undefined ? `${relativeTime(rec.created_at)} ` : \"\"\n const snippet = truncate(rec.content, 60)\n return `${id} ${when}${snippet}`\n}\n\n/**\n * Recognize the common `{ email, display_name? }` attendee shape and render\n * it the way humans expect (\"Alice <alice@example.com>\"). Returns null when\n * the input doesn't look like an attendee so the caller can fall back to\n * compact JSON.\n */\nfunction formatAttendeeLike(item: unknown): string | null {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return null\n const rec = item as Record<string, unknown>\n const email = typeof rec.email === \"string\" ? rec.email : null\n if (!email) return null\n const name =\n typeof rec.display_name === \"string\" && rec.display_name.length > 0\n ? rec.display_name\n : null\n return name ? `${name} <${email}>` : `<${email}>`\n}\n\nfunction renderScalar(data: unknown): void {\n if (data === null) {\n process.stdout.write(dim(\"null\") + \"\\n\")\n return\n }\n if (typeof data === \"boolean\") {\n process.stdout.write((data ? green(\"true\") : dim(\"false\")) + \"\\n\")\n return\n }\n if (typeof data === \"object\") {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\")\n return\n }\n process.stdout.write(String(data) + \"\\n\")\n}\n\nfunction isScalar(v: unknown): boolean {\n return v === null || (typeof v !== \"object\" && typeof v !== \"function\")\n}\n\nfunction formatCell(\n value: unknown,\n fmt?: XCliFormat,\n colorMap?: Record<string, { label: string; color: string }>,\n opts?: { noTruncate?: boolean },\n): string {\n if (fmt !== \"enum-badge\" && (value === undefined || value === null)) return dim(\"—\")\n switch (fmt) {\n case \"id-short\":\n return idShort(String(value))\n case \"status-badge\":\n return statusBadge(String(value))\n case \"relative-time\":\n return relativeTime(value)\n case \"truncate\":\n // `truncate` is a list/column-width hint only. In object (`show`) mode the\n // caller passes noTruncate so single-item views render the full value.\n return opts?.noTruncate ? String(value) : truncate(String(value), 50)\n case \"bool-badge\":\n return boolBadge(value)\n case \"enum-badge\": {\n const map = colorMap ?? {}\n const key = (value === null || value === undefined) ? \"null\" : String(value)\n const entry = map[key] ?? map[\"*\"]\n if (!entry) {\n return value === undefined || value === null ? dim(\"—\") : String(value)\n }\n const label = entry.label.replace(\"<value>\", String(value))\n return colorise(label, entry.color)\n }\n default:\n if (typeof value === \"object\") return JSON.stringify(value)\n return String(value)\n }\n}\n","// AUTO-GENERATED — DO NOT EDIT (source: key_create)\nimport { Command } from \"commander\"\nimport { keyCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const keyCreateCommand = new Command(\"create\")\n .description(\"Create a new API key (full value returned once)\")\n .option(\"--label <value>\", \"Human-readable label for the new key (1–60 chars after trimming). Pick something that identifies where the key will live — agent name, machine, or environment — so you can recognise it later in `wspc keys list`.\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await keyCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n label: opts.label,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"key_create\", display: {\"shape\":\"object\",\"fields\":[\"id\",\"label\",\"api_key\",\"created_at\"],\"format\":{\"id\":\"id-short\",\"created_at\":\"relative-time\"},\"secretField\":\"api_key\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: key_list)\nimport { Command } from \"commander\"\nimport { keyList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const keyListCommand = new Command(\"ls\")\n .description(\"List active API keys\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await keyList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"key_list\", display: {\"shape\":\"list\",\"dataPath\":\"keys\",\"columns\":[\"id\",\"label\",\"last_4\",\"created_at\",\"last_used_at\"],\"format\":{\"id\":\"id-short\",\"created_at\":\"relative-time\",\"last_used_at\":\"relative-time\"},\"emptyMessage\":\"(no API keys)\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_invite_create)\nimport { Command } from \"commander\"\nimport { orgInviteCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const orgInviteCreateCommand = new Command(\"invite\")\n .description(\"Invite an email to join the caller's organization\")\n .option(\"--email <value>\", \"Email address to invite into the caller's organization.\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await orgInviteCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n email: opts.email,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_invite_create\", display: {\"shape\":\"object\",\"fields\":[\"id\",\"email\",\"state\",\"expires_at\",\"invite_url\"]} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_invites_list)\nimport { Command } from \"commander\"\nimport { orgInvitesList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const orgInvitesListCommand = new Command(\"invites\")\n .description(\"List invites issued by the caller's organization\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await orgInvitesList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_invites_list\", display: {\"shape\":\"list\",\"dataPath\":\"invites\",\"columns\":[\"id\",\"email\",\"state\",\"expires_at\"],\"format\":{\"id\":\"id-short\",\"expires_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_get)\nimport { Command } from \"commander\"\nimport { orgGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const orgGetCommand = new Command(\"show\")\n .description(\"Get the authenticated user's organization\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await orgGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_get\", display: {\"shape\":\"object\",\"fields\":[\"id\",\"name\",\"created_at\",\"updated_at\"],\"format\":{\"id\":\"id-short\",\"name\":\"truncate\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_update)\nimport { Command } from \"commander\"\nimport { orgUpdate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const orgUpdateCommand = new Command(\"rename\")\n .description(\"Update the authenticated user's organization\")\n .option(\"--name <value>\", \"The new name for the organization. Cannot be empty or purely whitespace.\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await orgUpdate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n name: opts.name,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_update\", display: {\"shape\":\"object\",\"fields\":[\"id\",\"name\",\"created_at\",\"updated_at\"],\"format\":{\"id\":\"id-short\",\"name\":\"truncate\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: invite_get)\nimport { Command } from \"commander\"\nimport { inviteGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const inviteGetCommand = new Command(\"show\")\n .description(\"Get a single invite addressed to the caller\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await inviteGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"invite_get\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: auth_me)\nimport { Command } from \"commander\"\nimport { authMe } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const authMeCommand = new Command(\"me\")\n .description(\"Fetch the user identified by the bearer token\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await authMe({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"auth_me\", display: {\"shape\":\"object\",\"fields\":[\"user_id\",\"email\",\"display_name\",\"api_key_id\"],\"format\":{\"user_id\":\"id-short\",\"api_key_id\":\"id-short\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: invites_list)\nimport { Command } from \"commander\"\nimport { invitesList } from \"../sdk/index.js\"\nimport { loadSdkClient } from \"../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../handwritten/output/render.js\"\n\nexport const invitesListCommand = new Command(\"invites\")\n .description(\"List invites addressed to the authenticated user's email\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await invitesList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"invites_list\", display: {\"shape\":\"list\",\"dataPath\":\"invites\",\"columns\":[\"id\",\"org_name\",\"inviter_email\",\"state\",\"expires_at\"],\"format\":{\"id\":\"id-short\",\"expires_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_members_list)\nimport { Command } from \"commander\"\nimport { orgMembersList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const orgMembersListCommand = new Command(\"members\")\n .description(\"List members of the authenticated user's organization\")\n .option(\"--cursor <value>\", \"Opaque pagination cursor. Pass the `next_cursor` returned by the previous page to fetch the next slice. Omit on the first call.\")\n .option(\"--limit <value>\", \"Maximum members to return. Clamped to [1, 100]. Defaults to 50.\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await orgMembersList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n cursor: opts.cursor,\n limit: opts.limit,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_members_list\", display: {\"shape\":\"list\",\"dataPath\":\"members\",\"columns\":[\"user_id\",\"email\",\"display_name\",\"joined_at\"],\"format\":{\"user_id\":\"id-short\",\"joined_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: invite_reject)\nimport { Command } from \"commander\"\nimport { inviteReject } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const inviteRejectCommand = new Command(\"reject\")\n .description(\"Reject an invite\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await inviteReject({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"invite_reject\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: key_revoke)\nimport { Command } from \"commander\"\nimport { keyRevoke } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const keyRevokeCommand = new Command(\"rm\")\n .description(\"Soft-revoke an API key\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await keyRevoke({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"key_revoke\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: key_update)\nimport { Command } from \"commander\"\nimport { keyUpdate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const keyUpdateCommand = new Command(\"edit\")\n .description(\"Update an active API key's label\")\n .argument(\"<id>\", \"id\")\n .option(\"--label <value>\", \"Human-readable label for the key (1–60 chars after trimming).\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await keyUpdate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n label: opts.label,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"key_update\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: org_invite_revoke)\nimport { Command } from \"commander\"\nimport { orgInviteRevoke } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const orgInviteRevokeCommand = new Command(\"revoke\")\n .description(\"Revoke a pending invite\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await orgInviteRevoke({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"org_invite_revoke\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: event_create)\nimport { Command } from \"commander\"\nimport { eventCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\nimport { parseTimeInput, resolveTimezone } from \"../../../handwritten/utils/parse-time.js\"\nimport { parseDateOnly, inclusiveEndToExclusive } from \"../../../handwritten/utils/parse-date.js\"\nimport { parseAttendee } from \"../../../handwritten/utils/parse-attendee.js\"\n\nexport const eventCreateCommand = new Command(\"add\")\n .description(\"Schedule a calendar event\")\n .argument(\"<title>\", \"title\")\n .option(\"--description <value>\", \"Free-form notes about the event (agenda, dial-in instructions, etc.). Markdown formatted (CommonMark + GFM tables, strikethrough, task lists); stored verbatim. Invitation emails include the raw source — most email clients display it as plain text.\")\n .option(\"--start <value>\", \"Accepts ISO 8601 datetime with offset (e.g. `2026-06-01T12:30:00+08:00`) for timed events, or ISO date-only (e.g. `2026-06-01`) for all-day. The `wspc` CLI additionally accepts natural-language phrases (`tomorrow 12:30pm`, `next Monday 9am`) and resolves them to ISO before sending; the server itself only accepts ISO. All-day uses RFC 5545 exclusive end: a one-day event on 6/1 is `start=2026-06-01, end=2026-06-02`; both endpoints must be the same type.\")\n .option(\"--end <value>\", \"Accepts ISO 8601 datetime with offset (e.g. `2026-06-01T12:30:00+08:00`) for timed events, or ISO date-only (e.g. `2026-06-01`) for all-day. The `wspc` CLI additionally accepts natural-language phrases (`tomorrow 12:30pm`, `next Monday 9am`) and resolves them to ISO before sending; the server itself only accepts ISO. All-day uses RFC 5545 exclusive end: a one-day event on 6/1 is `start=2026-06-01, end=2026-06-02`; both endpoints must be the same type.\")\n .option(\"-l, --location <value>\", \"Free-text location — physical address, room, or short note. Separate from `url` (meeting link).\")\n .option(\"-u, --url <value>\", \"Optional meeting link (Zoom / Meet / etc.). Kept separate from `location` so calendar clients can render it as a join action.\")\n .option(\"--status <value>\", \"Lifecycle status. `confirmed`: the event will happen (default). `tentative`: organizer has not finalized; still visible in lists. `cancelled`: the event was called off but the record is kept so attendees can be notified and history audited; distinct from soft-delete (DELETE `/calendar/events/{id}`) which hides the event from default list responses.\")\n .option(\"--attendee <value>\", \"Up to 50 unique attendees (deduped case-insensitively by email). If non-empty, each attendee receives an invitation email with an `.ics` REQUEST attachment as a side effect of creation.\", (val: string, memo: string[]) => { memo.push(val); return memo }, [] as string[])\n .option(\"--all-day\", \"all_day\")\n .option(\"--tz <zone>\", \"IANA timezone for relative time parsing\")\n .action(async (title, opts) => {\n const zone = resolveTimezone(opts.tz as string | undefined)\n let startValue: string | undefined\n if (opts.start !== undefined) {\n if (opts.allDay) {\n startValue = parseDateOnly(opts.start as string)\n } else {\n startValue = parseTimeInput(opts.start as string, zone).toISO() ?? undefined\n }\n }\n let endValue: string | undefined\n if (opts.end !== undefined) {\n if (opts.allDay) {\n endValue = inclusiveEndToExclusive(opts.end as string)\n } else {\n endValue = parseTimeInput(opts.end as string, zone).toISO() ?? undefined\n }\n }\n const attendeeRaw = opts.attendee as string[]\n const attendees = attendeeRaw.length > 0 ? attendeeRaw.map(parseAttendee) : undefined\n const client = await loadSdkClient()\n const result = await eventCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n title,\n description: opts.description,\n start: startValue as string,\n end: endValue as string,\n location: opts.location,\n url: opts.url,\n status: opts.status,\n attendees: attendees,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_create\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"status\":\"status-badge\",\"start\":\"relative-time\",\"end\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","import * as chrono from \"chrono-node\"\nimport { DateTime } from \"luxon\"\n\nexport class ParseTimeError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"ParseTimeError\"\n }\n}\n\nexport function resolveTimezone(\n flag: string | undefined,\n env: Record<string, string | undefined> = process.env,\n): string {\n return flag ?? env.WSPC_TZ ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n}\n\nconst HAS_OFFSET = /(Z|[+-]\\d{2}:?\\d{2})$/\n\nexport function parseTimeInput(input: string, zone: string): DateTime {\n // Only fast-path ISO strings that carry an explicit offset/Z. Naive ISO\n // (e.g. \"2026-05-12T10:00\") would land in the system zone with setZone:true,\n // not the caller's `zone`. Let those fall through to chrono + fromObject.\n if (HAS_OFFSET.test(input)) {\n const iso = DateTime.fromISO(input, { setZone: true })\n if (iso.isValid) return iso\n }\n\n const nowInZone = DateTime.now().setZone(zone)\n const refDate = new Date(\n nowInZone.year,\n nowInZone.month - 1,\n nowInZone.day,\n nowInZone.hour,\n nowInZone.minute,\n nowInZone.second,\n nowInZone.millisecond,\n )\n const start = chrono.parse(input, refDate, { forwardDate: true })[0]?.start\n if (!start) {\n throw new ParseTimeError(\n `Cannot parse time: \"${input}\". Use ISO 8601 (e.g. 2026-05-12T10:00+08:00) or natural language (e.g. \"tomorrow 10am\").`,\n )\n }\n return DateTime.fromObject(\n {\n year: start.get(\"year\") ?? nowInZone.year,\n month: start.get(\"month\") ?? nowInZone.month,\n day: start.get(\"day\") ?? nowInZone.day,\n hour: start.get(\"hour\") ?? 0,\n minute: start.get(\"minute\") ?? 0,\n second: start.get(\"second\") ?? 0,\n },\n { zone },\n )\n}\n","import { DateTime } from \"luxon\"\n\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}$/\n\nexport class ParseDateError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"ParseDateError\"\n }\n}\n\nexport function parseDateOnly(input: string): string {\n if (!ISO_DATE.test(input)) {\n throw new ParseDateError(\n `Cannot parse date: \"${input}\". Use YYYY-MM-DD (e.g. 2026-05-10) when --all-day is set.`,\n )\n }\n const dt = DateTime.fromISO(input)\n if (!dt.isValid) {\n throw new ParseDateError(`Invalid date: \"${input}\".`)\n }\n return input\n}\n\nexport function inclusiveEndToExclusive(date: string): string {\n return DateTime.fromISO(parseDateOnly(date)).plus({ days: 1 }).toISODate()!\n}\n\nexport function exclusiveEndToInclusive(date: string): string {\n return DateTime.fromISO(parseDateOnly(date)).minus({ days: 1 }).toISODate()!\n}\n","export interface Attendee {\n email: string\n display_name?: string\n}\n\nexport function parseAttendee(input: string): Attendee {\n const match = input.match(/^(.*?)\\s*<(.*?)>$/)\n if (match) {\n const display_name = match[1]!.trim()\n const email = match[2]!.trim()\n return display_name ? { email, display_name } : { email }\n }\n return { email: input.trim() }\n}\n","// AUTO-GENERATED — DO NOT EDIT (source: event_list)\nimport { Command } from \"commander\"\nimport { eventList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\nimport { parseTimeInput, resolveTimezone } from \"../../../handwritten/utils/parse-time.js\"\n\nexport const eventListCommand = new Command(\"ls\")\n .description(\"List calendar events\")\n .option(\"--q <value>\", \"Optional full-text search across title, description, and location (case-insensitive substring).\")\n .option(\"--from <value>\", \"Inclusive lower bound on the event `start` (ISO datetime with offset, or ISO date-only). When ANY of `start_from`/`start_to`/`end_from`/`end_to` is provided, the implicit past filter is disabled.\")\n .option(\"--to <value>\", \"Inclusive upper bound on the event `start`.\")\n .option(\"--end-from <value>\", \"Inclusive lower bound on the event `end`.\")\n .option(\"--end-to <value>\", \"Inclusive upper bound on the event `end`.\")\n .option(\"--cursor <value>\", \"Opaque pagination cursor returned in `next_cursor` of a previous response.\")\n .option(\"--limit <value>\", \"Maximum number of events to return. Clamped to `[1, 200]`. Default is server-defined.\")\n .option(\"--include-deleted <value>\", \"When `true`, include soft-deleted events. Default `false`.\")\n .option(\"--include-past <value>\", \"When omitted or `false`, events whose `end` is before now are hidden. Pass `true` to include them. Ignored when any of `start_from`/`start_to`/`end_from`/`end_to` is provided — explicit time bounds always win.\")\n .option(\"--tz <zone>\", \"IANA timezone for relative time parsing\")\n .action(async (opts) => {\n const zone = resolveTimezone(opts.tz as string | undefined)\n let fromValue: string | undefined\n if (opts.from !== undefined) {\n fromValue = parseTimeInput(opts.from as string, zone).toISO() ?? undefined\n }\n let toValue: string | undefined\n if (opts.to !== undefined) {\n toValue = parseTimeInput(opts.to as string, zone).toISO() ?? undefined\n }\n const client = await loadSdkClient()\n const result = await eventList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n q: opts.q,\n start_from: fromValue,\n start_to: toValue,\n end_from: opts.endFrom,\n end_to: opts.endTo,\n cursor: opts.cursor,\n limit: opts.limit,\n include_deleted: opts.includeDeleted,\n include_past: opts.includePast,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"status\",\"title\",\"start\",\"end\"],\"format\":{\"id\":\"id-short\",\"status\":\"status-badge\",\"title\":\"truncate\",\"start\":\"relative-time\",\"end\":\"relative-time\"},\"emptyMessage\":\"no events\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: event_delete)\nimport { Command } from \"commander\"\nimport { eventDelete } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const eventDeleteCommand = new Command(\"rm\")\n .description(\"Soft-delete a calendar event\")\n .argument(\"<id>\", \"id\")\n .option(\"--expected-version <value>\", \"Optional optimistic lock. Omit to let the server use the current version; pass only to fail with 409 `VERSION_CONFLICT` if someone else has mutated the event since you last read.\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await eventDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n expected_version: opts.expectedVersion,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_delete\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: event_get)\nimport { Command } from \"commander\"\nimport { eventGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const eventGetCommand = new Command(\"show\")\n .description(\"Get a calendar event by id\")\n .argument(\"<id>\", \"id\")\n .option(\"--include-deleted <value>\", \"When `true`, return the row even if soft-deleted. Default `false` (returns 404).\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await eventGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n query: {\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_get\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"status\":\"status-badge\",\"start\":\"relative-time\",\"end\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: event_update)\nimport { Command } from \"commander\"\nimport { eventUpdate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\nimport { parseTimeInput, resolveTimezone } from \"../../../handwritten/utils/parse-time.js\"\nimport { parseDateOnly, inclusiveEndToExclusive } from \"../../../handwritten/utils/parse-date.js\"\nimport { parseAttendee } from \"../../../handwritten/utils/parse-attendee.js\"\n\nexport const eventUpdateCommand = new Command(\"set\")\n .description(\"Update a calendar event\")\n .argument(\"<id>\", \"id\")\n .option(\"--expected-version <value>\", \"Optional optimistic lock. Omit to let the server use the current version; pass only to fail the call if someone else has mutated the event since you last read. On mismatch the server returns 409 `VERSION_CONFLICT` with `extra.expected_version` and `extra.actual_version`.\")\n .option(\"--title <value>\", \"New event title. Omit to leave unchanged.\")\n .option(\"--description <value>\", \"New description. Markdown formatted (CommonMark + GFM tables, strikethrough, task lists). Pass an empty string to clear; omit to leave unchanged.\")\n .option(\"--start <value>\", \"Accepts ISO 8601 datetime with offset (e.g. `2026-06-01T12:30:00+08:00`) for timed events, or ISO date-only (e.g. `2026-06-01`) for all-day. The `wspc` CLI additionally accepts natural-language phrases (`tomorrow 12:30pm`, `next Monday 9am`) and resolves them to ISO before sending; the server itself only accepts ISO. All-day uses RFC 5545 exclusive end: a one-day event on 6/1 is `start=2026-06-01, end=2026-06-02`; both endpoints must be the same type.\")\n .option(\"--end <value>\", \"Accepts ISO 8601 datetime with offset (e.g. `2026-06-01T12:30:00+08:00`) for timed events, or ISO date-only (e.g. `2026-06-01`) for all-day. The `wspc` CLI additionally accepts natural-language phrases (`tomorrow 12:30pm`, `next Monday 9am`) and resolves them to ISO before sending; the server itself only accepts ISO. All-day uses RFC 5545 exclusive end: a one-day event on 6/1 is `start=2026-06-01, end=2026-06-02`; both endpoints must be the same type.\")\n .option(\"-l, --location <value>\", \"New location. Pass an empty string to clear; omit to leave unchanged.\")\n .option(\"-u, --url <value>\", \"New meeting link. Pass an empty string to clear; omit to leave unchanged.\")\n .option(\"--status <value>\", \"Lifecycle status. `confirmed`: the event will happen (default). `tentative`: organizer has not finalized; still visible in lists. `cancelled`: the event was called off but the record is kept so attendees can be notified and history audited; distinct from soft-delete (DELETE `/calendar/events/{id}`) which hides the event from default list responses.\")\n .option(\"--attendee <value>\", \"If provided, REPLACES the attendee list (after case-insensitive email dedupe, up to 50). Added attendees receive a fresh invitation, kept attendees receive an update email, removed attendees receive a cancellation.\", (val: string, memo: string[]) => { memo.push(val); return memo }, [] as string[])\n .option(\"--all-day\", \"all_day\")\n .option(\"--tz <zone>\", \"IANA timezone for relative time parsing\")\n .action(async (id, opts) => {\n const zone = resolveTimezone(opts.tz as string | undefined)\n let startValue: string | undefined\n if (opts.start !== undefined) {\n if (opts.allDay) {\n startValue = parseDateOnly(opts.start as string)\n } else {\n startValue = parseTimeInput(opts.start as string, zone).toISO() ?? undefined\n }\n }\n let endValue: string | undefined\n if (opts.end !== undefined) {\n if (opts.allDay) {\n endValue = inclusiveEndToExclusive(opts.end as string)\n } else {\n endValue = parseTimeInput(opts.end as string, zone).toISO() ?? undefined\n }\n }\n const attendeeRaw = opts.attendee as string[]\n const attendees = attendeeRaw.length > 0 ? attendeeRaw.map(parseAttendee) : undefined\n const client = await loadSdkClient()\n const result = await eventUpdate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n expected_version: opts.expectedVersion,\n title: opts.title,\n description: opts.description,\n start: startValue,\n end: endValue,\n location: opts.location,\n url: opts.url,\n status: opts.status,\n attendees: attendees,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_update\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"status\":\"status-badge\",\"start\":\"relative-time\",\"end\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: event_ics_download)\nimport { Command } from \"commander\"\nimport { eventIcsDownload } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const eventIcsDownloadCommand = new Command(\"ics\")\n .description(\"Download event as `.ics`\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await eventIcsDownload({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n filename: `${id}.ics`,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"event_ics_download\", display: {\"shape\":\"raw\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_alias_create)\nimport { Command } from \"commander\"\nimport { emailAliasCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailAliasCreateCommand = new Command(\"add\")\n .description(\"Create a receiving alias\")\n .argument(\"<email>\", \"email\")\n .action(async (email, opts) => {\n const client = await loadSdkClient()\n const result = await emailAliasCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n email,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_alias_create\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"created_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_alias_list)\nimport { Command } from \"commander\"\nimport { emailAliasList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailAliasListCommand = new Command(\"ls\")\n .description(\"List the caller's aliases\")\n .option(\"--include-deleted <value>\", \"When `true`, include soft-deleted aliases (with `deleted_at` set) alongside active ones. Defaults to `false`.\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await emailAliasList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_alias_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"email\",\"label\",\"created_at\"],\"format\":{\"id\":\"id-short\",\"label\":\"truncate\",\"created_at\":\"relative-time\"},\"emptyMessage\":\"no aliases\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_domain_create)\nimport { Command } from \"commander\"\nimport { emailDomainCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailDomainCreateCommand = new Command(\"add\")\n .description(\"Register a custom email domain\")\n .argument(\"<domain>\", \"domain\")\n .action(async (domain, opts) => {\n const client = await loadSdkClient()\n const result = await emailDomainCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n domain,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_domain_create\", display: {\"shape\":\"object\",\"format\":{\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"verified_at\":\"relative-time\"},\"dataPath\":\"domain\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_domain_list)\nimport { Command } from \"commander\"\nimport { emailDomainList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailDomainListCommand = new Command(\"ls\")\n .description(\"List cached custom domains\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await emailDomainList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_domain_list\", display: {\"shape\":\"list\",\"columns\":[\"domain\",\"status\",\"sending_status\",\"receiving_status\",\"updated_at\"],\"format\":{\"updated_at\":\"relative-time\",\"verified_at\":\"relative-time\"},\"emptyMessage\":\"no domains\",\"dataPath\":\"domains\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_alias_delete)\nimport { Command } from \"commander\"\nimport { emailAliasDelete } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailAliasDeleteCommand = new Command(\"rm\")\n .description(\"Soft-delete an alias\")\n .argument(\"<email>\", \"email\")\n .action(async (email, opts) => {\n const client = await loadSdkClient()\n const result = await emailAliasDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n email,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_alias_delete\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"created_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_delete)\nimport { Command } from \"commander\"\nimport { emailDelete } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailDeleteCommand = new Command(\"rm\")\n .description(\"Soft-delete inbound emails\")\n .argument(\"<id...>\", \"id\")\n .action(async (id, opts) => {\n const idRaw = id as string[]\n const ids = idRaw.length > 0 ? idRaw : undefined\n const client = await loadSdkClient()\n const result = await emailDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n ids: ids as string[],\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_delete\", display: {\"shape\":\"object\",\"format\":{}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_domain_get)\nimport { Command } from \"commander\"\nimport { emailDomainGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailDomainGetCommand = new Command(\"show\")\n .description(\"Get one cached custom domain\")\n .argument(\"<domain>\", \"domain\")\n .action(async (domain, opts) => {\n const client = await loadSdkClient()\n const result = await emailDomainGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n domain,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_domain_get\", display: {\"shape\":\"object\",\"format\":{\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"verified_at\":\"relative-time\"},\"dataPath\":\"domain\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_get)\nimport { Command } from \"commander\"\nimport { emailGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailGetCommand = new Command(\"show\")\n .description(\"Get an inbound email by id\")\n .argument(\"<id>\", \"id\")\n .option(\"--include-html <value>\", \"When `true`, fetch the HTML body from R2 and include it as `html_body` in the response. Costs an extra R2 read; omit if you only need text.\")\n .option(\"--include-deleted <value>\", \"When `true`, allow fetching a soft-deleted email. Defaults to `false` (returns 404 for soft-deleted rows).\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await emailGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n query: {\n include_html: opts.includeHtml,\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_get\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"org_id\":\"id-short\",\"user_id\":\"id-short\",\"received_at\":\"relative-time\",\"created_at\":\"relative-time\",\"read_at\":\"relative-time\",\"deleted_at\":\"relative-time\",\"is_read\":\"bool-badge\"},\"dataPath\":\"email\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_list)\nimport { Command } from \"commander\"\nimport { emailList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailListCommand = new Command(\"ls\")\n .description(\"List inbound emails\")\n .option(\"--limit <value>\", \"Max items to return (clamped to 1-100). Defaults to 20 server-side.\")\n .option(\"--alias-email <value>\", \"If set, only return emails received on this full alias email address.\")\n .option(\"--unread-only <value>\", \"When `true`, only return emails with `is_read=false`.\")\n .option(\"--since <value>\", \"Unix epoch milliseconds — only return emails with `received_at >= since`. Useful for incremental sync.\")\n .option(\"--cursor <value>\", \"Opaque pagination cursor returned in `next_cursor` of a previous response.\")\n .option(\"--include-deleted <value>\", \"When `true`, also return soft-deleted emails. Defaults to `false`.\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await emailList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n limit: opts.limit,\n alias_email: opts.aliasEmail,\n unread_only: opts.unreadOnly,\n since: opts.since,\n cursor: opts.cursor,\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"from_addr\",\"subject\",\"is_read\",\"received_at\"],\"format\":{\"id\":\"id-short\",\"from_addr\":\"truncate\",\"subject\":\"truncate\",\"is_read\":\"bool-badge\",\"received_at\":\"relative-time\"},\"emptyMessage\":\"no emails\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_mark_read)\nimport { Command } from \"commander\"\nimport { emailMarkRead } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailMarkReadCommand = new Command(\"read\")\n .description(\"Mark inbound emails as read\")\n .argument(\"<id...>\", \"id\")\n .action(async (id, opts) => {\n const idRaw = id as string[]\n const ids = idRaw.length > 0 ? idRaw : undefined\n const client = await loadSdkClient()\n const result = await emailMarkRead({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n ids: ids as string[],\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_mark_read\", display: {\"shape\":\"object\",\"format\":{}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_mark_unread)\nimport { Command } from \"commander\"\nimport { emailMarkUnread } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailMarkUnreadCommand = new Command(\"unread\")\n .description(\"Mark inbound emails as unread\")\n .argument(\"<id...>\", \"id\")\n .action(async (id, opts) => {\n const idRaw = id as string[]\n const ids = idRaw.length > 0 ? idRaw : undefined\n const client = await loadSdkClient()\n const result = await emailMarkUnread({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n ids: ids as string[],\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_mark_unread\", display: {\"shape\":\"object\",\"format\":{}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: email_domain_verify)\nimport { Command } from \"commander\"\nimport { emailDomainVerify } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const emailDomainVerifyCommand = new Command(\"verify\")\n .description(\"Verify a custom domain with the provider\")\n .argument(\"<domain>\", \"domain\")\n .action(async (domain, opts) => {\n const client = await loadSdkClient()\n const result = await emailDomainVerify({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n domain,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"email_domain_verify\", display: {\"shape\":\"object\",\"format\":{\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"verified_at\":\"relative-time\"},\"dataPath\":\"domain\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: push_config_delete)\nimport { Command } from \"commander\"\nimport { pushConfigDelete } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const pushConfigDeleteCommand = new Command(\"rm\")\n .description(\"Remove a push transport\")\n .argument(\"<transport>\", \"transport\")\n .action(async (transport, opts) => {\n const client = await loadSdkClient()\n const result = await pushConfigDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n transport,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"push_config_delete\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: push_config_set)\nimport { Command } from \"commander\"\nimport { pushConfigSet } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const pushConfigSetCommand = new Command(\"set\")\n .description(\"Register or update a push transport\")\n .option(\"--transport <value>\", \"Transport discriminator. `telegram` is the only supported value today — push delivers via a Telegram bot DM. Future transports (web push, iOS/Android, generic webhook) will be added as additional discriminator values.\")\n .option(\"--target-bot-username <value>\", \"Telegram bot username (with leading `@`, 5–32 alphanumeric/underscore characters). This is the bot the user has already started a chat with — wspc DMs notifications to it via the Telegram Bot API.\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await pushConfigSet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n config: {\n transport: opts.transport,\n target_bot_username: opts.targetBotUsername,\n },\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"push_config_set\", display: {\"shape\":\"object\",\"fields\":[\"transport\",\"target_bot_username\"],\"format\":{\"transport\":\"truncate\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: push_config_get)\nimport { Command } from \"commander\"\nimport { pushConfigGet } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const pushConfigGetCommand = new Command(\"show\")\n .description(\"List the caller's push transports\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await pushConfigGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"push_config_get\", display: {\"shape\":\"list\",\"dataPath\":\"configs\",\"columns\":[\"transport\",\"target_bot_username\",\"last_test_at\",\"last_test_status\"],\"format\":{\"transport\":\"truncate\",\"last_test_at\":\"relative-time\",\"last_test_status\":\"enum-badge\"},\"enumColorMap\":{\"last_test_status\":{\"ok\":{\"label\":\"✓ ok\",\"color\":\"green\"},\"*\":{\"label\":\"✕ <value>\",\"color\":\"red\"},\"null\":{\"label\":\"—\",\"color\":\"dim\"}}},\"emptyMessage\":\"(no push transports registered)\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: push_test)\nimport { Command } from \"commander\"\nimport { pushTest } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const pushTestCommand = new Command(\"test\")\n .description(\"Send a test push notification\")\n .option(\"--transport <value>\", \"Which transport to send the test message through. Must match a transport the caller has already registered via `POST /push/config`; today only `telegram` is supported.\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await pushTest({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n transport: opts.transport,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"push_test\", display: {\"shape\":\"object\",\"fields\":[\"ok\",\"status\",\"detail\",\"durationMs\"],\"format\":{\"ok\":\"bool-badge\"}} }, result.data)\n if (result.data?.ok === false) {\n process.exit(1)\n }\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_comment_create)\nimport { Command } from \"commander\"\nimport { todoCommentCreate } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const todoCommentCreateCommand = new Command(\"add\")\n .description(\"Add a comment to a todo\")\n .argument(\"<id>\", \"id\")\n .argument(\"<content>\", \"content\")\n .action(async (id, content, opts) => {\n const client = await loadSdkClient()\n const result = await todoCommentCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n content,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_comment_create\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"todo_id\":\"id-short\",\"user_id\":\"id-short\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_comment_list)\nimport { Command } from \"commander\"\nimport { todoCommentList } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const todoCommentListCommand = new Command(\"ls\")\n .description(\"List comments on a todo\")\n .argument(\"<id>\", \"id\")\n .option(\"--order <value>\", \"order\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .option(\"--limit <value>\", \"Max comments to return. Clamped to [1, 200]. Default 50 server-side.\")\n .option(\"--cursor <value>\", \"Opaque pagination cursor returned in `next_cursor` of a previous response.\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await todoCommentList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n query: {\n order: opts.order,\n include_deleted: opts.includeDeleted,\n limit: opts.limit,\n cursor: opts.cursor,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_comment_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"content\",\"created_at\"],\"format\":{\"id\":\"id-short\",\"content\":\"truncate\",\"created_at\":\"relative-time\"},\"emptyMessage\":\"no comments\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: project_create)\nimport { Command } from \"commander\"\nimport { projectCreate } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const projectCreateCommand = new Command(\"add\")\n .description(\"Create a project\")\n .argument(\"<name>\", \"name\")\n .option(\"--default-todo-type-id <value>\", \"default_todo_type_id\")\n .action(async (name, opts) => {\n const client = await loadSdkClient()\n const result = await projectCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n name,\n default_todo_type_id: opts.defaultTodoTypeId,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"project_create\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"org_id\":\"id-short\",\"creator_user_id\":\"id-short\",\"default_todo_type_id\":\"id-short\",\"name\":\"truncate\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: project_list)\nimport { Command } from \"commander\"\nimport { projectList } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const projectListCommand = new Command(\"ls\")\n .description(\"List projects\")\n .option(\"--include-deleted <value>\", \"Set to `true` to include soft-deleted projects in the response.\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await projectList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"project_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"name\",\"default_todo_type_id\"],\"format\":{\"id\":\"id-short\",\"name\":\"truncate\",\"default_todo_type_id\":\"id-short\"},\"emptyMessage\":\"no projects\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: recurrence_rule_create)\nimport { Command } from \"commander\"\nimport { recurrenceRuleCreate } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const recurrenceRuleCreateCommand = new Command(\"add\")\n .description(\"Create a recurring todo rule\")\n .argument(\"<title>\", \"title\")\n .option(\"--rrule <value>\", \"rrule\")\n .option(\"--dtstart <value>\", \"dtstart\")\n .option(\"--description <value>\", \"description\")\n .option(\"--parent-id <value>\", \"parent_id\")\n .option(\"-p, --project <value>\", \"Project for the recurrence rule, its template todo, and all materialized instances. Must be an active project in the caller's organization.\")\n .option(\"-t, --type <value>\", \"type_id\")\n .action(async (title, opts) => {\n const client = await loadSdkClient()\n const result = await recurrenceRuleCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n title,\n rrule: opts.rrule,\n dtstart: opts.dtstart,\n description: opts.description,\n parent_id: opts.parentId,\n project_id: opts.project,\n type_id: opts.type,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"recurrence_rule_create\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: recurrence_rule_list)\nimport { Command } from \"commander\"\nimport { recurrenceRuleList } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const recurrenceRuleListCommand = new Command(\"ls\")\n .description(\"List recurring todo rules\")\n .option(\"--project-id <value>\", \"Project id filter. Required. Unknown, cross-organization, or soft-deleted project ids return NOT_FOUND.\")\n .option(\"--user-id <value>\", \"user_id\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await recurrenceRuleList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n project_id: opts.projectId,\n user_id: opts.userId,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"recurrence_rule_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"rrule\",\"dtstart\",\"type_id\"],\"format\":{\"id\":\"id-short\",\"rrule\":\"truncate\",\"type_id\":\"id-short\"},\"emptyMessage\":\"no recurrence rules\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_create)\nimport { Command } from \"commander\"\nimport { todoCreate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\nimport { parseJsonField } from \"../../../handwritten/utils/parse-json-field.js\"\n\nexport const todoCreateCommand = new Command(\"add\")\n .description(\"Create a todo\")\n .argument(\"<title>\", \"title\")\n .option(\"-p, --project <value>\", \"Project id to assign this todo to. It must be an active project in the caller's organization.\")\n .option(\"--description <value>\", \"Free-form details about the todo. Fully supports GFM Markdown (tables, strikethrough, task lists). Stored verbatim; client applications are responsible for rendering. Optional. Passing `null` is strictly rejected.\")\n .option(\"--parent-id <value>\", \"Parent todo ID (`tod_<ULID>`) to attach this todo as a child under another todo. Omit or pass `null` to create a root-level todo. Nesting is limited to one level; attempting to set a child todo as a parent will trigger `PARENT_IS_CHILD`. To make a subtask appear on every occurrence of a recurring rule, set this to that rule's template todo id (the template id returned when the rule is created); the server re-materializes future occurrences so each carries the subtask.\")\n .option(\"--status <value>\", \"Initial status of the todo. Omit to default to `open`. Allowed values: `open`, `in_progress`, `done`, `cancelled`.\")\n .option(\"--due-at <value>\", \"Optional calendar due date in ISO date-only format (`YYYY-MM-DD`). Stored without timezone offsets to represent the same local calendar day globally. Pass `\\\"\\\"` or omit the field to skip setting a due date. Passing `null` is strictly rejected.\")\n .option(\"--type-id <value>\", \"Type id this todo belongs to. Omit to use the project's default type. When project_id is also supplied, the type must belong to the same project. New server-generated type ids use typ_<ULID>; legacy ids remain accepted.\")\n .option(\"--custom-fields <value>\", \"Custom field values keyed by the field's immutable `key` (not the human `label`). Each value must match the declared field type: string fields require string values, and string_array fields require string arrays. Providing a key that is not declared on the resolved todo type is strictly rejected with `UNDECLARED_FIELD`. Missing required fields that lack a default value are rejected with `FIELD_REQUIRED`. Defaults declared on the type are auto-applied at create time.\")\n .action(async (title, opts) => {\n const client = await loadSdkClient()\n const result = await todoCreate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body: {\n title,\n project_id: opts.project,\n description: opts.description,\n parent_id: opts.parentId,\n status: opts.status,\n due_at: opts.dueAt,\n type_id: opts.typeId,\n custom_fields: parseJsonField(opts.customFields, \"custom-fields\"),\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_create\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"project_id\":\"id-short\",\"parent_id\":\"id-short\",\"type_id\":\"id-short\",\"status\":\"status-badge\",\"due_at\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","/**\n * Parse a `--flag` value that the API expects as a JSON object or array.\n *\n * Commander hands option values to us as raw strings, so an object/array body\n * field would otherwise reach the server as a string and fail validation\n * (e.g. `custom_fields: expected record, received string`). We JSON.parse it\n * here. An omitted flag stays `undefined`; malformed JSON exits with a clear\n * message instead of an uncaught SyntaxError stack trace.\n */\nexport function parseJsonField<T = unknown>(raw: string | undefined, flag: string): T | undefined {\n if (raw === undefined) return undefined\n try {\n return JSON.parse(raw) as T\n } catch {\n process.stderr.write(`Invalid JSON for --${flag}: ${raw}\\n`)\n process.exit(1)\n }\n}\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_list)\nimport { Command } from \"commander\"\nimport { todoList } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const todoListCommand = new Command(\"ls\")\n .description(\"List todos with filters\")\n .option(\"-p, --project <value>\", \"Filter by project. Required. Unknown, cross-organization, or soft-deleted project ids return NOT_FOUND.\")\n .option(\"--user-id <value>\", \"user_id\")\n .option(\"--parent-id <value>\", \"parent_id\")\n .option(\"-s, --status <value>\", \"status\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .option(\"--include-templates <value>\", \"include_templates\")\n .option(\"--due-after <value>\", \"due_after\")\n .option(\"--due-before <value>\", \"due_before\")\n .option(\"--type-id <value>\", \"type_id\")\n .option(\"--sort-by <value>\", \"sort_by\")\n .option(\"--order <value>\", \"order\")\n .option(\"--include-orphan-fields <value>\", \"include_orphan_fields\")\n .option(\"--limit <value>\", \"Max todos to return. Clamped to [1, 200]. Default 50 server-side.\")\n .option(\"--cursor <value>\", \"Opaque pagination cursor returned in `next_cursor` of a previous response.\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await todoList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n project_id: opts.project,\n user_id: opts.userId,\n parent_id: opts.parentId,\n status: opts.status,\n include_deleted: opts.includeDeleted,\n include_templates: opts.includeTemplates,\n due_after: opts.dueAfter,\n due_before: opts.dueBefore,\n type_id: opts.typeId,\n sort_by: opts.sortBy,\n order: opts.order,\n include_orphan_fields: opts.includeOrphanFields,\n limit: opts.limit,\n cursor: opts.cursor,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"status\",\"title\",\"due_at\"],\"format\":{\"id\":\"id-short\",\"status\":\"status-badge\",\"title\":\"truncate\",\"due_at\":\"relative-time\"},\"emptyMessage\":\"no todos\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_type_list)\nimport { Command } from \"commander\"\nimport { todoTypeList } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const todoTypeListCommand = new Command(\"ls\")\n .description(\"List todo types\")\n .option(\"--project-id <value>\", \"Project id filter. Required. Unknown, cross-organization, or soft-deleted project ids return NOT_FOUND.\")\n .option(\"--user-id <value>\", \"user_id\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .action(async (opts) => {\n const client = await loadSdkClient()\n const result = await todoTypeList({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n query: {\n project_id: opts.projectId,\n user_id: opts.userId,\n include_deleted: opts.includeDeleted,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_type_list\", display: {\"shape\":\"list\",\"columns\":[\"id\",\"label\"],\"format\":{\"id\":\"id-short\",\"label\":\"truncate\"},\"emptyMessage\":\"no todo types\"} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_comment_delete)\nimport { Command } from \"commander\"\nimport { todoCommentDelete } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const todoCommentDeleteCommand = new Command(\"rm\")\n .description(\"Soft-delete a comment\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await todoCommentDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_comment_delete\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"todo_id\":\"id-short\",\"user_id\":\"id-short\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_comment_update)\nimport { Command } from \"commander\"\nimport { todoCommentUpdate } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const todoCommentUpdateCommand = new Command(\"edit\")\n .description(\"Edit a comment\")\n .argument(\"<id>\", \"id\")\n .argument(\"<content>\", \"content\")\n .action(async (id, content, opts) => {\n const client = await loadSdkClient()\n const result = await todoCommentUpdate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n content,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_comment_update\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"todo_id\":\"id-short\",\"user_id\":\"id-short\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: recurrence_rule_delete)\nimport { Command } from \"commander\"\nimport { recurrenceRuleDelete } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const recurrenceRuleDeleteCommand = new Command(\"rm\")\n .description(\"Delete a recurring todo rule\")\n .argument(\"<id>\", \"id\")\n .option(\"--expected-version <value>\", \"expected_version\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await recurrenceRuleDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n expected_version: opts.expectedVersion,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"recurrence_rule_delete\", display: undefined }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: recurrence_rule_get)\nimport { Command } from \"commander\"\nimport { recurrenceRuleGet } from \"../../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../../handwritten/output/render.js\"\n\nexport const recurrenceRuleGetCommand = new Command(\"show\")\n .description(\"Get a recurring todo rule\")\n .argument(\"<id>\", \"id\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await recurrenceRuleGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"recurrence_rule_get\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"type_id\":\"id-short\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_delete)\nimport { Command } from \"commander\"\nimport { todoDelete } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const todoDeleteCommand = new Command(\"rm\")\n .description(\"Soft-delete a todo\")\n .argument(\"<id>\", \"id\")\n .option(\"--expected-version <value>\", \"expected_version\")\n .option(\"--cascade <value>\", \"cascade\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await todoDelete({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n expected_version: opts.expectedVersion,\n cascade: opts.cascade,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_delete\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"project_id\":\"id-short\",\"parent_id\":\"id-short\",\"type_id\":\"id-short\",\"status\":\"status-badge\",\"due_at\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_get)\nimport { Command } from \"commander\"\nimport { todoGet } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\n\nexport const todoGetCommand = new Command(\"show\")\n .description(\"Get a todo by id\")\n .argument(\"<id>\", \"id\")\n .option(\"--include-deleted <value>\", \"include_deleted\")\n .option(\"--include-orphan-fields <value>\", \"include_orphan_fields\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await todoGet({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n query: {\n include_deleted: opts.includeDeleted,\n include_orphan_fields: opts.includeOrphanFields,\n include: \"children,comments\",\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_get\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"project_id\":\"id-short\",\"parent_id\":\"id-short\",\"type_id\":\"id-short\",\"status\":\"status-badge\",\"due_at\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT (source: todo_update)\nimport { Command } from \"commander\"\nimport { todoUpdate } from \"../../sdk/index.js\"\nimport { loadSdkClient } from \"../../../handwritten/auth/load-sdk-client.js\"\nimport { render } from \"../../../handwritten/output/render.js\"\nimport { parseJsonField } from \"../../../handwritten/utils/parse-json-field.js\"\n\nexport const todoUpdateCommand = new Command(\"update\")\n .description(\"Update a todo\")\n .argument(\"<id>\", \"id\")\n .option(\"--expected-version <value>\", \"expected_version\")\n .option(\"--title <value>\", \"New title. Omit to leave the existing title unchanged. Must be non-empty when supplied.\")\n .option(\"--description <value>\", \"New description. Markdown formatted (CommonMark + GFM tables, strikethrough, task lists). Pass empty string `\\\"\\\"` explicitly to clear an existing description, or omit to leave unchanged. Passing `null` is strictly rejected.\")\n .option(\"--parent-id <value>\", \"Re-parent the todo. Pass a valid parent ID to attach under another todo, pass `null` to move it back to the root level, or omit to leave unchanged. Nesting is limited to one level; attempting to set a child todo as a parent will trigger `PARENT_IS_CHILD`.\")\n .option(\"--status <value>\", \"New status of the todo. Allowed transitions: `open` ➔ `in_progress` ➔ `done`. `cancelled` represents a terminal state. Transitioning to `done` automatically emits a `captureTodoCompleted` analytics event. Omit to leave the existing status unchanged.\")\n .option(\"--due-at <value>\", \"Update calendar due date in ISO date-only format (`YYYY-MM-DD`). Pass `\\\"\\\"` explicitly to clear an existing due date, or omit to leave it unchanged. Passing `null` is strictly rejected.\")\n .option(\"--type-id <value>\", \"Re-assign this todo to a different active type. The new type must belong to the todo's same project; otherwise the request fails with TYPE_PROJECT_MISMATCH. New server-generated type ids use typ_<ULID>; legacy ids remain accepted.\")\n .option(\"--custom-fields <value>\", \"PATCH semantics: only the keys present in this map change. Pass `null` for a key (e.g. `custom_fields: { priority: null }`) to explicitly delete that custom field value. Array values are replaced wholesale with no element-level diff. Providing a key that is not declared on the effective todo type is rejected with `UNDECLARED_FIELD`.\")\n .option(\"--user-id <value>\", \"Reassign the owner (assignee) user ID of this todo. Target user must belong to the same organization.\")\n .action(async (id, opts) => {\n const client = await loadSdkClient()\n const result = await todoUpdate({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n path: {\n id,\n },\n body: {\n expected_version: opts.expectedVersion,\n title: opts.title,\n description: opts.description,\n parent_id: opts.parentId,\n status: opts.status,\n due_at: opts.dueAt,\n type_id: opts.typeId,\n custom_fields: parseJsonField(opts.customFields, \"custom-fields\"),\n user_id: opts.userId,\n },\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_update\", display: {\"shape\":\"object\",\"format\":{\"id\":\"id-short\",\"user_id\":\"id-short\",\"project_id\":\"id-short\",\"parent_id\":\"id-short\",\"type_id\":\"id-short\",\"status\":\"status-badge\",\"due_at\":\"relative-time\",\"created_at\":\"relative-time\",\"updated_at\":\"relative-time\",\"deleted_at\":\"relative-time\"}} }, result.data)\n })\n","// AUTO-GENERATED — DO NOT EDIT\nimport { Command } from \"commander\"\nimport { inviteAcceptCommand } from \"./invite/accept.js\"\nimport { keyCreateCommand } from \"./keys/create.js\"\nimport { keyListCommand } from \"./keys/ls.js\"\nimport { orgInviteCreateCommand } from \"./org/invite.js\"\nimport { orgInvitesListCommand } from \"./org/invites.js\"\nimport { orgGetCommand } from \"./org/show.js\"\nimport { orgUpdateCommand } from \"./org/rename.js\"\nimport { inviteGetCommand } from \"./invite/show.js\"\nimport { authMeCommand } from \"./auth/me.js\"\nimport { invitesListCommand } from \"./invites.js\"\nimport { orgMembersListCommand } from \"./org/members.js\"\nimport { inviteRejectCommand } from \"./invite/reject.js\"\nimport { keyRevokeCommand } from \"./keys/rm.js\"\nimport { keyUpdateCommand } from \"./keys/edit.js\"\nimport { orgInviteRevokeCommand } from \"./org/invite/revoke.js\"\nimport { eventCreateCommand } from \"./event/add.js\"\nimport { eventListCommand } from \"./event/ls.js\"\nimport { eventDeleteCommand } from \"./event/rm.js\"\nimport { eventGetCommand } from \"./event/show.js\"\nimport { eventUpdateCommand } from \"./event/set.js\"\nimport { eventIcsDownloadCommand } from \"./event/ics.js\"\nimport { emailAliasCreateCommand } from \"./alias/add.js\"\nimport { emailAliasListCommand } from \"./alias/ls.js\"\nimport { emailDomainCreateCommand } from \"./domain/add.js\"\nimport { emailDomainListCommand } from \"./domain/ls.js\"\nimport { emailAliasDeleteCommand } from \"./alias/rm.js\"\nimport { emailDeleteCommand } from \"./email/rm.js\"\nimport { emailDomainGetCommand } from \"./domain/show.js\"\nimport { emailGetCommand } from \"./email/show.js\"\nimport { emailListCommand } from \"./email/ls.js\"\nimport { emailMarkReadCommand } from \"./email/read.js\"\nimport { emailMarkUnreadCommand } from \"./email/unread.js\"\nimport { emailDomainVerifyCommand } from \"./domain/verify.js\"\nimport { pushConfigDeleteCommand } from \"./push/config/rm.js\"\nimport { pushConfigSetCommand } from \"./push/config/set.js\"\nimport { pushConfigGetCommand } from \"./push/config/show.js\"\nimport { pushTestCommand } from \"./push/test.js\"\nimport { todoCommentCreateCommand } from \"./todo/comment/add.js\"\nimport { todoCommentListCommand } from \"./todo/comment/ls.js\"\nimport { projectCreateCommand } from \"./todo/project/add.js\"\nimport { projectListCommand } from \"./todo/project/ls.js\"\nimport { recurrenceRuleCreateCommand } from \"./todo/rule/add.js\"\nimport { recurrenceRuleListCommand } from \"./todo/rule/ls.js\"\nimport { todoCreateCommand } from \"./todo/add.js\"\nimport { todoListCommand } from \"./todo/ls.js\"\nimport { todoTypeListCommand } from \"./todo/type/ls.js\"\nimport { todoCommentDeleteCommand } from \"./todo/comment/rm.js\"\nimport { todoCommentUpdateCommand } from \"./todo/comment/edit.js\"\nimport { recurrenceRuleDeleteCommand } from \"./todo/rule/rm.js\"\nimport { recurrenceRuleGetCommand } from \"./todo/rule/show.js\"\nimport { todoDeleteCommand } from \"./todo/rm.js\"\nimport { todoGetCommand } from \"./todo/show.js\"\nimport { todoUpdateCommand } from \"./todo/update.js\"\n\nexport function registerGeneratedCommands(root: Command): void {\n const root_invite = root.command(\"invite\").description(\"invite commands\")\n root_invite.addCommand(inviteAcceptCommand)\n root_invite.addCommand(inviteGetCommand)\n root_invite.addCommand(inviteRejectCommand)\n const root_keys = root.command(\"keys\").description(\"keys commands\")\n root_keys.addCommand(keyCreateCommand)\n root_keys.addCommand(keyListCommand)\n root_keys.addCommand(keyRevokeCommand)\n root_keys.addCommand(keyUpdateCommand)\n const root_org = root.command(\"org\").description(\"org commands\")\n const root_org_invite = root_org.command(\"invite\").description(\"invite commands\")\n root_org_invite.addCommand(orgInviteCreateCommand)\n root_org_invite.addCommand(orgInviteRevokeCommand)\n root_org.addCommand(orgInvitesListCommand)\n root_org.addCommand(orgGetCommand)\n root_org.addCommand(orgUpdateCommand)\n root_org.addCommand(orgMembersListCommand)\n const root_auth = root.command(\"auth\").description(\"auth commands\")\n root_auth.addCommand(authMeCommand)\n root.addCommand(invitesListCommand)\n const root_event = root.command(\"event\").description(\"event commands\")\n root_event.addCommand(eventCreateCommand)\n root_event.addCommand(eventListCommand)\n root_event.addCommand(eventDeleteCommand)\n root_event.addCommand(eventGetCommand)\n root_event.addCommand(eventUpdateCommand)\n root_event.addCommand(eventIcsDownloadCommand)\n const root_alias = root.command(\"alias\").description(\"alias commands\")\n root_alias.addCommand(emailAliasCreateCommand)\n root_alias.addCommand(emailAliasListCommand)\n root_alias.addCommand(emailAliasDeleteCommand)\n const root_domain = root.command(\"domain\").description(\"domain commands\")\n root_domain.addCommand(emailDomainCreateCommand)\n root_domain.addCommand(emailDomainListCommand)\n root_domain.addCommand(emailDomainGetCommand)\n root_domain.addCommand(emailDomainVerifyCommand)\n const root_email = root.command(\"email\").description(\"email commands\")\n root_email.addCommand(emailDeleteCommand)\n root_email.addCommand(emailGetCommand)\n root_email.addCommand(emailListCommand)\n root_email.addCommand(emailMarkReadCommand)\n root_email.addCommand(emailMarkUnreadCommand)\n const root_push = root.command(\"push\").description(\"push commands\")\n const root_push_config = root_push.command(\"config\").description(\"config commands\")\n root_push_config.addCommand(pushConfigDeleteCommand)\n root_push_config.addCommand(pushConfigSetCommand)\n root_push_config.addCommand(pushConfigGetCommand)\n root_push.addCommand(pushTestCommand)\n const root_todo = root.command(\"todo\").description(\"todo commands\")\n const root_todo_comment = root_todo.command(\"comment\").description(\"comment commands\")\n root_todo_comment.addCommand(todoCommentCreateCommand)\n root_todo_comment.addCommand(todoCommentListCommand)\n root_todo_comment.addCommand(todoCommentDeleteCommand)\n root_todo_comment.addCommand(todoCommentUpdateCommand)\n const root_todo_project = root_todo.command(\"project\").description(\"project commands\")\n root_todo_project.addCommand(projectCreateCommand)\n root_todo_project.addCommand(projectListCommand)\n const root_todo_rule = root_todo.command(\"rule\").description(\"rule commands\")\n root_todo_rule.addCommand(recurrenceRuleCreateCommand)\n root_todo_rule.addCommand(recurrenceRuleListCommand)\n root_todo_rule.addCommand(recurrenceRuleDeleteCommand)\n root_todo_rule.addCommand(recurrenceRuleGetCommand)\n root_todo.addCommand(todoCreateCommand)\n root_todo.addCommand(todoListCommand)\n const root_todo_type = root_todo.command(\"type\").description(\"type commands\")\n root_todo_type.addCommand(todoTypeListCommand)\n root_todo.addCommand(todoDeleteCommand)\n root_todo.addCommand(todoGetCommand)\n root_todo.addCommand(todoUpdateCommand)\n}\n","import { Command } from \"commander\"\nimport { ConfigStore } from \"../config/index.js\"\nimport { runLogin } from \"../auth/login.js\"\nimport { API_BASE } from \"../../version.js\"\n\nexport const loginCommand = new Command(\"login\")\n .description(\"Log in via OAuth device flow (default) or API key\")\n .option(\"--api-key <key>\", \"Log in with a wspc API key (escape hatch)\")\n .option(\"--json\", \"Emit machine-readable events to stdout\")\n .action(async (opts: { apiKey?: string; json?: boolean }) => {\n const store = new ConfigStore()\n const output = opts.json\n ? { write: () => {}, writeJson: (e: Record<string, unknown>) => process.stdout.write(JSON.stringify(e) + \"\\n\") }\n : {\n write: (s: string) => process.stdout.write(s + \"\\n\"),\n writeJson: () => {},\n }\n await runLogin({\n store,\n baseUrl: API_BASE,\n apiKey: opts.apiKey,\n output,\n })\n })\n","export interface DeviceFlowPrompt {\n verification_uri: string\n verification_uri_complete: string\n user_code: string\n expires_in: number\n}\n\nexport interface DeviceFlowResult {\n access_token: string\n refresh_token: string\n expires_in: number\n token_type: string\n}\n\nexport interface RunDeviceFlowOptions {\n baseUrl: string\n clientId: string\n onPrompt: (prompt: DeviceFlowPrompt) => void\n fetchImpl?: typeof fetch\n sleepMs?: (ms: number) => Promise<void>\n}\n\nconst DEFAULT_SLEEP = (ms: number) => new Promise<void>((r) => setTimeout(r, ms))\n\nexport async function runDeviceFlow(opts: RunDeviceFlowOptions): Promise<DeviceFlowResult> {\n const fetchImpl = opts.fetchImpl ?? fetch\n const sleep = opts.sleepMs ?? DEFAULT_SLEEP\n\n // 1. Request device code.\n const codeRes = await fetchImpl(`${opts.baseUrl}/auth/oauth/device`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({ client_id: opts.clientId }),\n })\n if (!codeRes.ok) {\n throw new Error(`device_authorization_failed: HTTP ${codeRes.status}`)\n }\n const codeJson = (await codeRes.json()) as {\n device_code: string\n user_code: string\n verification_uri: string\n verification_uri_complete: string\n expires_in: number\n interval: number\n }\n\n opts.onPrompt({\n verification_uri: codeJson.verification_uri,\n verification_uri_complete: codeJson.verification_uri_complete,\n user_code: codeJson.user_code,\n expires_in: codeJson.expires_in,\n })\n\n // 2. Poll token endpoint.\n const deadline = Date.now() + codeJson.expires_in * 1000\n let interval = codeJson.interval\n while (Date.now() < deadline) {\n await sleep(interval * 1000)\n const tokenRes = await fetchImpl(`${opts.baseUrl}/auth/oauth/token`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: codeJson.device_code,\n client_id: opts.clientId,\n }),\n })\n if (tokenRes.ok) {\n return (await tokenRes.json()) as DeviceFlowResult\n }\n // Server may return either RFC 8628 string form { error: \"authorization_pending\" }\n // or wspc's envelope { error: { code: \"AUTHORIZATION_PENDING\", message } }. Handle both.\n const errBody = (await tokenRes.json().catch(() => ({}))) as {\n error?: string | { code?: string }\n }\n const rawCode =\n typeof errBody.error === \"string\" ? errBody.error : (errBody.error?.code ?? \"\")\n const errCode = rawCode.toLowerCase()\n switch (errCode) {\n case \"authorization_pending\":\n continue\n case \"slow_down\":\n interval += 5\n continue\n case \"access_denied\":\n case \"expired_token\":\n throw new Error(`device_flow_${errCode}`)\n default:\n throw new Error(`device_flow_error: ${errCode || \"unknown\"} (HTTP ${tokenRes.status})`)\n }\n }\n throw new Error(\"device_flow_timeout\")\n}\n","import type { ConfigStore } from \"../config/index.js\"\n\nconst DEFAULT_CLIENT_NAME = \"wspc CLI\"\n// Device flow doesn't use redirect, but RFC 7591 requires a value.\nconst DEFAULT_REDIRECT_URI = \"http://localhost\"\n\nexport interface EnsureClientIdOptions {\n store: ConfigStore\n envName: string\n baseUrl: string\n fetchImpl?: typeof fetch\n clientName?: string\n}\n\ninterface RegisterResponse {\n client_id: string\n}\n\n/**\n * Returns the OAuth `client_id` stored under `envName`, registering a new\n * public client via RFC 7591 `/auth/oauth/register` and persisting the\n * resulting id if none exists yet. Re-running is idempotent: stored id wins.\n */\nexport async function ensureClientId(opts: EnsureClientIdOptions): Promise<string> {\n const fetchImpl = opts.fetchImpl ?? fetch\n const c = await opts.store.read()\n const existing = c.envs[opts.envName]?.client_id\n if (existing) return existing\n\n const res = await fetchImpl(`${opts.baseUrl}/auth/oauth/register`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n client_name: opts.clientName ?? DEFAULT_CLIENT_NAME,\n redirect_uris: [DEFAULT_REDIRECT_URI],\n token_endpoint_auth_method: \"none\",\n grant_types: [\"refresh_token\", \"urn:ietf:params:oauth:grant-type:device_code\"],\n }),\n })\n if (!res.ok) {\n throw new Error(`client_registration_failed: HTTP ${res.status}`)\n }\n const body = (await res.json()) as RegisterResponse\n if (!body.client_id) throw new Error(\"client_registration_failed: missing client_id in response\")\n\n // Re-read in case other fields were updated between read and now.\n const fresh = await opts.store.read()\n const env = fresh.envs[opts.envName] ?? { api_base: opts.baseUrl, accounts: {} }\n env.client_id = body.client_id\n fresh.envs[opts.envName] = env\n await opts.store.write(fresh)\n return body.client_id\n}\n","export interface MeResult {\n user_id: string\n email: string\n}\n\n/**\n * GET /auth/me with a bearer token (OAuth access token OR api key). Used at\n * login time to discover the account's email, which is the config map key.\n */\nexport async function fetchMe(opts: {\n baseUrl: string\n token: string\n fetchImpl?: typeof fetch\n}): Promise<MeResult> {\n const f = opts.fetchImpl ?? fetch\n const res = await f(`${opts.baseUrl}/auth/me`, {\n headers: { authorization: `Bearer ${opts.token}` },\n })\n if (!res.ok) throw new Error(`auth_me_failed: HTTP ${res.status}`)\n const body = (await res.json().catch(() => ({}))) as { user_id?: string; email?: string }\n if (!body.user_id || !body.email) {\n throw new Error(\"auth_me_failed: missing user_id/email in response\")\n }\n return { user_id: body.user_id, email: body.email }\n}\n","import type { ConfigStore, EnvConfig, WspcConfig } from \"../config/index.js\"\nimport { LEGACY_ACCOUNT_KEY } from \"../config/index.js\"\nimport { runDeviceFlow, type DeviceFlowResult } from \"./device-flow.js\"\nimport { ensureClientId } from \"./client-registration.js\"\nimport { fetchMe as defaultFetchMe } from \"./fetch-me.js\"\n\nexport interface LoginOutput {\n write(line: string): void\n writeJson(event: Record<string, unknown>): void\n}\n\nexport interface RunLoginOptions {\n store: ConfigStore\n baseUrl: string\n output: LoginOutput\n envName?: string\n clientId?: string\n ensureClient?: (envName: string) => Promise<string>\n deviceFlow?: (opts: {\n baseUrl: string\n clientId: string\n onPrompt: (p: unknown) => void\n }) => Promise<DeviceFlowResult>\n now?: () => number\n apiKey?: string\n fetchMe?: (opts: { baseUrl: string; token: string }) => Promise<{ user_id: string; email: string }>\n}\n\nfunction getOrCreateEnv(c: WspcConfig, envName: string, apiBase: string): EnvConfig {\n const existing = c.envs[envName]\n if (existing) {\n existing.api_base = apiBase\n existing.accounts ??= {}\n return existing\n }\n const fresh: EnvConfig = { api_base: apiBase, accounts: {} }\n c.envs[envName] = fresh\n return fresh\n}\n\nexport async function runLogin(opts: RunLoginOptions): Promise<void> {\n const envName = opts.envName ?? \"prod\"\n const now = opts.now ?? Date.now\n const me = opts.fetchMe ?? ((o: { baseUrl: string; token: string }) => defaultFetchMe(o))\n\n if (opts.apiKey) {\n const who = await me({ baseUrl: opts.baseUrl, token: opts.apiKey })\n const c = await opts.store.read()\n const env = getOrCreateEnv(c, envName, opts.baseUrl)\n const prev = env.accounts[who.email] ?? { email: who.email }\n const acct = (env.accounts[who.email] = {\n ...prev,\n email: who.email,\n user_id: who.user_id,\n api_key: opts.apiKey,\n })\n // api-key login is mutually exclusive with stored OAuth tokens.\n delete acct.refresh_token\n delete acct.access_token\n delete acct.access_token_expires_at\n env.current_account = who.email\n if (who.email !== LEGACY_ACCOUNT_KEY) delete env.accounts[LEGACY_ACCOUNT_KEY]\n c.current_env = envName\n await opts.store.write(c)\n opts.output.write(`✓ logged in (api key) as ${who.email} → env \"${envName}\"`)\n return\n }\n\n const ensureClient =\n opts.ensureClient ??\n ((env: string) => ensureClientId({ store: opts.store, envName: env, baseUrl: opts.baseUrl }))\n const clientId = opts.clientId ?? (await ensureClient(envName))\n const flow = opts.deviceFlow ?? runDeviceFlow\n\n const result = await flow({\n baseUrl: opts.baseUrl,\n clientId,\n onPrompt: (p) => {\n const prompt = p as { verification_uri: string; user_code: string; expires_in: number }\n opts.output.writeJson({ event: \"device_code_issued\", ...prompt })\n opts.output.write(`\\n=== wspc login ===`)\n opts.output.write(`verification_uri: ${prompt.verification_uri}`)\n opts.output.write(`user_code: ${prompt.user_code}`)\n opts.output.write(`expires_in: ${prompt.expires_in}`)\n opts.output.write(`=== waiting for approval ===\\n`)\n },\n })\n\n const who = await me({ baseUrl: opts.baseUrl, token: result.access_token })\n\n // Re-read: ensureClient may have written client_id while we ran the flow.\n const c = await opts.store.read()\n const env = getOrCreateEnv(c, envName, opts.baseUrl)\n const prev = env.accounts[who.email] ?? { email: who.email }\n const acct = (env.accounts[who.email] = {\n ...prev,\n email: who.email,\n user_id: who.user_id,\n refresh_token: result.refresh_token,\n access_token: result.access_token,\n access_token_expires_at: now() + result.expires_in * 1000,\n })\n // login is OAuth now — drop any stale api_key on this account.\n delete acct.api_key\n env.current_account = who.email\n if (who.email !== LEGACY_ACCOUNT_KEY) delete env.accounts[LEGACY_ACCOUNT_KEY]\n c.current_env = envName\n await opts.store.write(c)\n opts.output.writeJson({ event: \"login_success\", email: who.email })\n opts.output.write(`✓ logged in as ${who.email} → env \"${envName}\"`)\n}\n","import { Command } from \"commander\"\nimport { ConfigStore } from \"../config/index.js\"\nimport { runLogout } from \"../auth/logout.js\"\n\nexport const logoutCommand = new Command(\"logout\")\n .description(\"Log out an account (default: the active account in the current env)\")\n .argument(\"[email]\", \"Email of the account to log out\")\n .option(\"--all\", \"Log out every account in the current env\")\n .action(async (email: string | undefined, opts: { all?: boolean }) => {\n const res = await runLogout({ store: new ConfigStore(), email, all: opts.all })\n if (res.removed.length === 0) {\n process.stdout.write(\"nothing to log out\\n\")\n return\n }\n process.stdout.write(`✓ logged out: ${res.removed.join(\", \")}\\n`)\n if (res.newActive) process.stdout.write(`active account is now ${res.newActive}\\n`)\n })\n","import type { ConfigStore } from \"../config/index.js\"\n\nexport interface RunLogoutOptions {\n store: ConfigStore\n envName?: string\n email?: string\n all?: boolean\n}\n\nexport interface RunLogoutResult {\n removed: string[]\n newActive?: string\n}\n\n/**\n * Remove account(s) from an env's `accounts` map.\n * - all:true → remove every account\n * - email:\"x@y\" → remove that specific account\n * - neither → remove the active account (or the sole one)\n * When the active account is removed and exactly one remains, it is promoted\n * to active; if more than one remains, active is cleared (requires switch).\n */\nexport async function runLogout(opts: RunLogoutOptions): Promise<RunLogoutResult> {\n const c = await opts.store.read()\n const envName = opts.envName ?? c.current_env\n if (!envName || !c.envs[envName]) return { removed: [] }\n const env = c.envs[envName]\n env.accounts ??= {}\n\n if (opts.all) {\n const removed = Object.keys(env.accounts)\n env.accounts = {}\n env.current_account = undefined\n await opts.store.write(c)\n return { removed }\n }\n\n const target =\n opts.email ??\n env.current_account ??\n (Object.keys(env.accounts).length === 1 ? Object.keys(env.accounts)[0] : undefined)\n\n if (!target || !env.accounts[target]) return { removed: [] }\n\n delete env.accounts[target]\n if (env.current_account === target) {\n const remaining = Object.keys(env.accounts)\n env.current_account = remaining.length === 1 ? remaining[0] : undefined\n }\n await opts.store.write(c)\n return { removed: [target], newActive: env.current_account }\n}\n","import { Command } from \"commander\"\nimport { ConfigStore, rekeyLegacyAccount } from \"../config/index.js\"\nimport { loadSdkClient } from \"../auth/load-sdk-client.js\"\nimport { resolveAccount } from \"../auth/resolve-account.js\"\nimport { authMe, orgGet } from \"../../generated/sdk/index.js\"\nimport { render, registerRenderer, renderObject } from \"../output/render.js\"\nimport { bold, dim } from \"../output/primitives.js\"\nimport type { XCliDisplay } from \"../output/types.js\"\nimport { WspcAuthExpiredError } from \"../../index.js\"\n\nconst ENV_DISPLAY: XCliDisplay = {\n shape: \"object\",\n fields: [\"name\", \"api_base\", \"account\", \"actor\", \"agent_label\"],\n}\nconst USER_DISPLAY: XCliDisplay = {\n shape: \"object\",\n fields: [\"user_id\", \"email\", \"display_name\", \"api_key_id\"],\n format: { user_id: \"id-short\", api_key_id: \"id-short\" },\n}\nconst ORG_DISPLAY: XCliDisplay = {\n shape: \"object\",\n fields: [\"id\", \"name\", \"created_at\", \"updated_at\"],\n format: { id: \"id-short\", name: \"truncate\", created_at: \"relative-time\", updated_at: \"relative-time\" },\n}\n\ninterface WhoamiPayload {\n env: Record<string, unknown>\n user: Record<string, unknown>\n org?: Record<string, unknown>\n}\n\nregisterRenderer(\"whoami\", (data) => {\n const d = data as WhoamiPayload\n process.stdout.write(bold(\"ENV\") + \"\\n\")\n renderObject(d.env, ENV_DISPLAY)\n process.stdout.write(\"\\n\" + bold(\"USER\") + \"\\n\")\n renderObject(d.user, USER_DISPLAY)\n if (d.org) {\n process.stdout.write(\"\\n\" + bold(\"ORG\") + \"\\n\")\n renderObject(d.org, ORG_DISPLAY)\n }\n})\n\n/** Rename the migration placeholder to the real email once /auth/me resolves. */\nexport async function backfillActiveEmail(\n store: ConfigStore,\n envName: string,\n email: string,\n userId?: string,\n): Promise<void> {\n const cfg = await store.read()\n if (rekeyLegacyAccount(cfg, envName, email, userId)) {\n await store.write(cfg)\n }\n}\n\nexport const whoamiCommand = new Command(\"whoami\")\n .description(\"Show the active env, signed-in account, and organization\")\n .action(async () => {\n const store = new ConfigStore()\n const config = await store.read()\n\n let resolved: ReturnType<typeof resolveAccount>\n let sdkClient: Awaited<ReturnType<typeof loadSdkClient>>\n try {\n resolved = resolveAccount(config, { accountOverride: process.env.WSPC_ACCOUNT })\n sdkClient = await loadSdkClient({ store })\n } catch {\n printLoggedOut()\n return\n }\n const client = (sdkClient as unknown as { _rawClient: unknown })._rawClient\n\n let user: Record<string, unknown>\n let org: Record<string, unknown> | undefined\n try {\n const [meResult, orgResult] = await Promise.all([\n authMe({ client: client as never }),\n orgGet({ client: client as never }).catch(() => null),\n ])\n if (meResult.error || !meResult.response?.ok || !meResult.data) {\n printLoggedOut()\n return\n }\n user = meResult.data as Record<string, unknown>\n if (orgResult && orgResult.response?.ok && orgResult.data) {\n org = orgResult.data as Record<string, unknown>\n }\n } catch (e) {\n if (e instanceof WspcAuthExpiredError) {\n printLoggedOut()\n return\n }\n throw e\n }\n\n // Opportunistic migration backfill: if we ran as the \"(default)\" placeholder,\n // rename it now that /auth/me gave us the real email.\n if (typeof user.email === \"string\") {\n await backfillActiveEmail(store, resolved.envName, user.email, user.user_id as string | undefined)\n }\n\n const env: Record<string, unknown> = {\n name: resolved.envName,\n api_base: resolved.apiBase,\n account: typeof user.email === \"string\" ? user.email : resolved.email,\n }\n if (resolved.creds.actor) env.actor = resolved.creds.actor\n if (resolved.creds.agent_label) env.agent_label = resolved.creds.agent_label\n\n render({ kind: \"whoami\" }, { env, user, ...(org ? { org } : {}) })\n })\n\nfunction printLoggedOut(): void {\n process.stderr.write(dim('not logged in. run \"wspc login\".') + \"\\n\")\n process.exitCode = 1\n}\n","import { Command } from \"commander\"\nimport { ConfigStore } from \"../config/index.js\"\nimport { resolveAccount } from \"../auth/resolve-account.js\"\nimport { render, registerRenderer } from \"../output/render.js\"\nimport { dim, green, table } from \"../output/primitives.js\"\n\nexport const configCommand = new Command(\"config\").description(\"Manage wspc local config\")\n\ninterface ConfigShowPayload {\n current_env?: string\n envs: Array<{\n name: string\n api_base: string\n active_account?: string\n accounts: number\n auth: \"api_key\" | \"oauth\" | \"none\"\n }>\n}\n\nregisterRenderer(\"config_show\", (data) => {\n const d = data as ConfigShowPayload\n if (d.envs.length === 0) {\n process.stdout.write(dim(' no envs configured. run \"wspc login\".') + \"\\n\")\n return\n }\n const headers = [\"\", \"ENV\", \"API BASE\", \"ACTIVE ACCOUNT\", \"ACCOUNTS\", \"AUTH\"]\n const rows = d.envs.map((e) => [\n e.name === d.current_env ? green(\"✓\") : \" \",\n e.name,\n e.api_base,\n e.active_account ?? dim(\"—\"),\n String(e.accounts),\n e.auth === \"none\" ? dim(\"none\") : e.auth,\n ])\n process.stdout.write(table(headers, rows))\n})\n\n/** Set a config field on the active account of the current env. Exported for tests. */\nexport async function setConfigKey(store: ConfigStore, key: string, value: string): Promise<void> {\n const c = await store.read()\n const resolved = resolveAccount(c, { accountOverride: process.env.WSPC_ACCOUNT })\n const env = c.envs[resolved.envName]\n if (!env) throw new Error(`env \"${resolved.envName}\" not found`)\n const acct = env.accounts[resolved.email]\n if (!acct) throw new Error(`account \"${resolved.email}\" not found`)\n switch (key) {\n case \"actor\":\n if (value !== \"user\" && value !== \"agent\") throw new Error(\"actor must be 'user' or 'agent'\")\n acct.actor = value\n break\n case \"agent-label\":\n acct.agent_label = value\n break\n default:\n throw new Error(`unknown config key: ${key}`)\n }\n await store.write(c)\n}\n\nconfigCommand\n .command(\"show\")\n .description(\"List configured envs (tokens redacted, current marked with ✓)\")\n .action(async () => {\n const c = await new ConfigStore().read()\n const envs = Object.entries(c.envs ?? {}).map(([name, env]) => {\n const active = env.current_account ? env.accounts?.[env.current_account] : undefined\n return {\n name,\n api_base: env.api_base,\n ...(env.current_account !== undefined ? { active_account: env.current_account } : {}),\n accounts: Object.keys(env.accounts ?? {}).length,\n auth: (active?.api_key\n ? \"api_key\"\n : active?.access_token\n ? \"oauth\"\n : \"none\") as \"api_key\" | \"oauth\" | \"none\",\n }\n })\n render(\n { kind: \"config_show\" },\n { ...(c.current_env !== undefined ? { current_env: c.current_env } : {}), envs },\n )\n })\n\nconfigCommand\n .command(\"set <key> <value>\")\n .description(\"Set a field on the active account (actor, agent-label, ...)\")\n .action(async (key: string, value: string) => {\n await setConfigKey(new ConfigStore(), key, value)\n process.stdout.write(`✓ set ${key}=${value}\\n`)\n })\n\nconfigCommand\n .command(\"use <env>\")\n .description(\"Switch current_env\")\n .action(async (env: string) => {\n const store = new ConfigStore()\n const c = await store.read()\n if (!c.envs[env]) throw new Error(`env \"${env}\" not found`)\n c.current_env = env\n await store.write(c)\n process.stdout.write(`✓ current_env=${env}\\n`)\n })\n","import { Command } from \"commander\"\nimport { ConfigStore } from \"../config/index.js\"\nimport { render, registerRenderer } from \"../output/render.js\"\nimport { dim, green, table } from \"../output/primitives.js\"\n\nexport interface AccountRow {\n email: string\n user_id?: string\n actor?: \"user\" | \"agent\"\n auth: \"oauth\" | \"api_key\" | \"none\"\n active: boolean\n}\n\nexport async function listAccounts(store: ConfigStore): Promise<AccountRow[]> {\n const c = await store.read()\n const envName = c.current_env\n if (!envName || !c.envs[envName]) return []\n const env = c.envs[envName]\n return Object.values(env.accounts ?? {}).map((a) => ({\n email: a.email,\n user_id: a.user_id,\n actor: a.actor,\n auth: a.api_key ? \"api_key\" : a.access_token ? \"oauth\" : \"none\",\n active: env.current_account === a.email,\n }))\n}\n\nexport async function switchAccount(store: ConfigStore, email: string): Promise<void> {\n const c = await store.read()\n const envName = c.current_env\n if (!envName || !c.envs[envName]) throw new Error(\"no current env; run `wspc login` first\")\n const env = c.envs[envName]\n if (!env.accounts?.[email]) {\n throw new Error(`no account '${email}' in env '${envName}'. Run \\`wspc account ls\\` or \\`wspc login\\`.`)\n }\n env.current_account = email\n await store.write(c)\n}\n\nregisterRenderer(\"account_ls\", (data) => {\n const rows = (data as { accounts: AccountRow[] }).accounts\n if (rows.length === 0) {\n process.stdout.write(dim(' no accounts. run \"wspc login\".') + \"\\n\")\n return\n }\n const headers = [\"\", \"EMAIL\", \"USER\", \"ACTOR\", \"AUTH\"]\n const body = rows.map((r) => [\n r.active ? green(\"✓\") : \" \",\n r.email,\n r.user_id ?? dim(\"—\"),\n r.actor ?? dim(\"—\"),\n r.auth === \"none\" ? dim(\"none\") : r.auth,\n ])\n process.stdout.write(table(headers, body))\n})\n\nexport const accountCommand = new Command(\"account\").description(\"Manage logged-in accounts\")\n\naccountCommand\n .command(\"ls\")\n .description(\"List accounts in the current env (active marked with ✓)\")\n .action(async () => {\n const accounts = await listAccounts(new ConfigStore())\n render({ kind: \"account_ls\" }, { accounts })\n })\n\naccountCommand\n .command(\"switch <email>\")\n .description(\"Set the active account for the current env\")\n .action(async (email: string) => {\n await switchAccount(new ConfigStore(), email)\n process.stdout.write(`✓ active account is now ${email}\\n`)\n })\n","import { Command } from \"commander\"\nimport { loadSdkClient } from \"../auth/load-sdk-client.js\"\nimport { todoUpdate } from \"../../generated/sdk/index.js\"\nimport { render } from \"../output/render.js\"\nimport type { XCliDisplay } from \"../output/types.js\"\n\n/**\n * Mirrors the `display` block on the spec's `todo_update` operation. We\n * pin it here rather than reaching into the auto-generated `todo update`\n * command file because the generated file's exact identifier layout is an\n * implementation detail of the codegen. If the spec adds fields, this\n * object lags by one PR — same trade-off as the generated commands take.\n */\nconst TODO_UPDATE_DISPLAY: XCliDisplay = {\n shape: \"object\",\n format: {\n id: \"id-short\",\n user_id: \"id-short\",\n project_id: \"id-short\",\n parent_id: \"id-short\",\n type_id: \"id-short\",\n title: \"truncate\",\n description: \"truncate\",\n status: \"status-badge\",\n due_at: \"relative-time\",\n created_at: \"relative-time\",\n updated_at: \"relative-time\",\n deleted_at: \"relative-time\",\n },\n}\n\nexport const todoDoneCommand = new Command(\"done\")\n .description(\"Mark a todo done (sugar for `update <id> --status done`)\")\n .argument(\"<id>\", \"Todo id\")\n .action(async (id: string) => {\n const client = await loadSdkClient()\n const result = await todoUpdate({\n client: client._rawClient,\n path: { id },\n body: { status: \"done\" } as never,\n })\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render({ kind: \"todo_update\", display: TODO_UPDATE_DISPLAY }, result.data)\n })\n","import { Command } from \"commander\"\nimport { readFile, stat } from \"node:fs/promises\"\nimport { basename } from \"node:path\"\nimport { emailSend } from \"../../../generated/sdk/index.js\"\nimport { loadSdkClient } from \"../../auth/load-sdk-client.js\"\nimport { mimeFromExt } from \"../../utils/mime-from-ext.js\"\nimport { render } from \"../../output/render.js\"\n\nconst MAX_PER_ATTACHMENT = 5 * 1024 * 1024\nconst MAX_TOTAL_ATTACHMENT = 25 * 1024 * 1024\nconst MAX_TEXT_BYTES = 100 * 1024\nconst INBOUND_REF_RE = /^[a-z]+_[A-Z0-9]+:\\d+$/\n\ntype Attachment =\n | { filename: string; content_type: string; content_base64: string }\n | { from_inbound_email_id: string; idx: number }\n\nasync function resolveAttachment(input: string): Promise<{ att: Attachment; size: number }> {\n // Try as file first; fall back to ref regex.\n try {\n const s = await stat(input)\n if (s.isFile()) {\n if (s.size > MAX_PER_ATTACHMENT) {\n throw new Error(`Attachment ${input} (${s.size} bytes) exceeds 5 MiB limit.`)\n }\n const buf = await readFile(input)\n return {\n att: {\n filename: basename(input),\n content_type: mimeFromExt(input),\n content_base64: buf.toString(\"base64\"),\n },\n size: s.size,\n }\n }\n } catch {\n // not a readable file — try ref\n }\n if (INBOUND_REF_RE.test(input)) {\n const [emlId, idxStr] = input.split(\":\")\n return { att: { from_inbound_email_id: emlId!, idx: Number(idxStr) }, size: 0 }\n }\n throw new Error(\n `--attach ${input}: neither a readable file nor a valid <prefix>_<ulid>:<idx> reference.`,\n )\n}\n\nexport const sendCommand = new Command(\"send\")\n .description(\"Send an outbound email\")\n .requiredOption(\"--from <alias-email>\", \"alias email to send from\")\n .option(\"--to <addr...>\", \"recipient address (repeatable)\", [])\n .option(\"--subject <text>\", \"subject\")\n .option(\"--text <body>\", \"plain-text body\")\n .option(\"--text-file <path>\", \"read text body from file\")\n .option(\"--reply <id>\", \"inbound email id to reply to\")\n .option(\"--attach <path-or-ref...>\", \"attachment (file path or eml_xxx:idx)\", [])\n .requiredOption(\"--idempotency-key <key>\", \"idempotency key\")\n .action(async (opts) => {\n const isReply = Boolean(opts.reply)\n const to = opts.to as string[]\n const attachInputs = opts.attach as string[]\n\n // Resolve text source — mutually exclusive options\n if (opts.text && opts.textFile) {\n process.stderr.write(\"--text and --text-file are mutually exclusive\\n\")\n process.exitCode = 1\n return\n }\n let text: string | undefined = opts.text\n if (opts.textFile) {\n text = await readFile(opts.textFile as string, \"utf8\")\n }\n if (!text) {\n process.stderr.write(\"--text or --text-file is required\\n\")\n process.exitCode = 1\n return\n }\n if (Buffer.byteLength(text, \"utf8\") > MAX_TEXT_BYTES) {\n process.stderr.write(\"text body exceeds 100 KiB\\n\")\n process.exitCode = 1\n return\n }\n\n // Validate fresh-mode required fields\n if (!isReply) {\n if (to.length === 0) {\n process.stderr.write(\"--to is required (or use --reply for thread replies)\\n\")\n process.exitCode = 1\n return\n }\n if (!opts.subject) {\n process.stderr.write(\"--subject is required (or use --reply for thread replies)\\n\")\n process.exitCode = 1\n return\n }\n }\n\n // Resolve attachments\n const attachments: Attachment[] = []\n let total = 0\n for (const input of attachInputs) {\n try {\n const { att, size } = await resolveAttachment(input)\n total += size\n attachments.push(att)\n } catch (e) {\n process.stderr.write(`${(e as Error).message}\\n`)\n process.exitCode = 1\n return\n }\n }\n if (total > MAX_TOTAL_ATTACHMENT) {\n process.stderr.write(`Attachments total ${total} bytes exceeds 25 MiB limit.\\n`)\n process.exitCode = 1\n return\n }\n\n const body: Record<string, unknown> = {\n from_alias_email: opts.from,\n text,\n idempotency_key: opts.idempotencyKey,\n }\n if (isReply) {\n body.in_reply_to_email_id = opts.reply\n } else {\n body.to = to\n body.subject = opts.subject\n }\n if (attachments.length > 0) body.attachments = attachments\n\n const client = await loadSdkClient()\n const result = await emailSend({\n client: (client as unknown as { _rawClient: unknown })._rawClient as never,\n body,\n } as never)\n\n if (result.error || !result.response?.ok) {\n process.stderr.write(\n `HTTP ${result.response?.status ?? \"?\"}: ${JSON.stringify(result.error ?? \"unknown error\", null, 2)}\\n`,\n )\n process.exitCode = 1\n return\n }\n render(\n { kind: \"object\", display: { shape: \"object\", format: { id: \"id-short\" } } },\n result.data!.email,\n )\n })\n","import { extname } from \"node:path\"\n\nconst MIME_BY_EXT: Record<string, string> = {\n pdf: \"application/pdf\",\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n txt: \"text/plain\",\n csv: \"text/csv\",\n md: \"text/markdown\",\n html: \"text/html\",\n json: \"application/json\",\n ics: \"text/calendar\",\n zip: \"application/zip\",\n}\n\n/**\n * Map a filename's extension to a likely MIME type, falling back to\n * `application/octet-stream` for unknown extensions. The table is small on\n * purpose — `wspc-cli` deliberately avoids the `mime-types` dependency. Add\n * entries only when a real user complaint surfaces.\n */\nexport function mimeFromExt(filename: string): string {\n const ext = extname(filename).slice(1).toLowerCase()\n return MIME_BY_EXT[ext] ?? \"application/octet-stream\"\n}\n","import { Command } from \"commander\"\nimport { createWriteStream } from \"node:fs\"\nimport { Readable } from \"node:stream\"\nimport { pipeline } from \"node:stream/promises\"\nimport { loadAuthedFetch } from \"../../auth/load-sdk-client.js\"\nimport { parseContentDispositionFilename } from \"../../utils/parse-content-disposition.js\"\n\nexport const attachmentCommand = new Command(\"attachment\")\n .description(\"Download an inbound email attachment by index\")\n .argument(\"<email-id>\")\n .argument(\"<idx>\")\n .option(\"--output <path>\", \"output file path\")\n .option(\"--include-deleted\", \"allow downloads from soft-deleted parent emails\")\n .action(async (emailId: string, idxArg: string, opts) => {\n const idx = Number(idxArg)\n if (!Number.isInteger(idx) || idx < 0) {\n process.stderr.write(`<idx> must be a non-negative integer (got \"${idxArg}\")\\n`)\n process.exitCode = 1\n return\n }\n\n const { fetch: authedFetch, baseUrl } = await loadAuthedFetch()\n const url = new URL(`/email/messages/${emailId}/attachments/${idx}`, baseUrl)\n if (opts.includeDeleted) url.searchParams.set(\"include_deleted\", \"true\")\n\n const res = await authedFetch(url)\n\n if (!res.ok) {\n const text = await res.text()\n process.stderr.write(`HTTP ${res.status}: ${text}\\n`)\n process.exitCode = 1\n return\n }\n\n const filename =\n opts.output ??\n parseContentDispositionFilename(res.headers.get(\"content-disposition\")) ??\n `${emailId}-${idx}.bin`\n\n if (!res.body) {\n process.stderr.write(\"response has no body\\n\")\n process.exitCode = 1\n return\n }\n\n const sink = createWriteStream(filename)\n await pipeline(Readable.fromWeb(res.body as never), sink)\n process.stdout.write(`Saved ${filename}\\n`)\n })\n","/**\n * Extract the `filename=` token from a Content-Disposition header.\n * Supports both quoted (`filename=\"x.pdf\"`) and unquoted (`filename=x.pdf`)\n * tokens. RFC 5987 `filename*=UTF-8''...` is NOT supported in v1 — the\n * server does not currently emit it.\n */\nexport function parseContentDispositionFilename(\n header: string | null | undefined,\n): string | undefined {\n if (!header) return undefined\n if (!header.toLowerCase().startsWith(\"attachment\")) return undefined\n const quoted = header.match(/filename=\"([^\"]+)\"/i)\n if (quoted) return quoted[1]\n const unquoted = header.match(/filename=([^;\\s]+)/i)\n if (unquoted) return unquoted[1]\n return undefined\n}\n"],"mappings":";;;AACA,SAAS,WAAAA,iBAAe;;;ACAxB,SAAS,eAAe;;;AC0DjB,IAAM,qBAAqB;AAAA,EAChC,gBAAgB,CAAC,SACf,KAAK,UAAU,MAAM,CAAC,MAAM,UAAW,OAAO,UAAU,WAAW,MAAM,SAAS,IAAI,KAAM;AAChG;;;AClBA,IAAM,mBAAyC;AAAA,EAC7C,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AACX;AACA,IAAM,gBAAgB,OAAO,QAAQ,gBAAgB;;;AC+B9C,SAAS,gBAAiC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA2D;AACzD,MAAI;AAEJ,QAAM,QAAQ,eAAe,CAAC,OAAe,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAE7F,QAAM,eAAe,mBAAmB;AACtC,QAAI,aAAqB,wBAAwB;AACjD,QAAI,UAAU;AACd,UAAM,SAAS,QAAQ,UAAU,IAAI,gBAAgB,EAAE;AAEvD,WAAO,MAAM;AACX,UAAI,OAAO,QAAS;AAEpB;AAEA,YAAM,UACJ,QAAQ,mBAAmB,UACvB,QAAQ,UACR,IAAI,QAAQ,QAAQ,OAA6C;AAEvE,UAAI,gBAAgB,QAAW;AAC7B,gBAAQ,IAAI,iBAAiB,WAAW;AAAA,MAC1C;AAEA,UAAI;AACF,cAAM,cAA2B;AAAA,UAC/B,UAAU;AAAA,UACV,GAAG;AAAA,UACH,MAAM,QAAQ;AAAA,UACd;AAAA,UACA;AAAA,QACF;AACA,YAAI,UAAU,IAAI,QAAQ,KAAK,WAAW;AAC1C,YAAI,WAAW;AACb,oBAAU,MAAM,UAAU,KAAK,WAAW;AAAA,QAC5C;AAGA,cAAM,SAAS,QAAQ,SAAS,WAAW;AAC3C,cAAM,WAAW,MAAM,OAAO,OAAO;AAErC,YAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,eAAe,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAEzF,YAAI,CAAC,SAAS,KAAM,OAAM,IAAI,MAAM,yBAAyB;AAE7D,cAAM,SAAS,SAAS,KAAK,YAAY,IAAI,kBAAkB,CAAC,EAAE,UAAU;AAE5E,YAAI,SAAS;AAEb,cAAM,eAAe,MAAM;AACzB,cAAI;AACF,mBAAO,OAAO;AAAA,UAChB,QAAQ;AAAA,UAER;AAAA,QACF;AAEA,eAAO,iBAAiB,SAAS,YAAY;AAE7C,YAAI;AACF,iBAAO,MAAM;AACX,kBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,gBAAI,KAAM;AACV,sBAAU;AACV,qBAAS,OAAO,QAAQ,UAAU,IAAI;AAEtC,kBAAM,SAAS,OAAO,MAAM,MAAM;AAClC,qBAAS,OAAO,IAAI,KAAK;AAEzB,uBAAW,SAAS,QAAQ;AAC1B,oBAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,oBAAM,YAA2B,CAAC;AAClC,kBAAI;AAEJ,yBAAW,QAAQ,OAAO;AACxB,oBAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,4BAAU,KAAK,KAAK,QAAQ,aAAa,EAAE,CAAC;AAAA,gBAC9C,WAAW,KAAK,WAAW,QAAQ,GAAG;AACpC,8BAAY,KAAK,QAAQ,cAAc,EAAE;AAAA,gBAC3C,WAAW,KAAK,WAAW,KAAK,GAAG;AACjC,gCAAc,KAAK,QAAQ,WAAW,EAAE;AAAA,gBAC1C,WAAW,KAAK,WAAW,QAAQ,GAAG;AACpC,wBAAM,SAAS,OAAO,SAAS,KAAK,QAAQ,cAAc,EAAE,GAAG,EAAE;AACjE,sBAAI,CAAC,OAAO,MAAM,MAAM,GAAG;AACzB,iCAAa;AAAA,kBACf;AAAA,gBACF;AAAA,cACF;AAEA,kBAAI;AACJ,kBAAI,aAAa;AAEjB,kBAAI,UAAU,QAAQ;AACpB,sBAAM,UAAU,UAAU,KAAK,IAAI;AACnC,oBAAI;AACF,yBAAO,KAAK,MAAM,OAAO;AACzB,+BAAa;AAAA,gBACf,QAAQ;AACN,yBAAO;AAAA,gBACT;AAAA,cACF;AAEA,kBAAI,YAAY;AACd,oBAAI,mBAAmB;AACrB,wBAAM,kBAAkB,IAAI;AAAA,gBAC9B;AAEA,oBAAI,qBAAqB;AACvB,yBAAO,MAAM,oBAAoB,IAAI;AAAA,gBACvC;AAAA,cACF;AAEA,2BAAa;AAAA,gBACX;AAAA,gBACA,OAAO;AAAA,gBACP,IAAI;AAAA,gBACJ,OAAO;AAAA,cACT,CAAC;AAED,kBAAI,UAAU,QAAQ;AACpB,sBAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF,UAAE;AACA,iBAAO,oBAAoB,SAAS,YAAY;AAChD,iBAAO,YAAY;AAAA,QACrB;AAEA;AAAA,MACF,SAAS,OAAO;AAEd,qBAAa,KAAK;AAElB,YAAI,wBAAwB,UAAa,WAAW,qBAAqB;AACvE;AAAA,QACF;AAGA,cAAM,UAAU,KAAK,IAAI,aAAa,MAAM,UAAU,IAAI,oBAAoB,GAAK;AACnF,cAAM,MAAM,OAAO;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,aAAa;AAE5B,SAAO,EAAE,OAAO;AAClB;;;ACtNO,IAAM,wBAAwB,CAAC,UAA+B;AACnE,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,0BAA0B,CAAC,UAA+B;AACrE,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,yBAAyB,CAAC,UAAgC;AACrE,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAEM;AACJ,MAAI,CAAC,SAAS;AACZ,UAAMC,iBACJ,gBAAgB,QAAQ,MAAM,IAAI,CAAC,MAAM,mBAAmB,CAAW,CAAC,GACxE,KAAK,wBAAwB,KAAK,CAAC;AACrC,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO,IAAIA,aAAY;AAAA,MACzB,KAAK;AACH,eAAO,IAAI,IAAI,IAAIA,aAAY;AAAA,MACjC,KAAK;AACH,eAAOA;AAAA,MACT;AACE,eAAO,GAAG,IAAI,IAAIA,aAAY;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,YAAY,sBAAsB,KAAK;AAC7C,QAAM,eAAe,MAClB,IAAI,CAAC,MAAM;AACV,QAAI,UAAU,WAAW,UAAU,UAAU;AAC3C,aAAO,gBAAgB,IAAI,mBAAmB,CAAW;AAAA,IAC3D;AAEA,WAAO,wBAAwB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC,EACA,KAAK,SAAS;AACjB,SAAO,UAAU,WAAW,UAAU,WAAW,YAAY,eAAe;AAC9E;AAEO,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,MAA+B;AAC7B,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,GAAG,IAAI,IAAI,gBAAgB,QAAQ,mBAAmB,KAAK,CAAC;AACrE;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAGM;AACJ,MAAI,iBAAiB,MAAM;AACzB,WAAO,YAAY,MAAM,YAAY,IAAI,GAAG,IAAI,IAAI,MAAM,YAAY,CAAC;AAAA,EACzE;AAEA,MAAI,UAAU,gBAAgB,CAAC,SAAS;AACtC,QAAI,SAAmB,CAAC;AACxB,WAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM;AAC1C,eAAS,CAAC,GAAG,QAAQ,KAAK,gBAAiB,IAAe,mBAAmB,CAAW,CAAC;AAAA,IAC3F,CAAC;AACD,UAAMA,gBAAe,OAAO,KAAK,GAAG;AACpC,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO,GAAG,IAAI,IAAIA,aAAY;AAAA,MAChC,KAAK;AACH,eAAO,IAAIA,aAAY;AAAA,MACzB,KAAK;AACH,eAAO,IAAI,IAAI,IAAIA,aAAY;AAAA,MACjC;AACE,eAAOA;AAAA,IACX;AAAA,EACF;AAEA,QAAM,YAAY,uBAAuB,KAAK;AAC9C,QAAM,eAAe,OAAO,QAAQ,KAAK,EACtC;AAAA,IAAI,CAAC,CAAC,KAAK,CAAC,MACX,wBAAwB;AAAA,MACtB;AAAA,MACA,MAAM,UAAU,eAAe,GAAG,IAAI,IAAI,GAAG,MAAM;AAAA,MACnD,OAAO;AAAA,IACT,CAAC;AAAA,EACH,EACC,KAAK,SAAS;AACjB,SAAO,UAAU,WAAW,UAAU,WAAW,YAAY,eAAe;AAC9E;;;AC3JO,IAAM,gBAAgB;AAEtB,IAAM,wBAAwB,CAAC,EAAE,MAAM,KAAK,KAAK,MAAsB;AAC5E,MAAI,MAAM;AACV,QAAM,UAAU,KAAK,MAAM,aAAa;AACxC,MAAI,SAAS;AACX,eAAW,SAAS,SAAS;AAC3B,UAAI,UAAU;AACd,UAAI,OAAO,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC;AAC9C,UAAI,QAA6B;AAEjC,UAAI,KAAK,SAAS,GAAG,GAAG;AACtB,kBAAU;AACV,eAAO,KAAK,UAAU,GAAG,KAAK,SAAS,CAAC;AAAA,MAC1C;AAEA,UAAI,KAAK,WAAW,GAAG,GAAG;AACxB,eAAO,KAAK,UAAU,CAAC;AACvB,gBAAQ;AAAA,MACV,WAAW,KAAK,WAAW,GAAG,GAAG;AAC/B,eAAO,KAAK,UAAU,CAAC;AACvB,gBAAQ;AAAA,MACV;AAEA,YAAM,QAAQ,KAAK,IAAI;AAEvB,UAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAM,IAAI,QAAQ,OAAO,oBAAoB,EAAE,SAAS,MAAM,OAAO,MAAM,CAAC,CAAC;AAC7E;AAAA,MACF;AAEA,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,IAAI;AAAA,UACR;AAAA,UACA,qBAAqB;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAEA,UAAI,UAAU,UAAU;AACtB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,IAAI,wBAAwB;AAAA,YAC1B;AAAA,YACA;AAAA,UACF,CAAC,CAAC;AAAA,QACJ;AACA;AAAA,MACF;AAEA,YAAM,eAAe;AAAA,QACnB,UAAU,UAAU,IAAI,KAAe,KAAM;AAAA,MAC/C;AACA,YAAM,IAAI,QAAQ,OAAO,YAAY;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,SAAS,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AACP,MAMM;AACJ,QAAM,UAAU,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AACtD,MAAI,OAAO,WAAW,MAAM;AAC5B,MAAI,MAAM;AACR,UAAM,sBAAsB,EAAE,MAAM,IAAI,CAAC;AAAA,EAC3C;AACA,MAAI,SAAS,QAAQ,gBAAgB,KAAK,IAAI;AAC9C,MAAI,OAAO,WAAW,GAAG,GAAG;AAC1B,aAAS,OAAO,UAAU,CAAC;AAAA,EAC7B;AACA,MAAI,QAAQ;AACV,WAAO,IAAI,MAAM;AAAA,EACnB;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,SAIjC;AACD,QAAM,UAAU,QAAQ,SAAS;AACjC,QAAM,mBAAmB,WAAW,QAAQ;AAE5C,MAAI,kBAAkB;AACpB,QAAI,oBAAoB,SAAS;AAC/B,YAAM,oBACJ,QAAQ,mBAAmB,UAAa,QAAQ,mBAAmB;AAErE,aAAO,oBAAoB,QAAQ,iBAAiB;AAAA,IACtD;AAGA,WAAO,QAAQ,SAAS,KAAK,QAAQ,OAAO;AAAA,EAC9C;AAGA,MAAI,SAAS;AACX,WAAO,QAAQ;AAAA,EACjB;AAGA,SAAO;AACT;;;ACtHO,IAAM,eAAe,OAC1B,MACA,aACgC;AAChC,QAAM,QAAQ,OAAO,aAAa,aAAa,MAAM,SAAS,IAAI,IAAI;AAEtE,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,UAAU;AAC5B,WAAO,UAAU,KAAK;AAAA,EACxB;AAEA,MAAI,KAAK,WAAW,SAAS;AAC3B,WAAO,SAAS,KAAK,KAAK,CAAC;AAAA,EAC7B;AAEA,SAAO;AACT;;;AC3BO,IAAM,wBAAwB,CAAc;AAAA,EACjD,aAAa,CAAC;AAAA,EACd,GAAG;AACL,IAA4B,CAAC,MAAM;AACjC,QAAM,kBAAkB,CAAC,gBAAmB;AAC1C,UAAM,SAAmB,CAAC;AAC1B,QAAI,eAAe,OAAO,gBAAgB,UAAU;AAClD,iBAAW,QAAQ,aAAa;AAC9B,cAAM,QAAQ,YAAY,IAAI;AAE9B,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,QACF;AAEA,cAAM,UAAU,WAAW,IAAI,KAAK;AAEpC,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAM,kBAAkB,oBAAoB;AAAA,YAC1C,eAAe,QAAQ;AAAA,YACvB,SAAS;AAAA,YACT;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA,GAAG,QAAQ;AAAA,UACb,CAAC;AACD,cAAI,gBAAiB,QAAO,KAAK,eAAe;AAAA,QAClD,WAAW,OAAO,UAAU,UAAU;AACpC,gBAAM,mBAAmB,qBAAqB;AAAA,YAC5C,eAAe,QAAQ;AAAA,YACvB,SAAS;AAAA,YACT;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA,GAAG,QAAQ;AAAA,UACb,CAAC;AACD,cAAI,iBAAkB,QAAO,KAAK,gBAAgB;AAAA,QACpD,OAAO;AACL,gBAAM,sBAAsB,wBAAwB;AAAA,YAClD,eAAe,QAAQ;AAAA,YACvB;AAAA,YACA;AAAA,UACF,CAAC;AACD,cAAI,oBAAqB,QAAO,KAAK,mBAAmB;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,WAAO,OAAO,KAAK,GAAG;AAAA,EACxB;AACA,SAAO;AACT;AAKO,IAAM,aAAa,CAAC,gBAAmE;AAC5F,MAAI,CAAC,aAAa;AAGhB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,YAAY,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK;AAErD,MAAI,CAAC,cAAc;AACjB;AAAA,EACF;AAEA,MAAI,aAAa,WAAW,kBAAkB,KAAK,aAAa,SAAS,OAAO,GAAG;AACjF,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,uBAAuB;AAC1C,WAAO;AAAA,EACT;AAEA,MACE,CAAC,gBAAgB,UAAU,UAAU,QAAQ,EAAE,KAAK,CAAC,SAAS,aAAa,WAAW,IAAI,CAAC,GAC3F;AACA,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,WAAW,OAAO,GAAG;AACpC,WAAO;AAAA,EACT;AAEA;AACF;AAEA,IAAM,oBAAoB,CACxB,SAGA,SACY;AACZ,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MACE,QAAQ,QAAQ,IAAI,IAAI,KACxB,QAAQ,QAAQ,IAAI,KACpB,QAAQ,QAAQ,IAAI,QAAQ,GAAG,SAAS,GAAG,IAAI,GAAG,GAClD;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAsB,cACpB,SAGe;AACf,aAAW,QAAQ,QAAQ,YAAY,CAAC,GAAG;AACzC,QAAI,kBAAkB,SAAS,KAAK,IAAI,GAAG;AACzC;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,aAAa,MAAM,QAAQ,IAAI;AAEnD,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,QAAQ;AAE1B,YAAQ,KAAK,IAAI;AAAA,MACf,KAAK;AACH,YAAI,CAAC,QAAQ,OAAO;AAClB,kBAAQ,QAAQ,CAAC;AAAA,QACnB;AACA,gBAAQ,MAAM,IAAI,IAAI;AACtB;AAAA,MACF,KAAK;AACH,gBAAQ,QAAQ,OAAO,UAAU,GAAG,IAAI,IAAI,KAAK,EAAE;AACnD;AAAA,MACF,KAAK;AAAA,MACL;AACE,gBAAQ,QAAQ,IAAI,MAAM,KAAK;AAC/B;AAAA,IACJ;AAAA,EACF;AACF;AAEO,IAAM,WAA+B,CAAC,YAC3C,OAAO;AAAA,EACL,SAAS,QAAQ;AAAA,EACjB,MAAM,QAAQ;AAAA,EACd,OAAO,QAAQ;AAAA,EACf,iBACE,OAAO,QAAQ,oBAAoB,aAC/B,QAAQ,kBACR,sBAAsB,QAAQ,eAAe;AAAA,EACnD,KAAK,QAAQ;AACf,CAAC;AAEI,IAAM,eAAe,CAAC,GAAW,MAAsB;AAC5D,QAAM,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE;AAC5B,MAAI,OAAO,SAAS,SAAS,GAAG,GAAG;AACjC,WAAO,UAAU,OAAO,QAAQ,UAAU,GAAG,OAAO,QAAQ,SAAS,CAAC;AAAA,EACxE;AACA,SAAO,UAAU,aAAa,EAAE,SAAS,EAAE,OAAO;AAClD,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,YAA8C;AACpE,QAAM,UAAmC,CAAC;AAC1C,UAAQ,QAAQ,CAAC,OAAO,QAAQ;AAC9B,YAAQ,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,EAC3B,CAAC;AACD,SAAO;AACT;AAEO,IAAM,eAAe,IACvB,YACS;AACZ,QAAM,gBAAgB,IAAI,QAAQ;AAClC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,UAAM,WAAW,kBAAkB,UAAU,eAAe,MAAM,IAAI,OAAO,QAAQ,MAAM;AAE3F,eAAW,CAAC,KAAK,KAAK,KAAK,UAAU;AACnC,UAAI,UAAU,MAAM;AAClB,sBAAc,OAAO,GAAG;AAAA,MAC1B,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,mBAAW,KAAK,OAAO;AACrB,wBAAc,OAAO,KAAK,CAAW;AAAA,QACvC;AAAA,MACF,WAAW,UAAU,QAAW;AAG9B,sBAAc;AAAA,UACZ;AAAA,UACA,OAAO,UAAU,WAAW,KAAK,UAAU,KAAK,IAAK;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAmBA,IAAM,eAAN,MAAgC;AAAA,EAC9B,MAAiC,CAAC;AAAA,EAElC,QAAc;AACZ,SAAK,MAAM,CAAC;AAAA,EACd;AAAA,EAEA,MAAM,IAAgC;AACpC,UAAM,QAAQ,KAAK,oBAAoB,EAAE;AACzC,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,WAAK,IAAI,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,OAAO,IAAmC;AACxC,UAAM,QAAQ,KAAK,oBAAoB,EAAE;AACzC,WAAO,QAAQ,KAAK,IAAI,KAAK,CAAC;AAAA,EAChC;AAAA,EAEA,oBAAoB,IAAkC;AACpD,QAAI,OAAO,OAAO,UAAU;AAC1B,aAAO,KAAK,IAAI,EAAE,IAAI,KAAK;AAAA,IAC7B;AACA,WAAO,KAAK,IAAI,QAAQ,EAAE;AAAA,EAC5B;AAAA,EAEA,OAAO,IAA0B,IAA+C;AAC9E,UAAM,QAAQ,KAAK,oBAAoB,EAAE;AACzC,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,WAAK,IAAI,KAAK,IAAI;AAClB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,IAAyB;AAC3B,SAAK,IAAI,KAAK,EAAE;AAChB,WAAO,KAAK,IAAI,SAAS;AAAA,EAC3B;AACF;AAQO,IAAM,qBAAqB,OAK5B;AAAA,EACJ,OAAO,IAAI,aAAqD;AAAA,EAChE,SAAS,IAAI,aAA2C;AAAA,EACxD,UAAU,IAAI,aAAgD;AAChE;AAEA,IAAM,yBAAyB,sBAAsB;AAAA,EACnD,eAAe;AAAA,EACf,OAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF,CAAC;AAED,IAAM,iBAAiB;AAAA,EACrB,gBAAgB;AAClB;AAEO,IAAM,eAAe,CAC1B,WAAqD,CAAC,OACR;AAAA,EAC9C,GAAG;AAAA,EACH,SAAS;AAAA,EACT,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,GAAG;AACL;;;ACtSO,IAAM,eAAe,CAAC,SAAiB,CAAC,MAAc;AAC3D,MAAI,UAAU,aAAa,aAAa,GAAG,MAAM;AAEjD,QAAM,YAAY,OAAe,EAAE,GAAG,QAAQ;AAE9C,QAAM,YAAY,CAACC,YAA2B;AAC5C,cAAU,aAAa,SAASA,OAAM;AACtC,WAAO,UAAU;AAAA,EACnB;AAEA,QAAM,eAAe,mBAAuE;AAE5F,QAAM,gBAAgB,OAMpB,YACG;AACH,UAAM,OAAO;AAAA,MACX,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO,QAAQ,SAAS,QAAQ,SAAS,WAAW;AAAA,MACpD,SAAS,aAAa,QAAQ,SAAS,QAAQ,OAAO;AAAA,MACtD,gBAAgB;AAAA,IAClB;AAEA,QAAI,KAAK,UAAU;AACjB,YAAM,cAAc,IAAI;AAAA,IAC1B;AAEA,QAAI,KAAK,kBAAkB;AACzB,YAAM,KAAK,iBAAiB,IAAI;AAAA,IAClC;AAEA,QAAI,KAAK,SAAS,UAAa,KAAK,gBAAgB;AAClD,WAAK,iBAAiB,KAAK,eAAe,KAAK,IAAI;AAAA,IACrD;AAGA,QAAI,KAAK,SAAS,UAAa,KAAK,mBAAmB,IAAI;AACzD,WAAK,QAAQ,OAAO,cAAc;AAAA,IACpC;AAEA,UAAM,eAAe;AAErB,UAAM,MAAM,SAAS,YAAY;AAEjC,WAAO,EAAE,MAAM,cAAc,IAAI;AAAA,EACnC;AAEA,QAAM,UAA6B,OAAO,YAAY;AACpD,UAAM,eAAe,QAAQ,gBAAgB,QAAQ;AACrD,UAAM,gBAAgB,QAAQ,iBAAiB,QAAQ;AAEvD,QAAIC;AACJ,QAAI;AAEJ,QAAI;AACF,YAAM,EAAE,MAAM,IAAI,IAAI,MAAM,cAAc,OAAO;AACjD,YAAM,cAAuB;AAAA,QAC3B,UAAU;AAAA,QACV,GAAG;AAAA,QACH,MAAM,oBAAoB,IAAI;AAAA,MAChC;AAEA,MAAAA,WAAU,IAAI,QAAQ,KAAK,WAAW;AAEtC,iBAAW,MAAM,aAAa,QAAQ,KAAK;AACzC,YAAI,IAAI;AACN,UAAAA,WAAU,MAAM,GAAGA,UAAS,IAAI;AAAA,QAClC;AAAA,MACF;AAIA,YAAM,SAAS,KAAK;AAEpB,iBAAW,MAAM,OAAOA,QAAO;AAE/B,iBAAW,MAAM,aAAa,SAAS,KAAK;AAC1C,YAAI,IAAI;AACN,qBAAW,MAAM,GAAG,UAAUA,UAAS,IAAI;AAAA,QAC7C;AAAA,MACF;AAEA,YAAM,SAAS;AAAA,QACb,SAAAA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,SAAS,IAAI;AACf,cAAM,WACH,KAAK,YAAY,SACd,WAAW,SAAS,QAAQ,IAAI,cAAc,CAAC,IAC/C,KAAK,YAAY;AAEvB,YAAI,SAAS,WAAW,OAAO,SAAS,QAAQ,IAAI,gBAAgB,MAAM,KAAK;AAC7E,cAAI;AACJ,kBAAQ,SAAS;AAAA,YACf,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AACH,0BAAY,MAAM,SAAS,OAAO,EAAE;AACpC;AAAA,YACF,KAAK;AACH,0BAAY,IAAI,SAAS;AACzB;AAAA,YACF,KAAK;AACH,0BAAY,SAAS;AACrB;AAAA,YACF,KAAK;AAAA,YACL;AACE,0BAAY,CAAC;AACb;AAAA,UACJ;AACA,iBAAO,KAAK,kBAAkB,SAC1B,YACA;AAAA,YACE,MAAM;AAAA,YACN,GAAG;AAAA,UACL;AAAA,QACN;AAEA,YAAI;AACJ,gBAAQ,SAAS;AAAA,UACf,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AACH,mBAAO,MAAM,SAAS,OAAO,EAAE;AAC/B;AAAA,UACF,KAAK,QAAQ;AAGX,kBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,mBAAO,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC;AAClC;AAAA,UACF;AAAA,UACA,KAAK;AACH,mBAAO,KAAK,kBAAkB,SAC1B,SAAS,OACT;AAAA,cACE,MAAM,SAAS;AAAA,cACf,GAAG;AAAA,YACL;AAAA,QACR;AAEA,YAAI,YAAY,QAAQ;AACtB,cAAI,KAAK,mBAAmB;AAC1B,kBAAM,KAAK,kBAAkB,IAAI;AAAA,UACnC;AAEA,cAAI,KAAK,qBAAqB;AAC5B,mBAAO,MAAM,KAAK,oBAAoB,IAAI;AAAA,UAC5C;AAAA,QACF;AAEA,eAAO,KAAK,kBAAkB,SAC1B,OACA;AAAA,UACE;AAAA,UACA,GAAG;AAAA,QACL;AAAA,MACN;AAEA,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,UAAI;AAEJ,UAAI;AACF,oBAAY,KAAK,MAAM,SAAS;AAAA,MAClC,QAAQ;AAAA,MAER;AAEA,YAAM,aAAa;AAAA,IACrB,SAAS,OAAO;AACd,UAAI,aAAa;AAEjB,iBAAW,MAAM,aAAa,MAAM,KAAK;AACvC,YAAI,IAAI;AACN,uBAAa,MAAM,GAAG,YAAY,UAAUA,UAAS,OAAiC;AAAA,QACxF;AAAA,MACF;AAEA,mBAAa,cAAc,CAAC;AAE5B,UAAI,cAAc;AAChB,cAAM;AAAA,MACR;AAGA,aAAO,kBAAkB,SACrB,SACA;AAAA,QACE,OAAO;AAAA,QACP,SAAAA;AAAA,QACA;AAAA,MACF;AAAA,IACN;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,WAAkC,CAAC,YACvD,QAAQ,EAAE,GAAG,SAAS,OAAO,CAAC;AAEhC,QAAM,YAAY,CAAC,WAAkC,OAAO,YAA4B;AACtF,UAAM,EAAE,MAAM,IAAI,IAAI,MAAM,cAAc,OAAO;AACjD,WAAO,gBAAgB;AAAA,MACrB,GAAG;AAAA,MACH,MAAM,KAAK;AAAA,MACX;AAAA,MACA,WAAW,OAAOC,MAAK,SAAS;AAC9B,YAAID,WAAU,IAAI,QAAQC,MAAK,IAAI;AACnC,mBAAW,MAAM,aAAa,QAAQ,KAAK;AACzC,cAAI,IAAI;AACN,YAAAD,WAAU,MAAM,GAAGA,UAAS,IAAI;AAAA,UAClC;AAAA,QACF;AACA,eAAOA;AAAA,MACT;AAAA,MACA,gBAAgB,oBAAoB,IAAI;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,YAAgC,CAAC,YAAY,SAAS,EAAE,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtF,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,aAAa,SAAS;AAAA,IAC/B,QAAQ,aAAa,QAAQ;AAAA,IAC7B,KAAK,aAAa,KAAK;AAAA,IACvB;AAAA,IACA,MAAM,aAAa,MAAM;AAAA,IACzB;AAAA,IACA,SAAS,aAAa,SAAS;AAAA,IAC/B,OAAO,aAAa,OAAO;AAAA,IAC3B,MAAM,aAAa,MAAM;AAAA,IACzB,KAAK,aAAa,KAAK;AAAA,IACvB;AAAA,IACA;AAAA,IACA,KAAK;AAAA,MACH,SAAS,UAAU,SAAS;AAAA,MAC5B,QAAQ,UAAU,QAAQ;AAAA,MAC1B,KAAK,UAAU,KAAK;AAAA,MACpB,MAAM,UAAU,MAAM;AAAA,MACtB,SAAS,UAAU,SAAS;AAAA,MAC5B,OAAO,UAAU,OAAO;AAAA,MACxB,MAAM,UAAU,MAAM;AAAA,MACtB,KAAK,UAAU,KAAK;AAAA,MACpB,OAAO,UAAU,OAAO;AAAA,IAC1B;AAAA,IACA,OAAO,aAAa,OAAO;AAAA,EAC7B;AACF;;;ACrQO,IAAM,SAAS,aAAa,aAA6B,EAAE,SAAS,sBAAsB,CAAC,CAAC;;;ACU5F,IAAM,eAAe,CAAuC,aAAsD,QAAQ,UAAU,QAAQ,KAA8D;AAAA,EAC7M,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAoBM,IAAM,UAAU,CAAuC,aAAkD,SAAS,UAAU,QAAQ,IAAmD;AAAA,EAC1L,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAqBM,IAAM,YAAY,CAAuC,aAAmD,QAAQ,UAAU,QAAQ,KAAwD;AAAA,EACjM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAOM,IAAM,iBAAiB,CAAuC,aAAyD,SAAS,UAAU,QAAQ,IAAiE;AAAA,EACtN,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAOM,IAAM,kBAAkB,CAAuC,aAA0D,SAAS,UAAU,QAAQ,KAAoE;AAAA,EAC3N,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,SAAS;AAAA,EAChB;AACJ,CAAC;AA+CM,IAAM,SAAS,CAAuC,aAAiD,SAAS,UAAU,QAAQ,IAAiD;AAAA,EACtL,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAaM,IAAM,YAAY,CAAuC,aAAoD,SAAS,UAAU,QAAQ,MAAyD;AAAA,EACpM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,SAAS;AAAA,EAChB;AACJ,CAAC;AAOM,IAAM,YAAY,CAAuC,aAAmD,QAAQ,UAAU,QAAQ,IAAuD;AAAA,EAChM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAmBM,IAAM,SAAS,CAAuC,aAAiD,SAAS,UAAU,QAAQ,IAAiD;AAAA,EACtL,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAOM,IAAM,cAAc,CAAuC,aAAsD,SAAS,UAAU,QAAQ,IAA2D;AAAA,EAC1M,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAsBM,IAAM,iBAAiB,CAAuC,aAAyD,SAAS,UAAU,QAAQ,IAAiE;AAAA,EACtN,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAmEM,IAAM,eAAe,CAAuC,aAAsD,QAAQ,UAAU,QAAQ,KAA8D;AAAA,EAC7M,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAiEM,IAAM,YAAY,CAAuC,aAAmD,QAAQ,UAAU,QAAQ,OAA0D;AAAA,EACnM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAYM,IAAM,YAAY,CAAuC,aAAmD,QAAQ,UAAU,QAAQ,MAAyD;AAAA,EAClM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAgCM,IAAM,kBAAkB,CAAuC,aAAyD,QAAQ,UAAU,QAAQ,OAAsE;AAAA,EAC3N,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AA6EM,IAAM,YAAY,CAAuC,aAAoD,SAAS,UAAU,QAAQ,IAAuD;AAAA,EAClM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAsBM,IAAM,cAAc,CAAuC,aAAsD,SAAS,UAAU,QAAQ,KAA4D;AAAA,EAC3M,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,SAAS;AAAA,EAChB;AACJ,CAAC;AAoBM,IAAM,cAAc,CAAuC,aAAqD,QAAQ,UAAU,QAAQ,OAA8D;AAAA,EAC3M,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAkBM,IAAM,WAAW,CAAuC,aAAkD,QAAQ,UAAU,QAAQ,IAAqD;AAAA,EAC5L,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAwBM,IAAM,cAAc,CAAuC,aAAqD,QAAQ,UAAU,QAAQ,MAA6D;AAAA,EAC1M,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAmBM,IAAM,mBAAmB,CAAuC,aAA0D,QAAQ,UAAU,QAAQ,IAAqE;AAAA,EAC5N,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AA8CM,IAAM,iBAAiB,CAAuC,aAAyD,SAAS,UAAU,QAAQ,IAAiE;AAAA,EACtN,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AA0BM,IAAM,mBAAmB,CAAuC,aAA0D,QAAQ,UAAU,QAAQ,KAAsE;AAAA,EAC7N,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAiBM,IAAM,kBAAkB,CAAuC,aAA0D,SAAS,UAAU,QAAQ,IAAmE;AAAA,EAC1N,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAuBM,IAAM,oBAAoB,CAAuC,aAA2D,QAAQ,UAAU,QAAQ,KAAwE;AAAA,EACjO,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAqBM,IAAM,mBAAmB,CAAuC,aAA0D,QAAQ,UAAU,QAAQ,OAAwE;AAAA,EAC/N,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAqBM,IAAM,cAAc,CAAuC,aAAqD,QAAQ,UAAU,QAAQ,KAA4D;AAAA,EACzM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AA8CM,IAAM,iBAAiB,CAAuC,aAAwD,QAAQ,UAAU,QAAQ,IAAiE;AAAA,EACpN,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAqBM,IAAM,WAAW,CAAuC,aAAkD,QAAQ,UAAU,QAAQ,IAAqD;AAAA,EAC5L,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAqBM,IAAM,YAAY,CAAuC,aAAoD,SAAS,UAAU,QAAQ,IAAuD;AAAA,EAClM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAoBM,IAAM,gBAAgB,CAAuC,aAAuD,QAAQ,UAAU,QAAQ,KAAgE;AAAA,EACjN,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAmBM,IAAM,kBAAkB,CAAuC,aAAyD,QAAQ,UAAU,QAAQ,KAAoE;AAAA,EACzN,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAgFM,IAAM,YAAY,CAAuC,aAAmD,QAAQ,UAAU,QAAQ,KAAwD;AAAA,EACjM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAwBM,IAAM,oBAAoB,CAAuC,aAA2D,QAAQ,UAAU,QAAQ,KAAwE;AAAA,EACjO,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAmBM,IAAM,mBAAmB,CAAuC,aAA0D,QAAQ,UAAU,QAAQ,OAAwE;AAAA,EAC/N,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAkBM,IAAM,gBAAgB,CAAuC,aAAwD,SAAS,UAAU,QAAQ,IAA+D;AAAA,EAClN,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAoBM,IAAM,gBAAgB,CAAuC,aAAuD,QAAQ,UAAU,QAAQ,KAAgE;AAAA,EACjN,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAoBM,IAAM,WAAW,CAAuC,aAAkD,QAAQ,UAAU,QAAQ,KAAsD;AAAA,EAC7L,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAiBM,IAAM,kBAAkB,CAAuC,aAAyD,QAAQ,UAAU,QAAQ,IAAmE;AAAA,EACxN,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAgBM,IAAM,oBAAoB,CAAuC,aAA2D,QAAQ,UAAU,QAAQ,KAAwE;AAAA,EACjO,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAiBM,IAAM,cAAc,CAAuC,aAAsD,SAAS,UAAU,QAAQ,IAA2D;AAAA,EAC1M,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAmBM,IAAM,gBAAgB,CAAuC,aAAwD,SAAS,UAAU,QAAQ,KAAgE;AAAA,EACnN,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,SAAS;AAAA,EAChB;AACJ,CAAC;AAkBM,IAAM,qBAAqB,CAAuC,aAA4D,QAAQ,UAAU,QAAQ,IAAyE;AAAA,EACpO,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAsBM,IAAM,uBAAuB,CAAuC,aAA+D,SAAS,UAAU,QAAQ,KAA8E;AAAA,EAC/O,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,SAAS;AAAA,EAChB;AACJ,CAAC;AAsBM,IAAM,WAAW,CAAuC,aAAkD,QAAQ,UAAU,QAAQ,IAAqD;AAAA,EAC5L,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAuBM,IAAM,aAAa,CAAuC,aAAqD,SAAS,UAAU,QAAQ,KAA0D;AAAA,EACvM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,SAAS;AAAA,EAChB;AACJ,CAAC;AAkBM,IAAM,eAAe,CAAuC,aAAsD,QAAQ,UAAU,QAAQ,IAA6D;AAAA,EAC5M,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAwCM,IAAM,oBAAoB,CAAuC,aAA2D,QAAQ,UAAU,QAAQ,OAA0E;AAAA,EACnO,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAeM,IAAM,oBAAoB,CAAuC,aAA2D,QAAQ,UAAU,QAAQ,MAAyE;AAAA,EAClO,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAwFM,IAAM,uBAAuB,CAAuC,aAA8D,QAAQ,UAAU,QAAQ,OAAgF;AAAA,EAC/O,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAiBM,IAAM,oBAAoB,CAAuC,aAA2D,QAAQ,UAAU,QAAQ,IAAuE;AAAA,EAChO,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAkDM,IAAM,aAAa,CAAuC,aAAoD,QAAQ,UAAU,QAAQ,OAA4D;AAAA,EACvM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;AAiBM,IAAM,UAAU,CAAuC,aAAiD,QAAQ,UAAU,QAAQ,IAAmD;AAAA,EACxL,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACP,CAAC;AAuBM,IAAM,aAAa,CAAuC,aAAoD,QAAQ,UAAU,QAAQ,MAA2D;AAAA,EACtM,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACf;AACJ,CAAC;;;AC/sDD,SAAS,YAAY,UAAU;AAC/B,SAAS,eAAe;AACxB,SAAS,YAAY;AAEd,IAAM,qBAAqB;AA4BlC,IAAM,cAAc,KAAK,QAAQ,GAAG,OAAO;AAG3C,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,WAAW,KAAyC;AAC3D,QAAM,WAAW,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AACnE,QAAM,MAAiB,EAAE,UAAU,UAAU,CAAC,EAAE;AAChD,MAAI,OAAO,IAAI,cAAc,SAAU,KAAI,YAAY,IAAI;AAG3D,MAAI,IAAI,YAAY,OAAO,IAAI,aAAa,UAAU;AACpD,QAAI,WAAW,IAAI;AACnB,QAAI,OAAO,IAAI,oBAAoB,SAAU,KAAI,kBAAkB,IAAI;AACvE,WAAO;AAAA,EACT;AAGA,QAAM,WAAW,aAAa,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,MAAS;AAC9D,MAAI,UAAU;AACZ,UAAM,QAAsB,EAAE,OAAO,mBAAmB;AACxD,eAAW,KAAK,cAAc;AAC5B,UAAI,IAAI,CAAC,MAAM,OAAW,CAAC,MAA6C,CAAC,IAAI,IAAI,CAAC;AAAA,IACpF;AACA,QAAI,SAAS,kBAAkB,IAAI;AACnC,QAAI,kBAAkB;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,UAAU,QAA6B;AAC9C,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO,EAAE,MAAM,CAAC,EAAE;AACrE,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,SAAS,YAAY,IAAI,SAAS,KAAM,QAAO,EAAE,MAAM,CAAC,EAAE;AACzE,QAAM,OAAkC,CAAC;AACzC,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,IAAI,IAA+B,GAAG;AAChF,QAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,WAAK,IAAI,IAAI,WAAW,MAAiC;AAAA,IAC3D;AAAA,EACF;AACA,QAAM,MAAkB,EAAE,gBAAgB,GAAG,KAAK;AAClD,MAAI,OAAO,IAAI,gBAAgB,SAAU,KAAI,cAAc,IAAI;AAC/D,SAAO;AACT;AAMO,SAAS,mBACd,QACA,SACA,OACA,QACS;AACT,MAAI,UAAU,mBAAoB,QAAO;AACzC,QAAM,MAAM,OAAO,KAAK,OAAO;AAC/B,QAAM,SAAS,KAAK,WAAW,kBAAkB;AACjD,MAAI,CAAC,OAAO,CAAC,OAAQ,QAAO;AAC5B,SAAO,IAAI,SAAS,kBAAkB;AAGtC,MAAI,CAAC,IAAI,SAAS,KAAK,GAAG;AACxB,QAAI,SAAS,KAAK,IAAI,EAAE,GAAG,QAAQ,OAAO,GAAI,SAAS,EAAE,SAAS,OAAO,IAAI,CAAC,EAAG;AAAA,EACnF;AACA,MAAI,IAAI,oBAAoB,mBAAoB,KAAI,kBAAkB;AACtE,SAAO;AACT;AAEO,IAAM,cAAN,MAAkB;AAAA,EACN;AAAA,EACA;AAAA,EAEjB,YAAY,OAA+B,CAAC,GAAG;AAC7C,SAAK,YAAY,KAAK,aAAa;AACnC,SAAK,aAAa,KAAK,KAAK,WAAW,aAAa;AAAA,EACtD;AAAA,EAEA,MAAM,OAA4B;AAChC,QAAI;AACF,YAAM,MAAM,MAAM,GAAG,SAAS,KAAK,YAAY,MAAM;AACrD,aAAO,UAAU,KAAK,MAAM,GAAG,CAAC;AAAA,IAClC,SAAS,GAAG;AACV,UAAK,EAA4B,SAAS,SAAU,QAAO,EAAE,MAAM,CAAC,EAAE;AACtE,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,QAAmC;AAC7C,UAAM,GAAG,MAAM,KAAK,WAAW,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAC/D,QAAI,QAAQ,aAAa,SAAS;AAChC,YAAM,GAAG,MAAM,KAAK,WAAW,GAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACtD;AACA,UAAM,GAAG,UAAU,KAAK,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,EAAE,MAAM,IAAM,CAAC;AAAA,EAC7F;AAAA,EAEA,MAAM,aAAuE;AAC3E,UAAM,IAAI,MAAM,KAAK,KAAK;AAC1B,UAAM,OAAO,EAAE;AACf,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,MAAM,EAAE,KAAK,IAAI;AACvB,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,EAAE,MAAM,QAAQ,IAAI;AAAA,EAC7B;AACF;;;AC9IO,IAAM,UAAU;AAChB,IAAM,WAAW;AACjB,IAAM,kBAAkB;AACxB,IAAM,WAAW;;;ACsCjB,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACrC,OAAO;AAAA,EAChB,YAAY,UAAU,8DAA8D;AAClF,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;AC7BO,SAAS,sBAAsB,MAAiC;AACrE,MAAI,YAAY,MAAM;AACpB,UAAM,SAAS,KAAK;AACpB,WAAO;AAAA,MACL,MAAM,UAAU,KAAK;AACnB,YAAI,QAAQ,IAAI,iBAAiB,UAAU,MAAM,EAAE;AACnD,eAAO;AAAA,MACT;AAAA,MACA,MAAM,QAAQ,KAAK;AACjB,cAAM,MAAM,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC;AAC5C,eAAO,MAAM,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,KAAK;AACvB,MAAI,eAAe,KAAK;AACxB,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,MAAM,KAAK,OAAO,KAAK;AAE7B,SAAO;AAAA,IACL,MAAM,UAAU,KAAK;AACnB,UAAI,QAAQ,IAAI,iBAAiB,UAAU,WAAW,EAAE;AACxD,aAAO;AAAA,IACT;AAAA,IACA,MAAM,QAAQ,KAAK;AACjB,YAAM,QAAQ,MAAM,UAAU,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,CAAC;AAC/D,UAAI,MAAM,WAAW,IAAK,QAAO;AAEjC,YAAM,aAAa,MAAM,UAAU,GAAG,KAAK,OAAO,qBAAqB;AAAA,QACrE,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,QAC/D,MAAM,IAAI,gBAAgB;AAAA,UACxB,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH,CAAC;AACD,UAAI,CAAC,WAAW,IAAI;AAClB,cAAM,IAAI,qBAAqB;AAAA,MACjC;AACA,YAAM,SAAU,MAAM,WAAW,KAAK;AAKtC,oBAAc,OAAO;AACrB,qBAAe,OAAO;AACtB,YAAM,KAAK,eAAe;AAAA,QACxB;AAAA,QACA;AAAA,QACA,WAAW,IAAI,IAAI,OAAO,aAAa;AAAA,MACzC,CAAC;AACD,aAAO,UAAU,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,CAAC;AAAA,IACpD;AAAA,EACF;AACF;;;ACjEA,IAAM,gBAAgB;AASf,SAAS,eACd,QACA,OAAqC,CAAC,GACrB;AACjB,QAAM,UAAU,OAAO;AACvB,MAAI,CAAC,WAAW,CAAC,OAAO,KAAK,OAAO,EAAG,OAAM,IAAI,MAAM,aAAa;AACpE,QAAM,MAAM,OAAO,KAAK,OAAO;AAC/B,QAAM,WAAW,IAAI,YAAY,CAAC;AAClC,QAAM,SAAS,OAAO,KAAK,QAAQ;AAEnC,MAAI;AACJ,QAAM,WAAW,KAAK;AACtB,MAAI,UAAU;AACZ,QAAI,CAAC,SAAS,QAAQ,GAAG;AACvB,YAAM,IAAI;AAAA,QACR,eAAe,QAAQ,aAAa,OAAO;AAAA,MAC7C;AAAA,IACF;AACA,YAAQ;AAAA,EACV,WAAW,IAAI,mBAAmB,SAAS,IAAI,eAAe,GAAG;AAC/D,YAAQ,IAAI;AAAA,EACd,WAAW,OAAO,WAAW,GAAG;AAC9B,YAAQ,OAAO,CAAC;AAAA,EAClB,WAAW,OAAO,WAAW,GAAG;AAC9B,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B,OAAO;AACL,UAAM,IAAI;AAAA,MACR,6BAA6B,OAAO;AAAA,IACtC;AAAA,EACF;AAEA,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,aAAa;AACtD,QAAM,QAAQ,SAAS,KAAK;AAC5B,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,aAAa;AACzC,MAAI,CAAC,MAAM,WAAW,EAAE,MAAM,gBAAgB,MAAM,gBAAgB;AAClE,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B;AACA,SAAO,EAAE,SAAS,SAAS,IAAI,UAAU,UAAU,IAAI,WAAW,OAAO,MAAM;AACjF;;;AC3CA,SAAS,iBACP,OACA,UAC0C;AAC1C,QAAM,EAAE,SAAS,SAAS,UAAU,OAAO,MAAM,IAAI;AACrD,MAAI,MAAM,SAAS;AACjB,WAAO,sBAAsB,EAAE,QAAQ,MAAM,QAAQ,CAAC;AAAA,EACxD;AACA,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO,sBAAsB;AAAA,IAC3B,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,SAAS;AAAA,IACT;AAAA,IACA,gBAAgB,OAAO,EAAE,aAAa,cAAc,UAAU,MAAM;AAClE,YAAM,MAAM,MAAM,MAAM,KAAK;AAC7B,YAAM,IAAI,IAAI,KAAK,OAAO,GAAG,WAAW,KAAK;AAC7C,UAAI,CAAC,EAAG;AACR,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,QAAE,0BAA0B;AAC5B,YAAM,MAAM,MAAM,GAAG;AAAA,IACvB;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,cAAc,OAAgC,CAAC,GAA0B;AAC7F,QAAM,QAAQ,KAAK,SAAS,IAAI,YAAY;AAC5C,QAAM,SAAS,MAAM,MAAM,KAAK;AAChC,QAAM,WAAW,eAAe,QAAQ,EAAE,iBAAiB,QAAQ,IAAI,aAAa,CAAC;AACrF,QAAM,cAAc,iBAAiB,OAAO,QAAQ;AAEpD,QAAM,YAAY;AAAA,IAChB,aAAa;AAAA,MACX,SAAS,SAAS;AAAA,MAClB,QAAQ,CAAC,OAA0B,SACjC,YAAY,QAAQ,IAAI,QAAQ,OAAsB,IAAI,CAAC;AAAA,IAC/D,CAAC;AAAA,EACH;AACA,SAAO,EAAE,YAAY,UAAU;AACjC;AAEA,eAAsB,gBAAgB,OAAgC,CAAC,GAAyB;AAC9F,QAAM,QAAQ,KAAK,SAAS,IAAI,YAAY;AAC5C,QAAM,SAAS,MAAM,MAAM,KAAK;AAChC,QAAM,WAAW,eAAe,QAAQ,EAAE,iBAAiB,QAAQ,IAAI,aAAa,CAAC;AACrF,QAAM,cAAc,iBAAiB,OAAO,QAAQ;AAEpD,QAAM,cAA4B,CAAC,OAAO,SACxC,YAAY,QAAQ,IAAI,QAAQ,OAAsB,IAAI,CAAC;AAC7D,SAAO,EAAE,OAAO,aAAa,SAAS,SAAS,QAAQ;AACzD;;;AC9DA,IAAM,MAAM;AAKZ,SAAS,gBAAyB;AAChC,MAAI,QAAQ,IAAI,SAAU,QAAO;AACjC,MAAI,QAAQ,IAAI,YAAa,QAAO;AACpC,SAAO,CAAC,CAAC,QAAQ,OAAO;AAC1B;AAEA,SAAS,KAAK,MAAc,GAAmB;AAC7C,MAAI,CAAC,cAAc,EAAG,QAAO;AAC7B,SAAO,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG;AACjC;AAEO,IAAM,MAAM,CAAC,MAAsB,KAAK,KAAK,CAAC;AAC9C,IAAM,OAAO,CAAC,MAAsB,KAAK,KAAK,CAAC;AAC/C,IAAM,QAAQ,CAAC,MAAsB,KAAK,MAAM,CAAC;AACjD,IAAM,SAAS,CAAC,MAAsB,KAAK,MAAM,CAAC;AAClD,IAAM,MAAM,CAAC,MAAsB,KAAK,MAAM,CAAC;AAC/C,IAAM,OAAO,CAAC,MAAsB,KAAK,MAAM,CAAC;AAChD,IAAM,OAAO,CAAC,MAAsB,KAAK,MAAM,CAAC;AAEhD,SAAS,SAAS,GAAW,OAAwB;AAC1D,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,MAAM,CAAC;AAAA,IAChB,KAAK;AACH,aAAO,OAAO,CAAC;AAAA,IACjB,KAAK;AACH,aAAO,IAAI,CAAC;AAAA,IACd,KAAK;AACH,aAAO,KAAK,CAAC;AAAA,IACf,KAAK;AACH,aAAO,KAAK,CAAC;AAAA,IACf,KAAK;AACH,aAAO,IAAI,CAAC;AAAA,IACd,KAAK;AACH,aAAO,KAAK,CAAC;AAAA,IACf;AACE,aAAO;AAAA,EACX;AACF;AAIA,IAAM,UAAU;AAGT,SAAS,aAAa,GAAmB;AAC9C,QAAM,WAAW,EAAE,QAAQ,SAAS,EAAE;AACtC,MAAI,IAAI;AACR,aAAW,MAAM,UAAU;AACzB,UAAM,OAAO,GAAG,YAAY,CAAC;AAG7B,QAAI,QAAQ,QAAU,QAAQ,KAAQ,MAAK;AAAA,aAClC,QAAQ,SAAU,QAAQ,MAAQ,MAAK;AAAA,aACvC,QAAQ,SAAU,QAAQ,MAAQ,MAAK;AAAA,aACvC,QAAQ,SAAU,QAAQ,MAAQ,MAAK;AAAA,aACvC,QAAQ,SAAU,QAAQ,MAAQ,MAAK;AAAA,aACvC,QAAQ,SAAU,QAAQ,MAAQ,MAAK;AAAA,QAC3C,MAAK;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,cAAc,GAAW,QAAwB;AACxD,QAAM,IAAI,aAAa,CAAC;AACxB,MAAI,KAAK,OAAQ,QAAO;AACxB,SAAO,IAAI,IAAI,OAAO,SAAS,CAAC;AAClC;AAMO,SAAS,SAAS,GAAW,MAAM,IAAY;AACpD,MAAI,aAAa,CAAC,KAAK,IAAK,QAAO;AAGnC,MAAI,MAAM;AACV,MAAI,IAAI;AACR,aAAW,MAAM,EAAE,QAAQ,SAAS,EAAE,GAAG;AACvC,UAAM,KAAK,aAAa,EAAE;AAC1B,QAAI,IAAI,KAAK,IAAI,IAAK;AACtB,WAAO;AACP,SAAK;AAAA,EACP;AACA,SAAO,MAAM;AACf;AAcO,SAAS,QAAQ,GAAmB;AACzC,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,KAAK,EAAE,QAAQ,GAAG;AACxB,QAAM,YAAY,MAAM,IAAI,KAAK,IAAI;AACrC,MAAI,EAAE,UAAU,UAAW,QAAO;AAClC,SAAO,EAAE,MAAM,GAAG,SAAS,IAAI,IAAI,EAAE,MAAM,SAAS,CAAC;AACvD;AAOO,SAAS,YAAY,GAAmB;AAC7C,UAAQ,GAAG;AAAA,IACT,KAAK;AACH,aAAO,KAAK,aAAQ;AAAA,IACtB,KAAK;AACH,aAAO,OAAO,oBAAe;AAAA,IAC/B,KAAK;AACH,aAAO,MAAM,aAAQ;AAAA,IACvB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI,YAAO,CAAC;AAAA,IACrB;AACE,aAAO;AAAA,EACX;AACF;AAOO,SAAS,UAAU,OAAwB;AAChD,MAAI,UAAU,KAAM,QAAO,IAAI,aAAQ;AACvC,MAAI,UAAU,MAAO,QAAO;AAC5B,SAAO,OAAO,KAAK;AACrB;AAQO,SAAS,aAAa,OAAgB,MAAc,KAAK,IAAI,GAAW;AAC7E,MAAI;AACJ,MAAI,OAAO,UAAU,UAAU;AAC7B,SAAK;AAAA,EACP,WAAW,OAAO,UAAU,UAAU;AAEpC,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,QAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,SAAK;AAAA,EACP,OAAO;AACL,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,QAAM,OAAO,KAAK;AAClB,QAAM,MAAM,KAAK,IAAI,IAAI;AACzB,QAAM,SAAS,OAAO;AAEtB,QAAM,SAAS,KAAK;AACpB,QAAM,OAAO,KAAK;AAClB,QAAM,MAAM,KAAK;AACjB,QAAM,OAAO,IAAI;AACjB,QAAM,QAAQ,KAAK;AAEnB,MAAI;AACJ,MAAI;AACJ,MAAI,MAAM,OAAQ,QAAO;AACzB,MAAI,MAAM,MAAM;AACd,aAAS,KAAK,MAAM,MAAM,MAAM;AAChC,WAAO;AAAA,EACT,WAAW,MAAM,KAAK;AACpB,aAAS,KAAK,MAAM,MAAM,IAAI;AAC9B,WAAO;AAAA,EACT,WAAW,MAAM,MAAM;AACrB,aAAS,KAAK,MAAM,MAAM,GAAG;AAC7B,WAAO;AAAA,EACT,WAAW,MAAM,OAAO;AACtB,aAAS,KAAK,MAAM,MAAM,IAAI;AAC9B,WAAO;AAAA,EACT,OAAO;AACL,aAAS,KAAK,MAAM,MAAM,KAAK;AAC/B,WAAO;AAAA,EACT;AACA,SAAO,SAAS,MAAM,MAAM,GAAG,IAAI,KAAK,GAAG,MAAM,GAAG,IAAI;AAC1D;AAcO,SAAS,YAAY,MAAc,OAAyB;AACjE,QAAM,QAAQ,QAAQ,IAAI,QAAQ;AAClC,QAAM,MAAgB,CAAC;AACvB,aAAW,QAAQ,KAAK,MAAM,IAAI,GAAG;AACnC,QAAI,KAAK,WAAW,GAAG;AACrB,UAAI,KAAK,EAAE;AACX;AAAA,IACF;AACA,QAAI,MAAM;AACV,aAAS,QAAQ,KAAK,MAAM,GAAG,GAAG;AAEhC,aAAO,aAAa,IAAI,IAAI,OAAO;AACjC,YAAI,OAAO;AACX,mBAAW,MAAM,MAAM;AACrB,cAAI,QAAQ,aAAa,OAAO,EAAE,IAAI,MAAO;AAC7C,kBAAQ;AACR,cAAI,aAAa,IAAI,KAAK,MAAO;AAAA,QACnC;AACA,YAAI,KAAK;AACP,cAAI,KAAK,GAAG;AACZ,gBAAM;AAAA,QACR;AACA,YAAI,KAAK,IAAI;AACb,eAAO,KAAK,MAAM,KAAK,MAAM;AAAA,MAC/B;AACA,YAAM,MAAM,MAAM,MAAM;AACxB,UAAI,OAAO,aAAa,MAAM,MAAM,IAAI,IAAI,OAAO;AACjD,YAAI,KAAK,GAAG;AACZ,cAAM;AAAA,MACR,OAAO;AACL,cAAM,MAAM,MAAM;AAAA,MACpB;AAAA,IACF;AACA,QAAI,IAAK,KAAI,KAAK,GAAG;AAAA,EACvB;AACA,SAAO;AACT;AASO,SAAS,MAAM,SAAmB,MAA0B;AACjE,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AACA,QAAM,SAAmB,QAAQ,IAAI,CAAC,GAAG,MAAM;AAC7C,QAAI,IAAI,aAAa,CAAC;AACtB,eAAW,KAAK,MAAM;AACpB,YAAM,OAAO,EAAE,CAAC,KAAK;AACrB,YAAM,KAAK,aAAa,IAAI;AAC5B,UAAI,KAAK,EAAG,KAAI;AAAA,IAClB;AACA,WAAO;AAAA,EACT,CAAC;AACD,QAAM,MAAM;AACZ,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,QAAQ,IAAI,CAAC,GAAG,MAAM,IAAI,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AACjF,aAAW,KAAK,MAAM;AACpB,UAAM,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,cAAc,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,EAC9E;AACA,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;;;AC9OA,IAAM,qBAA+C,CAAC;AAG/C,SAAS,iBAAiB,MAAc,UAA0B;AACvE,qBAAmB,IAAI,IAAI;AAC7B;AAEO,SAAS,OAAO,KAAoB,MAAqB;AAC9D,MAAI,SAAS,OAAW;AAMxB,MAAI,IAAI,SAAS,UAAU,OAAO;AAChC,UAAM,IAAI,OAAO,SAAS,WAAW,OAAO,OAAO,IAAI;AACvD,YAAQ,OAAO,MAAM,CAAC;AACtB,QAAI,CAAC,EAAE,SAAS,IAAI,EAAG,SAAQ,OAAO,MAAM,IAAI;AAChD;AAAA,EACF;AACA,MAAI,iBAAiB,GAAG;AACtB,YAAQ,OAAO,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AACzD;AAAA,EACF;AAGA,QAAM,SAAS,cAAc,MAAM,IAAI,SAAS,QAAQ;AACxD,QAAM,WAAW,mBAAmB,IAAI,IAAI;AAC5C,MAAI,UAAU;AACZ,aAAS,QAAQ,IAAI,OAAO;AAAA,EAC9B,OAAO;AACL,kBAAc,QAAQ,IAAI,OAAO;AAAA,EACnC;AAGA,yBAAuB,IAAI;AAC7B;AAEA,SAAS,uBAAuB,MAAqB;AACnD,MAAI,SAAS,QAAQ,OAAO,SAAS,SAAU;AAC/C,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,gBAAgB,YAAY,EAAE,YAAY,SAAS,GAAG;AACjE,YAAQ,OAAO,MAAM,IAAI,qDAA2C,EAAE,WAAW,EAAE,IAAI,IAAI;AAAA,EAC7F;AACA,QAAM,KAAK,OAAO,EAAE,OAAO,WAAW,EAAE,KAAK;AAC7C,MAAI,OAAO,EAAE,yBAAyB,YAAY,EAAE,qBAAqB,SAAS,GAAG;AACnF,YAAQ,OAAO,MAAM,IAAI,uDAA6C,EAAE,EAAE,IAAI,IAAI;AAAA,EACpF;AACA,MAAI,OAAO,EAAE,yBAAyB,YAAY,EAAE,qBAAqB,SAAS,GAAG;AACnF,YAAQ,OAAO,MAAM,IAAI,sDAA4C,EAAE,EAAE,IAAI,IAAI;AAAA,EACnF;AACF;AAEA,SAAS,cAAc,MAAe,UAAuC;AAC3E,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,SAAS,QAAQ,OAAO,SAAS,SAAU,QAAO;AACtD,QAAM,QAAS,KAAiC,QAAQ;AAGxD,SAAO,UAAU,SAAY,OAAO;AACtC;AAEA,SAAS,mBAA4B;AAGnC,MAAI,QAAQ,IAAI,gBAAgB,OAAQ,QAAO;AAC/C,MAAI,QAAQ,IAAI,gBAAgB,SAAU,QAAO;AAEjD,MAAI,CAAC,QAAQ,OAAO,OAAO;AAGzB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAIA,SAAS,YAAoB;AAC3B,QAAM,IAAI,QAAQ,OAAO;AACzB,SAAO,OAAO,MAAM,YAAY,IAAI,IAAI,IAAI;AAC9C;AAEA,SAAS,cAAc,MAAe,OAA2B;AAC/D,QAAM,QAAQ,OAAO,SAAS,YAAY,IAAI;AAC9C,MAAI,UAAU,QAAQ;AACpB,eAAW,MAAM,KAAK;AAAA,EACxB,WAAW,UAAU,UAAU;AAC7B,iBAAa,MAAM,KAAK;AAAA,EAC1B,OAAO;AACL,iBAAa,IAAI;AAAA,EACnB;AACF;AAEA,SAAS,YAAY,MAA6C;AAChE,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO;AAChC,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAI7C,UAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,UAAM,YAAY,KAAK,OAAO,CAAC,MAAM,MAAM,QAAS,KAAiC,CAAC,CAAC,CAAC;AACxF,QAAI,UAAU,WAAW,EAAG,QAAO;AACnC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAA0B;AAC9C,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO;AAChC,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,eAAW,KAAK,OAAO,OAAO,IAAI,GAAG;AACnC,UAAI,MAAM,QAAQ,CAAC,EAAG,QAAO;AAAA,IAC/B;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,WAAW,MAAe,OAA2B;AAC5D,QAAM,QAAQ,aAAa,IAAI;AAC/B,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,OAAO,MAAM,IAAI,QAAQ,OAAO,gBAAgB,WAAW,IAAI,IAAI;AAC3E;AAAA,EACF;AACA,QAAM,QAAQ,MAAM,CAAC;AACrB,QAAM,UAAU,YAAY,OAAO,OAAO,OAAO;AACjD,QAAM,SAAS,OAAO,UAAU,CAAC;AACjC,QAAM,UAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAClD,QAAM,OAAO,MAAM;AAAA,IAAI,CAAC,SACtB,QAAQ;AAAA,MAAI,CAAC,QACX,WAAY,KAAiC,GAAG,GAAG,OAAO,GAAG,GAAG,OAAO,eAAe,GAAG,CAAC;AAAA,IAC5F;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,MAAM,SAAS,IAAI,CAAC;AAC3C;AAEA,SAAS,YAAY,OAAgC,MAA2B;AAC9E,MAAI,QAAQ,KAAK,SAAS,EAAG,QAAO,KAAK,OAAO,CAAC,MAAM,KAAK,KAAK;AAGjE,QAAM,YAAY,CAAC,MAAM,QAAQ,SAAS,SAAS,UAAU,UAAU,YAAY;AACnF,QAAM,UAAU,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC;AAC1C,QAAM,UAAU;AAAA,IACd,GAAG,UAAU,OAAO,CAAC,MAAM,QAAQ,IAAI,CAAC,KAAK,SAAS,MAAM,CAAC,CAAC,CAAC;AAAA,IAC/D,GAAG,OAAO,KAAK,KAAK,EAAE;AAAA,MACpB,CAAC,MAAM,CAAC,UAAU,SAAS,CAAC,KAAK,SAAS,MAAM,CAAC,CAAC;AAAA,IACpD;AAAA,EACF;AACA,SAAO,QAAQ,MAAM,GAAG,CAAC;AAC3B;AAOO,SAAS,aAAa,MAAe,OAA2B;AACrE,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,iBAAa,IAAI;AACjB;AAAA,EACF;AAGA,MAAI,MAAM;AACV,QAAM,UAAU,OAAO,KAAK,GAAG;AAC/B,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,UAAU,QAAQ,CAAC;AACzB,UAAM,QAAQ,IAAI,OAAO;AACzB,QAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,YAAM;AAAA,IACR;AAAA,EACF;AACA,QAAM,SACJ,OAAO,QAAQ,OAAO,CAAC,MAAM,KAAK,GAAG,KACrC,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC,MAAM,SAAS,IAAI,CAAC,CAAC,CAAC;AACjD,MAAI,OAAO,WAAW,GAAG;AAGvB,YAAQ,OAAO,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,IAAI;AACxD;AAAA,EACF;AACA,QAAM,SAAS,OAAO,UAAU,CAAC;AAIjC,QAAM,cAAc,OAAO,SACvB,CAAC,IACD,OAAO,KAAK,GAAG,EAAE;AAAA,IACf,CAAC,MAAM,MAAM,QAAQ,IAAI,CAAC,CAAC,KAAM,IAAI,CAAC,EAAgB,SAAS;AAAA,EACjE;AAMJ,QAAM,YAAqC,OAAO,IAAI,CAAC,MAAM;AAAA,IAC3D;AAAA,IACA,WAAW,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,eAAe,CAAC,GAAG,EAAE,YAAY,KAAK,CAAC;AAAA,EAC9E,CAAC;AACD,QAAM,aAAa,KAAK;AAAA,IACtB,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM;AAAA,IAClC,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,IAClC;AAAA,EACF;AACA,QAAM,KAAK,UAAU;AACrB,QAAM,QAAQ,MAAM,IAAI,aAAa;AACrC,QAAM,cAAuC,CAAC;AAC9C,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,GAAG,KAAK,KAAK,WAAW;AAClC,QAAI,MAAM,SAAS,IAAI,KAAK,aAAa,KAAK,IAAI,OAAO;AACvD,aAAO,KAAK,CAAC,GAAG,KAAK,CAAC;AAAA,IACxB,OAAO;AACL,kBAAY,KAAK,CAAC,GAAG,KAAK,CAAC;AAAA,IAC7B;AAAA,EACF;AAEA,aAAW,CAAC,GAAG,KAAK,KAAK,aAAa;AACpC,YAAQ,OAAO,MAAM,KAAK,IAAI,EAAE,OAAO,UAAU,CAAC,CAAC,KAAK,KAAK;AAAA,CAAI;AAAA,EACnE;AACA,aAAW,KAAK,aAAa;AAC3B,UAAM,WAAW,MAAM,cAAc,MAAM;AAC3C,UAAM,MAAM,WAAW,OAAO,oBAAoB;AAClD,qBAAiB,GAAG,IAAI,CAAC,GAAgB,YAAY,GAAG;AAAA,EAC1D;AACA,QAAM,WAAW,YAAY,SAAS,KAAK,YAAY,SAAS;AAChE,SAAO,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,MAAM;AAChC,QAAI,YAAY,IAAI,EAAG,SAAQ,OAAO,MAAM,IAAI;AAChD,YAAQ,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,CAAI;AACpC,eAAW,QAAQ,YAAY,OAAO,KAAK,CAAC,GAAG;AAC7C,cAAQ,OAAO,MAAM,OAAO,IAAI;AAAA,CAAI;AAAA,IACtC;AAAA,EACF,CAAC;AACD,MAAI,OAAO,aAAa;AACtB,UAAM,QAAQ,IAAI,MAAM,WAAW;AACnC,QAAI,UAAU,QAAW;AACvB,cAAQ,OAAO,MAAM,IAAI;AACzB,cAAQ,OAAO,MAAM,SAAS,mEAA8D,QAAQ,IAAI,IAAI;AAC5G,cAAQ,OAAO,MAAM,IAAI;AACzB,cAAQ,OAAO,MAAM,8CAA8C;AACnE,cAAQ,OAAO,MAAM,sCAAsC,KAAK;AAAA,CAAI;AAAA,IACtE;AAAA,EACF;AACF;AAEA,IAAM,wBAAwB;AAE9B,SAAS,iBACP,MACA,OACA,YACA,MAAc,uBACR;AACN,QAAM,QAAQ,MAAM;AACpB,QAAM,SAAS,GAAG,KAAK,IAAI,UAAU,IAAI,SAAS,OAAO;AACzD,UAAQ,OAAO,MAAM,KAAK,IAAI,KAAK,OAAO,UAAU,CAAC,CAAC,KAAK,MAAM;AAAA,CAAI;AACrE,QAAM,QAAQ,MAAM,MAAM,GAAG,GAAG;AAChC,QAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,YAAQ,OAAO,MAAM,OAAO,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,gBAAgB,IAAI,CAAC;AAAA,CAAI;AAAA,EAC3E,CAAC;AACD,MAAI,QAAQ,MAAM,QAAQ;AACxB,YAAQ,OAAO,MAAM,OAAO,IAAI,WAAW,QAAQ,MAAM,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,EAC7E;AACF;AAEA,SAAS,gBAAgB,MAAuB;AAC9C,MAAI,SAAS,KAAM,QAAO,IAAI,MAAM;AACpC,MAAI,OAAO,SAAS,SAAU,QAAO,OAAO,IAAI;AAChD,QAAM,OAAO,eAAe,IAAI;AAChC,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,UAAU,kBAAkB,IAAI;AACtC,MAAI,YAAY,KAAM,QAAO;AAC7B,QAAM,WAAW,mBAAmB,IAAI;AACxC,MAAI,aAAa,KAAM,QAAO;AAC9B,SAAO,KAAK,UAAU,IAAI;AAC5B;AAOA,SAAS,eAAe,MAA8B;AACpD,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG,QAAO;AACrE,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,OAAO,YAAY,OAAO,IAAI,UAAU,SAAU,QAAO;AACxE,QAAM,KAAK,QAAQ,IAAI,EAAE;AACzB,QAAM,SAAS,OAAO,IAAI,WAAW,WAAW,YAAY,IAAI,MAAM,IAAI;AAC1E,SAAO,SAAS,GAAG,EAAE,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,GAAG,EAAE,KAAK,IAAI,KAAK;AACxE;AAQA,SAAS,kBAAkB,MAA8B;AACvD,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG,QAAO;AACrE,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,OAAO,YAAY,OAAO,IAAI,YAAY,SAAU,QAAO;AAC1E,QAAM,KAAK,QAAQ,IAAI,EAAE;AACzB,QAAM,OAAO,IAAI,eAAe,SAAY,GAAG,aAAa,IAAI,UAAU,CAAC,OAAO;AAClF,QAAM,UAAU,SAAS,IAAI,SAAS,EAAE;AACxC,SAAO,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO;AACjC;AAQA,SAAS,mBAAmB,MAA8B;AACxD,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG,QAAO;AACrE,QAAM,MAAM;AACZ,QAAM,QAAQ,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAC1D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OACJ,OAAO,IAAI,iBAAiB,YAAY,IAAI,aAAa,SAAS,IAC9D,IAAI,eACJ;AACN,SAAO,OAAO,GAAG,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK;AAChD;AAEA,SAAS,aAAa,MAAqB;AACzC,MAAI,SAAS,MAAM;AACjB,YAAQ,OAAO,MAAM,IAAI,MAAM,IAAI,IAAI;AACvC;AAAA,EACF;AACA,MAAI,OAAO,SAAS,WAAW;AAC7B,YAAQ,OAAO,OAAO,OAAO,MAAM,MAAM,IAAI,IAAI,OAAO,KAAK,IAAI;AACjE;AAAA,EACF;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,YAAQ,OAAO,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AACzD;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,OAAO,IAAI,IAAI,IAAI;AAC1C;AAEA,SAAS,SAAS,GAAqB;AACrC,SAAO,MAAM,QAAS,OAAO,MAAM,YAAY,OAAO,MAAM;AAC9D;AAEA,SAAS,WACP,OACA,KACA,UACA,MACQ;AACR,MAAI,QAAQ,iBAAiB,UAAU,UAAa,UAAU,MAAO,QAAO,IAAI,QAAG;AACnF,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,QAAQ,OAAO,KAAK,CAAC;AAAA,IAC9B,KAAK;AACH,aAAO,YAAY,OAAO,KAAK,CAAC;AAAA,IAClC,KAAK;AACH,aAAO,aAAa,KAAK;AAAA,IAC3B,KAAK;AAGH,aAAO,MAAM,aAAa,OAAO,KAAK,IAAI,SAAS,OAAO,KAAK,GAAG,EAAE;AAAA,IACtE,KAAK;AACH,aAAO,UAAU,KAAK;AAAA,IACxB,KAAK,cAAc;AACjB,YAAM,MAAM,YAAY,CAAC;AACzB,YAAM,MAAO,UAAU,QAAQ,UAAU,SAAa,SAAS,OAAO,KAAK;AAC3E,YAAM,QAAQ,IAAI,GAAG,KAAK,IAAI,GAAG;AACjC,UAAI,CAAC,OAAO;AACV,eAAO,UAAU,UAAa,UAAU,OAAO,IAAI,QAAG,IAAI,OAAO,KAAK;AAAA,MACxE;AACA,YAAM,QAAQ,MAAM,MAAM,QAAQ,WAAW,OAAO,KAAK,CAAC;AAC1D,aAAO,SAAS,OAAO,MAAM,KAAK;AAAA,IACpC;AAAA,IACA;AACE,UAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,aAAO,OAAO,KAAK;AAAA,EACvB;AACF;;;AlB9ZO,IAAM,sBAAsB,IAAI,QAAQ,QAAQ,EACpD,YAAY,4DAA4D,EACxE,SAAS,QAAQ,IAAI,EACrB,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAME,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,aAAa;AAAA,IAChC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,iBAAiB,SAAS,EAAC,SAAQ,UAAS,UAAS,CAAC,MAAK,QAAO,cAAa,YAAY,EAAC,EAAE,GAAG,OAAO,IAAI;AAC7H,CAAC;;;AmBxBH,SAAS,WAAAC,gBAAe;AAKjB,IAAM,mBAAmB,IAAIC,SAAQ,QAAQ,EACjD,YAAY,iDAAiD,EAC7D,OAAO,mBAAmB,oOAAqN,EAC/O,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,UAAU;AAAA,IAC7B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ,OAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,cAAc,SAAS,EAAC,SAAQ,UAAS,UAAS,CAAC,MAAK,SAAQ,WAAU,YAAY,GAAE,UAAS,EAAC,MAAK,YAAW,cAAa,gBAAe,GAAE,eAAc,UAAS,EAAE,GAAG,OAAO,IAAI;AACxM,CAAC;;;ACxBH,SAAS,WAAAC,gBAAe;AAKjB,IAAM,iBAAiB,IAAIC,SAAQ,IAAI,EAC3C,YAAY,sBAAsB,EAClC,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,QAASA,QAA8C;AAAA,EACzD,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,YAAY,SAAS,EAAC,SAAQ,QAAO,YAAW,QAAO,WAAU,CAAC,MAAK,SAAQ,UAAS,cAAa,cAAc,GAAE,UAAS,EAAC,MAAK,YAAW,cAAa,iBAAgB,gBAAe,gBAAe,GAAE,gBAAe,gBAAe,EAAE,GAAG,OAAO,IAAI;AAC3Q,CAAC;;;ACpBH,SAAS,WAAAC,gBAAe;AAKjB,IAAM,yBAAyB,IAAIC,SAAQ,QAAQ,EACvD,YAAY,mDAAmD,EAC/D,OAAO,mBAAmB,yDAAyD,EACnF,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,gBAAgB;AAAA,IACnC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ,OAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,qBAAqB,SAAS,EAAC,SAAQ,UAAS,UAAS,CAAC,MAAK,SAAQ,SAAQ,cAAa,YAAY,EAAC,EAAE,GAAG,OAAO,IAAI;AAC1I,CAAC;;;ACxBH,SAAS,WAAAC,gBAAe;AAKjB,IAAM,wBAAwB,IAAIC,SAAQ,SAAS,EACvD,YAAY,kDAAkD,EAC9D,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC,QAASA,QAA8C;AAAA,EACzD,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,oBAAoB,SAAS,EAAC,SAAQ,QAAO,YAAW,WAAU,WAAU,CAAC,MAAK,SAAQ,SAAQ,YAAY,GAAE,UAAS,EAAC,MAAK,YAAW,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACxM,CAAC;;;ACpBH,SAAS,WAAAC,gBAAe;AAKjB,IAAM,gBAAgB,IAAIC,SAAQ,MAAM,EAC5C,YAAY,2CAA2C,EACvD,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,OAAO;AAAA,IAC1B,QAASA,QAA8C;AAAA,EACzD,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,WAAW,SAAS,EAAC,SAAQ,UAAS,UAAS,CAAC,MAAK,QAAO,cAAa,YAAY,GAAE,UAAS,EAAC,MAAK,YAAW,QAAO,YAAW,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AAC9N,CAAC;;;ACpBH,SAAS,WAAAC,gBAAe;AAKjB,IAAM,mBAAmB,IAAIC,SAAQ,QAAQ,EACjD,YAAY,8CAA8C,EAC1D,OAAO,kBAAkB,0EAA0E,EACnG,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,UAAU;AAAA,IAC7B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ,MAAM,KAAK;AAAA,IACb;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,cAAc,SAAS,EAAC,SAAQ,UAAS,UAAS,CAAC,MAAK,QAAO,cAAa,YAAY,GAAE,UAAS,EAAC,MAAK,YAAW,QAAO,YAAW,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACjO,CAAC;;;ACxBH,SAAS,WAAAC,gBAAe;AAKjB,IAAM,mBAAmB,IAAIC,SAAQ,MAAM,EAC/C,YAAY,6CAA6C,EACzD,SAAS,QAAQ,IAAI,EACrB,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,UAAU;AAAA,IAC7B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,cAAc,SAAS,OAAU,GAAG,OAAO,IAAI;AAChE,CAAC;;;ACxBH,SAAS,WAAAC,gBAAe;AAKjB,IAAM,gBAAgB,IAAIC,SAAQ,IAAI,EAC1C,YAAY,+CAA+C,EAC3D,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,OAAO;AAAA,IAC1B,QAASA,QAA8C;AAAA,EACzD,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,WAAW,SAAS,EAAC,SAAQ,UAAS,UAAS,CAAC,WAAU,SAAQ,gBAAe,YAAY,GAAE,UAAS,EAAC,WAAU,YAAW,cAAa,WAAU,EAAC,EAAE,GAAG,OAAO,IAAI;AACvL,CAAC;;;ACpBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,qBAAqB,IAAIC,UAAQ,SAAS,EACpD,YAAY,0DAA0D,EACtE,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,QAASA,QAA8C;AAAA,EACzD,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,gBAAgB,SAAS,EAAC,SAAQ,QAAO,YAAW,WAAU,WAAU,CAAC,MAAK,YAAW,iBAAgB,SAAQ,YAAY,GAAE,UAAS,EAAC,MAAK,YAAW,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACvN,CAAC;;;ACpBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,wBAAwB,IAAIC,UAAQ,SAAS,EACvD,YAAY,uDAAuD,EACnE,OAAO,oBAAoB,iIAAiI,EAC5J,OAAO,mBAAmB,iEAAiE,EAC3F,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC,QAASA,QAA8C;AAAA,IACvD,OAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,oBAAoB,SAAS,EAAC,SAAQ,QAAO,YAAW,WAAU,WAAU,CAAC,WAAU,SAAQ,gBAAe,WAAW,GAAE,UAAS,EAAC,WAAU,YAAW,aAAY,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACvN,CAAC;;;AC1BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,sBAAsB,IAAIC,UAAQ,QAAQ,EACpD,YAAY,kBAAkB,EAC9B,SAAS,QAAQ,IAAI,EACrB,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,aAAa;AAAA,IAChC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,iBAAiB,SAAS,OAAU,GAAG,OAAO,IAAI;AACnE,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,mBAAmB,IAAIC,UAAQ,IAAI,EAC7C,YAAY,wBAAwB,EACpC,SAAS,QAAQ,IAAI,EACrB,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,UAAU;AAAA,IAC7B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,cAAc,SAAS,OAAU,GAAG,OAAO,IAAI;AAChE,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,mBAAmB,IAAIC,UAAQ,MAAM,EAC/C,YAAY,kCAAkC,EAC9C,SAAS,QAAQ,IAAI,EACrB,OAAO,mBAAmB,oEAA+D,EACzF,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,UAAU;AAAA,IAC7B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,OAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,cAAc,SAAS,OAAU,GAAG,OAAO,IAAI;AAChE,CAAC;;;AC5BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,yBAAyB,IAAIC,UAAQ,QAAQ,EACvD,YAAY,yBAAyB,EACrC,SAAS,QAAQ,IAAI,EACrB,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,gBAAgB;AAAA,IACnC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,qBAAqB,SAAS,OAAU,GAAG,OAAO,IAAI;AACvE,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;;;ACDxB,YAAY,YAAY;AACxB,SAAS,gBAAgB;AAElB,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,gBACd,MACA,MAA0C,QAAQ,KAC1C;AACR,SAAO,QAAQ,IAAI,WAAW,KAAK,eAAe,EAAE,gBAAgB,EAAE;AACxE;AAEA,IAAM,aAAa;AAEZ,SAAS,eAAe,OAAe,MAAwB;AAIpE,MAAI,WAAW,KAAK,KAAK,GAAG;AAC1B,UAAM,MAAM,SAAS,QAAQ,OAAO,EAAE,SAAS,KAAK,CAAC;AACrD,QAAI,IAAI,QAAS,QAAO;AAAA,EAC1B;AAEA,QAAM,YAAY,SAAS,IAAI,EAAE,QAAQ,IAAI;AAC7C,QAAM,UAAU,IAAI;AAAA,IAClB,UAAU;AAAA,IACV,UAAU,QAAQ;AAAA,IAClB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AACA,QAAM,QAAe,aAAM,OAAO,SAAS,EAAE,aAAa,KAAK,CAAC,EAAE,CAAC,GAAG;AACtE,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,uBAAuB,KAAK;AAAA,IAC9B;AAAA,EACF;AACA,SAAO,SAAS;AAAA,IACd;AAAA,MACE,MAAM,MAAM,IAAI,MAAM,KAAK,UAAU;AAAA,MACrC,OAAO,MAAM,IAAI,OAAO,KAAK,UAAU;AAAA,MACvC,KAAK,MAAM,IAAI,KAAK,KAAK,UAAU;AAAA,MACnC,MAAM,MAAM,IAAI,MAAM,KAAK;AAAA,MAC3B,QAAQ,MAAM,IAAI,QAAQ,KAAK;AAAA,MAC/B,QAAQ,MAAM,IAAI,QAAQ,KAAK;AAAA,IACjC;AAAA,IACA,EAAE,KAAK;AAAA,EACT;AACF;;;ACvDA,SAAS,YAAAC,iBAAgB;AAEzB,IAAM,WAAW;AAEV,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,cAAc,OAAuB;AACnD,MAAI,CAAC,SAAS,KAAK,KAAK,GAAG;AACzB,UAAM,IAAI;AAAA,MACR,uBAAuB,KAAK;AAAA,IAC9B;AAAA,EACF;AACA,QAAM,KAAKA,UAAS,QAAQ,KAAK;AACjC,MAAI,CAAC,GAAG,SAAS;AACf,UAAM,IAAI,eAAe,kBAAkB,KAAK,IAAI;AAAA,EACtD;AACA,SAAO;AACT;AAEO,SAAS,wBAAwB,MAAsB;AAC5D,SAAOA,UAAS,QAAQ,cAAc,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU;AAC3E;;;ACrBO,SAAS,cAAc,OAAyB;AACrD,QAAM,QAAQ,MAAM,MAAM,mBAAmB;AAC7C,MAAI,OAAO;AACT,UAAM,eAAe,MAAM,CAAC,EAAG,KAAK;AACpC,UAAM,QAAQ,MAAM,CAAC,EAAG,KAAK;AAC7B,WAAO,eAAe,EAAE,OAAO,aAAa,IAAI,EAAE,MAAM;AAAA,EAC1D;AACA,SAAO,EAAE,OAAO,MAAM,KAAK,EAAE;AAC/B;;;AHJO,IAAM,qBAAqB,IAAIC,UAAQ,KAAK,EAChD,YAAY,2BAA2B,EACvC,SAAS,WAAW,OAAO,EAC3B,OAAO,yBAAyB,8PAAyP,EACzR,OAAO,mBAAmB,ycAAyc,EACne,OAAO,iBAAiB,ycAAyc,EACje,OAAO,0BAA0B,sGAAiG,EAClI,OAAO,qBAAqB,+HAA+H,EAC3J,OAAO,oBAAoB,gWAAgW,EAC3X,OAAO,sBAAsB,6LAA6L,CAAC,KAAa,SAAmB;AAAE,OAAK,KAAK,GAAG;AAAG,SAAO;AAAK,GAAG,CAAC,CAAa,EAC1S,OAAO,aAAa,SAAS,EAC7B,OAAO,eAAe,yCAAyC,EAC/D,OAAO,OAAO,OAAO,SAAS;AAC7B,QAAM,OAAO,gBAAgB,KAAK,EAAwB;AAC1D,MAAI;AACJ,MAAI,KAAK,UAAU,QAAW;AAC5B,QAAI,KAAK,QAAQ;AACf,mBAAa,cAAc,KAAK,KAAe;AAAA,IACjD,OAAO;AACL,mBAAa,eAAe,KAAK,OAAiB,IAAI,EAAE,MAAM,KAAK;AAAA,IACrE;AAAA,EACF;AACA,MAAI;AACJ,MAAI,KAAK,QAAQ,QAAW;AAC1B,QAAI,KAAK,QAAQ;AACf,iBAAW,wBAAwB,KAAK,GAAa;AAAA,IACvD,OAAO;AACL,iBAAW,eAAe,KAAK,KAAe,IAAI,EAAE,MAAM,KAAK;AAAA,IACjE;AAAA,EACF;AACA,QAAM,cAAc,KAAK;AACzB,QAAM,YAAY,YAAY,SAAS,IAAI,YAAY,IAAI,aAAa,IAAI;AAC5E,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,OAAO;AAAA,MACP,KAAK;AAAA,MACL,UAAU,KAAK;AAAA,MACf,KAAK,KAAK;AAAA,MACV,QAAQ,KAAK;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,gBAAgB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,UAAS,gBAAe,SAAQ,iBAAgB,OAAM,iBAAgB,cAAa,iBAAgB,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACxR,CAAC;;;AI9DH,SAAS,WAAAC,iBAAe;AAMjB,IAAM,mBAAmB,IAAIC,UAAQ,IAAI,EAC7C,YAAY,sBAAsB,EAClC,OAAO,eAAe,iGAAiG,EACvH,OAAO,kBAAkB,qMAAqM,EAC9N,OAAO,gBAAgB,6CAA6C,EACpE,OAAO,sBAAsB,2CAA2C,EACxE,OAAO,oBAAoB,2CAA2C,EACtE,OAAO,oBAAoB,4EAA4E,EACvG,OAAO,mBAAmB,uFAAuF,EACjH,OAAO,6BAA6B,4DAA4D,EAChG,OAAO,0BAA0B,wNAAmN,EACpP,OAAO,eAAe,yCAAyC,EAC/D,OAAO,OAAO,SAAS;AACtB,QAAM,OAAO,gBAAgB,KAAK,EAAwB;AAC1D,MAAI;AACJ,MAAI,KAAK,SAAS,QAAW;AAC3B,gBAAY,eAAe,KAAK,MAAgB,IAAI,EAAE,MAAM,KAAK;AAAA,EACnE;AACA,MAAI;AACJ,MAAI,KAAK,OAAO,QAAW;AACzB,cAAU,eAAe,KAAK,IAAc,IAAI,EAAE,MAAM,KAAK;AAAA,EAC/D;AACA,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,UAAU;AAAA,IAC7B,QAASA,QAA8C;AAAA,IACvD,OAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,iBAAiB,KAAK;AAAA,MACtB,cAAc,KAAK;AAAA,IACrB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,cAAc,SAAS,EAAC,SAAQ,QAAO,WAAU,CAAC,MAAK,UAAS,SAAQ,SAAQ,KAAK,GAAE,UAAS,EAAC,MAAK,YAAW,UAAS,gBAAe,SAAQ,YAAW,SAAQ,iBAAgB,OAAM,gBAAe,GAAE,gBAAe,YAAW,EAAE,GAAG,OAAO,IAAI;AACtQ,CAAC;;;ACnDH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,qBAAqB,IAAIC,UAAQ,IAAI,EAC/C,YAAY,8BAA8B,EAC1C,SAAS,QAAQ,IAAI,EACrB,OAAO,8BAA8B,oLAAoL,EACzN,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,kBAAkB,KAAK;AAAA,IACzB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,gBAAgB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACnI,CAAC;;;AC5BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,kBAAkB,IAAIC,UAAQ,MAAM,EAC9C,YAAY,4BAA4B,EACxC,SAAS,QAAQ,IAAI,EACrB,OAAO,6BAA6B,kFAAkF,EACtH,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,SAAS;AAAA,IAC5B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,iBAAiB,KAAK;AAAA,IACxB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,aAAa,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,UAAS,gBAAe,SAAQ,iBAAgB,OAAM,iBAAgB,cAAa,iBAAgB,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACrR,CAAC;;;AC5BH,SAAS,WAAAC,iBAAe;AAQjB,IAAM,qBAAqB,IAAIC,UAAQ,KAAK,EAChD,YAAY,yBAAyB,EACrC,SAAS,QAAQ,IAAI,EACrB,OAAO,8BAA8B,iRAAiR,EACtT,OAAO,mBAAmB,2CAA2C,EACrE,OAAO,yBAAyB,mJAAmJ,EACnL,OAAO,mBAAmB,ycAAyc,EACne,OAAO,iBAAiB,ycAAyc,EACje,OAAO,0BAA0B,uEAAuE,EACxG,OAAO,qBAAqB,2EAA2E,EACvG,OAAO,oBAAoB,gWAAgW,EAC3X,OAAO,sBAAsB,0NAA0N,CAAC,KAAa,SAAmB;AAAE,OAAK,KAAK,GAAG;AAAG,SAAO;AAAK,GAAG,CAAC,CAAa,EACvU,OAAO,aAAa,SAAS,EAC7B,OAAO,eAAe,yCAAyC,EAC/D,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAM,OAAO,gBAAgB,KAAK,EAAwB;AAC1D,MAAI;AACJ,MAAI,KAAK,UAAU,QAAW;AAC5B,QAAI,KAAK,QAAQ;AACf,mBAAa,cAAc,KAAK,KAAe;AAAA,IACjD,OAAO;AACL,mBAAa,eAAe,KAAK,OAAiB,IAAI,EAAE,MAAM,KAAK;AAAA,IACrE;AAAA,EACF;AACA,MAAI;AACJ,MAAI,KAAK,QAAQ,QAAW;AAC1B,QAAI,KAAK,QAAQ;AACf,iBAAW,wBAAwB,KAAK,GAAa;AAAA,IACvD,OAAO;AACL,iBAAW,eAAe,KAAK,KAAe,IAAI,EAAE,MAAM,KAAK;AAAA,IACjE;AAAA,EACF;AACA,QAAM,cAAc,KAAK;AACzB,QAAM,YAAY,YAAY,SAAS,IAAI,YAAY,IAAI,aAAa,IAAI;AAC5E,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,kBAAkB,KAAK;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,OAAO;AAAA,MACP,KAAK;AAAA,MACL,UAAU,KAAK;AAAA,MACf,KAAK,KAAK;AAAA,MACV,QAAQ,KAAK;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,gBAAgB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,UAAS,gBAAe,SAAQ,iBAAgB,OAAM,iBAAgB,cAAa,iBAAgB,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACxR,CAAC;;;ACpEH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,0BAA0B,IAAIC,UAAQ,KAAK,EACrD,YAAY,0BAA0B,EACtC,SAAS,QAAQ,IAAI,EACrB,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,iBAAiB;AAAA,IACpC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ,UAAU,GAAG,EAAE;AAAA,IACjB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,sBAAsB,SAAS,EAAC,SAAQ,MAAK,EAAE,GAAG,OAAO,IAAI;AAC9E,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,0BAA0B,IAAIC,UAAQ,KAAK,EACrD,YAAY,0BAA0B,EACtC,SAAS,WAAW,OAAO,EAC3B,OAAO,OAAO,OAAO,SAAS;AAC7B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,iBAAiB;AAAA,IACpC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,sBAAsB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AAC3L,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,wBAAwB,IAAIC,UAAQ,IAAI,EAClD,YAAY,2BAA2B,EACvC,OAAO,6BAA6B,+GAA+G,EACnJ,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC,QAASA,QAA8C;AAAA,IACvD,OAAO;AAAA,MACL,iBAAiB,KAAK;AAAA,IACxB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,oBAAoB,SAAS,EAAC,SAAQ,QAAO,WAAU,CAAC,MAAK,SAAQ,SAAQ,YAAY,GAAE,UAAS,EAAC,MAAK,YAAW,SAAQ,YAAW,cAAa,gBAAe,GAAE,gBAAe,aAAY,EAAE,GAAG,OAAO,IAAI;AAClO,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,2BAA2B,IAAIC,UAAQ,KAAK,EACtD,YAAY,gCAAgC,EAC5C,SAAS,YAAY,QAAQ,EAC7B,OAAO,OAAO,QAAQ,SAAS;AAC9B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,uBAAuB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,cAAa,iBAAgB,cAAa,iBAAgB,eAAc,gBAAe,GAAE,YAAW,SAAQ,EAAE,GAAG,OAAO,IAAI;AACzM,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,yBAAyB,IAAIC,UAAQ,IAAI,EACnD,YAAY,4BAA4B,EACxC,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,gBAAgB;AAAA,IACnC,QAASA,QAA8C;AAAA,EACzD,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,qBAAqB,SAAS,EAAC,SAAQ,QAAO,WAAU,CAAC,UAAS,UAAS,kBAAiB,oBAAmB,YAAY,GAAE,UAAS,EAAC,cAAa,iBAAgB,eAAc,gBAAe,GAAE,gBAAe,cAAa,YAAW,UAAS,EAAE,GAAG,OAAO,IAAI;AACpR,CAAC;;;ACpBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,0BAA0B,IAAIC,UAAQ,IAAI,EACpD,YAAY,sBAAsB,EAClC,SAAS,WAAW,OAAO,EAC3B,OAAO,OAAO,OAAO,SAAS;AAC7B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,iBAAiB;AAAA,IACpC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,sBAAsB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AAC3L,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,qBAAqB,IAAIC,UAAQ,IAAI,EAC/C,YAAY,4BAA4B,EACxC,SAAS,WAAW,IAAI,EACxB,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAM,QAAQ;AACd,QAAM,MAAM,MAAM,SAAS,IAAI,QAAQ;AACvC,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,gBAAgB,SAAS,EAAC,SAAQ,UAAS,UAAS,CAAC,EAAC,EAAE,GAAG,OAAO,IAAI;AACvF,CAAC;;;AC1BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,wBAAwB,IAAIC,UAAQ,MAAM,EACpD,YAAY,8BAA8B,EAC1C,SAAS,YAAY,QAAQ,EAC7B,OAAO,OAAO,QAAQ,SAAS;AAC9B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,oBAAoB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,cAAa,iBAAgB,cAAa,iBAAgB,eAAc,gBAAe,GAAE,YAAW,SAAQ,EAAE,GAAG,OAAO,IAAI;AACtM,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,kBAAkB,IAAIC,UAAQ,MAAM,EAC9C,YAAY,4BAA4B,EACxC,SAAS,QAAQ,IAAI,EACrB,OAAO,0BAA0B,6IAA6I,EAC9K,OAAO,6BAA6B,4GAA4G,EAChJ,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,SAAS;AAAA,IAC5B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,cAAc,KAAK;AAAA,MACnB,iBAAiB,KAAK;AAAA,IACxB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,aAAa,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,UAAS,YAAW,WAAU,YAAW,eAAc,iBAAgB,cAAa,iBAAgB,WAAU,iBAAgB,cAAa,iBAAgB,WAAU,aAAY,GAAE,YAAW,QAAO,EAAE,GAAG,OAAO,IAAI;AACxS,CAAC;;;AC9BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,mBAAmB,IAAIC,UAAQ,IAAI,EAC7C,YAAY,qBAAqB,EACjC,OAAO,mBAAmB,qEAAqE,EAC/F,OAAO,yBAAyB,uEAAuE,EACvG,OAAO,yBAAyB,uDAAuD,EACvF,OAAO,mBAAmB,6GAAwG,EAClI,OAAO,oBAAoB,4EAA4E,EACvG,OAAO,6BAA6B,oEAAoE,EACxG,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,UAAU;AAAA,IAC7B,QAASA,QAA8C;AAAA,IACvD,OAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,aAAa,KAAK;AAAA,MAClB,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,iBAAiB,KAAK;AAAA,IACxB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,cAAc,SAAS,EAAC,SAAQ,QAAO,WAAU,CAAC,MAAK,aAAY,WAAU,WAAU,aAAa,GAAE,UAAS,EAAC,MAAK,YAAW,aAAY,YAAW,WAAU,YAAW,WAAU,cAAa,eAAc,gBAAe,GAAE,gBAAe,YAAW,EAAE,GAAG,OAAO,IAAI;AAC7R,CAAC;;;AClCH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,uBAAuB,IAAIC,UAAQ,MAAM,EACnD,YAAY,6BAA6B,EACzC,SAAS,WAAW,IAAI,EACxB,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAM,QAAQ;AACd,QAAM,MAAM,MAAM,SAAS,IAAI,QAAQ;AACvC,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,cAAc;AAAA,IACjC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,mBAAmB,SAAS,EAAC,SAAQ,UAAS,UAAS,CAAC,EAAC,EAAE,GAAG,OAAO,IAAI;AAC1F,CAAC;;;AC1BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,yBAAyB,IAAIC,UAAQ,QAAQ,EACvD,YAAY,+BAA+B,EAC3C,SAAS,WAAW,IAAI,EACxB,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAM,QAAQ;AACd,QAAM,MAAM,MAAM,SAAS,IAAI,QAAQ;AACvC,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,gBAAgB;AAAA,IACnC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,qBAAqB,SAAS,EAAC,SAAQ,UAAS,UAAS,CAAC,EAAC,EAAE,GAAG,OAAO,IAAI;AAC5F,CAAC;;;AC1BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,2BAA2B,IAAIC,UAAQ,QAAQ,EACzD,YAAY,0CAA0C,EACtD,SAAS,YAAY,QAAQ,EAC7B,OAAO,OAAO,QAAQ,SAAS;AAC9B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,uBAAuB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,cAAa,iBAAgB,cAAa,iBAAgB,eAAc,gBAAe,GAAE,YAAW,SAAQ,EAAE,GAAG,OAAO,IAAI;AACzM,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,0BAA0B,IAAIC,UAAQ,IAAI,EACpD,YAAY,yBAAyB,EACrC,SAAS,eAAe,WAAW,EACnC,OAAO,OAAO,WAAW,SAAS;AACjC,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,iBAAiB;AAAA,IACpC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,sBAAsB,SAAS,OAAU,GAAG,OAAO,IAAI;AACxE,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,uBAAuB,IAAIC,UAAQ,KAAK,EAClD,YAAY,qCAAqC,EACjD,OAAO,uBAAuB,gOAA2N,EACzP,OAAO,iCAAiC,gNAAsM,EAC9O,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,cAAc;AAAA,IACjC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ,QAAQ;AAAA,QACN,WAAW,KAAK;AAAA,QAChB,qBAAqB,KAAK;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,mBAAmB,SAAS,EAAC,SAAQ,UAAS,UAAS,CAAC,aAAY,qBAAqB,GAAE,UAAS,EAAC,aAAY,WAAU,EAAC,EAAE,GAAG,OAAO,IAAI;AAC7J,CAAC;;;AC5BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,uBAAuB,IAAIC,UAAQ,MAAM,EACnD,YAAY,mCAAmC,EAC/C,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,cAAc;AAAA,IACjC,QAASA,QAA8C;AAAA,EACzD,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,mBAAmB,SAAS,EAAC,SAAQ,QAAO,YAAW,WAAU,WAAU,CAAC,aAAY,uBAAsB,gBAAe,kBAAkB,GAAE,UAAS,EAAC,aAAY,YAAW,gBAAe,iBAAgB,oBAAmB,aAAY,GAAE,gBAAe,EAAC,oBAAmB,EAAC,MAAK,EAAC,SAAQ,aAAO,SAAQ,QAAO,GAAE,KAAI,EAAC,SAAQ,kBAAY,SAAQ,MAAK,GAAE,QAAO,EAAC,SAAQ,UAAI,SAAQ,MAAK,EAAC,EAAC,GAAE,gBAAe,kCAAiC,EAAE,GAAG,OAAO,IAAI;AAC1d,CAAC;;;ACpBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,kBAAkB,IAAIC,UAAQ,MAAM,EAC9C,YAAY,+BAA+B,EAC3C,OAAO,uBAAuB,yKAAyK,EACvM,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,SAAS;AAAA,IAC5B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ,WAAW,KAAK;AAAA,IAClB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,aAAa,SAAS,EAAC,SAAQ,UAAS,UAAS,CAAC,MAAK,UAAS,UAAS,YAAY,GAAE,UAAS,EAAC,MAAK,aAAY,EAAC,EAAE,GAAG,OAAO,IAAI;AAClJ,MAAI,OAAO,MAAM,OAAO,OAAO;AAC7B,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;;;AC3BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,2BAA2B,IAAIC,UAAQ,KAAK,EACtD,YAAY,yBAAyB,EACrC,SAAS,QAAQ,IAAI,EACrB,SAAS,aAAa,SAAS,EAC/B,OAAO,OAAO,IAAI,SAAS,SAAS;AACnC,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,uBAAuB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,WAAU,YAAW,cAAa,iBAAgB,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AAC9O,CAAC;;;AC5BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,yBAAyB,IAAIC,UAAQ,IAAI,EACnD,YAAY,yBAAyB,EACrC,SAAS,QAAQ,IAAI,EACrB,OAAO,mBAAmB,OAAO,EACjC,OAAO,6BAA6B,iBAAiB,EACrD,OAAO,mBAAmB,sEAAsE,EAChG,OAAO,oBAAoB,4EAA4E,EACvG,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,gBAAgB;AAAA,IACnC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,iBAAiB,KAAK;AAAA,MACtB,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,IACf;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,qBAAqB,SAAS,EAAC,SAAQ,QAAO,WAAU,CAAC,MAAK,WAAU,YAAY,GAAE,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,cAAa,gBAAe,GAAE,gBAAe,cAAa,EAAE,GAAG,OAAO,IAAI;AAChO,CAAC;;;AClCH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,uBAAuB,IAAIC,UAAQ,KAAK,EAClD,YAAY,kBAAkB,EAC9B,SAAS,UAAU,MAAM,EACzB,OAAO,kCAAkC,sBAAsB,EAC/D,OAAO,OAAO,MAAM,SAAS;AAC5B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,cAAc;AAAA,IACjC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,MACA,sBAAsB,KAAK;AAAA,IAC7B;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,kBAAkB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,UAAS,YAAW,mBAAkB,YAAW,wBAAuB,YAAW,QAAO,YAAW,cAAa,iBAAgB,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACpS,CAAC;;;AC1BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,qBAAqB,IAAIC,UAAQ,IAAI,EAC/C,YAAY,eAAe,EAC3B,OAAO,6BAA6B,iEAAiE,EACrG,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,QAASA,QAA8C;AAAA,IACvD,OAAO;AAAA,MACL,iBAAiB,KAAK;AAAA,IACxB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,gBAAgB,SAAS,EAAC,SAAQ,QAAO,WAAU,CAAC,MAAK,QAAO,sBAAsB,GAAE,UAAS,EAAC,MAAK,YAAW,QAAO,YAAW,wBAAuB,WAAU,GAAE,gBAAe,cAAa,EAAE,GAAG,OAAO,IAAI;AACpO,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,8BAA8B,IAAIC,UAAQ,KAAK,EACzD,YAAY,8BAA8B,EAC1C,SAAS,WAAW,OAAO,EAC3B,OAAO,mBAAmB,OAAO,EACjC,OAAO,qBAAqB,SAAS,EACrC,OAAO,yBAAyB,aAAa,EAC7C,OAAO,uBAAuB,WAAW,EACzC,OAAO,yBAAyB,6IAA6I,EAC7K,OAAO,sBAAsB,SAAS,EACtC,OAAO,OAAO,OAAO,SAAS;AAC7B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,qBAAqB;AAAA,IACxC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,0BAA0B,SAAS,OAAU,GAAG,OAAO,IAAI;AAC5E,CAAC;;;ACpCH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,4BAA4B,IAAIC,UAAQ,IAAI,EACtD,YAAY,2BAA2B,EACvC,OAAO,wBAAwB,yGAAyG,EACxI,OAAO,qBAAqB,SAAS,EACrC,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,mBAAmB;AAAA,IACtC,QAASA,QAA8C;AAAA,IACvD,OAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,wBAAwB,SAAS,EAAC,SAAQ,QAAO,WAAU,CAAC,MAAK,SAAQ,WAAU,SAAS,GAAE,UAAS,EAAC,MAAK,YAAW,SAAQ,YAAW,WAAU,WAAU,GAAE,gBAAe,sBAAqB,EAAE,GAAG,OAAO,IAAI;AACtO,CAAC;;;AC1BH,SAAS,WAAAC,iBAAe;;;ACQjB,SAAS,eAA4B,KAAyB,MAA6B;AAChG,MAAI,QAAQ,OAAW,QAAO;AAC9B,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,YAAQ,OAAO,MAAM,sBAAsB,IAAI,KAAK,GAAG;AAAA,CAAI;AAC3D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ADVO,IAAM,oBAAoB,IAAIC,UAAQ,KAAK,EAC/C,YAAY,eAAe,EAC3B,SAAS,WAAW,OAAO,EAC3B,OAAO,yBAAyB,+FAA+F,EAC/H,OAAO,yBAAyB,uNAAuN,EACvP,OAAO,uBAAuB,0dAA0d,EACxf,OAAO,oBAAoB,oHAAoH,EAC/I,OAAO,oBAAoB,oPAAsP,EACjR,OAAO,qBAAqB,6NAA6N,EACzP,OAAO,2BAA2B,wdAAwd,EAC1f,OAAO,OAAO,OAAO,SAAS;AAC7B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,WAAW;AAAA,IAC9B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,MACA,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,eAAe,eAAe,KAAK,cAAc,eAAe;AAAA,IAClE;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,eAAe,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,cAAa,YAAW,aAAY,YAAW,WAAU,YAAW,UAAS,gBAAe,UAAS,iBAAgB,cAAa,iBAAgB,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACtU,CAAC;;;AEvCH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,kBAAkB,IAAIC,UAAQ,IAAI,EAC5C,YAAY,yBAAyB,EACrC,OAAO,yBAAyB,yGAAyG,EACzI,OAAO,qBAAqB,SAAS,EACrC,OAAO,uBAAuB,WAAW,EACzC,OAAO,wBAAwB,QAAQ,EACvC,OAAO,6BAA6B,iBAAiB,EACrD,OAAO,+BAA+B,mBAAmB,EACzD,OAAO,uBAAuB,WAAW,EACzC,OAAO,wBAAwB,YAAY,EAC3C,OAAO,qBAAqB,SAAS,EACrC,OAAO,qBAAqB,SAAS,EACrC,OAAO,mBAAmB,OAAO,EACjC,OAAO,mCAAmC,uBAAuB,EACjE,OAAO,mBAAmB,mEAAmE,EAC7F,OAAO,oBAAoB,4EAA4E,EACvG,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,SAAS;AAAA,IAC5B,QAASA,QAA8C;AAAA,IACvD,OAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,iBAAiB,KAAK;AAAA,MACtB,mBAAmB,KAAK;AAAA,MACxB,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,uBAAuB,KAAK;AAAA,MAC5B,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,IACf;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,aAAa,SAAS,EAAC,SAAQ,QAAO,WAAU,CAAC,MAAK,UAAS,SAAQ,QAAQ,GAAE,UAAS,EAAC,MAAK,YAAW,UAAS,gBAAe,SAAQ,YAAW,UAAS,gBAAe,GAAE,gBAAe,WAAU,EAAE,GAAG,OAAO,IAAI;AAC1O,CAAC;;;AClDH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,sBAAsB,IAAIC,UAAQ,IAAI,EAChD,YAAY,iBAAiB,EAC7B,OAAO,wBAAwB,yGAAyG,EACxI,OAAO,qBAAqB,SAAS,EACrC,OAAO,6BAA6B,iBAAiB,EACrD,OAAO,OAAO,SAAS;AACtB,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,aAAa;AAAA,IAChC,QAASA,QAA8C;AAAA,IACvD,OAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,MACd,iBAAiB,KAAK;AAAA,IACxB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,kBAAkB,SAAS,EAAC,SAAQ,QAAO,WAAU,CAAC,MAAK,OAAO,GAAE,UAAS,EAAC,MAAK,YAAW,SAAQ,WAAU,GAAE,gBAAe,gBAAe,EAAE,GAAG,OAAO,IAAI;AACjL,CAAC;;;AC5BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,2BAA2B,IAAIC,UAAQ,IAAI,EACrD,YAAY,uBAAuB,EACnC,SAAS,QAAQ,IAAI,EACrB,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,uBAAuB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,WAAU,YAAW,cAAa,iBAAgB,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AAC9O,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,2BAA2B,IAAIC,UAAQ,MAAM,EACvD,YAAY,gBAAgB,EAC5B,SAAS,QAAQ,IAAI,EACrB,SAAS,aAAa,SAAS,EAC/B,OAAO,OAAO,IAAI,SAAS,SAAS;AACnC,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,uBAAuB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,WAAU,YAAW,cAAa,iBAAgB,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AAC9O,CAAC;;;AC5BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,8BAA8B,IAAIC,UAAQ,IAAI,EACxD,YAAY,8BAA8B,EAC1C,SAAS,QAAQ,IAAI,EACrB,OAAO,8BAA8B,kBAAkB,EACvD,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,qBAAqB;AAAA,IACxC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,kBAAkB,KAAK;AAAA,IACzB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,0BAA0B,SAAS,OAAU,GAAG,OAAO,IAAI;AAC5E,CAAC;;;AC5BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,2BAA2B,IAAIC,UAAQ,MAAM,EACvD,YAAY,2BAA2B,EACvC,SAAS,QAAQ,IAAI,EACrB,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,uBAAuB,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,WAAU,EAAC,EAAE,GAAG,OAAO,IAAI;AAClI,CAAC;;;ACxBH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,oBAAoB,IAAIC,UAAQ,IAAI,EAC9C,YAAY,oBAAoB,EAChC,SAAS,QAAQ,IAAI,EACrB,OAAO,8BAA8B,kBAAkB,EACvD,OAAO,qBAAqB,SAAS,EACrC,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,WAAW;AAAA,IAC9B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,kBAAkB,KAAK;AAAA,MACvB,SAAS,KAAK;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,eAAe,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,cAAa,YAAW,aAAY,YAAW,WAAU,YAAW,UAAS,gBAAe,UAAS,iBAAgB,cAAa,iBAAgB,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACtU,CAAC;;;AC9BH,SAAS,WAAAC,iBAAe;AAKjB,IAAM,iBAAiB,IAAIC,UAAQ,MAAM,EAC7C,YAAY,kBAAkB,EAC9B,SAAS,QAAQ,IAAI,EACrB,OAAO,6BAA6B,iBAAiB,EACrD,OAAO,mCAAmC,uBAAuB,EACjE,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,iBAAiB,KAAK;AAAA,MACtB,uBAAuB,KAAK;AAAA,MAC5B,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,YAAY,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,cAAa,YAAW,aAAY,YAAW,WAAU,YAAW,UAAS,gBAAe,UAAS,iBAAgB,cAAa,iBAAgB,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACnU,CAAC;;;AC/BH,SAAS,WAAAC,iBAAe;AAMjB,IAAM,oBAAoB,IAAIC,UAAQ,QAAQ,EAClD,YAAY,eAAe,EAC3B,SAAS,QAAQ,IAAI,EACrB,OAAO,8BAA8B,kBAAkB,EACvD,OAAO,mBAAmB,yFAAyF,EACnH,OAAO,yBAAyB,gOAAkO,EAClQ,OAAO,uBAAuB,iQAAiQ,EAC/R,OAAO,oBAAoB,qQAA2P,EACtR,OAAO,oBAAoB,0LAA4L,EACvN,OAAO,qBAAqB,wOAAwO,EACpQ,OAAO,2BAA2B,gVAAgV,EAClX,OAAO,qBAAqB,uGAAuG,EACnI,OAAO,OAAO,IAAI,SAAS;AAC1B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,WAAW;AAAA,IAC9B,QAASA,QAA8C;AAAA,IACvD,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,kBAAkB,KAAK;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,eAAe,eAAe,KAAK,cAAc,eAAe;AAAA,MAChE,SAAS,KAAK;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,eAAe,SAAS,EAAC,SAAQ,UAAS,UAAS,EAAC,MAAK,YAAW,WAAU,YAAW,cAAa,YAAW,aAAY,YAAW,WAAU,YAAW,UAAS,gBAAe,UAAS,iBAAgB,cAAa,iBAAgB,cAAa,iBAAgB,cAAa,gBAAe,EAAC,EAAE,GAAG,OAAO,IAAI;AACtU,CAAC;;;ACUI,SAAS,0BAA0B,MAAqB;AAC7D,QAAM,cAAc,KAAK,QAAQ,QAAQ,EAAE,YAAY,iBAAiB;AACxE,cAAY,WAAW,mBAAmB;AAC1C,cAAY,WAAW,gBAAgB;AACvC,cAAY,WAAW,mBAAmB;AAC1C,QAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,YAAY,eAAe;AAClE,YAAU,WAAW,gBAAgB;AACrC,YAAU,WAAW,cAAc;AACnC,YAAU,WAAW,gBAAgB;AACrC,YAAU,WAAW,gBAAgB;AACrC,QAAM,WAAW,KAAK,QAAQ,KAAK,EAAE,YAAY,cAAc;AAC/D,QAAM,kBAAkB,SAAS,QAAQ,QAAQ,EAAE,YAAY,iBAAiB;AAChF,kBAAgB,WAAW,sBAAsB;AACjD,kBAAgB,WAAW,sBAAsB;AACjD,WAAS,WAAW,qBAAqB;AACzC,WAAS,WAAW,aAAa;AACjC,WAAS,WAAW,gBAAgB;AACpC,WAAS,WAAW,qBAAqB;AACzC,QAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,YAAY,eAAe;AAClE,YAAU,WAAW,aAAa;AAClC,OAAK,WAAW,kBAAkB;AAClC,QAAM,aAAa,KAAK,QAAQ,OAAO,EAAE,YAAY,gBAAgB;AACrE,aAAW,WAAW,kBAAkB;AACxC,aAAW,WAAW,gBAAgB;AACtC,aAAW,WAAW,kBAAkB;AACxC,aAAW,WAAW,eAAe;AACrC,aAAW,WAAW,kBAAkB;AACxC,aAAW,WAAW,uBAAuB;AAC7C,QAAM,aAAa,KAAK,QAAQ,OAAO,EAAE,YAAY,gBAAgB;AACrE,aAAW,WAAW,uBAAuB;AAC7C,aAAW,WAAW,qBAAqB;AAC3C,aAAW,WAAW,uBAAuB;AAC7C,QAAM,cAAc,KAAK,QAAQ,QAAQ,EAAE,YAAY,iBAAiB;AACxE,cAAY,WAAW,wBAAwB;AAC/C,cAAY,WAAW,sBAAsB;AAC7C,cAAY,WAAW,qBAAqB;AAC5C,cAAY,WAAW,wBAAwB;AAC/C,QAAM,aAAa,KAAK,QAAQ,OAAO,EAAE,YAAY,gBAAgB;AACrE,aAAW,WAAW,kBAAkB;AACxC,aAAW,WAAW,eAAe;AACrC,aAAW,WAAW,gBAAgB;AACtC,aAAW,WAAW,oBAAoB;AAC1C,aAAW,WAAW,sBAAsB;AAC5C,QAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,YAAY,eAAe;AAClE,QAAM,mBAAmB,UAAU,QAAQ,QAAQ,EAAE,YAAY,iBAAiB;AAClF,mBAAiB,WAAW,uBAAuB;AACnD,mBAAiB,WAAW,oBAAoB;AAChD,mBAAiB,WAAW,oBAAoB;AAChD,YAAU,WAAW,eAAe;AACpC,QAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,YAAY,eAAe;AAClE,QAAM,oBAAoB,UAAU,QAAQ,SAAS,EAAE,YAAY,kBAAkB;AACrF,oBAAkB,WAAW,wBAAwB;AACrD,oBAAkB,WAAW,sBAAsB;AACnD,oBAAkB,WAAW,wBAAwB;AACrD,oBAAkB,WAAW,wBAAwB;AACrD,QAAM,oBAAoB,UAAU,QAAQ,SAAS,EAAE,YAAY,kBAAkB;AACrF,oBAAkB,WAAW,oBAAoB;AACjD,oBAAkB,WAAW,kBAAkB;AAC/C,QAAM,iBAAiB,UAAU,QAAQ,MAAM,EAAE,YAAY,eAAe;AAC5E,iBAAe,WAAW,2BAA2B;AACrD,iBAAe,WAAW,yBAAyB;AACnD,iBAAe,WAAW,2BAA2B;AACrD,iBAAe,WAAW,wBAAwB;AAClD,YAAU,WAAW,iBAAiB;AACtC,YAAU,WAAW,eAAe;AACpC,QAAM,iBAAiB,UAAU,QAAQ,MAAM,EAAE,YAAY,eAAe;AAC5E,iBAAe,WAAW,mBAAmB;AAC7C,YAAU,WAAW,iBAAiB;AACtC,YAAU,WAAW,cAAc;AACnC,YAAU,WAAW,iBAAiB;AACxC;;;AC9HA,SAAS,WAAAC,iBAAe;;;ACsBxB,IAAM,gBAAgB,CAAC,OAAe,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAEhF,eAAsB,cAAc,MAAuD;AACzF,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,QAAQ,KAAK,WAAW;AAG9B,QAAM,UAAU,MAAM,UAAU,GAAG,KAAK,OAAO,sBAAsB;AAAA,IACnE,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,IAC/D,MAAM,IAAI,gBAAgB,EAAE,WAAW,KAAK,SAAS,CAAC;AAAA,EACxD,CAAC;AACD,MAAI,CAAC,QAAQ,IAAI;AACf,UAAM,IAAI,MAAM,qCAAqC,QAAQ,MAAM,EAAE;AAAA,EACvE;AACA,QAAM,WAAY,MAAM,QAAQ,KAAK;AASrC,OAAK,SAAS;AAAA,IACZ,kBAAkB,SAAS;AAAA,IAC3B,2BAA2B,SAAS;AAAA,IACpC,WAAW,SAAS;AAAA,IACpB,YAAY,SAAS;AAAA,EACvB,CAAC;AAGD,QAAM,WAAW,KAAK,IAAI,IAAI,SAAS,aAAa;AACpD,MAAI,WAAW,SAAS;AACxB,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,UAAM,MAAM,WAAW,GAAI;AAC3B,UAAM,WAAW,MAAM,UAAU,GAAG,KAAK,OAAO,qBAAqB;AAAA,MACnE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,MAC/D,MAAM,IAAI,gBAAgB;AAAA,QACxB,YAAY;AAAA,QACZ,aAAa,SAAS;AAAA,QACtB,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH,CAAC;AACD,QAAI,SAAS,IAAI;AACf,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B;AAGA,UAAM,UAAW,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAGvD,UAAM,UACJ,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAS,QAAQ,OAAO,QAAQ;AAC9E,UAAM,UAAU,QAAQ,YAAY;AACpC,YAAQ,SAAS;AAAA,MACf,KAAK;AACH;AAAA,MACF,KAAK;AACH,oBAAY;AACZ;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAM,IAAI,MAAM,eAAe,OAAO,EAAE;AAAA,MAC1C;AACE,cAAM,IAAI,MAAM,sBAAsB,WAAW,SAAS,UAAU,SAAS,MAAM,GAAG;AAAA,IAC1F;AAAA,EACF;AACA,QAAM,IAAI,MAAM,qBAAqB;AACvC;;;AC1FA,IAAM,sBAAsB;AAE5B,IAAM,uBAAuB;AAmB7B,eAAsB,eAAe,MAA8C;AACjF,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,IAAI,MAAM,KAAK,MAAM,KAAK;AAChC,QAAM,WAAW,EAAE,KAAK,KAAK,OAAO,GAAG;AACvC,MAAI,SAAU,QAAO;AAErB,QAAM,MAAM,MAAM,UAAU,GAAG,KAAK,OAAO,wBAAwB;AAAA,IACjE,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,aAAa,KAAK,cAAc;AAAA,MAChC,eAAe,CAAC,oBAAoB;AAAA,MACpC,4BAA4B;AAAA,MAC5B,aAAa,CAAC,iBAAiB,8CAA8C;AAAA,IAC/E,CAAC;AAAA,EACH,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,oCAAoC,IAAI,MAAM,EAAE;AAAA,EAClE;AACA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,MAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,2DAA2D;AAGhG,QAAM,QAAQ,MAAM,KAAK,MAAM,KAAK;AACpC,QAAM,MAAM,MAAM,KAAK,KAAK,OAAO,KAAK,EAAE,UAAU,KAAK,SAAS,UAAU,CAAC,EAAE;AAC/E,MAAI,YAAY,KAAK;AACrB,QAAM,KAAK,KAAK,OAAO,IAAI;AAC3B,QAAM,KAAK,MAAM,MAAM,KAAK;AAC5B,SAAO,KAAK;AACd;;;AC3CA,eAAsB,QAAQ,MAIR;AACpB,QAAM,IAAI,KAAK,aAAa;AAC5B,QAAM,MAAM,MAAM,EAAE,GAAG,KAAK,OAAO,YAAY;AAAA,IAC7C,SAAS,EAAE,eAAe,UAAU,KAAK,KAAK,GAAG;AAAA,EACnD,CAAC;AACD,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,wBAAwB,IAAI,MAAM,EAAE;AACjE,QAAM,OAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC/C,MAAI,CAAC,KAAK,WAAW,CAAC,KAAK,OAAO;AAChC,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO,EAAE,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM;AACpD;;;ACIA,SAAS,eAAe,GAAe,SAAiB,SAA4B;AAClF,QAAM,WAAW,EAAE,KAAK,OAAO;AAC/B,MAAI,UAAU;AACZ,aAAS,WAAW;AACpB,aAAS,aAAa,CAAC;AACvB,WAAO;AAAA,EACT;AACA,QAAM,QAAmB,EAAE,UAAU,SAAS,UAAU,CAAC,EAAE;AAC3D,IAAE,KAAK,OAAO,IAAI;AAClB,SAAO;AACT;AAEA,eAAsB,SAAS,MAAsC;AACnE,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,MAAM,KAAK,OAAO,KAAK;AAC7B,QAAM,KAAK,KAAK,YAAY,CAAC,MAA0C,QAAe,CAAC;AAEvF,MAAI,KAAK,QAAQ;AACf,UAAMC,OAAM,MAAM,GAAG,EAAE,SAAS,KAAK,SAAS,OAAO,KAAK,OAAO,CAAC;AAClE,UAAMC,KAAI,MAAM,KAAK,MAAM,KAAK;AAChC,UAAMC,OAAM,eAAeD,IAAG,SAAS,KAAK,OAAO;AACnD,UAAME,QAAOD,KAAI,SAASF,KAAI,KAAK,KAAK,EAAE,OAAOA,KAAI,MAAM;AAC3D,UAAMI,QAAQF,KAAI,SAASF,KAAI,KAAK,IAAI;AAAA,MACtC,GAAGG;AAAA,MACH,OAAOH,KAAI;AAAA,MACX,SAASA,KAAI;AAAA,MACb,SAAS,KAAK;AAAA,IAChB;AAEA,WAAOI,MAAK;AACZ,WAAOA,MAAK;AACZ,WAAOA,MAAK;AACZ,IAAAF,KAAI,kBAAkBF,KAAI;AAC1B,QAAIA,KAAI,UAAU,mBAAoB,QAAOE,KAAI,SAAS,kBAAkB;AAC5E,IAAAD,GAAE,cAAc;AAChB,UAAM,KAAK,MAAM,MAAMA,EAAC;AACxB,SAAK,OAAO,MAAM,iCAA4BD,KAAI,KAAK,gBAAW,OAAO,GAAG;AAC5E;AAAA,EACF;AAEA,QAAM,eACJ,KAAK,iBACJ,CAACE,SAAgB,eAAe,EAAE,OAAO,KAAK,OAAO,SAASA,MAAK,SAAS,KAAK,QAAQ,CAAC;AAC7F,QAAM,WAAW,KAAK,YAAa,MAAM,aAAa,OAAO;AAC7D,QAAM,OAAO,KAAK,cAAc;AAEhC,QAAM,SAAS,MAAM,KAAK;AAAA,IACxB,SAAS,KAAK;AAAA,IACd;AAAA,IACA,UAAU,CAAC,MAAM;AACf,YAAM,SAAS;AACf,WAAK,OAAO,UAAU,EAAE,OAAO,sBAAsB,GAAG,OAAO,CAAC;AAChE,WAAK,OAAO,MAAM;AAAA,mBAAsB;AACxC,WAAK,OAAO,MAAM,qBAAqB,OAAO,gBAAgB,EAAE;AAChE,WAAK,OAAO,MAAM,cAAc,OAAO,SAAS,EAAE;AAClD,WAAK,OAAO,MAAM,eAAe,OAAO,UAAU,EAAE;AACpD,WAAK,OAAO,MAAM;AAAA,CAAgC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,QAAM,MAAM,MAAM,GAAG,EAAE,SAAS,KAAK,SAAS,OAAO,OAAO,aAAa,CAAC;AAG1E,QAAM,IAAI,MAAM,KAAK,MAAM,KAAK;AAChC,QAAM,MAAM,eAAe,GAAG,SAAS,KAAK,OAAO;AACnD,QAAM,OAAO,IAAI,SAAS,IAAI,KAAK,KAAK,EAAE,OAAO,IAAI,MAAM;AAC3D,QAAM,OAAQ,IAAI,SAAS,IAAI,KAAK,IAAI;AAAA,IACtC,GAAG;AAAA,IACH,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,IACb,eAAe,OAAO;AAAA,IACtB,cAAc,OAAO;AAAA,IACrB,yBAAyB,IAAI,IAAI,OAAO,aAAa;AAAA,EACvD;AAEA,SAAO,KAAK;AACZ,MAAI,kBAAkB,IAAI;AAC1B,MAAI,IAAI,UAAU,mBAAoB,QAAO,IAAI,SAAS,kBAAkB;AAC5E,IAAE,cAAc;AAChB,QAAM,KAAK,MAAM,MAAM,CAAC;AACxB,OAAK,OAAO,UAAU,EAAE,OAAO,iBAAiB,OAAO,IAAI,MAAM,CAAC;AAClE,OAAK,OAAO,MAAM,uBAAkB,IAAI,KAAK,gBAAW,OAAO,GAAG;AACpE;;;AJzGO,IAAM,eAAe,IAAIG,UAAQ,OAAO,EAC5C,YAAY,mDAAmD,EAC/D,OAAO,mBAAmB,2CAA2C,EACrE,OAAO,UAAU,wCAAwC,EACzD,OAAO,OAAO,SAA8C;AAC3D,QAAM,QAAQ,IAAI,YAAY;AAC9B,QAAM,SAAS,KAAK,OAChB,EAAE,OAAO,MAAM;AAAA,EAAC,GAAG,WAAW,CAAC,MAA+B,QAAQ,OAAO,MAAM,KAAK,UAAU,CAAC,IAAI,IAAI,EAAE,IAC7G;AAAA,IACE,OAAO,CAAC,MAAc,QAAQ,OAAO,MAAM,IAAI,IAAI;AAAA,IACnD,WAAW,MAAM;AAAA,IAAC;AAAA,EACpB;AACJ,QAAM,SAAS;AAAA,IACb;AAAA,IACA,SAAS;AAAA,IACT,QAAQ,KAAK;AAAA,IACb;AAAA,EACF,CAAC;AACH,CAAC;;;AKvBH,SAAS,WAAAC,iBAAe;;;ACsBxB,eAAsB,UAAU,MAAkD;AAChF,QAAM,IAAI,MAAM,KAAK,MAAM,KAAK;AAChC,QAAM,UAAU,KAAK,WAAW,EAAE;AAClC,MAAI,CAAC,WAAW,CAAC,EAAE,KAAK,OAAO,EAAG,QAAO,EAAE,SAAS,CAAC,EAAE;AACvD,QAAM,MAAM,EAAE,KAAK,OAAO;AAC1B,MAAI,aAAa,CAAC;AAElB,MAAI,KAAK,KAAK;AACZ,UAAM,UAAU,OAAO,KAAK,IAAI,QAAQ;AACxC,QAAI,WAAW,CAAC;AAChB,QAAI,kBAAkB;AACtB,UAAM,KAAK,MAAM,MAAM,CAAC;AACxB,WAAO,EAAE,QAAQ;AAAA,EACnB;AAEA,QAAM,SACJ,KAAK,SACL,IAAI,oBACH,OAAO,KAAK,IAAI,QAAQ,EAAE,WAAW,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC,IAAI;AAE3E,MAAI,CAAC,UAAU,CAAC,IAAI,SAAS,MAAM,EAAG,QAAO,EAAE,SAAS,CAAC,EAAE;AAE3D,SAAO,IAAI,SAAS,MAAM;AAC1B,MAAI,IAAI,oBAAoB,QAAQ;AAClC,UAAM,YAAY,OAAO,KAAK,IAAI,QAAQ;AAC1C,QAAI,kBAAkB,UAAU,WAAW,IAAI,UAAU,CAAC,IAAI;AAAA,EAChE;AACA,QAAM,KAAK,MAAM,MAAM,CAAC;AACxB,SAAO,EAAE,SAAS,CAAC,MAAM,GAAG,WAAW,IAAI,gBAAgB;AAC7D;;;AD/CO,IAAM,gBAAgB,IAAIC,UAAQ,QAAQ,EAC9C,YAAY,qEAAqE,EACjF,SAAS,WAAW,iCAAiC,EACrD,OAAO,SAAS,0CAA0C,EAC1D,OAAO,OAAO,OAA2B,SAA4B;AACpE,QAAM,MAAM,MAAM,UAAU,EAAE,OAAO,IAAI,YAAY,GAAG,OAAO,KAAK,KAAK,IAAI,CAAC;AAC9E,MAAI,IAAI,QAAQ,WAAW,GAAG;AAC5B,YAAQ,OAAO,MAAM,sBAAsB;AAC3C;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,sBAAiB,IAAI,QAAQ,KAAK,IAAI,CAAC;AAAA,CAAI;AAChE,MAAI,IAAI,UAAW,SAAQ,OAAO,MAAM,yBAAyB,IAAI,SAAS;AAAA,CAAI;AACpF,CAAC;;;AEhBH,SAAS,WAAAC,iBAAe;AAUxB,IAAM,cAA2B;AAAA,EAC/B,OAAO;AAAA,EACP,QAAQ,CAAC,QAAQ,YAAY,WAAW,SAAS,aAAa;AAChE;AACA,IAAM,eAA4B;AAAA,EAChC,OAAO;AAAA,EACP,QAAQ,CAAC,WAAW,SAAS,gBAAgB,YAAY;AAAA,EACzD,QAAQ,EAAE,SAAS,YAAY,YAAY,WAAW;AACxD;AACA,IAAM,cAA2B;AAAA,EAC/B,OAAO;AAAA,EACP,QAAQ,CAAC,MAAM,QAAQ,cAAc,YAAY;AAAA,EACjD,QAAQ,EAAE,IAAI,YAAY,MAAM,YAAY,YAAY,iBAAiB,YAAY,gBAAgB;AACvG;AAQA,iBAAiB,UAAU,CAAC,SAAS;AACnC,QAAM,IAAI;AACV,UAAQ,OAAO,MAAM,KAAK,KAAK,IAAI,IAAI;AACvC,eAAa,EAAE,KAAK,WAAW;AAC/B,UAAQ,OAAO,MAAM,OAAO,KAAK,MAAM,IAAI,IAAI;AAC/C,eAAa,EAAE,MAAM,YAAY;AACjC,MAAI,EAAE,KAAK;AACT,YAAQ,OAAO,MAAM,OAAO,KAAK,KAAK,IAAI,IAAI;AAC9C,iBAAa,EAAE,KAAK,WAAW;AAAA,EACjC;AACF,CAAC;AAGD,eAAsB,oBACpB,OACA,SACA,OACA,QACe;AACf,QAAM,MAAM,MAAM,MAAM,KAAK;AAC7B,MAAI,mBAAmB,KAAK,SAAS,OAAO,MAAM,GAAG;AACnD,UAAM,MAAM,MAAM,GAAG;AAAA,EACvB;AACF;AAEO,IAAM,gBAAgB,IAAIC,UAAQ,QAAQ,EAC9C,YAAY,0DAA0D,EACtE,OAAO,YAAY;AAClB,QAAM,QAAQ,IAAI,YAAY;AAC9B,QAAM,SAAS,MAAM,MAAM,KAAK;AAEhC,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,eAAW,eAAe,QAAQ,EAAE,iBAAiB,QAAQ,IAAI,aAAa,CAAC;AAC/E,gBAAY,MAAM,cAAc,EAAE,MAAM,CAAC;AAAA,EAC3C,QAAQ;AACN,mBAAe;AACf;AAAA,EACF;AACA,QAAMC,UAAU,UAAiD;AAEjE,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,UAAM,CAAC,UAAU,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC9C,OAAO,EAAE,QAAQA,QAAgB,CAAC;AAAA,MAClC,OAAO,EAAE,QAAQA,QAAgB,CAAC,EAAE,MAAM,MAAM,IAAI;AAAA,IACtD,CAAC;AACD,QAAI,SAAS,SAAS,CAAC,SAAS,UAAU,MAAM,CAAC,SAAS,MAAM;AAC9D,qBAAe;AACf;AAAA,IACF;AACA,WAAO,SAAS;AAChB,QAAI,aAAa,UAAU,UAAU,MAAM,UAAU,MAAM;AACzD,YAAM,UAAU;AAAA,IAClB;AAAA,EACF,SAAS,GAAG;AACV,QAAI,aAAa,sBAAsB;AACrC,qBAAe;AACf;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAIA,MAAI,OAAO,KAAK,UAAU,UAAU;AAClC,UAAM,oBAAoB,OAAO,SAAS,SAAS,KAAK,OAAO,KAAK,OAA6B;AAAA,EACnG;AAEA,QAAM,MAA+B;AAAA,IACnC,MAAM,SAAS;AAAA,IACf,UAAU,SAAS;AAAA,IACnB,SAAS,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,SAAS;AAAA,EAClE;AACA,MAAI,SAAS,MAAM,MAAO,KAAI,QAAQ,SAAS,MAAM;AACrD,MAAI,SAAS,MAAM,YAAa,KAAI,cAAc,SAAS,MAAM;AAEjE,SAAO,EAAE,MAAM,SAAS,GAAG,EAAE,KAAK,MAAM,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC,EAAG,CAAC;AACnE,CAAC;AAEH,SAAS,iBAAuB;AAC9B,UAAQ,OAAO,MAAM,IAAI,kCAAkC,IAAI,IAAI;AACnE,UAAQ,WAAW;AACrB;;;ACpHA,SAAS,WAAAC,iBAAe;AAMjB,IAAM,gBAAgB,IAAIC,UAAQ,QAAQ,EAAE,YAAY,0BAA0B;AAazF,iBAAiB,eAAe,CAAC,SAAS;AACxC,QAAM,IAAI;AACV,MAAI,EAAE,KAAK,WAAW,GAAG;AACvB,YAAQ,OAAO,MAAM,IAAI,yCAAyC,IAAI,IAAI;AAC1E;AAAA,EACF;AACA,QAAM,UAAU,CAAC,IAAI,OAAO,YAAY,kBAAkB,YAAY,MAAM;AAC5E,QAAM,OAAO,EAAE,KAAK,IAAI,CAAC,MAAM;AAAA,IAC7B,EAAE,SAAS,EAAE,cAAc,MAAM,QAAG,IAAI;AAAA,IACxC,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE,kBAAkB,IAAI,QAAG;AAAA,IAC3B,OAAO,EAAE,QAAQ;AAAA,IACjB,EAAE,SAAS,SAAS,IAAI,MAAM,IAAI,EAAE;AAAA,EACtC,CAAC;AACD,UAAQ,OAAO,MAAM,MAAM,SAAS,IAAI,CAAC;AAC3C,CAAC;AAGD,eAAsB,aAAa,OAAoB,KAAa,OAA8B;AAChG,QAAM,IAAI,MAAM,MAAM,KAAK;AAC3B,QAAM,WAAW,eAAe,GAAG,EAAE,iBAAiB,QAAQ,IAAI,aAAa,CAAC;AAChF,QAAM,MAAM,EAAE,KAAK,SAAS,OAAO;AACnC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,QAAQ,SAAS,OAAO,aAAa;AAC/D,QAAM,OAAO,IAAI,SAAS,SAAS,KAAK;AACxC,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,YAAY,SAAS,KAAK,aAAa;AAClE,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,UAAI,UAAU,UAAU,UAAU,QAAS,OAAM,IAAI,MAAM,iCAAiC;AAC5F,WAAK,QAAQ;AACb;AAAA,IACF,KAAK;AACH,WAAK,cAAc;AACnB;AAAA,IACF;AACE,YAAM,IAAI,MAAM,uBAAuB,GAAG,EAAE;AAAA,EAChD;AACA,QAAM,MAAM,MAAM,CAAC;AACrB;AAEA,cACG,QAAQ,MAAM,EACd,YAAY,oEAA+D,EAC3E,OAAO,YAAY;AAClB,QAAM,IAAI,MAAM,IAAI,YAAY,EAAE,KAAK;AACvC,QAAM,OAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM;AAC7D,UAAM,SAAS,IAAI,kBAAkB,IAAI,WAAW,IAAI,eAAe,IAAI;AAC3E,WAAO;AAAA,MACL;AAAA,MACA,UAAU,IAAI;AAAA,MACd,GAAI,IAAI,oBAAoB,SAAY,EAAE,gBAAgB,IAAI,gBAAgB,IAAI,CAAC;AAAA,MACnF,UAAU,OAAO,KAAK,IAAI,YAAY,CAAC,CAAC,EAAE;AAAA,MAC1C,MAAO,QAAQ,UACX,YACA,QAAQ,eACN,UACA;AAAA,IACR;AAAA,EACF,CAAC;AACD;AAAA,IACE,EAAE,MAAM,cAAc;AAAA,IACtB,EAAE,GAAI,EAAE,gBAAgB,SAAY,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC,GAAI,KAAK;AAAA,EACjF;AACF,CAAC;AAEH,cACG,QAAQ,mBAAmB,EAC3B,YAAY,6DAA6D,EACzE,OAAO,OAAO,KAAa,UAAkB;AAC5C,QAAM,aAAa,IAAI,YAAY,GAAG,KAAK,KAAK;AAChD,UAAQ,OAAO,MAAM,cAAS,GAAG,IAAI,KAAK;AAAA,CAAI;AAChD,CAAC;AAEH,cACG,QAAQ,WAAW,EACnB,YAAY,oBAAoB,EAChC,OAAO,OAAO,QAAgB;AAC7B,QAAM,QAAQ,IAAI,YAAY;AAC9B,QAAM,IAAI,MAAM,MAAM,KAAK;AAC3B,MAAI,CAAC,EAAE,KAAK,GAAG,EAAG,OAAM,IAAI,MAAM,QAAQ,GAAG,aAAa;AAC1D,IAAE,cAAc;AAChB,QAAM,MAAM,MAAM,CAAC;AACnB,UAAQ,OAAO,MAAM,sBAAiB,GAAG;AAAA,CAAI;AAC/C,CAAC;;;ACtGH,SAAS,WAAAC,iBAAe;AAaxB,eAAsB,aAAa,OAA2C;AAC5E,QAAM,IAAI,MAAM,MAAM,KAAK;AAC3B,QAAM,UAAU,EAAE;AAClB,MAAI,CAAC,WAAW,CAAC,EAAE,KAAK,OAAO,EAAG,QAAO,CAAC;AAC1C,QAAM,MAAM,EAAE,KAAK,OAAO;AAC1B,SAAO,OAAO,OAAO,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO;AAAA,IACnD,OAAO,EAAE;AAAA,IACT,SAAS,EAAE;AAAA,IACX,OAAO,EAAE;AAAA,IACT,MAAM,EAAE,UAAU,YAAY,EAAE,eAAe,UAAU;AAAA,IACzD,QAAQ,IAAI,oBAAoB,EAAE;AAAA,EACpC,EAAE;AACJ;AAEA,eAAsB,cAAc,OAAoB,OAA8B;AACpF,QAAM,IAAI,MAAM,MAAM,KAAK;AAC3B,QAAM,UAAU,EAAE;AAClB,MAAI,CAAC,WAAW,CAAC,EAAE,KAAK,OAAO,EAAG,OAAM,IAAI,MAAM,wCAAwC;AAC1F,QAAM,MAAM,EAAE,KAAK,OAAO;AAC1B,MAAI,CAAC,IAAI,WAAW,KAAK,GAAG;AAC1B,UAAM,IAAI,MAAM,eAAe,KAAK,aAAa,OAAO,+CAA+C;AAAA,EACzG;AACA,MAAI,kBAAkB;AACtB,QAAM,MAAM,MAAM,CAAC;AACrB;AAEA,iBAAiB,cAAc,CAAC,SAAS;AACvC,QAAM,OAAQ,KAAoC;AAClD,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,OAAO,MAAM,IAAI,kCAAkC,IAAI,IAAI;AACnE;AAAA,EACF;AACA,QAAM,UAAU,CAAC,IAAI,SAAS,QAAQ,SAAS,MAAM;AACrD,QAAM,OAAO,KAAK,IAAI,CAAC,MAAM;AAAA,IAC3B,EAAE,SAAS,MAAM,QAAG,IAAI;AAAA,IACxB,EAAE;AAAA,IACF,EAAE,WAAW,IAAI,QAAG;AAAA,IACpB,EAAE,SAAS,IAAI,QAAG;AAAA,IAClB,EAAE,SAAS,SAAS,IAAI,MAAM,IAAI,EAAE;AAAA,EACtC,CAAC;AACD,UAAQ,OAAO,MAAM,MAAM,SAAS,IAAI,CAAC;AAC3C,CAAC;AAEM,IAAM,iBAAiB,IAAIC,UAAQ,SAAS,EAAE,YAAY,2BAA2B;AAE5F,eACG,QAAQ,IAAI,EACZ,YAAY,8DAAyD,EACrE,OAAO,YAAY;AAClB,QAAM,WAAW,MAAM,aAAa,IAAI,YAAY,CAAC;AACrD,SAAO,EAAE,MAAM,aAAa,GAAG,EAAE,SAAS,CAAC;AAC7C,CAAC;AAEH,eACG,QAAQ,gBAAgB,EACxB,YAAY,4CAA4C,EACxD,OAAO,OAAO,UAAkB;AAC/B,QAAM,cAAc,IAAI,YAAY,GAAG,KAAK;AAC5C,UAAQ,OAAO,MAAM,gCAA2B,KAAK;AAAA,CAAI;AAC3D,CAAC;;;ACxEH,SAAS,WAAAC,iBAAe;AAaxB,IAAM,sBAAmC;AAAA,EACvC,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AACF;AAEO,IAAM,kBAAkB,IAAIC,UAAQ,MAAM,EAC9C,YAAY,0DAA0D,EACtE,SAAS,QAAQ,SAAS,EAC1B,OAAO,OAAO,OAAe;AAC5B,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,WAAW;AAAA,IAC9B,QAAQA,QAAO;AAAA,IACf,MAAM,EAAE,GAAG;AAAA,IACX,MAAM,EAAE,QAAQ,OAAO;AAAA,EACzB,CAAC;AACD,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,eAAe,SAAS,oBAAoB,GAAG,OAAO,IAAI;AAC3E,CAAC;;;ACjDH,SAAS,WAAAC,iBAAe;AACxB,SAAS,UAAU,YAAY;AAC/B,SAAS,gBAAgB;;;ACFzB,SAAS,eAAe;AAExB,IAAM,cAAsC;AAAA,EAC1C,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AACP;AAQO,SAAS,YAAY,UAA0B;AACpD,QAAM,MAAM,QAAQ,QAAQ,EAAE,MAAM,CAAC,EAAE,YAAY;AACnD,SAAO,YAAY,GAAG,KAAK;AAC7B;;;ADnBA,IAAM,qBAAqB,IAAI,OAAO;AACtC,IAAM,uBAAuB,KAAK,OAAO;AACzC,IAAM,iBAAiB,MAAM;AAC7B,IAAM,iBAAiB;AAMvB,eAAe,kBAAkB,OAA2D;AAE1F,MAAI;AACF,UAAM,IAAI,MAAM,KAAK,KAAK;AAC1B,QAAI,EAAE,OAAO,GAAG;AACd,UAAI,EAAE,OAAO,oBAAoB;AAC/B,cAAM,IAAI,MAAM,cAAc,KAAK,KAAK,EAAE,IAAI,8BAA8B;AAAA,MAC9E;AACA,YAAM,MAAM,MAAM,SAAS,KAAK;AAChC,aAAO;AAAA,QACL,KAAK;AAAA,UACH,UAAU,SAAS,KAAK;AAAA,UACxB,cAAc,YAAY,KAAK;AAAA,UAC/B,gBAAgB,IAAI,SAAS,QAAQ;AAAA,QACvC;AAAA,QACA,MAAM,EAAE;AAAA,MACV;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,MAAI,eAAe,KAAK,KAAK,GAAG;AAC9B,UAAM,CAAC,OAAO,MAAM,IAAI,MAAM,MAAM,GAAG;AACvC,WAAO,EAAE,KAAK,EAAE,uBAAuB,OAAQ,KAAK,OAAO,MAAM,EAAE,GAAG,MAAM,EAAE;AAAA,EAChF;AACA,QAAM,IAAI;AAAA,IACR,YAAY,KAAK;AAAA,EACnB;AACF;AAEO,IAAM,cAAc,IAAIC,UAAQ,MAAM,EAC1C,YAAY,wBAAwB,EACpC,eAAe,wBAAwB,0BAA0B,EACjE,OAAO,kBAAkB,kCAAkC,CAAC,CAAC,EAC7D,OAAO,oBAAoB,SAAS,EACpC,OAAO,iBAAiB,iBAAiB,EACzC,OAAO,sBAAsB,0BAA0B,EACvD,OAAO,gBAAgB,8BAA8B,EACrD,OAAO,6BAA6B,yCAAyC,CAAC,CAAC,EAC/E,eAAe,2BAA2B,iBAAiB,EAC3D,OAAO,OAAO,SAAS;AACtB,QAAM,UAAU,QAAQ,KAAK,KAAK;AAClC,QAAM,KAAK,KAAK;AAChB,QAAM,eAAe,KAAK;AAG1B,MAAI,KAAK,QAAQ,KAAK,UAAU;AAC9B,YAAQ,OAAO,MAAM,iDAAiD;AACtE,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,MAAI,OAA2B,KAAK;AACpC,MAAI,KAAK,UAAU;AACjB,WAAO,MAAM,SAAS,KAAK,UAAoB,MAAM;AAAA,EACvD;AACA,MAAI,CAAC,MAAM;AACT,YAAQ,OAAO,MAAM,qCAAqC;AAC1D,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,MAAI,OAAO,WAAW,MAAM,MAAM,IAAI,gBAAgB;AACpD,YAAQ,OAAO,MAAM,6BAA6B;AAClD,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,MAAI,CAAC,SAAS;AACZ,QAAI,GAAG,WAAW,GAAG;AACnB,cAAQ,OAAO,MAAM,wDAAwD;AAC7E,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,SAAS;AACjB,cAAQ,OAAO,MAAM,6DAA6D;AAClF,cAAQ,WAAW;AACnB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,cAA4B,CAAC;AACnC,MAAI,QAAQ;AACZ,aAAW,SAAS,cAAc;AAChC,QAAI;AACF,YAAM,EAAE,KAAK,KAAK,IAAI,MAAM,kBAAkB,KAAK;AACnD,eAAS;AACT,kBAAY,KAAK,GAAG;AAAA,IACtB,SAAS,GAAG;AACV,cAAQ,OAAO,MAAM,GAAI,EAAY,OAAO;AAAA,CAAI;AAChD,cAAQ,WAAW;AACnB;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,sBAAsB;AAChC,YAAQ,OAAO,MAAM,qBAAqB,KAAK;AAAA,CAAgC;AAC/E,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,OAAgC;AAAA,IACpC,kBAAkB,KAAK;AAAA,IACvB;AAAA,IACA,iBAAiB,KAAK;AAAA,EACxB;AACA,MAAI,SAAS;AACX,SAAK,uBAAuB,KAAK;AAAA,EACnC,OAAO;AACL,SAAK,KAAK;AACV,SAAK,UAAU,KAAK;AAAA,EACtB;AACA,MAAI,YAAY,SAAS,EAAG,MAAK,cAAc;AAE/C,QAAMC,UAAS,MAAM,cAAc;AACnC,QAAM,SAAS,MAAM,UAAU;AAAA,IAC7B,QAASA,QAA8C;AAAA,IACvD;AAAA,EACF,CAAU;AAEV,MAAI,OAAO,SAAS,CAAC,OAAO,UAAU,IAAI;AACxC,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU,UAAU,GAAG,KAAK,KAAK,UAAU,OAAO,SAAS,iBAAiB,MAAM,CAAC,CAAC;AAAA;AAAA,IACrG;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA;AAAA,IACE,EAAE,MAAM,UAAU,SAAS,EAAE,OAAO,UAAU,QAAQ,EAAE,IAAI,WAAW,EAAE,EAAE;AAAA,IAC3E,OAAO,KAAM;AAAA,EACf;AACF,CAAC;;;AEnJH,SAAS,WAAAC,iBAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;;;ACGlB,SAAS,gCACd,QACoB;AACpB,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,CAAC,OAAO,YAAY,EAAE,WAAW,YAAY,EAAG,QAAO;AAC3D,QAAM,SAAS,OAAO,MAAM,qBAAqB;AACjD,MAAI,OAAQ,QAAO,OAAO,CAAC;AAC3B,QAAM,WAAW,OAAO,MAAM,qBAAqB;AACnD,MAAI,SAAU,QAAO,SAAS,CAAC;AAC/B,SAAO;AACT;;;ADTO,IAAM,oBAAoB,IAAIC,UAAQ,YAAY,EACtD,YAAY,+CAA+C,EAC3D,SAAS,YAAY,EACrB,SAAS,OAAO,EAChB,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,qBAAqB,iDAAiD,EAC7E,OAAO,OAAO,SAAiB,QAAgB,SAAS;AACvD,QAAM,MAAM,OAAO,MAAM;AACzB,MAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,GAAG;AACrC,YAAQ,OAAO,MAAM,8CAA8C,MAAM;AAAA,CAAM;AAC/E,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,EAAE,OAAO,aAAa,QAAQ,IAAI,MAAM,gBAAgB;AAC9D,QAAM,MAAM,IAAI,IAAI,mBAAmB,OAAO,gBAAgB,GAAG,IAAI,OAAO;AAC5E,MAAI,KAAK,eAAgB,KAAI,aAAa,IAAI,mBAAmB,MAAM;AAEvE,QAAM,MAAM,MAAM,YAAY,GAAG;AAEjC,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAQ,OAAO,MAAM,QAAQ,IAAI,MAAM,KAAK,IAAI;AAAA,CAAI;AACpD,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,WACJ,KAAK,UACL,gCAAgC,IAAI,QAAQ,IAAI,qBAAqB,CAAC,KACtE,GAAG,OAAO,IAAI,GAAG;AAEnB,MAAI,CAAC,IAAI,MAAM;AACb,YAAQ,OAAO,MAAM,wBAAwB;AAC7C,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,OAAO,kBAAkB,QAAQ;AACvC,QAAM,SAAS,SAAS,QAAQ,IAAI,IAAa,GAAG,IAAI;AACxD,UAAQ,OAAO,MAAM,SAAS,QAAQ;AAAA,CAAI;AAC5C,CAAC;;;A1FnCH,SAAS,eAAwB;AAC/B,QAAM,UAAU,IAAIC,UAAQ,EACzB,KAAK,MAAM,EACX,YAAY,0BAA0B,EACtC,QAAQ,QAAQ,OAAO,UAAU,QAAQ,aAAa,eAAe,GAAG,EAIxE,OAAO,UAAU,oCAAoC,EACrD,OAAO,qBAAqB,0DAA0D,EACtF,KAAK,aAAa,CAAC,cAAc,kBAAkB;AAClD,UAAM,UAAU,cAAc,gBAAgB;AAC9C,QAAI,QAAQ,KAAM,SAAQ,IAAI,cAAc;AAG5C,QAAI,QAAQ,QAAS,SAAQ,IAAI,eAAe,OAAO,QAAQ,OAAO;AAAA,EACxE,CAAC;AAEH,UAAQ,WAAW,YAAY;AAC/B,UAAQ,WAAW,aAAa;AAChC,UAAQ,WAAW,aAAa;AAChC,UAAQ,WAAW,aAAa;AAChC,UAAQ,WAAW,cAAc;AAEjC,4BAA0B,OAAO;AAEjC,QAAM,OAAO,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,KAAK,MAAM,MAAM;AAC7D,MAAI,KAAM,MAAK,WAAW,eAAe;AAMzC,QAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,KAAK,MAAM,OAAO;AAC/D,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACA,QAAM,WAAW,WAAW;AAC5B,QAAM,WAAW,iBAAiB;AAElC,SAAO;AACT;AAEA,eAAsB,SAAS,MAAgB,EAAE,aAAa,KAAK,IAA8B,CAAC,GAAkB;AAClH,MAAI;AACF,UAAM,aAAa,EAAE,WAAW,IAAI;AAAA,EACtC,SAAS,KAAK;AACZ,UAAM,OAAO,OAAO,OAAO,QAAQ,WAAY,IAA0B,OAAO;AAChF,QAAI,SAAS,qBAAqB;AAChC,UAAI,cAAc,QAAQ,MAAM,SAAS,QAAQ,OAAO,OAAO;AAC7D,gBAAQ,OAAO,MAAM,yCAAyC;AAC9D,cAAM,aAAa,EAAE,WAAW,CAAC,QAAQ,QAAQ,OAAO,CAAC;AACzD,cAAM,SAAS,MAAM,EAAE,YAAY,MAAM,CAAC;AAC1C;AAAA,MACF;AACA,cAAQ,OAAO,MAAM,UAAW,IAAc,OAAO;AAAA,CAAI;AAIzD,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,YAAQ,OAAO,MAAM,UAAW,IAAc,WAAW,GAAG;AAAA,CAAI;AAChE,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,QAAQ,IAAI;","names":["Command","joinedValues","config","request","url","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","DateTime","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","Command","client","Command","who","c","env","prev","acct","Command","Command","Command","Command","Command","client","Command","Command","Command","Command","Command","Command","client","Command","Command","client","Command","Command","Command"]}