@alumnium/cursor 0.0.0-stage → 0.24.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +2 -2
- package/package.json +39 -4
- package/src/index.cjs +1194 -0
- package/src/index.cjs.map +16 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +1069 -0
- package/src/index.js.map +16 -0
- package/src/llm/CursorLanguageModel.d.ts +27 -0
- package/src/llm/cursorProviders.d.ts +2 -0
- package/src/standalone/cursorSdkManifest.d.ts +20 -0
- package/src/standalone/cursorSdkResolver.d.ts +17 -0
- package/src/standalone/cursorSdkVendorManifest.d.ts +2 -0
- package/src/standalone/installCursorSdk.d.ts +38 -0
- package/src/standalone/untar.d.ts +8 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../cursor/src/llm/CursorLanguageModel.ts", "../../cursor/src/llm/cursorProviders.ts", "../../cursor/src/standalone/installCursorSdk.ts", "../../cursor/src/standalone/cursorSdkManifest.ts", "../../cursor/src/standalone/cursorSdkResolver.ts", "../../cursor/src/standalone/cursorSdkVendorManifest.ts", "../../cursor/src/standalone/untar.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport {\n APICallError,\n UnsupportedFunctionalityError,\n type LanguageModelV4,\n type LanguageModelV4CallOptions,\n type LanguageModelV4GenerateResult,\n type LanguageModelV4StreamPart,\n type LanguageModelV4StreamResult,\n} from \"@ai-sdk/provider\";\nimport type {\n RunResult,\n SDKAgent,\n SDKImage,\n SDKUserMessage,\n TokenUsage,\n} from \"@cursor/sdk\";\nimport { z } from \"zod\";\nimport { Logger } from \"@alumnium/core/internal\";\n\nexport type CursorSdkModule = typeof import(\"@cursor/sdk\");\n\nexport interface CursorLanguageModelOptions {\n modelId: string;\n apiKey?: string;\n sdkLoader?: () => Promise<CursorSdkModule>;\n}\n\nconst logger = Logger.get(\"packages/typescript/cursor/src/llm/CursorLanguageModel.ts\");\nconst CHAT_CONTEXT = `# Execution context\nYou are used as a chat completion model inside another application.\nDo NOT read or write files, run terminal commands, search the web, or use any\nbuilt-in or MCP tools. Reply with a single final assistant message directly.`;\nconst ToolCallsResponse = z.object({\n tool_calls: z.array(\n z.object({\n name: z.string(),\n arguments: z.record(z.string(), z.unknown()).optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n }),\n ),\n});\n\n/** Cursor has no chat API; emulate completions with a fresh local agent. */\nexport class CursorLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = \"v4\";\n readonly provider = \"cursor\";\n readonly modelId: string;\n readonly supportedUrls: Record<string, RegExp[]> = {};\n #options: CursorLanguageModelOptions;\n #sandbox = true;\n\n constructor(options: CursorLanguageModelOptions) {\n this.modelId = options.modelId;\n this.#options = options;\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const abort = createAbortScope(options.abortSignal);\n try {\n return await this.#generateOnce(options, abort);\n } catch (error) {\n options.abortSignal?.throwIfAborted();\n if (\n this.#sandbox &&\n error instanceof Error &&\n error.name === \"ConfigurationError\" &&\n /sandbox/i.test(error.message)\n ) {\n logger.warn(\n \"Cursor SDK sandboxing is not supported; retrying without it.\",\n );\n this.#sandbox = false;\n return await this.doGenerate(options);\n }\n if (\n error instanceof Error &&\n (error.name === \"RateLimitError\" ||\n error.name === \"TimeoutError\" ||\n (\"isRetryable\" in error && error.isRetryable === true))\n ) {\n throw new APICallError({\n message: error.message,\n url: \"cursor://local\",\n requestBodyValues: { model: this.modelId },\n isRetryable: true,\n cause: error,\n });\n }\n throw error;\n } finally {\n abort.dispose();\n }\n }\n\n // The local runtime returns a complete reply; expose it as a buffered stream.\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const result = await this.doGenerate(options);\n return {\n stream: new ReadableStream<LanguageModelV4StreamPart>({\n start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings: result.warnings,\n });\n controller.enqueue({ type: \"response-metadata\", ...result.response });\n for (const part of result.content) {\n if (part.type === \"text\") {\n const id = crypto.randomUUID();\n controller.enqueue({ type: \"text-start\", id });\n controller.enqueue({ type: \"text-delta\", id, delta: part.text });\n controller.enqueue({ type: \"text-end\", id });\n } else if (part.type === \"tool-call\") {\n controller.enqueue(part);\n }\n }\n controller.enqueue({\n type: \"finish\",\n usage: result.usage,\n finishReason: result.finishReason,\n });\n controller.close();\n },\n }),\n };\n }\n\n async #generateOnce(\n options: LanguageModelV4CallOptions,\n abort: ReturnType<typeof createAbortScope>,\n ): Promise<LanguageModelV4GenerateResult> {\n const signal = options.abortSignal;\n signal?.throwIfAborted();\n const prompt = serializePrompt(options);\n const contract = responseContract(options);\n const sdk = await abort.run((this.#options.sdkLoader ?? loadCursorSdk)());\n const root = await fs.mkdtemp(path.join(os.tmpdir(), \"alumnium-cursor-\"));\n let agent: SDKAgent | undefined;\n try {\n const cwd = path.join(root, \"workspace\");\n await fs.mkdir(cwd);\n const store = new sdk.JsonlLocalAgentStore(path.join(root, \"store\"));\n signal?.throwIfAborted();\n agent = await abort.run(\n sdk.Agent.create({\n ...(this.#options.apiKey ? { apiKey: this.#options.apiKey } : {}),\n model: { id: this.modelId },\n local: {\n cwd,\n settingSources: [],\n sandboxOptions: { enabled: this.#sandbox },\n store,\n },\n }),\n async (lateAgent) => {\n try {\n lateAgent.close();\n } finally {\n await fs.rm(root, { recursive: true, force: true });\n }\n },\n );\n const first = await send(\n agent,\n {\n text: [prompt.text, CHAT_CONTEXT, contract]\n .filter(Boolean)\n .join(\"\\n\\n\"),\n images: prompt.images,\n },\n abort,\n );\n const usages = [first.usage];\n let content: LanguageModelV4GenerateResult[\"content\"];\n try {\n content = parseResponse(first.result ?? \"\", options);\n } catch (error) {\n const retry = await send(\n agent,\n {\n text: `Your previous reply was invalid: ${error instanceof Error ? error.message : String(error)}\\nRespond again following this contract exactly:\\n${contract}`,\n },\n abort,\n );\n usages.push(retry.usage);\n content = parseResponse(retry.result ?? \"\", options);\n }\n return {\n content,\n finishReason: {\n unified: content.some((part) => part.type === \"tool-call\")\n ? \"tool-calls\"\n : \"stop\",\n raw: \"finished\",\n },\n usage: toUsage(usages),\n warnings: [],\n response: { id: first.id, modelId: this.modelId },\n };\n } finally {\n try {\n agent?.close();\n } finally {\n await fs.rm(root, { recursive: true, force: true });\n }\n }\n }\n}\n\nasync function loadCursorSdk(): Promise<CursorSdkModule> {\n return import(\"@cursor/sdk\");\n}\n\nfunction serializePrompt(options: LanguageModelV4CallOptions): {\n text: string;\n images: SDKImage[];\n} {\n const images: SDKImage[] = [];\n const sections = options.prompt.map((message) => {\n const text =\n message.role === \"system\"\n ? message.content\n : message.content\n .map((part) => {\n if (part.type === \"text\" || part.type === \"reasoning\")\n return part.text;\n if (part.type === \"tool-call\")\n return JSON.stringify({\n tool_call_id: part.toolCallId,\n name: part.toolName,\n arguments: part.input,\n });\n if (part.type === \"tool-result\")\n return JSON.stringify({\n tool_call_id: part.toolCallId,\n name: part.toolName,\n output: part.output,\n });\n if (part.type === \"file\" && part.mediaType.startsWith(\"image/\")) {\n if (part.data.type === \"url\") return part.data.url.toString();\n if (part.data.type === \"data\") {\n images.push({\n mimeType: part.mediaType,\n data:\n typeof part.data.data === \"string\"\n ? part.data.data\n : Buffer.from(part.data.data).toString(\"base64\"),\n });\n return `[image ${images.length} attached]`;\n }\n }\n throw new UnsupportedFunctionalityError({\n functionality: `Cursor prompt part: ${part.type}`,\n });\n })\n .join(\"\\n\");\n const role = message.role === \"tool\" ? \"tool_result\" : message.role;\n return `<${role}>\\n${text}\\n</${role}>`;\n });\n return { text: sections.join(\"\\n\\n\"), images };\n}\n\nfunction responseContract(options: LanguageModelV4CallOptions): string {\n if (options.responseFormat?.type === \"json\") {\n return `# Structured output\\nRespond with ONLY valid JSON, with no other text.\\n${options.responseFormat.description ?? \"\"}\\nJSON schema: ${JSON.stringify(options.responseFormat.schema ?? {})}`;\n }\n const tools = activeTools(options);\n if (!tools.length) return \"\";\n return `# Tool calling\nDecide which of these tools to call to fulfill the request. Do not execute them yourself.\nAvailable tools (JSON schema per tool):\n${JSON.stringify(tools)}\nRespond with ONLY a JSON object of this exact shape and no other text:\n{\"tool_calls\": [{\"name\": \"<tool_name>\", \"arguments\": {<parameters>}}]}\nList multiple entries when several calls are needed, in execution order.\n${options.toolChoice?.type === \"required\" || options.toolChoice?.type === \"tool\" ? \"You MUST call at least one of the listed tools.\" : 'If no tool applies, respond with {\"tool_calls\": []}.'}`;\n}\n\nfunction activeTools(options: LanguageModelV4CallOptions) {\n if (options.toolChoice?.type === \"none\") return [];\n return (options.tools ?? [])\n .map((tool) => {\n if (tool.type !== \"function\")\n throw new UnsupportedFunctionalityError({\n functionality: \"Cursor provider-defined tools\",\n });\n return tool;\n })\n .filter(\n (tool) =>\n options.toolChoice?.type !== \"tool\" ||\n tool.name === options.toolChoice.toolName,\n );\n}\n\nfunction parseResponse(\n text: string,\n options: LanguageModelV4CallOptions,\n): LanguageModelV4GenerateResult[\"content\"] {\n if (options.responseFormat?.type === \"json\")\n return [{ type: \"text\", text: JSON.stringify(parseJson(text)) }];\n const tools = activeTools(options);\n if (!tools.length) return [{ type: \"text\", text }];\n const calls = ToolCallsResponse.parse(parseJson(text)).tool_calls;\n if (\n !calls.length &&\n (options.toolChoice?.type === \"required\" ||\n options.toolChoice?.type === \"tool\")\n )\n throw new Error(\"At least one tool call is required\");\n return calls.map((call) => {\n if (!tools.some((tool) => tool.name === call.name))\n throw new Error(`Unknown or disallowed tool: ${call.name}`);\n return {\n type: \"tool-call\",\n toolCallId: `call_${crypto.randomUUID()}`,\n toolName: call.name,\n input: JSON.stringify(call.arguments ?? call.args ?? {}),\n };\n });\n}\n\nfunction parseJson(text: string): unknown {\n // Accept fenced replies and prose around JSON, including braces in strings.\n try {\n return JSON.parse(text);\n } catch {}\n const start = text.search(/[[{]/);\n let depth = 0;\n let quoted = false;\n let escaped = false;\n for (let index = start; index >= 0 && index < text.length; index++) {\n const char = text[index];\n if (escaped) escaped = false;\n else if (quoted && char === \"\\\\\") escaped = true;\n else if (char === '\"') quoted = !quoted;\n else if (!quoted) {\n if (char === \"{\" || char === \"[\") depth++;\n else if ((char === \"}\" || char === \"]\") && --depth === 0)\n return JSON.parse(text.slice(start, index + 1));\n }\n }\n throw new Error(\"Response does not contain valid JSON\");\n}\n\nasync function send(\n agent: SDKAgent,\n payload: SDKUserMessage,\n abort: ReturnType<typeof createAbortScope>,\n): Promise<RunResult> {\n abort.signal?.throwIfAborted();\n const run = await abort.run(agent.send(payload), (lateRun) => {\n void lateRun.cancel().catch(() => {});\n });\n let result: RunResult;\n try {\n result = await abort.run(run.wait());\n } catch (error) {\n void run.cancel().catch(() => {});\n throw error;\n }\n if (result.status !== \"finished\")\n throw new Error(\n `Cursor agent run ${result.status}: ${result.error?.message ?? \"no error details\"}`,\n );\n return result;\n}\n\nfunction createAbortScope(signal?: AbortSignal) {\n signal?.throwIfAborted();\n // Keep the listener for the entire call. In Bun 1.3.13, removing the last\n // listener between SDK operations disables an AbortSignal.timeout timer.\n let onAbort = () => {};\n const aborted = new Promise<never>((_, reject) => {\n onAbort = () => reject(signal?.reason);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n return {\n signal,\n async run<T>(\n promise: Promise<T>,\n onLateResult?: (value: T) => void | Promise<void>,\n ): Promise<T> {\n if (!signal) return promise;\n return Promise.race([\n promise.then(async (value) => {\n if (signal.aborted) {\n await onLateResult?.(value);\n signal.throwIfAborted();\n }\n return value;\n }),\n aborted,\n ]);\n },\n dispose() {\n signal?.removeEventListener(\"abort\", onAbort);\n },\n };\n}\n\nfunction toUsage(\n usages: Array<TokenUsage | undefined>,\n): LanguageModelV4GenerateResult[\"usage\"] {\n const reported = usages.filter((usage) => usage !== undefined);\n function sum(key: keyof TokenUsage) {\n return reported.some((usage) => usage[key] !== undefined)\n ? reported.reduce((total, usage) => total + (usage[key] ?? 0), 0)\n : undefined;\n }\n const noCache = sum(\"inputTokens\");\n const cacheRead = sum(\"cacheReadTokens\");\n const cacheWrite = sum(\"cacheWriteTokens\");\n return {\n inputTokens: {\n total:\n noCache === undefined\n ? undefined\n : noCache + (cacheRead ?? 0) + (cacheWrite ?? 0),\n noCache,\n cacheRead,\n cacheWrite,\n },\n outputTokens: {\n total: sum(\"outputTokens\"),\n text: undefined,\n reasoning: sum(\"reasoningTokens\"),\n },\n };\n}\n",
|
|
6
|
+
"import {\n Env,\n isSingleFileExecutable,\n Logger,\n maskString,\n LlmFactory,\n} from \"@alumnium/core/internal\";\nimport { loadVendoredCursorSdk } from \"../standalone/installCursorSdk.ts\";\nimport { CursorLanguageModel } from \"./CursorLanguageModel.ts\";\n\nconst logger = Logger.get(\"packages/typescript/cursor/src/llm/cursorProviders.ts\");\n\nexport const cursorProviders: LlmFactory.Providers = {\n cursor: (model) => {\n logger.debug(`Creating Cursor LLM with model ${model.name}`);\n const apiKey = Env.CURSOR_API_KEY;\n if (apiKey) logger.debug(`Cursor API Key is set: ${maskString(apiKey)}`);\n return new CursorLanguageModel({\n modelId: model.name,\n ...(apiKey ? { apiKey } : {}),\n ...(isSingleFileExecutable() ? { sdkLoader: loadVendoredCursorSdk } : {}),\n });\n },\n};\n\nLlmFactory.register(cursorProviders);\n",
|
|
7
|
+
"// Downloads the Cursor SDK on first use in the compiled single-file binary.\n//\n// @cursor/sdk cannot be bundled (its webpack-chunked dist loads chunks with\n// dynamic requires) and cannot be embedded like the Selenium atoms (its\n// license does not permit redistribution). Instead the binary vendors it the\n// way Playwright browsers are handled: on the first cursor-provider call the\n// locked dependency closure (src/standalone/cursorSdkVendorManifest.ts) is\n// fetched from registry.npmjs.org into ~/.alumnium/vendor, verified against\n// the lockfile's sha512 integrity, and loaded with createRequire plus the\n// parent-scoped bare-specifier hook from cursorSdkResolver.ts.\nimport { createHash } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { gunzipSync } from \"node:zlib\";\nimport { Env, Logger, retry } from \"@alumnium/core/internal\";\nimport type { CursorSdkModule } from \"../llm/CursorLanguageModel.ts\";\nimport {\n CURSOR_SDK_PACKAGE_NAME,\n type CursorSdkVendorManifest,\n type CursorSdkVendorPackage,\n} from \"./cursorSdkManifest.ts\";\nimport {\n installVendorResolveHook,\n resolvePackageEntry,\n} from \"./cursorSdkResolver.ts\";\nimport { cursorSdkVendorManifest } from \"./cursorSdkVendorManifest.ts\";\nimport { untarInto } from \"./untar.ts\";\n\nconst logger = Logger.get(\"packages/typescript/cursor/src/standalone/installCursorSdk.ts\");\n\nconst MARKER_FILENAME = \".alumnium-complete\";\nconst STALE_PARTIAL_AGE_MS = 24 * 60 * 60 * 1000;\n\nlet loadPromise: Promise<CursorSdkModule> | undefined;\n\n// Memoize the promise so concurrent cursor calls don't race each other into\n// parallel downloads; cleared on failure so the next call can retry.\nexport function loadVendoredCursorSdk(): Promise<CursorSdkModule> {\n loadPromise ??= loadVendoredCursorSdkInternal().catch((error) => {\n loadPromise = undefined;\n throw error;\n });\n return loadPromise;\n}\n\nasync function loadVendoredCursorSdkInternal(): Promise<CursorSdkModule> {\n const manifest = cursorSdkVendorManifest;\n\n const explicitDir = Env.ALUMNIUM_CURSOR_SDK_DIR;\n let vendorRoot: string;\n if (explicitDir) {\n vendorRoot = path.resolve(explicitDir);\n await assertExplicitVendorDir(vendorRoot, manifest);\n } else {\n vendorRoot = path.join(\n os.homedir(),\n \".alumnium\",\n \"vendor\",\n \"cursor-sdk\",\n manifest.sdkVersion,\n );\n await ensureVendorTree(manifest, vendorRoot);\n }\n\n return loadSdkFromVendorRoot(manifest, vendorRoot);\n}\n\n/**\n * Makes sure vendorRoot holds the complete manifest closure, downloading it\n * from the npm registry if needed. Installation is atomic: everything is\n * extracted into a sibling partial directory that is renamed into place only\n * after the completion marker is written, so a directory without the marker\n * is always a leftover from a crash and safe to delete.\n */\nexport async function ensureVendorTree(\n manifest: CursorSdkVendorManifest,\n vendorRoot: string,\n): Promise<void> {\n const markerPath = path.join(vendorRoot, MARKER_FILENAME);\n if (await pathExists(markerPath)) return;\n await fs.rm(vendorRoot, { recursive: true, force: true });\n\n const packages = packagesForPlatform(manifest);\n logger.info(\n `Downloading the Cursor SDK (~24 MB, one time) from registry.npmjs.org into ${vendorRoot}`,\n );\n\n const partialDir = `${vendorRoot}.partial-${process.pid}-${crypto.randomUUID().slice(0, 8)}`;\n try {\n for (const pkg of packages) {\n try {\n await retry({ maxAttempts: 3, backOff: 500 }, () =>\n downloadAndExtract(pkg, partialDir),\n );\n } catch (error) {\n throw new Error(\n `Failed to download Cursor SDK package ${pkg.name}@${pkg.version} from registry.npmjs.org: ` +\n `${error instanceof Error ? error.message : String(error)}. ` +\n \"The Cursor provider performs a one-time ~24 MB download on first use. \" +\n \"Check network/proxy settings (HTTPS_PROXY is honored), or point \" +\n \"ALUMNIUM_CURSOR_SDK_DIR at a pre-installed node_modules tree.\",\n { cause: error },\n );\n }\n }\n\n await fs.writeFile(\n path.join(partialDir, MARKER_FILENAME),\n JSON.stringify(\n {\n sdkVersion: manifest.sdkVersion,\n installedAt: new Date().toISOString(),\n platform: `${process.platform}-${process.arch}`,\n },\n null,\n 2,\n ),\n );\n await promoteToVendorRoot(partialDir, markerPath, vendorRoot);\n } finally {\n await fs.rm(partialDir, { recursive: true, force: true }).catch(() => {});\n await sweepStalePartials(vendorRoot);\n }\n}\n\n/**\n * The manifest-closure packages relevant on this machine: everything\n * unrestricted, plus the ripgrep package matching the current platform.\n * Windows-on-ARM falls back to the x64 ripgrep (emulation runs it fine); if\n * no package matches, the SDK degrades gracefully without ripgrep.\n */\nexport function packagesForPlatform(\n manifest: CursorSdkVendorManifest,\n platform: string = process.platform,\n arch: string = process.arch,\n): CursorSdkVendorPackage[] {\n const [universal, platformSpecific] = manifest.packages.reduce<\n [CursorSdkVendorPackage[], CursorSdkVendorPackage[]]\n >(\n ([plain, restricted], pkg) => {\n (pkg.os || pkg.cpu ? restricted : plain).push(pkg);\n return [plain, restricted];\n },\n [[], []],\n );\n\n const ripgrep =\n platformSpecific.find((pkg) => pkg.os === platform && pkg.cpu === arch) ??\n (platform === \"win32\"\n ? platformSpecific.find((pkg) => pkg.os === \"win32\" && pkg.cpu === \"x64\")\n : undefined);\n\n if (!ripgrep) {\n logger.warn(\n `No Cursor ripgrep package for ${platform}-${arch}; Cursor agent file-search tools may be unavailable.`,\n );\n return universal;\n }\n return [...universal, ripgrep];\n}\n\nasync function downloadAndExtract(\n pkg: CursorSdkVendorPackage,\n partialDir: string,\n): Promise<void> {\n const basename = pkg.name.split(\"/\").pop() as string;\n const url = `https://registry.npmjs.org/${pkg.name}/-/${basename}-${pkg.version}.tgz`;\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} fetching ${url}`);\n }\n const tgzBytes = new Uint8Array(await response.arrayBuffer());\n\n const digest = createHash(\"sha512\").update(tgzBytes).digest(\"base64\");\n const expected = pkg.integrity.slice(\"sha512-\".length);\n if (digest !== expected) {\n throw new Error(\n `Integrity check failed for ${pkg.name}@${pkg.version} (expected sha512-${expected}, got sha512-${digest}) — ` +\n \"the download may be corrupted or tampered with; report at \" +\n \"https://github.com/alumnium-hq/alumnium/issues if it persists\",\n );\n }\n\n await untarInto(\n gunzipSync(tgzBytes),\n path.join(partialDir, \"node_modules\", pkg.name),\n );\n}\n\nasync function promoteToVendorRoot(\n partialDir: string,\n markerPath: string,\n vendorRoot: string,\n): Promise<void> {\n for (let attempt = 1; ; attempt++) {\n try {\n await fs.rename(partialDir, vendorRoot);\n return;\n } catch (error) {\n // Another process may have completed the same install first; their\n // tree is as good as ours. Otherwise retry briefly (Windows AV scans\n // hold locks) before giving up.\n if (await pathExists(markerPath)) return;\n if (attempt >= 3) throw error;\n await new Promise((resolve) => setTimeout(resolve, 200 * attempt));\n }\n }\n}\n\nasync function sweepStalePartials(vendorRoot: string): Promise<void> {\n try {\n const parentDir = path.dirname(vendorRoot);\n const prefix = `${path.basename(vendorRoot)}.partial-`;\n for (const entry of await fs.readdir(parentDir)) {\n if (!entry.startsWith(prefix)) continue;\n const entryPath = path.join(parentDir, entry);\n const { mtimeMs } = await fs.stat(entryPath);\n if (Date.now() - mtimeMs > STALE_PARTIAL_AGE_MS) {\n await fs.rm(entryPath, { recursive: true, force: true });\n }\n }\n } catch {\n // Best-effort cleanup of other processes' leftovers.\n }\n}\n\nasync function assertExplicitVendorDir(\n vendorRoot: string,\n manifest: CursorSdkVendorManifest,\n): Promise<void> {\n const manifestPath = path.join(\n vendorRoot,\n \"node_modules\",\n CURSOR_SDK_PACKAGE_NAME,\n \"package.json\",\n );\n\n let installedVersion: string | undefined;\n try {\n installedVersion = (\n JSON.parse(await fs.readFile(manifestPath, \"utf-8\")) as {\n version?: string;\n }\n ).version;\n } catch (error) {\n throw new Error(\n `ALUMNIUM_CURSOR_SDK_DIR is set to ${vendorRoot} but ${manifestPath} cannot be read`,\n { cause: error },\n );\n }\n\n if (installedVersion !== manifest.sdkVersion) {\n logger.warn(\n `ALUMNIUM_CURSOR_SDK_DIR holds @cursor/sdk@${installedVersion}, but this Alumnium build expects ${manifest.sdkVersion}`,\n );\n }\n}\n\n/**\n * Loads the vendored SDK: installs the bare-specifier hook, points the SDK\n * at its ripgrep binary (it probes CURSOR_RIPGREP_PATH first — its own\n * node_modules walk cannot find our vendor tree), and requires the CJS entry\n * by absolute path.\n */\nexport async function loadSdkFromVendorRoot(\n manifest: CursorSdkVendorManifest,\n vendorRoot: string,\n): Promise<CursorSdkModule> {\n const vendorNodeModules = path.join(vendorRoot, \"node_modules\");\n\n installVendorResolveHook(\n vendorRoot,\n new Set(manifest.packages.map((pkg) => pkg.name)),\n );\n\n const ripgrep = packagesForPlatform(manifest).find((pkg) => pkg.bin);\n const ripgrepRelPath =\n ripgrep?.bin?.rg ?? Object.values(ripgrep?.bin ?? {})[0];\n if (ripgrep && ripgrepRelPath) {\n const ripgrepPath = path.join(\n vendorNodeModules,\n ripgrep.name,\n ripgrepRelPath,\n );\n if (await pathExists(ripgrepPath)) {\n if (process.platform !== \"win32\") await fs.chmod(ripgrepPath, 0o755);\n // oxlint-disable-next-line no-process-env -- The SDK locates ripgrep through this variable\n process.env.CURSOR_RIPGREP_PATH ??= ripgrepPath;\n }\n }\n\n const entryPath = resolvePackageEntry(\n vendorNodeModules,\n CURSOR_SDK_PACKAGE_NAME,\n \".\",\n );\n if (!entryPath) {\n throw new Error(\n `Vendored Cursor SDK at ${vendorRoot} is missing or unreadable; delete the directory to reinstall`,\n );\n }\n\n const requireFromVendor = createRequire(\n path.join(vendorNodeModules, CURSOR_SDK_PACKAGE_NAME, \"package.json\"),\n );\n return requireFromVendor(entryPath) as CursorSdkModule;\n}\n\nasync function pathExists(target: string): Promise<boolean> {\n try {\n await fs.access(target);\n return true;\n } catch {\n return false;\n }\n}\n",
|
|
8
|
+
"// Computes the set of npm packages the Cursor SDK needs at runtime by\n// walking the repo lockfile from @cursor/sdk. The result is committed as\n// cursorSdkVendorManifest.ts (via scripts/build/generate-bundles.ts) and drives\n// the download-on-first-use install in installCursorSdk.ts — the compiled\n// binary cannot bundle or redistribute the SDK (webpack-chunked dist,\n// proprietary license), so it vendors exactly the locked closure instead.\n\nexport interface CursorSdkVendorPackage {\n name: string;\n version: string;\n /** npm integrity string (\"sha512-<base64>\") used to verify the tarball. */\n integrity: string;\n /** Platform restriction of optional platform packages (process.platform). */\n os?: string;\n /** CPU restriction of optional platform packages (process.arch). */\n cpu?: string;\n /** Executables the package ships, relative to its root (e.g. bin/rg). */\n bin?: Record<string, string>;\n}\n\nexport interface CursorSdkVendorManifest {\n sdkVersion: string;\n packages: CursorSdkVendorPackage[];\n}\n\nexport const CURSOR_SDK_PACKAGE_NAME = \"@cursor/sdk\";\n\ninterface LockEntry {\n name: string;\n version: string;\n integrity?: string;\n os?: string;\n cpu?: string;\n bin?: Record<string, string>;\n dependencies: Record<string, string>;\n peerDependencies: Record<string, string>;\n optionalDependencies: Record<string, string>;\n}\n\nexport function computeCursorSdkManifest(\n lock: unknown,\n): CursorSdkVendorManifest {\n const lockPackages = extractLockPackages(lock);\n\n if (!(CURSOR_SDK_PACKAGE_NAME in lockPackages)) {\n throw new Error(\n `Lockfile has no \"${CURSOR_SDK_PACKAGE_NAME}\" entry — is the package installed?`,\n );\n }\n\n const collected = new Map<string, CursorSdkVendorPackage>();\n const visitedKeys = new Set<string>();\n // Each queue item is the nesting chain of package names that forms the\n // package's lockfile key (bun.lock scopes conflicting resolutions under\n // \"<parentKey>/<depName>\" keys, mirroring node_modules nesting).\n const queue: string[][] = [[CURSOR_SDK_PACKAGE_NAME]];\n\n while (queue.length) {\n const chain = queue.shift() as string[];\n const key = chain.join(\"/\");\n if (visitedKeys.has(key)) continue;\n visitedKeys.add(key);\n\n const entry = parseLockEntry(key, lockPackages[key]);\n collectPackage(collected, key, entry);\n\n for (const [depNames, optional] of [\n [Object.keys(entry.dependencies), false],\n [Object.keys(entry.peerDependencies), false],\n [Object.keys(entry.optionalDependencies), true],\n ] as const) {\n for (const depName of depNames) {\n const depChain = resolveDependencyKey(lockPackages, chain, depName);\n if (depChain) {\n queue.push(depChain);\n } else if (!optional) {\n throw new Error(\n `Lockfile entry for dependency \"${depName}\" of \"${key}\" not found`,\n );\n }\n }\n }\n }\n\n const sdkVersion = findSdkVersion(collected);\n const packages = [...collected.values()].sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n\n assertClosureSanity(packages);\n\n return { sdkVersion, packages };\n}\n\nfunction extractLockPackages(lock: unknown): Record<string, unknown> {\n if (\n typeof lock !== \"object\" ||\n lock === null ||\n !(\"packages\" in lock) ||\n typeof lock.packages !== \"object\" ||\n lock.packages === null\n ) {\n throw new Error('Lockfile has no \"packages\" object');\n }\n return lock.packages as Record<string, unknown>;\n}\n\n// bun.lock entry: [\"name@version\", \"<registry>\", { deps/os/cpu/bin }?, \"sha512-…\"?]\n// (workspace/file entries have fewer elements and no integrity).\nfunction parseLockEntry(key: string, raw: unknown): LockEntry {\n if (!Array.isArray(raw) || typeof raw[0] !== \"string\") {\n throw new Error(`Malformed lockfile entry for \"${key}\"`);\n }\n\n const nameAtVersion = raw[0];\n const separator = nameAtVersion.lastIndexOf(\"@\");\n if (separator <= 0) {\n throw new Error(`Malformed lockfile entry name for \"${key}\"`);\n }\n\n const meta = raw.find(\n (element): element is Record<string, unknown> =>\n typeof element === \"object\" && element !== null,\n );\n const last = raw[raw.length - 1];\n const integrity =\n typeof last === \"string\" && last.startsWith(\"sha\") ? last : undefined;\n\n return {\n name: nameAtVersion.slice(0, separator),\n version: nameAtVersion.slice(separator + 1),\n ...(integrity === undefined ? {} : { integrity }),\n ...(typeof meta?.os === \"string\" ? { os: meta.os } : {}),\n ...(typeof meta?.cpu === \"string\" ? { cpu: meta.cpu } : {}),\n ...(typeof meta?.bin === \"object\" && meta.bin !== null\n ? { bin: meta.bin as Record<string, string> }\n : {}),\n dependencies: asRecord(meta?.dependencies),\n peerDependencies: asRecord(meta?.peerDependencies),\n optionalDependencies: asRecord(meta?.optionalDependencies),\n };\n}\n\nfunction asRecord(value: unknown): Record<string, string> {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, string>)\n : {};\n}\n\n// Resolves where the lockfile records depName for a package nested at\n// `chain`: first under the package itself, then under each ancestor, then\n// hoisted at the top level — the same shadowing order as node_modules.\nfunction resolveDependencyKey(\n lockPackages: Record<string, unknown>,\n chain: string[],\n depName: string,\n): string[] | undefined {\n for (let depth = chain.length; depth >= 0; depth--) {\n const candidate = [...chain.slice(0, depth), depName];\n if (candidate.join(\"/\") in lockPackages) return candidate;\n }\n return undefined;\n}\n\nfunction collectPackage(\n collected: Map<string, CursorSdkVendorPackage>,\n key: string,\n entry: LockEntry,\n): void {\n if (!entry.integrity?.startsWith(\"sha512-\")) {\n throw new Error(\n `Lockfile entry \"${key}\" has no sha512 integrity — only registry packages can be vendored`,\n );\n }\n\n const existing = collected.get(entry.name);\n if (existing && existing.version !== entry.version) {\n // The vendor tree is a flat node_modules; two versions of one package\n // would collide. Nothing in the current closure does this.\n throw new Error(\n `Cursor SDK closure needs \"${entry.name}\" at both ${existing.version} and ${entry.version}; the flat vendor layout cannot represent that`,\n );\n }\n if (existing) return;\n\n collected.set(entry.name, {\n name: entry.name,\n version: entry.version,\n integrity: entry.integrity,\n ...(entry.os === undefined ? {} : { os: entry.os }),\n ...(entry.cpu === undefined ? {} : { cpu: entry.cpu }),\n ...(entry.bin === undefined ? {} : { bin: entry.bin }),\n });\n}\n\nfunction findSdkVersion(\n collected: Map<string, CursorSdkVendorPackage>,\n): string {\n const sdk = collected.get(CURSOR_SDK_PACKAGE_NAME);\n if (!sdk) {\n throw new Error(`Closure walk did not collect ${CURSOR_SDK_PACKAGE_NAME}`);\n }\n return sdk.version;\n}\n\n// Guards against silently generating a manifest that is missing packages the\n// SDK requires at runtime (verified against @cursor/sdk@1.0.23's dist).\nfunction assertClosureSanity(packages: CursorSdkVendorPackage[]): void {\n const names = new Set(packages.map((pkg) => pkg.name));\n for (const required of [\"undici\", \"@fastify/busboy\", \"zod\"]) {\n if (!names.has(required)) {\n throw new Error(\n `Cursor SDK closure is missing \"${required}\" — the lockfile walk looks broken`,\n );\n }\n }\n if (!packages.some((pkg) => pkg.os && pkg.cpu && pkg.bin)) {\n throw new Error(\n \"Cursor SDK closure has no platform ripgrep package — the lockfile walk looks broken\",\n );\n }\n}\n",
|
|
9
|
+
"// Bare-specifier resolution for the vendored Cursor SDK (installCursorSdk.ts).\n// Compiled single-file binaries load real on-disk files fine but have no\n// node_modules resolution, so a Module._resolveFilename hook maps the bare\n// requires the SDK's dist makes (e.g. \"@connectrpc/connect/protocol\") onto\n// the vendor tree. The hook is parent-scoped: only requires originating from\n// files inside the vendor root are served, so the vendored zod@3/undici@5\n// never leak into the rest of the process.\n\nimport fs from \"node:fs\";\nimport Module from \"node:module\";\nimport path from \"node:path\";\n\nexport interface VendorResolveHookHandle {\n uninstall(): void;\n}\n\nconst installedVendorRoots = new Map<string, VendorResolveHookHandle>();\n\nexport function installVendorResolveHook(\n vendorRoot: string,\n packageNames: ReadonlySet<string>,\n): VendorResolveHookHandle {\n const existing = installedVendorRoots.get(vendorRoot);\n if (existing) return existing;\n\n const vendorNodeModules = path.join(vendorRoot, \"node_modules\");\n const vendorPrefix = vendorRoot + path.sep;\n const resolutionCache = new Map<string, string | undefined>();\n\n const moduleWithResolveFilename = Module as typeof Module & {\n _resolveFilename(this: void, ...args: unknown[]): string;\n };\n\n const resolveFilename = moduleWithResolveFilename._resolveFilename;\n\n moduleWithResolveFilename._resolveFilename = function (...args: unknown[]) {\n const [request, parent] = args as [\n unknown,\n { filename?: string | null } | undefined,\n ];\n\n if (\n typeof request === \"string\" &&\n isBareSpecifier(request) &&\n parent?.filename?.startsWith(vendorPrefix)\n ) {\n let resolved = resolutionCache.get(request);\n if (!resolutionCache.has(request)) {\n const { packageName, subpath } = splitBareSpecifier(request);\n resolved = packageNames.has(packageName)\n ? resolvePackageEntry(vendorNodeModules, packageName, subpath)\n : undefined;\n resolutionCache.set(request, resolved);\n }\n if (resolved) return resolved;\n }\n\n return resolveFilename.call(this, ...args);\n };\n\n const handle: VendorResolveHookHandle = {\n uninstall() {\n moduleWithResolveFilename._resolveFilename = resolveFilename;\n installedVendorRoots.delete(vendorRoot);\n },\n };\n installedVendorRoots.set(vendorRoot, handle);\n return handle;\n}\n\nfunction isBareSpecifier(request: string): boolean {\n return (\n !request.startsWith(\".\") &&\n !path.isAbsolute(request) &&\n !request.startsWith(\"node:\") &&\n !request.startsWith(\"bun:\")\n );\n}\n\nfunction splitBareSpecifier(request: string): {\n packageName: string;\n subpath: string;\n} {\n const segments = request.split(\"/\");\n const nameLength = request.startsWith(\"@\") ? 2 : 1;\n return {\n packageName: segments.slice(0, nameLength).join(\"/\"),\n subpath:\n segments.length > nameLength\n ? `./${segments.slice(nameLength).join(\"/\")}`\n : \".\",\n };\n}\n\n/**\n * Resolves a package subpath (`\".\"` or `\"./sub/path\"`) to an absolute file\n * inside the vendor node_modules, honoring the package's `exports` map or\n * falling back to `main`/index with extension probing.\n */\nexport function resolvePackageEntry(\n vendorNodeModules: string,\n packageName: string,\n subpath: string,\n): string | undefined {\n const packageDir = path.join(vendorNodeModules, packageName);\n const manifest = readPackageManifest(packageDir);\n if (!manifest) return undefined;\n\n if (manifest.exports != null) {\n const target = lookupExports(manifest.exports, subpath);\n return target === undefined\n ? undefined\n : resolveExportTarget(packageDir, target);\n }\n\n const candidate =\n subpath === \".\"\n ? typeof manifest.main === \"string\"\n ? manifest.main\n : \"index.js\"\n : subpath;\n return probeFile(path.join(packageDir, candidate));\n}\n\ninterface PackageManifest {\n main?: unknown;\n exports?: unknown;\n}\n\nconst manifestCache = new Map<string, PackageManifest | undefined>();\n\nfunction readPackageManifest(packageDir: string): PackageManifest | undefined {\n if (!manifestCache.has(packageDir)) {\n let manifest: PackageManifest | undefined;\n try {\n manifest = JSON.parse(\n fs.readFileSync(path.join(packageDir, \"package.json\"), \"utf-8\"),\n ) as PackageManifest;\n } catch {\n manifest = undefined;\n }\n manifestCache.set(packageDir, manifest);\n }\n return manifestCache.get(packageDir);\n}\n\nfunction lookupExports(exports: unknown, subpath: string): unknown {\n // Sugar forms: a bare target or a conditions object (no \".\"-prefixed\n // keys) stand for { \".\": <exports> }.\n const isSubpathMap =\n typeof exports === \"object\" &&\n exports !== null &&\n !Array.isArray(exports) &&\n Object.keys(exports).every((key) => key === \".\" || key.startsWith(\"./\"));\n\n if (!isSubpathMap) return subpath === \".\" ? exports : undefined;\n\n const map = exports as Record<string, unknown>;\n if (subpath in map) return map[subpath];\n\n // Single-asterisk pattern fallback (none in the current SDK closure).\n for (const [key, value] of Object.entries(map)) {\n const asterisk = key.indexOf(\"*\");\n if (asterisk < 0 || key.indexOf(\"*\", asterisk + 1) >= 0) continue;\n const prefix = key.slice(0, asterisk);\n const suffix = key.slice(asterisk + 1);\n if (\n subpath.length > prefix.length + suffix.length &&\n subpath.startsWith(prefix) &&\n subpath.endsWith(suffix)\n ) {\n const wildcard = subpath.slice(\n prefix.length,\n subpath.length - suffix.length,\n );\n return typeof value === \"string\"\n ? value.replaceAll(\"*\", wildcard)\n : value;\n }\n }\n return undefined;\n}\n\n// The vendored SDK is loaded over CJS require, so of the standard export\n// conditions only these apply.\nconst ACCEPTED_CONDITIONS = new Set([\"require\", \"node\", \"default\"]);\n\nfunction resolveExportTarget(\n packageDir: string,\n target: unknown,\n): string | undefined {\n if (typeof target === \"string\") {\n if (!target.startsWith(\"./\")) return undefined;\n const resolved = path.join(packageDir, target);\n return isFile(resolved) ? resolved : undefined;\n }\n\n if (Array.isArray(target)) {\n for (const entry of target) {\n const resolved = resolveExportTarget(packageDir, entry);\n if (resolved) return resolved;\n }\n return undefined;\n }\n\n if (typeof target === \"object\" && target !== null) {\n for (const [condition, value] of Object.entries(target)) {\n if (!ACCEPTED_CONDITIONS.has(condition)) continue;\n const resolved = resolveExportTarget(packageDir, value);\n if (resolved) return resolved;\n }\n }\n\n return undefined;\n}\n\nfunction probeFile(candidate: string): string | undefined {\n for (const probe of [\n candidate,\n `${candidate}.js`,\n `${candidate}.json`,\n path.join(candidate, \"index.js\"),\n path.join(candidate, \"index.json\"),\n ]) {\n if (isFile(probe)) return probe;\n }\n return undefined;\n}\n\nfunction isFile(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n",
|
|
10
|
+
"// This file is auto-generated by scripts/build/generate-bundles.ts. Do not edit it directly.\n\nimport type { CursorSdkVendorManifest } from \"./cursorSdkManifest.ts\";\n\nexport const cursorSdkVendorManifest: CursorSdkVendorManifest = {\n sdkVersion: \"1.0.30\",\n packages: [\n {\n name: \"@bufbuild/protobuf\",\n version: \"1.10.0\",\n integrity:\n \"sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==\",\n },\n {\n name: \"@connectrpc/connect\",\n version: \"1.7.0\",\n integrity:\n \"sha512-iNKdJRi69YP3mq6AePRT8F/HrxWCewrhxnLMNm0vpqXAR8biwzRtO6Hjx80C6UvtKJ5sFmffQT7I4Baecz389w==\",\n },\n {\n name: \"@connectrpc/connect-node\",\n version: \"1.7.0\",\n integrity:\n \"sha512-6vaPIkG/NyhxlYgytLoR9KYbPhczEboFB2OYWkA9qvUz1K7efXfeGrlRxoLtpa+r8VxyIOw73w5ktNe743nD+A==\",\n },\n {\n name: \"@connectrpc/connect-web\",\n version: \"1.7.0\",\n integrity:\n \"sha512-qyP0YOnUPRWwCc/VfsoydMJvkb7EyUPr2q9sHgBuJzbADjiqck1gKH5V5ZPzPhTLBvmz5UvG+wiZ5sMRQHU1MQ==\",\n },\n {\n name: \"@cursor/sdk\",\n version: \"1.0.30\",\n integrity:\n \"sha512-s3gIXfTD3w8ys+KFE81JjjoiJcynkHsf/JCDyXrnbliIac3dkT59hwYZII3XhsT1DlXIfqg+YzSMru6w1CkZow==\",\n },\n {\n name: \"@cursor/sdk-darwin-arm64\",\n version: \"1.0.30\",\n integrity:\n \"sha512-O0w2fLd6jxrvAUOJGsKBs8VSi5OojqqEOMFBzHTHS82wU/DX3ZlizK3czzCXxDKs3l8j/BVQwVCxP9jMFcf41Q==\",\n os: \"darwin\",\n cpu: \"arm64\",\n bin: {\n rg: \"bin/rg\",\n },\n },\n {\n name: \"@cursor/sdk-darwin-x64\",\n version: \"1.0.30\",\n integrity:\n \"sha512-TdjreV7V6gtSKbUaXDarfE1735PES6uzLgLxp42E5kT6EXpjQhKsifdsYOMdsO/RBw166kya/XxG24L/FUfEHA==\",\n os: \"darwin\",\n cpu: \"x64\",\n bin: {\n rg: \"bin/rg\",\n },\n },\n {\n name: \"@cursor/sdk-linux-arm64\",\n version: \"1.0.30\",\n integrity:\n \"sha512-1+bsmri6vJ2YuqL/SQ6QSx/ymu2eBzjGgT1bTgN47tCzxDgNOKacXtghpx4zdHM5AmOtT+aLXVVxXjStXmNtcA==\",\n os: \"linux\",\n cpu: \"arm64\",\n bin: {\n rg: \"bin/rg\",\n },\n },\n {\n name: \"@cursor/sdk-linux-x64\",\n version: \"1.0.30\",\n integrity:\n \"sha512-5TRAM1xNwVr0Lox2ay5U5h+VY1OeqJLgnS28da7mx+ZkmeAU+hzuUFq2/lcIqoJrp2qBRdUH5WzI44JNtjBKmg==\",\n os: \"linux\",\n cpu: \"x64\",\n bin: {\n rg: \"bin/rg\",\n },\n },\n {\n name: \"@cursor/sdk-win32-x64\",\n version: \"1.0.30\",\n integrity:\n \"sha512-kVjpWmLTFLL131TQm3ytz1HbAeyjBRAHMtr6vyLtbBMuLBb0la5igvt58Xi8mXwekymWXim1+rZj7ZYUO3K1rw==\",\n os: \"win32\",\n cpu: \"x64\",\n bin: {\n rg: \"bin/rg.exe\",\n },\n },\n {\n name: \"@fastify/busboy\",\n version: \"2.1.1\",\n integrity:\n \"sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==\",\n },\n {\n name: \"@statsig/client-core\",\n version: \"3.31.0\",\n integrity:\n \"sha512-SuxQD6TmVszPG7FoMKwTk/uyBuVFk7XnxI3T/E0uyb7PL7GNjONtfsoh+NqBBVUJVse0CUeSFfgJPoZy1ZOslQ==\",\n },\n {\n name: \"@statsig/js-client\",\n version: \"3.31.0\",\n integrity:\n \"sha512-LFa5E0LjT6sTfZv3sNGoyRLSZ1078+agdgOA+Vm1ecjG+KbSOfBLTW7hMwimrJ29slRwbYDzbtKaPJo/R37N2g==\",\n },\n {\n name: \"undici\",\n version: \"5.29.0\",\n integrity:\n \"sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==\",\n },\n {\n name: \"zod\",\n version: \"3.25.76\",\n integrity:\n \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n },\n ],\n};\n",
|
|
11
|
+
"// Minimal tar extractor for npm registry tarballs (installCursorSdk.ts).\n// Registry tarballs are constrained — ustar/pax with regular files and\n// directories only — so a small reader with an explicit security posture\n// (reject absolute paths, \"..\", and link entries) is preferred over adding\n// a tar dependency that npm-package users would install but never run.\n\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst BLOCK_SIZE = 512;\n\nconst OFFSETS = {\n name: [0, 100],\n mode: [100, 8],\n size: [124, 12],\n checksum: [148, 8],\n typeflag: 156,\n prefix: [345, 155],\n} as const;\n\n/**\n * Extracts a (gunzipped) npm package tarball into destDir, stripping the\n * tarball's single root directory (usually \"package/\") the way npm does.\n */\nexport async function untarInto(\n tarBytes: Uint8Array,\n destDir: string,\n): Promise<void> {\n let offset = 0;\n // A pax \"x\" or GNU \"L\" entry overrides the following entry's path.\n let pendingPath: string | undefined;\n\n while (offset + BLOCK_SIZE <= tarBytes.length) {\n const header = tarBytes.subarray(offset, offset + BLOCK_SIZE);\n if (isZeroBlock(header)) break;\n verifyChecksum(header);\n\n const size = readNumeric(header, ...OFFSETS.size);\n const dataStart = offset + BLOCK_SIZE;\n if (dataStart + size > tarBytes.length) {\n throw new Error(\"Truncated tar archive\");\n }\n const data = tarBytes.subarray(dataStart, dataStart + size);\n offset = dataStart + Math.ceil(size / BLOCK_SIZE) * BLOCK_SIZE;\n\n const typeflag = String.fromCharCode(header[OFFSETS.typeflag] ?? 0);\n\n if (typeflag === \"x\") {\n pendingPath = parsePaxPath(data) ?? pendingPath;\n continue;\n }\n if (typeflag === \"L\") {\n pendingPath = decodeToNul(data);\n continue;\n }\n if (typeflag === \"1\" || typeflag === \"2\") {\n throw new Error(\n `Tar entry \"${decodeToNul(header.subarray(...spanOf(OFFSETS.name)))}\" is a link; links are not allowed in npm tarballs`,\n );\n }\n if (typeflag !== \"0\" && typeflag !== \"\\0\" && typeflag !== \"5\") {\n // Other entry types (pax globals, GNU extensions) carry no payload we\n // need; their data has already been skipped over.\n pendingPath = undefined;\n continue;\n }\n\n const entryPath = pendingPath ?? ustarPath(header);\n pendingPath = undefined;\n\n // Drop the tarball's root directory. npm strips the first path segment\n // whatever it is named, so entries at the root itself vanish.\n const segments = sanitizedSegments(entryPath).slice(1);\n if (!segments.length) continue;\n const target = path.join(destDir, ...segments);\n\n if (typeflag === \"5\") {\n await fs.mkdir(target, { recursive: true });\n continue;\n }\n\n await fs.mkdir(path.dirname(target), { recursive: true });\n const mode = readNumeric(header, ...OFFSETS.mode);\n await fs.writeFile(target, data, {\n mode: mode & 0o111 ? 0o755 : 0o644,\n });\n }\n}\n\nfunction spanOf(field: readonly [number, number]): [number, number] {\n return [field[0], field[0] + field[1]];\n}\n\nfunction isZeroBlock(block: Uint8Array): boolean {\n return block.every((byte) => byte === 0);\n}\n\nfunction verifyChecksum(header: Uint8Array): void {\n const stored = readNumeric(header, ...OFFSETS.checksum);\n const [checksumStart, checksumEnd] = spanOf(OFFSETS.checksum);\n\n let computed = 0;\n for (let index = 0; index < BLOCK_SIZE; index++) {\n computed +=\n index >= checksumStart && index < checksumEnd\n ? 0x20\n : (header[index] as number);\n }\n\n if (computed !== stored) {\n throw new Error(\"Tar header checksum mismatch — the archive is corrupted\");\n }\n}\n\n// Tar numeric fields are NUL/space-terminated ASCII octal, or base-256\n// (leading byte with the high bit set) for values that do not fit.\nfunction readNumeric(\n header: Uint8Array,\n start: number,\n length: number,\n): number {\n const first = header[start] as number;\n\n if (first & 0x80) {\n let value = first & 0x7f;\n for (let index = start + 1; index < start + length; index++) {\n value = value * 256 + (header[index] as number);\n }\n return value;\n }\n\n const text = decodeToNul(header.subarray(start, start + length)).trim();\n return text ? Number.parseInt(text, 8) : 0;\n}\n\nfunction decodeToNul(bytes: Uint8Array): string {\n const nul = bytes.indexOf(0);\n return new TextDecoder().decode(nul < 0 ? bytes : bytes.subarray(0, nul));\n}\n\nfunction ustarPath(header: Uint8Array): string {\n const name = decodeToNul(header.subarray(...spanOf(OFFSETS.name)));\n const prefix = decodeToNul(header.subarray(...spanOf(OFFSETS.prefix)));\n return prefix ? `${prefix}/${name}` : name;\n}\n\n// Pax extended header data is a sequence of \"<byteLength> <key>=<value>\\n\"\n// records. Decoded as latin1 so string indices equal byte offsets; values\n// are re-decoded as UTF-8.\nfunction parsePaxPath(data: Uint8Array): string | undefined {\n const text = Buffer.from(data).toString(\"latin1\");\n let cursor = 0;\n let result: string | undefined;\n\n while (cursor < text.length) {\n const lengthEnd = text.indexOf(\" \", cursor);\n if (lengthEnd < 0) break;\n const recordLength = Number(text.slice(cursor, lengthEnd));\n if (!Number.isInteger(recordLength) || recordLength <= 0) break;\n const recordEnd = cursor + recordLength;\n\n const equals = text.indexOf(\"=\", lengthEnd + 1);\n if (equals > 0 && equals < recordEnd) {\n const key = text.slice(lengthEnd + 1, equals);\n if (key === \"path\") {\n const value = text.slice(equals + 1, recordEnd - 1);\n result = Buffer.from(value, \"latin1\").toString(\"utf8\");\n }\n }\n\n cursor = recordEnd;\n }\n\n return result;\n}\n\nfunction sanitizedSegments(entryPath: string): string[] {\n if (entryPath.startsWith(\"/\") || /^[A-Za-z]:/.test(entryPath)) {\n throw new Error(`Tar entry \"${entryPath}\" has an absolute path`);\n }\n\n const segments = entryPath\n .split(\"/\")\n .filter((segment) => segment !== \"\" && segment !== \".\");\n\n for (const segment of segments) {\n if (segment === \"..\" || segment.includes(\"\\\\\") || segment.includes(\":\")) {\n throw new Error(`Tar entry \"${entryPath}\" has an unsafe path`);\n }\n }\n\n return segments;\n}\n"
|
|
12
|
+
],
|
|
13
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAe,IAAf;AACe,IAAf;AACiB,IAAjB;AASO,IARP;AAgBkB,IAAlB;AACuB,IAAvB;AAUA,IAAM,SAAS,uBAAO,IAAI,2DAA2D;AACrF,IAAM,eAAe;AAAA;AAAA;AAAA;AAIrB,IAAM,oBAAoB,aAAE,OAAO;AAAA,EACjC,YAAY,aAAE,MACZ,aAAE,OAAO;AAAA,IACP,MAAM,aAAE,OAAO;AAAA,IACf,WAAW,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,IACtD,MAAM,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACnD,CAAC,CACH;AACF,CAAC;AAAA;AAGM,MAAM,oBAA+C;AAAA,EACjD,uBAAuB;AAAA,EACvB,WAAW;AAAA,EACX;AAAA,EACA,gBAA0C,CAAC;AAAA,EACpD;AAAA,EACA,WAAW;AAAA,EAEX,WAAW,CAAC,SAAqC;AAAA,IAC/C,KAAK,UAAU,QAAQ;AAAA,IACvB,KAAK,WAAW;AAAA;AAAA,OAGZ,WAAU,CACd,SACwC;AAAA,IACxC,MAAM,QAAQ,iBAAiB,QAAQ,WAAW;AAAA,IAClD,IAAI;AAAA,MACF,OAAO,MAAM,KAAK,cAAc,SAAS,KAAK;AAAA,MAC9C,OAAO,OAAO;AAAA,MACd,QAAQ,aAAa,eAAe;AAAA,MACpC,IACE,KAAK,YACL,iBAAiB,SACjB,MAAM,SAAS,wBACf,WAAW,KAAK,MAAM,OAAO,GAC7B;AAAA,QACA,OAAO,KACL,8DACF;AAAA,QACA,KAAK,WAAW;AAAA,QAChB,OAAO,MAAM,KAAK,WAAW,OAAO;AAAA,MACtC;AAAA,MACA,IACE,iBAAiB,UAChB,MAAM,SAAS,oBACd,MAAM,SAAS,mBACd,iBAAiB,UAAS,MAAM,gBAAgB,OACnD;AAAA,QACA,MAAM,IAAI,6BAAa;AAAA,UACrB,SAAS,MAAM;AAAA,UACf,KAAK;AAAA,UACL,mBAAmB,EAAE,OAAO,KAAK,QAAQ;AAAA,UACzC,aAAa;AAAA,UACb,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,MAAM;AAAA,cACN;AAAA,MACA,MAAM,QAAQ;AAAA;AAAA;AAAA,OAKZ,SAAQ,CACZ,SACsC;AAAA,IACtC,MAAM,SAAS,MAAM,KAAK,WAAW,OAAO;AAAA,IAC5C,OAAO;AAAA,MACL,QAAQ,IAAI,eAA0C;AAAA,QACpD,KAAK,CAAC,YAAY;AAAA,UAChB,WAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,UAAU,OAAO;AAAA,UACnB,CAAC;AAAA,UACD,WAAW,QAAQ,EAAE,MAAM,wBAAwB,OAAO,SAAS,CAAC;AAAA,UACpE,WAAW,QAAQ,OAAO,SAAS;AAAA,YACjC,IAAI,KAAK,SAAS,QAAQ;AAAA,cACxB,MAAM,KAAK,OAAO,WAAW;AAAA,cAC7B,WAAW,QAAQ,EAAE,MAAM,cAAc,GAAG,CAAC;AAAA,cAC7C,WAAW,QAAQ,EAAE,MAAM,cAAc,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,cAC/D,WAAW,QAAQ,EAAE,MAAM,YAAY,GAAG,CAAC;AAAA,YAC7C,EAAO,SAAI,KAAK,SAAS,aAAa;AAAA,cACpC,WAAW,QAAQ,IAAI;AAAA,YACzB;AAAA,UACF;AAAA,UACA,WAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,OAAO,OAAO;AAAA,YACd,cAAc,OAAO;AAAA,UACvB,CAAC;AAAA,UACD,WAAW,MAAM;AAAA;AAAA,MAErB,CAAC;AAAA,IACH;AAAA;AAAA,OAGI,aAAa,CACjB,SACA,OACwC;AAAA,IACxC,MAAM,SAAS,QAAQ;AAAA,IACvB,QAAQ,eAAe;AAAA,IACvB,MAAM,SAAS,gBAAgB,OAAO;AAAA,IACtC,MAAM,WAAW,iBAAiB,OAAO;AAAA,IACzC,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,SAAS,aAAa,eAAe,CAAC;AAAA,IACxE,MAAM,OAAO,MAAM,wBAAG,QAAQ,yBAAK,KAAK,uBAAG,OAAO,GAAG,kBAAkB,CAAC;AAAA,IACxE,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,MAAM,MAAM,yBAAK,KAAK,MAAM,WAAW;AAAA,MACvC,MAAM,wBAAG,MAAM,GAAG;AAAA,MAClB,MAAM,QAAQ,IAAI,IAAI,qBAAqB,yBAAK,KAAK,MAAM,OAAO,CAAC;AAAA,MACnE,QAAQ,eAAe;AAAA,MACvB,QAAQ,MAAM,MAAM,IAClB,IAAI,MAAM,OAAO;AAAA,WACX,KAAK,SAAS,SAAS,EAAE,QAAQ,KAAK,SAAS,OAAO,IAAI,CAAC;AAAA,QAC/D,OAAO,EAAE,IAAI,KAAK,QAAQ;AAAA,QAC1B,OAAO;AAAA,UACL;AAAA,UACA,gBAAgB,CAAC;AAAA,UACjB,gBAAgB,EAAE,SAAS,KAAK,SAAS;AAAA,UACzC;AAAA,QACF;AAAA,MACF,CAAC,GACD,OAAO,cAAc;AAAA,QACnB,IAAI;AAAA,UACF,UAAU,MAAM;AAAA,kBAChB;AAAA,UACA,MAAM,wBAAG,GAAG,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA;AAAA,OAGxD;AAAA,MACA,MAAM,QAAQ,MAAM,KAClB,OACA;AAAA,QACE,MAAM,CAAC,OAAO,MAAM,cAAc,QAAQ,EACvC,OAAO,OAAO,EACd,KAAK;AAAA;AAAA,CAAM;AAAA,QACd,QAAQ,OAAO;AAAA,MACjB,GACA,KACF;AAAA,MACA,MAAM,SAAS,CAAC,MAAM,KAAK;AAAA,MAC3B,IAAI;AAAA,MACJ,IAAI;AAAA,QACF,UAAU,cAAc,MAAM,UAAU,IAAI,OAAO;AAAA,QACnD,OAAO,OAAO;AAAA,QACd,MAAM,QAAQ,MAAM,KAClB,OACA;AAAA,UACE,MAAM,oCAAoC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA;AAAA,EAAsD;AAAA,QACvJ,GACA,KACF;AAAA,QACA,OAAO,KAAK,MAAM,KAAK;AAAA,QACvB,UAAU,cAAc,MAAM,UAAU,IAAI,OAAO;AAAA;AAAA,MAErD,OAAO;AAAA,QACL;AAAA,QACA,cAAc;AAAA,UACZ,SAAS,QAAQ,KAAK,CAAC,SAAS,KAAK,SAAS,WAAW,IACrD,eACA;AAAA,UACJ,KAAK;AAAA,QACP;AAAA,QACA,OAAO,QAAQ,MAAM;AAAA,QACrB,UAAU,CAAC;AAAA,QACX,UAAU,EAAE,IAAI,MAAM,IAAI,SAAS,KAAK,QAAQ;AAAA,MAClD;AAAA,cACA;AAAA,MACA,IAAI;AAAA,QACF,OAAO,MAAM;AAAA,gBACb;AAAA,QACA,MAAM,wBAAG,GAAG,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA;AAAA;AAAA;AAI1D;AAEA,eAAe,aAAa,GAA6B;AAAA,EACvD,OAAc;AAAA;AAGhB,SAAS,eAAe,CAAC,SAGvB;AAAA,EACA,MAAM,SAAqB,CAAC;AAAA,EAC5B,MAAM,WAAW,QAAQ,OAAO,IAAI,CAAC,YAAY;AAAA,IAC/C,MAAM,OACJ,QAAQ,SAAS,WACb,QAAQ,UACR,QAAQ,QACL,IAAI,CAAC,SAAS;AAAA,MACb,IAAI,KAAK,SAAS,UAAU,KAAK,SAAS;AAAA,QACxC,OAAO,KAAK;AAAA,MACd,IAAI,KAAK,SAAS;AAAA,QAChB,OAAO,KAAK,UAAU;AAAA,UACpB,cAAc,KAAK;AAAA,UACnB,MAAM,KAAK;AAAA,UACX,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH,IAAI,KAAK,SAAS;AAAA,QAChB,OAAO,KAAK,UAAU;AAAA,UACpB,cAAc,KAAK;AAAA,UACnB,MAAM,KAAK;AAAA,UACX,QAAQ,KAAK;AAAA,QACf,CAAC;AAAA,MACH,IAAI,KAAK,SAAS,UAAU,KAAK,UAAU,WAAW,QAAQ,GAAG;AAAA,QAC/D,IAAI,KAAK,KAAK,SAAS;AAAA,UAAO,OAAO,KAAK,KAAK,IAAI,SAAS;AAAA,QAC5D,IAAI,KAAK,KAAK,SAAS,QAAQ;AAAA,UAC7B,OAAO,KAAK;AAAA,YACV,UAAU,KAAK;AAAA,YACf,MACE,OAAO,KAAK,KAAK,SAAS,WACtB,KAAK,KAAK,OACV,OAAO,KAAK,KAAK,KAAK,IAAI,EAAE,SAAS,QAAQ;AAAA,UACrD,CAAC;AAAA,UACD,OAAO,UAAU,OAAO;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,MAAM,IAAI,8CAA8B;AAAA,QACtC,eAAe,uBAAuB,KAAK;AAAA,MAC7C,CAAC;AAAA,KACF,EACA,KAAK;AAAA,CAAI;AAAA,IAClB,MAAM,OAAO,QAAQ,SAAS,SAAS,gBAAgB,QAAQ;AAAA,IAC/D,OAAO,IAAI;AAAA,EAAU;AAAA,IAAW;AAAA,GACjC;AAAA,EACD,OAAO,EAAE,MAAM,SAAS,KAAK;AAAA;AAAA,CAAM,GAAG,OAAO;AAAA;AAG/C,SAAS,gBAAgB,CAAC,SAA6C;AAAA,EACrE,IAAI,QAAQ,gBAAgB,SAAS,QAAQ;AAAA,IAC3C,OAAO;AAAA;AAAA,EAA2E,QAAQ,eAAe,eAAe;AAAA,eAAoB,KAAK,UAAU,QAAQ,eAAe,UAAU,CAAC,CAAC;AAAA,EAChM;AAAA,EACA,MAAM,QAAQ,YAAY,OAAO;AAAA,EACjC,IAAI,CAAC,MAAM;AAAA,IAAQ,OAAO;AAAA,EAC1B,OAAO;AAAA;AAAA;AAAA,EAGP,KAAK,UAAU,KAAK;AAAA;AAAA;AAAA;AAAA,EAIpB,QAAQ,YAAY,SAAS,cAAc,QAAQ,YAAY,SAAS,SAAS,oDAAoD;AAAA;AAGvI,SAAS,WAAW,CAAC,SAAqC;AAAA,EACxD,IAAI,QAAQ,YAAY,SAAS;AAAA,IAAQ,OAAO,CAAC;AAAA,EACjD,QAAQ,QAAQ,SAAS,CAAC,GACvB,IAAI,CAAC,SAAS;AAAA,IACb,IAAI,KAAK,SAAS;AAAA,MAChB,MAAM,IAAI,8CAA8B;AAAA,QACtC,eAAe;AAAA,MACjB,CAAC;AAAA,IACH,OAAO;AAAA,GACR,EACA,OACC,CAAC,SACC,QAAQ,YAAY,SAAS,UAC7B,KAAK,SAAS,QAAQ,WAAW,QACrC;AAAA;AAGJ,SAAS,aAAa,CACpB,MACA,SAC0C;AAAA,EAC1C,IAAI,QAAQ,gBAAgB,SAAS;AAAA,IACnC,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,UAAU,IAAI,CAAC,EAAE,CAAC;AAAA,EACjE,MAAM,QAAQ,YAAY,OAAO;AAAA,EACjC,IAAI,CAAC,MAAM;AAAA,IAAQ,OAAO,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,EACjD,MAAM,QAAQ,kBAAkB,MAAM,UAAU,IAAI,CAAC,EAAE;AAAA,EACvD,IACE,CAAC,MAAM,WACN,QAAQ,YAAY,SAAS,cAC5B,QAAQ,YAAY,SAAS;AAAA,IAE/B,MAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,IACzB,IAAI,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK,IAAI;AAAA,MAC/C,MAAM,IAAI,MAAM,+BAA+B,KAAK,MAAM;AAAA,IAC5D,OAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY,QAAQ,OAAO,WAAW;AAAA,MACtC,UAAU,KAAK;AAAA,MACf,OAAO,KAAK,UAAU,KAAK,aAAa,KAAK,QAAQ,CAAC,CAAC;AAAA,IACzD;AAAA,GACD;AAAA;AAGH,SAAS,SAAS,CAAC,MAAuB;AAAA,EAExC,IAAI;AAAA,IACF,OAAO,KAAK,MAAM,IAAI;AAAA,IACtB,MAAM;AAAA,EACR,MAAM,QAAQ,KAAK,OAAO,MAAM;AAAA,EAChC,IAAI,QAAQ;AAAA,EACZ,IAAI,SAAS;AAAA,EACb,IAAI,UAAU;AAAA,EACd,SAAS,QAAQ,MAAO,SAAS,KAAK,QAAQ,KAAK,QAAQ,SAAS;AAAA,IAClE,MAAM,OAAO,KAAK;AAAA,IAClB,IAAI;AAAA,MAAS,UAAU;AAAA,IAClB,SAAI,UAAU,SAAS;AAAA,MAAM,UAAU;AAAA,IACvC,SAAI,SAAS;AAAA,MAAK,SAAS,CAAC;AAAA,IAC5B,SAAI,CAAC,QAAQ;AAAA,MAChB,IAAI,SAAS,OAAO,SAAS;AAAA,QAAK;AAAA,MAC7B,UAAK,SAAS,OAAO,SAAS,QAAQ,EAAE,UAAU;AAAA,QACrD,OAAO,KAAK,MAAM,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM,sCAAsC;AAAA;AAGxD,eAAe,IAAI,CACjB,OACA,SACA,OACoB;AAAA,EACpB,MAAM,QAAQ,eAAe;AAAA,EAC7B,MAAM,MAAM,MAAM,MAAM,IAAI,MAAM,KAAK,OAAO,GAAG,CAAC,YAAY;AAAA,IACvD,QAAQ,OAAO,EAAE,MAAM,MAAM,EAAE;AAAA,GACrC;AAAA,EACD,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,MAAM,MAAM,IAAI,IAAI,KAAK,CAAC;AAAA,IACnC,OAAO,OAAO;AAAA,IACT,IAAI,OAAO,EAAE,MAAM,MAAM,EAAE;AAAA,IAChC,MAAM;AAAA;AAAA,EAER,IAAI,OAAO,WAAW;AAAA,IACpB,MAAM,IAAI,MACR,oBAAoB,OAAO,WAAW,OAAO,OAAO,WAAW,oBACjE;AAAA,EACF,OAAO;AAAA;AAGT,SAAS,gBAAgB,CAAC,QAAsB;AAAA,EAC9C,QAAQ,eAAe;AAAA,EAGvB,IAAI,UAAU,MAAM;AAAA,EACpB,MAAM,UAAU,IAAI,QAAe,CAAC,GAAG,WAAW;AAAA,IAChD,UAAU,MAAM,OAAO,QAAQ,MAAM;AAAA,IACrC,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,GAC1D;AAAA,EACD,OAAO;AAAA,IACL;AAAA,SACM,IAAM,CACV,SACA,cACY;AAAA,MACZ,IAAI,CAAC;AAAA,QAAQ,OAAO;AAAA,MACpB,OAAO,QAAQ,KAAK;AAAA,QAClB,QAAQ,KAAK,OAAO,UAAU;AAAA,UAC5B,IAAI,OAAO,SAAS;AAAA,YAClB,MAAM,eAAe,KAAK;AAAA,YAC1B,OAAO,eAAe;AAAA,UACxB;AAAA,UACA,OAAO;AAAA,SACR;AAAA,QACD;AAAA,MACF,CAAC;AAAA;AAAA,IAEH,OAAO,GAAG;AAAA,MACR,QAAQ,oBAAoB,SAAS,OAAO;AAAA;AAAA,EAEhD;AAAA;AAGF,SAAS,OAAO,CACd,QACwC;AAAA,EACxC,MAAM,WAAW,OAAO,OAAO,CAAC,UAAU,UAAU,SAAS;AAAA,EAC7D,SAAS,GAAG,CAAC,KAAuB;AAAA,IAClC,OAAO,SAAS,KAAK,CAAC,UAAU,MAAM,SAAS,SAAS,IACpD,SAAS,OAAO,CAAC,OAAO,UAAU,SAAS,MAAM,QAAQ,IAAI,CAAC,IAC9D;AAAA;AAAA,EAEN,MAAM,UAAU,IAAI,aAAa;AAAA,EACjC,MAAM,YAAY,IAAI,iBAAiB;AAAA,EACvC,MAAM,aAAa,IAAI,kBAAkB;AAAA,EACzC,OAAO;AAAA,IACL,aAAa;AAAA,MACX,OACE,YAAY,YACR,YACA,WAAW,aAAa,MAAM,cAAc;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,cAAc;AAAA,MACZ,OAAO,IAAI,cAAc;AAAA,MACzB,MAAM;AAAA,MACN,WAAW,IAAI,iBAAiB;AAAA,IAClC;AAAA,EACF;AAAA;;AC5aK,IANP;;;ACU2B,IAA3B;AACe,IAAf;AAC8B,IAA9B;AACe,IAAf;AACiB,IAAjB;AAC2B,IAA3B;AACmC,IAAnC;;;ACSO,IAAM,0BAA0B;;;ACjBxB,IAAf;AACmB,IAAnB;AACiB,IAAjB;AAMA,IAAM,uBAAuB,IAAI;AAE1B,SAAS,wBAAwB,CACtC,YACA,cACyB;AAAA,EACzB,MAAM,WAAW,qBAAqB,IAAI,UAAU;AAAA,EACpD,IAAI;AAAA,IAAU,OAAO;AAAA,EAErB,MAAM,oBAAoB,0BAAK,KAAK,YAAY,cAAc;AAAA,EAC9D,MAAM,eAAe,aAAa,0BAAK;AAAA,EACvC,MAAM,kBAAkB,IAAI;AAAA,EAE5B,MAAM,4BAA4B;AAAA,EAIlC,MAAM,kBAAkB,0BAA0B;AAAA,EAElD,0BAA0B,mBAAmB,QAAS,IAAI,MAAiB;AAAA,IACzE,OAAO,SAAS,UAAU;AAAA,IAK1B,IACE,OAAO,YAAY,YACnB,gBAAgB,OAAO,KACvB,QAAQ,UAAU,WAAW,YAAY,GACzC;AAAA,MACA,IAAI,WAAW,gBAAgB,IAAI,OAAO;AAAA,MAC1C,IAAI,CAAC,gBAAgB,IAAI,OAAO,GAAG;AAAA,QACjC,QAAQ,aAAa,YAAY,mBAAmB,OAAO;AAAA,QAC3D,WAAW,aAAa,IAAI,WAAW,IACnC,oBAAoB,mBAAmB,aAAa,OAAO,IAC3D;AAAA,QACJ,gBAAgB,IAAI,SAAS,QAAQ;AAAA,MACvC;AAAA,MACA,IAAI;AAAA,QAAU,OAAO;AAAA,IACvB;AAAA,IAEA,OAAO,gBAAgB,KAAK,MAAM,GAAG,IAAI;AAAA;AAAA,EAG3C,MAAM,SAAkC;AAAA,IACtC,SAAS,GAAG;AAAA,MACV,0BAA0B,mBAAmB;AAAA,MAC7C,qBAAqB,OAAO,UAAU;AAAA;AAAA,EAE1C;AAAA,EACA,qBAAqB,IAAI,YAAY,MAAM;AAAA,EAC3C,OAAO;AAAA;AAGT,SAAS,eAAe,CAAC,SAA0B;AAAA,EACjD,OACE,CAAC,QAAQ,WAAW,GAAG,KACvB,CAAC,0BAAK,WAAW,OAAO,KACxB,CAAC,QAAQ,WAAW,OAAO,KAC3B,CAAC,QAAQ,WAAW,MAAM;AAAA;AAI9B,SAAS,kBAAkB,CAAC,SAG1B;AAAA,EACA,MAAM,WAAW,QAAQ,MAAM,GAAG;AAAA,EAClC,MAAM,aAAa,QAAQ,WAAW,GAAG,IAAI,IAAI;AAAA,EACjD,OAAO;AAAA,IACL,aAAa,SAAS,MAAM,GAAG,UAAU,EAAE,KAAK,GAAG;AAAA,IACnD,SACE,SAAS,SAAS,aACd,KAAK,SAAS,MAAM,UAAU,EAAE,KAAK,GAAG,MACxC;AAAA,EACR;AAAA;AAQK,SAAS,mBAAmB,CACjC,mBACA,aACA,SACoB;AAAA,EACpB,MAAM,aAAa,0BAAK,KAAK,mBAAmB,WAAW;AAAA,EAC3D,MAAM,WAAW,oBAAoB,UAAU;AAAA,EAC/C,IAAI,CAAC;AAAA,IAAU;AAAA,EAEf,IAAI,SAAS,WAAW,MAAM;AAAA,IAC5B,MAAM,SAAS,cAAc,SAAS,SAAS,OAAO;AAAA,IACtD,OAAO,WAAW,YACd,YACA,oBAAoB,YAAY,MAAM;AAAA,EAC5C;AAAA,EAEA,MAAM,YACJ,YAAY,MACR,OAAO,SAAS,SAAS,WACvB,SAAS,OACT,aACF;AAAA,EACN,OAAO,UAAU,0BAAK,KAAK,YAAY,SAAS,CAAC;AAAA;AAQnD,IAAM,gBAAgB,IAAI;AAE1B,SAAS,mBAAmB,CAAC,YAAiD;AAAA,EAC5E,IAAI,CAAC,cAAc,IAAI,UAAU,GAAG;AAAA,IAClC,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,WAAW,KAAK,MACd,uBAAG,aAAa,0BAAK,KAAK,YAAY,cAAc,GAAG,OAAO,CAChE;AAAA,MACA,MAAM;AAAA,MACN,WAAW;AAAA;AAAA,IAEb,cAAc,IAAI,YAAY,QAAQ;AAAA,EACxC;AAAA,EACA,OAAO,cAAc,IAAI,UAAU;AAAA;AAGrC,SAAS,aAAa,CAAC,UAAkB,SAA0B;AAAA,EAGjE,MAAM,eACJ,OAAO,aAAY,YACnB,aAAY,QACZ,CAAC,MAAM,QAAQ,QAAO,KACtB,OAAO,KAAK,QAAO,EAAE,MAAM,CAAC,QAAQ,QAAQ,OAAO,IAAI,WAAW,IAAI,CAAC;AAAA,EAEzE,IAAI,CAAC;AAAA,IAAc,OAAO,YAAY,MAAM,WAAU;AAAA,EAEtD,MAAM,MAAM;AAAA,EACZ,IAAI,WAAW;AAAA,IAAK,OAAO,IAAI;AAAA,EAG/B,YAAY,KAAK,UAAU,OAAO,QAAQ,GAAG,GAAG;AAAA,IAC9C,MAAM,WAAW,IAAI,QAAQ,GAAG;AAAA,IAChC,IAAI,WAAW,KAAK,IAAI,QAAQ,KAAK,WAAW,CAAC,KAAK;AAAA,MAAG;AAAA,IACzD,MAAM,SAAS,IAAI,MAAM,GAAG,QAAQ;AAAA,IACpC,MAAM,SAAS,IAAI,MAAM,WAAW,CAAC;AAAA,IACrC,IACE,QAAQ,SAAS,OAAO,SAAS,OAAO,UACxC,QAAQ,WAAW,MAAM,KACzB,QAAQ,SAAS,MAAM,GACvB;AAAA,MACA,MAAM,WAAW,QAAQ,MACvB,OAAO,QACP,QAAQ,SAAS,OAAO,MAC1B;AAAA,MACA,OAAO,OAAO,UAAU,WACpB,MAAM,WAAW,KAAK,QAAQ,IAC9B;AAAA,IACN;AAAA,EACF;AAAA,EACA;AAAA;AAKF,IAAM,sBAAsB,IAAI,IAAI,CAAC,WAAW,QAAQ,SAAS,CAAC;AAElE,SAAS,mBAAmB,CAC1B,YACA,QACoB;AAAA,EACpB,IAAI,OAAO,WAAW,UAAU;AAAA,IAC9B,IAAI,CAAC,OAAO,WAAW,IAAI;AAAA,MAAG;AAAA,IAC9B,MAAM,WAAW,0BAAK,KAAK,YAAY,MAAM;AAAA,IAC7C,OAAO,OAAO,QAAQ,IAAI,WAAW;AAAA,EACvC;AAAA,EAEA,IAAI,MAAM,QAAQ,MAAM,GAAG;AAAA,IACzB,WAAW,SAAS,QAAQ;AAAA,MAC1B,MAAM,WAAW,oBAAoB,YAAY,KAAK;AAAA,MACtD,IAAI;AAAA,QAAU,OAAO;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AAAA,IACjD,YAAY,WAAW,UAAU,OAAO,QAAQ,MAAM,GAAG;AAAA,MACvD,IAAI,CAAC,oBAAoB,IAAI,SAAS;AAAA,QAAG;AAAA,MACzC,MAAM,WAAW,oBAAoB,YAAY,KAAK;AAAA,MACtD,IAAI;AAAA,QAAU,OAAO;AAAA,IACvB;AAAA,EACF;AAAA,EAEA;AAAA;AAGF,SAAS,SAAS,CAAC,WAAuC;AAAA,EACxD,WAAW,SAAS;AAAA,IAClB;AAAA,IACA,GAAG;AAAA,IACH,GAAG;AAAA,IACH,0BAAK,KAAK,WAAW,UAAU;AAAA,IAC/B,0BAAK,KAAK,WAAW,YAAY;AAAA,EACnC,GAAG;AAAA,IACD,IAAI,OAAO,KAAK;AAAA,MAAG,OAAO;AAAA,EAC5B;AAAA,EACA;AAAA;AAGF,SAAS,MAAM,CAAC,UAA2B;AAAA,EACzC,IAAI;AAAA,IACF,OAAO,uBAAG,SAAS,QAAQ,EAAE,OAAO;AAAA,IACpC,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;;;ACrOJ,IAAM,0BAAmD;AAAA,EAC9D,YAAY;AAAA,EACZ,UAAU;AAAA,IACR;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,MACF,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,QACH,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,MACF,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,QACH,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,MACF,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,QACH,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,MACF,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,QACH,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,MACF,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,QACH,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WACE;AAAA,IACJ;AAAA,EACF;AACF;;;ACrHe,IAAf;AACiB,IAAjB;AAEA,IAAM,aAAa;AAEnB,IAAM,UAAU;AAAA,EACd,MAAM,CAAC,GAAG,GAAG;AAAA,EACb,MAAM,CAAC,KAAK,CAAC;AAAA,EACb,MAAM,CAAC,KAAK,EAAE;AAAA,EACd,UAAU,CAAC,KAAK,CAAC;AAAA,EACjB,UAAU;AAAA,EACV,QAAQ,CAAC,KAAK,GAAG;AACnB;AAMA,eAAsB,SAAS,CAC7B,UACA,SACe;AAAA,EACf,IAAI,SAAS;AAAA,EAEb,IAAI;AAAA,EAEJ,OAAO,SAAS,cAAc,SAAS,QAAQ;AAAA,IAC7C,MAAM,SAAS,SAAS,SAAS,QAAQ,SAAS,UAAU;AAAA,IAC5D,IAAI,YAAY,MAAM;AAAA,MAAG;AAAA,IACzB,eAAe,MAAM;AAAA,IAErB,MAAM,OAAO,YAAY,QAAQ,GAAG,QAAQ,IAAI;AAAA,IAChD,MAAM,YAAY,SAAS;AAAA,IAC3B,IAAI,YAAY,OAAO,SAAS,QAAQ;AAAA,MACtC,MAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAAA,IACA,MAAM,OAAO,SAAS,SAAS,WAAW,YAAY,IAAI;AAAA,IAC1D,SAAS,YAAY,KAAK,KAAK,OAAO,UAAU,IAAI;AAAA,IAEpD,MAAM,WAAW,OAAO,aAAa,OAAO,QAAQ,aAAa,CAAC;AAAA,IAElE,IAAI,aAAa,KAAK;AAAA,MACpB,cAAc,aAAa,IAAI,KAAK;AAAA,MACpC;AAAA,IACF;AAAA,IACA,IAAI,aAAa,KAAK;AAAA,MACpB,cAAc,YAAY,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,IAAI,aAAa,OAAO,aAAa,KAAK;AAAA,MACxC,MAAM,IAAI,MACR,cAAc,YAAY,OAAO,SAAS,GAAG,OAAO,QAAQ,IAAI,CAAC,CAAC,qDACpE;AAAA,IACF;AAAA,IACA,IAAI,aAAa,OAAO,aAAa,UAAQ,aAAa,KAAK;AAAA,MAG7D,cAAc;AAAA,MACd;AAAA,IACF;AAAA,IAEA,MAAM,YAAY,eAAe,UAAU,MAAM;AAAA,IACjD,cAAc;AAAA,IAId,MAAM,WAAW,kBAAkB,SAAS,EAAE,MAAM,CAAC;AAAA,IACrD,IAAI,CAAC,SAAS;AAAA,MAAQ;AAAA,IACtB,MAAM,SAAS,0BAAK,KAAK,SAAS,GAAG,QAAQ;AAAA,IAE7C,IAAI,aAAa,KAAK;AAAA,MACpB,MAAM,yBAAG,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,IAEA,MAAM,yBAAG,MAAM,0BAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IACxD,MAAM,OAAO,YAAY,QAAQ,GAAG,QAAQ,IAAI;AAAA,IAChD,MAAM,yBAAG,UAAU,QAAQ,MAAM;AAAA,MAC/B,MAAM,OAAO,KAAQ,MAAQ;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA;AAGF,SAAS,MAAM,CAAC,OAAoD;AAAA,EAClE,OAAO,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE;AAAA;AAGvC,SAAS,WAAW,CAAC,OAA4B;AAAA,EAC/C,OAAO,MAAM,MAAM,CAAC,SAAS,SAAS,CAAC;AAAA;AAGzC,SAAS,cAAc,CAAC,QAA0B;AAAA,EAChD,MAAM,SAAS,YAAY,QAAQ,GAAG,QAAQ,QAAQ;AAAA,EACtD,OAAO,eAAe,eAAe,OAAO,QAAQ,QAAQ;AAAA,EAE5D,IAAI,WAAW;AAAA,EACf,SAAS,QAAQ,EAAG,QAAQ,YAAY,SAAS;AAAA,IAC/C,YACE,SAAS,iBAAiB,QAAQ,cAC9B,KACC,OAAO;AAAA,EAChB;AAAA,EAEA,IAAI,aAAa,QAAQ;AAAA,IACvB,MAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAAA;AAKF,SAAS,WAAW,CAClB,QACA,OACA,QACQ;AAAA,EACR,MAAM,QAAQ,OAAO;AAAA,EAErB,IAAI,QAAQ,KAAM;AAAA,IAChB,IAAI,QAAQ,QAAQ;AAAA,IACpB,SAAS,QAAQ,QAAQ,EAAG,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MAC3D,QAAQ,QAAQ,MAAO,OAAO;AAAA,IAChC;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,YAAY,OAAO,SAAS,OAAO,QAAQ,MAAM,CAAC,EAAE,KAAK;AAAA,EACtE,OAAO,OAAO,OAAO,SAAS,MAAM,CAAC,IAAI;AAAA;AAG3C,SAAS,WAAW,CAAC,OAA2B;AAAA,EAC9C,MAAM,MAAM,MAAM,QAAQ,CAAC;AAAA,EAC3B,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM,IAAI,QAAQ,MAAM,SAAS,GAAG,GAAG,CAAC;AAAA;AAG1E,SAAS,SAAS,CAAC,QAA4B;AAAA,EAC7C,MAAM,OAAO,YAAY,OAAO,SAAS,GAAG,OAAO,QAAQ,IAAI,CAAC,CAAC;AAAA,EACjE,MAAM,SAAS,YAAY,OAAO,SAAS,GAAG,OAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,EACrE,OAAO,SAAS,GAAG,UAAU,SAAS;AAAA;AAMxC,SAAS,YAAY,CAAC,MAAsC;AAAA,EAC1D,MAAM,OAAO,OAAO,KAAK,IAAI,EAAE,SAAS,QAAQ;AAAA,EAChD,IAAI,SAAS;AAAA,EACb,IAAI;AAAA,EAEJ,OAAO,SAAS,KAAK,QAAQ;AAAA,IAC3B,MAAM,YAAY,KAAK,QAAQ,KAAK,MAAM;AAAA,IAC1C,IAAI,YAAY;AAAA,MAAG;AAAA,IACnB,MAAM,eAAe,OAAO,KAAK,MAAM,QAAQ,SAAS,CAAC;AAAA,IACzD,IAAI,CAAC,OAAO,UAAU,YAAY,KAAK,gBAAgB;AAAA,MAAG;AAAA,IAC1D,MAAM,YAAY,SAAS;AAAA,IAE3B,MAAM,SAAS,KAAK,QAAQ,KAAK,YAAY,CAAC;AAAA,IAC9C,IAAI,SAAS,KAAK,SAAS,WAAW;AAAA,MACpC,MAAM,MAAM,KAAK,MAAM,YAAY,GAAG,MAAM;AAAA,MAC5C,IAAI,QAAQ,QAAQ;AAAA,QAClB,MAAM,QAAQ,KAAK,MAAM,SAAS,GAAG,YAAY,CAAC;AAAA,QAClD,SAAS,OAAO,KAAK,OAAO,QAAQ,EAAE,SAAS,MAAM;AAAA,MACvD;AAAA,IACF;AAAA,IAEA,SAAS;AAAA,EACX;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,WAA6B;AAAA,EACtD,IAAI,UAAU,WAAW,GAAG,KAAK,aAAa,KAAK,SAAS,GAAG;AAAA,IAC7D,MAAM,IAAI,MAAM,cAAc,iCAAiC;AAAA,EACjE;AAAA,EAEA,MAAM,WAAW,UACd,MAAM,GAAG,EACT,OAAO,CAAC,YAAY,YAAY,MAAM,YAAY,GAAG;AAAA,EAExD,WAAW,WAAW,UAAU;AAAA,IAC9B,IAAI,YAAY,QAAQ,QAAQ,SAAS,IAAI,KAAK,QAAQ,SAAS,GAAG,GAAG;AAAA,MACvE,MAAM,IAAI,MAAM,cAAc,+BAA+B;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;;;AJjKT,IAAM,UAAS,wBAAO,IAAI,+DAA+D;AAEzF,IAAM,kBAAkB;AACxB,IAAM,uBAAuB,KAAK,KAAK,KAAK;AAE5C,IAAI;AAIG,SAAS,qBAAqB,GAA6B;AAAA,EAChE,gBAAgB,8BAA8B,EAAE,MAAM,CAAC,UAAU;AAAA,IAC/D,cAAc;AAAA,IACd,MAAM;AAAA,GACP;AAAA,EACD,OAAO;AAAA;AAGT,eAAe,6BAA6B,GAA6B;AAAA,EACvE,MAAM,WAAW;AAAA,EAEjB,MAAM,cAAc,qBAAI;AAAA,EACxB,IAAI;AAAA,EACJ,IAAI,aAAa;AAAA,IACf,aAAa,0BAAK,QAAQ,WAAW;AAAA,IACrC,MAAM,wBAAwB,YAAY,QAAQ;AAAA,EACpD,EAAO;AAAA,IACL,aAAa,0BAAK,KAChB,wBAAG,QAAQ,GACX,aACA,UACA,cACA,SAAS,UACX;AAAA,IACA,MAAM,iBAAiB,UAAU,UAAU;AAAA;AAAA,EAG7C,OAAO,sBAAsB,UAAU,UAAU;AAAA;AAUnD,eAAsB,gBAAgB,CACpC,UACA,YACe;AAAA,EACf,MAAM,aAAa,0BAAK,KAAK,YAAY,eAAe;AAAA,EACxD,IAAI,MAAM,WAAW,UAAU;AAAA,IAAG;AAAA,EAClC,MAAM,yBAAG,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAExD,MAAM,WAAW,oBAAoB,QAAQ;AAAA,EAC7C,QAAO,KACL,8EAA8E,YAChF;AAAA,EAEA,MAAM,aAAa,GAAG,sBAAsB,QAAQ,OAAO,OAAO,WAAW,EAAE,MAAM,GAAG,CAAC;AAAA,EACzF,IAAI;AAAA,IACF,WAAW,OAAO,UAAU;AAAA,MAC1B,IAAI;AAAA,QACF,MAAM,uBAAM,EAAE,aAAa,GAAG,SAAS,IAAI,GAAG,MAC5C,mBAAmB,KAAK,UAAU,CACpC;AAAA,QACA,OAAO,OAAO;AAAA,QACd,MAAM,IAAI,MACR,yCAAyC,IAAI,QAAQ,IAAI,sCACvD,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,QACxD,2EACA,qEACA,iEACF,EAAE,OAAO,MAAM,CACjB;AAAA;AAAA,IAEJ;AAAA,IAEA,MAAM,yBAAG,UACP,0BAAK,KAAK,YAAY,eAAe,GACrC,KAAK,UACH;AAAA,MACE,YAAY,SAAS;AAAA,MACrB,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,MACpC,UAAU,GAAG,QAAQ,YAAY,QAAQ;AAAA,IAC3C,GACA,MACA,CACF,CACF;AAAA,IACA,MAAM,oBAAoB,YAAY,YAAY,UAAU;AAAA,YAC5D;AAAA,IACA,MAAM,yBAAG,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,EAAE;AAAA,IACxE,MAAM,mBAAmB,UAAU;AAAA;AAAA;AAUhC,SAAS,mBAAmB,CACjC,UACA,WAAmB,QAAQ,UAC3B,OAAe,QAAQ,MACG;AAAA,EAC1B,OAAO,WAAW,oBAAoB,SAAS,SAAS,OAGtD,EAAE,OAAO,aAAa,QAAQ;AAAA,KAC3B,IAAI,MAAM,IAAI,MAAM,aAAa,OAAO,KAAK,GAAG;AAAA,IACjD,OAAO,CAAC,OAAO,UAAU;AAAA,KAE3B,CAAC,CAAC,GAAG,CAAC,CAAC,CACT;AAAA,EAEA,MAAM,UACJ,iBAAiB,KAAK,CAAC,QAAQ,IAAI,OAAO,YAAY,IAAI,QAAQ,IAAI,MACrE,aAAa,UACV,iBAAiB,KAAK,CAAC,QAAQ,IAAI,OAAO,WAAW,IAAI,QAAQ,KAAK,IACtE;AAAA,EAEN,IAAI,CAAC,SAAS;AAAA,IACZ,QAAO,KACL,iCAAiC,YAAY,0DAC/C;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,OAAO,CAAC,GAAG,WAAW,OAAO;AAAA;AAG/B,eAAe,kBAAkB,CAC/B,KACA,YACe;AAAA,EACf,MAAM,WAAW,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;AAAA,EACzC,MAAM,MAAM,8BAA8B,IAAI,UAAU,YAAY,IAAI;AAAA,EAExE,MAAM,WAAW,MAAM,MAAM,GAAG;AAAA,EAChC,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,MAAM,IAAI,MAAM,QAAQ,SAAS,mBAAmB,KAAK;AAAA,EAC3D;AAAA,EACA,MAAM,WAAW,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AAAA,EAE5D,MAAM,SAAS,8BAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,QAAQ;AAAA,EACpE,MAAM,WAAW,IAAI,UAAU,MAAM,UAAU,MAAM;AAAA,EACrD,IAAI,WAAW,UAAU;AAAA,IACvB,MAAM,IAAI,MACR,8BAA8B,IAAI,QAAQ,IAAI,4BAA4B,wBAAwB,eAChG,+DACA,+DACJ;AAAA,EACF;AAAA,EAEA,MAAM,UACJ,4BAAW,QAAQ,GACnB,0BAAK,KAAK,YAAY,gBAAgB,IAAI,IAAI,CAChD;AAAA;AAGF,eAAe,mBAAmB,CAChC,YACA,YACA,YACe;AAAA,EACf,SAAS,UAAU,IAAK,WAAW;AAAA,IACjC,IAAI;AAAA,MACF,MAAM,yBAAG,OAAO,YAAY,UAAU;AAAA,MACtC;AAAA,MACA,OAAO,OAAO;AAAA,MAId,IAAI,MAAM,WAAW,UAAU;AAAA,QAAG;AAAA,MAClC,IAAI,WAAW;AAAA,QAAG,MAAM;AAAA,MACxB,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,MAAM,OAAO,CAAC;AAAA;AAAA,EAErE;AAAA;AAGF,eAAe,kBAAkB,CAAC,YAAmC;AAAA,EACnE,IAAI;AAAA,IACF,MAAM,YAAY,0BAAK,QAAQ,UAAU;AAAA,IACzC,MAAM,SAAS,GAAG,0BAAK,SAAS,UAAU;AAAA,IAC1C,WAAW,SAAS,MAAM,yBAAG,QAAQ,SAAS,GAAG;AAAA,MAC/C,IAAI,CAAC,MAAM,WAAW,MAAM;AAAA,QAAG;AAAA,MAC/B,MAAM,YAAY,0BAAK,KAAK,WAAW,KAAK;AAAA,MAC5C,QAAQ,YAAY,MAAM,yBAAG,KAAK,SAAS;AAAA,MAC3C,IAAI,KAAK,IAAI,IAAI,UAAU,sBAAsB;AAAA,QAC/C,MAAM,yBAAG,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACzD;AAAA,IACF;AAAA,IACA,MAAM;AAAA;AAKV,eAAe,uBAAuB,CACpC,YACA,UACe;AAAA,EACf,MAAM,eAAe,0BAAK,KACxB,YACA,gBACA,yBACA,cACF;AAAA,EAEA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,mBACE,KAAK,MAAM,MAAM,yBAAG,SAAS,cAAc,OAAO,CAAC,EAGnD;AAAA,IACF,OAAO,OAAO;AAAA,IACd,MAAM,IAAI,MACR,qCAAqC,kBAAkB,+BACvD,EAAE,OAAO,MAAM,CACjB;AAAA;AAAA,EAGF,IAAI,qBAAqB,SAAS,YAAY;AAAA,IAC5C,QAAO,KACL,6CAA6C,qDAAqD,SAAS,YAC7G;AAAA,EACF;AAAA;AASF,eAAsB,qBAAqB,CACzC,UACA,YAC0B;AAAA,EAC1B,MAAM,oBAAoB,0BAAK,KAAK,YAAY,cAAc;AAAA,EAE9D,yBACE,YACA,IAAI,IAAI,SAAS,SAAS,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,CAClD;AAAA,EAEA,MAAM,UAAU,oBAAoB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,GAAG;AAAA,EACnE,MAAM,iBACJ,SAAS,KAAK,MAAM,OAAO,OAAO,SAAS,OAAO,CAAC,CAAC,EAAE;AAAA,EACxD,IAAI,WAAW,gBAAgB;AAAA,IAC7B,MAAM,cAAc,0BAAK,KACvB,mBACA,QAAQ,MACR,cACF;AAAA,IACA,IAAI,MAAM,WAAW,WAAW,GAAG;AAAA,MACjC,IAAI,QAAQ,aAAa;AAAA,QAAS,MAAM,yBAAG,MAAM,aAAa,GAAK;AAAA,MAEnE,QAAQ,IAAI,wBAAwB;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,oBAChB,mBACA,yBACA,GACF;AAAA,EACA,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,MACR,0BAA0B,wEAC5B;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,kCACxB,0BAAK,KAAK,mBAAmB,yBAAyB,cAAc,CACtE;AAAA,EACA,OAAO,kBAAkB,SAAS;AAAA;AAGpC,eAAe,UAAU,CAAC,QAAkC;AAAA,EAC1D,IAAI;AAAA,IACF,MAAM,yBAAG,OAAO,MAAM;AAAA,IACtB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;;;ADlTX,IAAM,UAAS,wBAAO,IAAI,uDAAuD;AAE1E,IAAM,kBAAwC;AAAA,EACnD,QAAQ,CAAC,UAAU;AAAA,IACjB,QAAO,MAAM,kCAAkC,MAAM,MAAM;AAAA,IAC3D,MAAM,SAAS,qBAAI;AAAA,IACnB,IAAI;AAAA,MAAQ,QAAO,MAAM,0BAA0B,4BAAW,MAAM,GAAG;AAAA,IACvE,OAAO,IAAI,oBAAoB;AAAA,MAC7B,SAAS,MAAM;AAAA,SACX,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,SACvB,wCAAuB,IAAI,EAAE,WAAW,sBAAsB,IAAI,CAAC;AAAA,IACzE,CAAC;AAAA;AAEL;AAEA,4BAAW,SAAS,eAAe;",
|
|
14
|
+
"debugId": "AC468DAB1BED071964756E2164756E21",
|
|
15
|
+
"names": []
|
|
16
|
+
}
|
package/src/index.d.ts
ADDED