mnemospark 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +4 -1
- package/scripts/README.md +0 -10
- package/scripts/seed-mnemospark-backend.sh +0 -96
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/proxy.ts","../src/balance.ts","../src/errors.ts","../src/config.ts","../src/mnemospark-request-sign.ts","../src/nonce.ts","../src/cloud-correlation.ts","../src/cloud-utils.ts","../src/wallet-signature.ts","../src/cloud-price-storage.ts","../src/x402.ts","../src/payment-cache.ts","../src/cloud-storage.ts","../src/cloud-storage-crypto.ts","../src/cloud-jsonl.ts","../src/auth.ts","../src/wallet-key.ts","../src/version.ts","../src/cloud-command.ts","../src/cloud-datastore.ts","../src/cli.ts"],"sourcesContent":["/**\n * Local mnemospark proxy server.\n *\n * This proxy only forwards mnemospark storage endpoints to the backend API and\n * serves health checks. It does not handle chat completions or model routing.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport { PROXY_PORT, MNEMOSPARK_BACKEND_API_BASE_URL } from \"./config.js\";\nimport { createWalletSignatureHeaderValue } from \"./mnemospark-request-sign.js\";\nimport {\n PAYMENT_SETTLE_PROXY_PATH,\n PRICE_STORAGE_PROXY_PATH,\n UPLOAD_PROXY_PATH,\n UPLOAD_CONFIRM_PROXY_PATH,\n forwardPaymentSettleToBackend,\n forwardStorageUploadConfirmToBackend,\n forwardPriceStorageToBackend,\n forwardStorageUploadToBackend,\n parseStorageUploadConfirmRequest,\n parsePriceStorageQuoteRequest,\n parseStorageUploadRequest,\n} from \"./cloud-price-storage.js\";\nimport { createPaymentFetch } from \"./x402.js\";\nimport {\n STORAGE_DELETE_PROXY_PATH,\n STORAGE_DOWNLOAD_PROXY_PATH,\n STORAGE_LS_PROXY_PATH,\n downloadStorageToDisk,\n forwardStorageDeleteToBackend,\n forwardStorageDownloadToBackend,\n forwardStorageLsToBackend,\n parseStorageObjectRequest,\n} from \"./cloud-storage.js\";\nimport { appendJsonlEvent } from \"./cloud-jsonl.js\";\nimport { MNEMOSPARK_OPERATION_ID_HEADER, MNEMOSPARK_TRACE_ID_HEADER } from \"./cloud-correlation.js\";\n\nconst HEALTH_CHECK_TIMEOUT_MS = 2_000; // Timeout for checking existing proxy\nconst PORT_RETRY_ATTEMPTS = 5; // Max attempts to bind port (handles TIME_WAIT)\nconst PORT_RETRY_DELAY_MS = 1_000; // Delay between retry attempts\nconst DEFAULT_DOWNLOAD_OUTPUT_DIR = join(homedir(), \".openclaw\", \"mnemospark\", \"downloads\");\n\nfunction resolveDownloadOutputDir(): string {\n const configuredOutputDir = process.env.MNEMOSPARK_DOWNLOAD_DIR?.trim();\n if (configuredOutputDir && configuredOutputDir.length > 0) {\n return configuredOutputDir;\n }\n return DEFAULT_DOWNLOAD_OUTPUT_DIR;\n}\n\nfunction matchesProxyPath(url: string | undefined, path: string): boolean {\n return url === path || url?.startsWith(`${path}?`) === true;\n}\n\nfunction readHeaderValue(value: string | string[] | undefined): string | undefined {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n if (Array.isArray(value)) {\n for (const candidate of value) {\n const trimmed = candidate.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n }\n return undefined;\n}\n\nasync function readProxyJsonBody(req: IncomingMessage): Promise<unknown> {\n const bodyChunks: Buffer[] = [];\n for await (const chunk of req) {\n bodyChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n const bodyText = Buffer.concat(bodyChunks).toString(\"utf-8\").trim();\n if (bodyText.length === 0) {\n return {};\n }\n\n return JSON.parse(bodyText);\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(body));\n}\n\nfunction logProxyEvent(\n level: \"info\" | \"warn\" | \"error\",\n event: string,\n fields: Record<string, unknown> = {},\n): void {\n const payload = JSON.stringify({ event, ...fields });\n const message = `[mnemospark] ${payload}`;\n if (level === \"error\") {\n console.error(message);\n return;\n }\n if (level === \"warn\") {\n console.warn(message);\n return;\n }\n console.info(message);\n}\n\ntype ProxyEventCorrelation = {\n trace_id: string;\n operation_id: string;\n quote_id?: string;\n wallet_address?: string;\n object_id?: string;\n object_key?: string;\n};\n\nfunction emitProxyEvent(\n eventType: string,\n status: \"start\" | \"result\" | \"success\" | \"failure\" | \"decision\",\n correlation: ProxyEventCorrelation,\n details: Record<string, unknown> = {},\n): void {\n void appendJsonlEvent(\"proxy-events.jsonl\", {\n ts: new Date().toISOString(),\n event_type: eventType,\n status,\n trace_id: correlation.trace_id,\n operation_id: correlation.operation_id,\n quote_id: correlation.quote_id ?? null,\n wallet_address: correlation.wallet_address ?? null,\n object_id: correlation.object_id ?? null,\n object_key: correlation.object_key ?? null,\n details,\n }).catch(() => undefined);\n}\n\nfunction createProxyCorrelation(headers: IncomingMessage[\"headers\"]): ProxyEventCorrelation {\n const traceId =\n readHeaderValue(headers[MNEMOSPARK_TRACE_ID_HEADER.toLowerCase()]) ?? randomUUID();\n const operationId =\n readHeaderValue(\n headers[MNEMOSPARK_OPERATION_ID_HEADER.toLowerCase()] ?? headers[\"idempotency-key\"],\n ) ?? randomUUID();\n return { trace_id: traceId, operation_id: operationId };\n}\n\nfunction emitProxyTerminalFromStatus(\n correlation: ProxyEventCorrelation,\n statusCode: number,\n details: Record<string, unknown> = {},\n): void {\n if (statusCode >= 200 && statusCode < 300) {\n emitProxyEvent(\"terminal.success\", \"success\", correlation, { status: statusCode, ...details });\n return;\n }\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, { status: statusCode, ...details });\n}\n\nfunction isAlreadySettledConflict(status: number, bodyText: string): boolean {\n if (status !== 409) {\n return false;\n }\n try {\n const payload = JSON.parse(bodyText) as Record<string, unknown>;\n const errorCode = String(payload.error_code ?? payload.error ?? \"\").toLowerCase();\n const message = String(payload.message ?? \"\").toLowerCase();\n return errorCode === \"payment_already_settled\" || message.includes(\"already settled\");\n } catch {\n return false;\n }\n}\n\nfunction createBackendForwardHeaders(response: {\n contentType: string;\n paymentRequired?: string;\n paymentResponse?: string;\n}): Record<string, string> {\n const responseHeaders: Record<string, string> = {\n \"Content-Type\": response.contentType,\n };\n\n // Preserve v2 payment headers while also supporting legacy names.\n if (response.paymentRequired) {\n responseHeaders[\"PAYMENT-REQUIRED\"] = response.paymentRequired;\n responseHeaders[\"x-payment-required\"] = response.paymentRequired;\n }\n if (response.paymentResponse) {\n responseHeaders[\"PAYMENT-RESPONSE\"] = response.paymentResponse;\n responseHeaders[\"x-payment-response\"] = response.paymentResponse;\n }\n\n return responseHeaders;\n}\n\ntype BackendAuthFailure = {\n status: number;\n contentType: string;\n bodyText: string;\n};\n\nfunction isLikelyWalletProofFailure(bodyText: string): boolean {\n return /(wallet|signature|proof|nonce|timestamp|expired|authoriz)/i.test(bodyText);\n}\n\nexport function normalizeBackendAuthFailure(\n status: number,\n bodyText: string,\n): BackendAuthFailure | undefined {\n if (status !== 401 && status !== 403) {\n return undefined;\n }\n\n const message = isLikelyWalletProofFailure(bodyText) ? \"wallet proof invalid\" : \"unauthorized\";\n return {\n status,\n contentType: \"application/json\",\n bodyText: createAuthErrorBody(message),\n };\n}\n\nfunction createAuthErrorBody(message: \"unauthorized\" | \"wallet proof invalid\"): string {\n return JSON.stringify({\n error: message.replace(/\\s+/g, \"_\"),\n message,\n });\n}\n\nfunction createWalletRequiredBody(): string {\n return JSON.stringify({\n error: \"wallet_required\",\n message: \"wallet required for storage endpoints\",\n });\n}\n\n/**\n * Get the proxy port from pre-loaded configuration.\n * Port is validated at module load time, this just returns the cached value.\n */\nexport function getProxyPort(): number {\n return PROXY_PORT;\n}\n\n/**\n * Check if a proxy is already running on the given port.\n * Returns the wallet address if running, undefined otherwise.\n */\nasync function checkExistingProxy(port: number): Promise<string | undefined> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), HEALTH_CHECK_TIMEOUT_MS);\n\n try {\n const response = await fetch(`http://127.0.0.1:${port}/health`, {\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n\n if (response.ok) {\n const data = (await response.json()) as { status?: string; wallet?: string };\n if (data.status === \"ok\" && data.wallet) {\n return data.wallet;\n }\n }\n return undefined;\n } catch {\n clearTimeout(timeoutId);\n return undefined;\n }\n}\n\n/** Callback info for low balance warning */\nexport type LowBalanceInfo = {\n balanceUSD: string;\n walletAddress: string;\n};\n\n/** Callback info for insufficient funds error */\nexport type InsufficientFundsInfo = {\n balanceUSD: string;\n requiredUSD: string;\n walletAddress: string;\n};\n\nexport type ProxyOptions = {\n walletKey: string;\n /** Port to listen on (default: 7120) */\n port?: number;\n onReady?: (port: number) => void;\n onError?: (error: Error) => void;\n /** Called when balance drops below $1.00 (warning, request still proceeds) */\n onLowBalance?: (info: LowBalanceInfo) => void;\n /** Called when balance is insufficient for a request (request fails) */\n onInsufficientFunds?: (info: InsufficientFundsInfo) => void;\n};\n\nexport type ProxyHandle = {\n port: number;\n baseUrl: string;\n walletAddress: string;\n balanceMonitor: BalanceMonitor;\n close: () => Promise<void>;\n};\n\n/**\n * Start the local mnemospark backend proxy server.\n *\n * If a proxy is already running on the target port, reuses it instead of failing.\n * Port can be configured via MNEMOSPARK_PROXY_PORT environment variable.\n *\n * Returns a handle with the assigned port, base URL, and a close function.\n */\nexport async function startProxy(options: ProxyOptions): Promise<ProxyHandle> {\n // Determine port: options.port > env var > default\n const listenPort = options.port ?? getProxyPort();\n\n // Check if a proxy is already running on this port\n const existingWallet = await checkExistingProxy(listenPort);\n if (existingWallet) {\n // Proxy already running — reuse it instead of failing with EADDRINUSE\n const account = privateKeyToAccount(options.walletKey as `0x${string}`);\n const balanceMonitor = new BalanceMonitor(account.address);\n const baseUrl = `http://127.0.0.1:${listenPort}`;\n\n // Verify the existing proxy is using the same wallet (or warn if different)\n if (existingWallet !== account.address) {\n console.warn(\n `[mnemospark] Existing proxy on port ${listenPort} uses wallet ${existingWallet}, but current config uses ${account.address}. Reusing existing proxy.`,\n );\n }\n\n options.onReady?.(listenPort);\n\n return {\n port: listenPort,\n baseUrl,\n walletAddress: existingWallet,\n balanceMonitor,\n close: async () => {\n // No-op: we didn't start this proxy, so we shouldn't close it\n },\n };\n }\n\n const walletPrivateKey = options.walletKey.trim() as `0x${string}`;\n const account = privateKeyToAccount(walletPrivateKey);\n const balanceMonitor = new BalanceMonitor(account.address);\n const proxyWalletAddressLower = account.address.toLowerCase();\n\n // Track active connections for graceful cleanup\n const connections = new Set<import(\"net\").Socket>();\n\n const createBackendWalletSignature = async (\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n walletAddress: string,\n ): Promise<string | undefined> => {\n if (walletAddress.toLowerCase() !== proxyWalletAddressLower) {\n return undefined;\n }\n\n try {\n return await createWalletSignatureHeaderValue(method, path, walletAddress, walletPrivateKey);\n } catch (err) {\n console.warn(\n `[mnemospark] Failed to create wallet proof for ${path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return undefined;\n }\n };\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n req.on(\"error\", (err) => {\n console.error(`[mnemospark] Request stream error: ${err.message}`);\n });\n res.on(\"error\", (err) => {\n console.error(`[mnemospark] Response stream error: ${err.message}`);\n });\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud price-storage command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, PRICE_STORAGE_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_price_storage_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: PRICE_STORAGE_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_price_storage_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud price-storage\",\n });\n return;\n }\n\n const requestPayload = parsePriceStorageQuoteRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_price_storage_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message:\n \"Missing required fields: wallet_address, object_id, object_id_hash, gb, provider, region\",\n });\n return;\n }\n\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_id = requestPayload.object_id;\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"price-storage\" });\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/price-storage\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_price_storage_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n const backendResponse = await forwardPriceStorageToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n });\n logProxyEvent(\"info\", \"proxy_price_storage_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_price_storage_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_price_storage_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud price-storage: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark proxy endpoint for payment/settle (forwards to backend POST /payment/settle).\n if (req.method === \"POST\" && matchesProxyPath(req.url, PAYMENT_SETTLE_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_payment_settle_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: PAYMENT_SETTLE_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_payment_settle_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark/payment/settle\",\n });\n return;\n }\n\n const record =\n payload && typeof payload === \"object\" ? (payload as Record<string, unknown>) : null;\n const quoteId = typeof record?.quote_id === \"string\" ? record.quote_id.trim() : \"\";\n const walletAddress =\n typeof record?.wallet_address === \"string\" ? record.wallet_address.trim() : \"\";\n const inlinePayment = record?.payment;\n const inlinePaymentAuthorization = record?.payment_authorization;\n if (!quoteId || !walletAddress) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Missing required fields: quote_id, wallet_address\",\n });\n return;\n }\n if (\n inlinePayment !== undefined &&\n (inlinePayment === null ||\n typeof inlinePayment !== \"object\" ||\n Array.isArray(inlinePayment))\n ) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_invalid_payment_shape\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_payment_shape\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid field: payment must be an object when provided\",\n });\n return;\n }\n if (\n inlinePaymentAuthorization !== undefined &&\n !(\n typeof inlinePaymentAuthorization === \"string\" ||\n (inlinePaymentAuthorization !== null &&\n typeof inlinePaymentAuthorization === \"object\" &&\n !Array.isArray(inlinePaymentAuthorization))\n )\n ) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_invalid_payment_authorization_shape\");\n emitProxyTerminalFromStatus(correlation, 400, {\n reason: \"invalid_payment_authorization_shape\",\n });\n sendJson(res, 400, {\n error: \"Bad request\",\n message:\n \"Invalid field: payment_authorization must be an object or string when provided\",\n });\n return;\n }\n\n if (walletAddress.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_wallet_mismatch\", {\n request_wallet: walletAddress,\n proxy_wallet: account.address,\n });\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/payment/settle\",\n walletAddress,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n correlation.quote_id = quoteId;\n correlation.wallet_address = walletAddress;\n emitProxyEvent(\"payment.settle\", \"start\", correlation);\n\n const paymentFetch = createPaymentFetch(walletPrivateKey).fetch;\n const backendResponse = await forwardPaymentSettleToBackend(quoteId, walletAddress, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n fetchImpl: paymentFetch,\n paymentSignature: readHeaderValue(req.headers[\"payment-signature\"]),\n legacyPayment: readHeaderValue(req.headers[\"x-payment\"]),\n payment:\n inlinePayment && typeof inlinePayment === \"object\" && !Array.isArray(inlinePayment)\n ? (inlinePayment as Record<string, unknown>)\n : undefined,\n paymentAuthorization:\n typeof inlinePaymentAuthorization === \"string\"\n ? inlinePaymentAuthorization.trim() || undefined\n : inlinePaymentAuthorization !== undefined\n ? (inlinePaymentAuthorization as Record<string, unknown>)\n : undefined,\n });\n logProxyEvent(\"info\", \"proxy_payment_settle_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"payment.settle\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_payment_settle_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark/payment/settle: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud upload command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, UPLOAD_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_upload_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: UPLOAD_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_upload_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud upload\",\n });\n return;\n }\n\n const requestPayload = parseStorageUploadRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_upload_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message:\n \"Missing required fields: quote_id, wallet_address, object_id, object_id_hash, quoted_storage_price, payload\",\n });\n return;\n }\n\n correlation.quote_id = requestPayload.quote_id;\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_id = requestPayload.object_id;\n\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_upload_wallet_mismatch\", {\n request_wallet: requestPayload.wallet_address,\n proxy_wallet: account.address,\n });\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/storage/upload\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_upload_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n const requiredMicros = BigInt(\n Math.max(1, Math.ceil(requestPayload.quoted_storage_price * 1_000_000)),\n );\n const uploadBalanceMonitor =\n requestPayload.wallet_address.toLowerCase() === account.address.toLowerCase()\n ? balanceMonitor\n : new BalanceMonitor(requestPayload.wallet_address);\n const sufficiency = await uploadBalanceMonitor.checkSufficient(requiredMicros);\n const requiredUSD = uploadBalanceMonitor.formatUSDC(requiredMicros);\n\n if (!sufficiency.sufficient) {\n logProxyEvent(\"warn\", \"proxy_upload_insufficient_balance\", {\n wallet_address: requestPayload.wallet_address,\n balance_usd: sufficiency.info.balanceUSD,\n required_usd: requiredUSD,\n });\n options.onInsufficientFunds?.({\n balanceUSD: sufficiency.info.balanceUSD,\n requiredUSD,\n walletAddress: requestPayload.wallet_address,\n });\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"insufficient_balance\" });\n sendJson(res, 400, {\n error: \"insufficient_balance\",\n message: `Insufficient USDC balance. Current: ${sufficiency.info.balanceUSD}, Required: ${requiredUSD}`,\n wallet: requestPayload.wallet_address,\n help: `Fund wallet ${requestPayload.wallet_address} on Base before running /mnemospark_cloud upload`,\n });\n return;\n }\n\n if (sufficiency.info.isLow) {\n logProxyEvent(\"warn\", \"proxy_upload_low_balance\", {\n wallet_address: requestPayload.wallet_address,\n balance_usd: sufficiency.info.balanceUSD,\n });\n options.onLowBalance?.({\n balanceUSD: sufficiency.info.balanceUSD,\n walletAddress: requestPayload.wallet_address,\n });\n }\n\n // Settle payment first (with 402 handling); then upload without payment headers.\n const settleWalletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/payment/settle\",\n requestPayload.wallet_address,\n );\n if (!settleWalletSignature) {\n logProxyEvent(\"warn\", \"proxy_upload_settle_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"settle_signature_missing\" });\n return;\n }\n const uploadPaymentFetch = createPaymentFetch(walletPrivateKey).fetch;\n emitProxyEvent(\"payment.settle\", \"start\", correlation, { via: \"upload\" });\n const settleResponse = await forwardPaymentSettleToBackend(\n requestPayload.quote_id,\n requestPayload.wallet_address,\n {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature: settleWalletSignature,\n fetchImpl: uploadPaymentFetch,\n },\n );\n emitProxyEvent(\"payment.settle\", \"result\", correlation, { status: settleResponse.status });\n const settledAlready = isAlreadySettledConflict(\n settleResponse.status,\n settleResponse.bodyText,\n );\n if (settleResponse.status !== 200 && !settledAlready) {\n logProxyEvent(\"warn\", \"proxy_upload_settle_failed\", {\n status: settleResponse.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: settleResponse.contentType,\n paymentRequired: settleResponse.paymentRequired,\n paymentResponse: settleResponse.paymentResponse,\n });\n res.writeHead(settleResponse.status, responseHeaders);\n res.end(settleResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, settleResponse.status, {\n reason: \"settle_failed\",\n });\n return;\n }\n if (settledAlready) {\n emitProxyEvent(\"retry.decision\", \"decision\", correlation, {\n reason: \"payment_already_settled_conflict\",\n status: settleResponse.status,\n });\n logProxyEvent(\"info\", \"proxy_upload_settle_already_confirmed\", {\n status: settleResponse.status,\n });\n }\n\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"storage/upload\" });\n const backendResponse = await forwardStorageUploadToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n idempotencyKey: readHeaderValue(req.headers[\"idempotency-key\"]),\n });\n logProxyEvent(\"info\", \"proxy_upload_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_upload_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_upload_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud upload: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud upload confirm command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, UPLOAD_CONFIRM_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_upload_confirm_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: UPLOAD_CONFIRM_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_upload_confirm_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud upload/confirm\",\n });\n return;\n }\n\n const requestPayload = parseStorageUploadConfirmRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_upload_confirm_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message:\n \"Missing required fields: quote_id, wallet_address, object_key, idempotency_key\",\n });\n return;\n }\n correlation.quote_id = requestPayload.quote_id;\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_key = requestPayload.object_key;\n\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_upload_confirm_wallet_mismatch\", {\n request_wallet: requestPayload.wallet_address,\n proxy_wallet: account.address,\n });\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/storage/upload/confirm\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_upload_confirm_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"storage/upload/confirm\" });\n const backendResponse = await forwardStorageUploadConfirmToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n });\n logProxyEvent(\"info\", \"proxy_upload_confirm_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_upload_confirm_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_upload_confirm_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud upload/confirm: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud ls command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, STORAGE_LS_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_ls_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: STORAGE_LS_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_ls_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud ls\",\n });\n return;\n }\n\n const requestPayload = parseStorageObjectRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_ls_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Missing required fields: wallet_address, object_key\",\n });\n return;\n }\n\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_key = requestPayload.object_key;\n\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_ls_wallet_mismatch\");\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/storage/ls\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_ls_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"storage/ls\" });\n const backendResponse = await forwardStorageLsToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n });\n logProxyEvent(\"info\", \"proxy_ls_backend_response\", { status: backendResponse.status });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_ls_auth_failure\", { status: authFailure.status });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_ls_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud ls: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud download command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, STORAGE_DOWNLOAD_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_download_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, {\n path: STORAGE_DOWNLOAD_PROXY_PATH,\n });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_download_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud download\",\n });\n return;\n }\n\n const requestPayload = parseStorageObjectRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_download_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Missing required fields: wallet_address, object_key\",\n });\n return;\n }\n\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_key = requestPayload.object_key;\n\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_download_wallet_mismatch\");\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/storage/download\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_download_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"storage/download\" });\n const backendResponse = await forwardStorageDownloadToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n });\n logProxyEvent(\"info\", \"proxy_download_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_download_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n // Forward backend failures directly so client gets original status/details.\n if (backendResponse.status < 200 || backendResponse.status >= 300) {\n logProxyEvent(\"warn\", \"proxy_download_backend_non_success\", {\n status: backendResponse.status,\n });\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n return;\n }\n\n const downloadResult = await downloadStorageToDisk(requestPayload, backendResponse, {\n outputDir: resolveDownloadOutputDir(),\n });\n logProxyEvent(\"info\", \"proxy_download_written_to_disk\", {\n key: downloadResult.key,\n file_path: downloadResult.filePath,\n bytes_written: downloadResult.bytesWritten,\n });\n sendJson(res, 200, {\n success: true,\n key: downloadResult.key,\n file_path: downloadResult.filePath,\n bytes_written: downloadResult.bytesWritten,\n });\n emitProxyTerminalFromStatus(correlation, 200);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_download_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud download: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud delete command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, STORAGE_DELETE_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_delete_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: STORAGE_DELETE_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_delete_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud delete\",\n });\n return;\n }\n\n const requestPayload = parseStorageObjectRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_delete_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Missing required fields: wallet_address, object_key\",\n });\n return;\n }\n\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_key = requestPayload.object_key;\n\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_delete_wallet_mismatch\");\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/storage/delete\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_delete_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"storage/delete\" });\n const backendResponse = await forwardStorageDeleteToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n });\n logProxyEvent(\"info\", \"proxy_delete_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_delete_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_delete_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud delete: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Health check with optional balance info\n if (req.url === \"/health\" || req.url?.startsWith(\"/health?\")) {\n const url = new URL(req.url, \"http://localhost\");\n const full = url.searchParams.get(\"full\") === \"true\";\n\n const response: Record<string, unknown> = {\n status: \"ok\",\n wallet: account.address,\n backendConfigured: MNEMOSPARK_BACKEND_API_BASE_URL.trim().length > 0,\n };\n\n if (full) {\n try {\n const balanceInfo = await balanceMonitor.checkBalance();\n response.balance = balanceInfo.balanceUSD;\n response.isLow = balanceInfo.isLow;\n response.isEmpty = balanceInfo.isEmpty;\n } catch {\n response.balanceError = \"Could not fetch balance\";\n }\n }\n\n sendJson(res, 200, response);\n return;\n }\n\n sendJson(res, 404, {\n error: \"Not found\",\n message: \"Supported paths: /health and /mnemospark/* storage endpoints\",\n });\n });\n\n // Listen on configured port with retry logic for TIME_WAIT handling\n // When gateway restarts quickly, the port may still be in TIME_WAIT state.\n // We retry with delay instead of incorrectly assuming a proxy is running.\n const tryListen = (attempt: number): Promise<void> => {\n return new Promise<void>((resolveAttempt, rejectAttempt) => {\n const onError = async (err: NodeJS.ErrnoException) => {\n server.removeListener(\"error\", onError);\n\n if (err.code === \"EADDRINUSE\") {\n // Port is in use - check if a proxy is actually running\n const existingWallet = await checkExistingProxy(listenPort);\n if (existingWallet) {\n // Proxy is actually running - this is fine, reuse it\n console.log(`[mnemospark] Existing proxy detected on port ${listenPort}, reusing`);\n rejectAttempt({ code: \"REUSE_EXISTING\", wallet: existingWallet });\n return;\n }\n\n // Port is in TIME_WAIT (no proxy responding) - retry after delay\n if (attempt < PORT_RETRY_ATTEMPTS) {\n console.log(\n `[mnemospark] Port ${listenPort} in TIME_WAIT, retrying in ${PORT_RETRY_DELAY_MS}ms (attempt ${attempt}/${PORT_RETRY_ATTEMPTS})`,\n );\n rejectAttempt({ code: \"RETRY\", attempt });\n return;\n }\n\n // Max retries exceeded\n console.error(\n `[mnemospark] Port ${listenPort} still in use after ${PORT_RETRY_ATTEMPTS} attempts`,\n );\n rejectAttempt(err);\n return;\n }\n\n rejectAttempt(err);\n };\n\n server.once(\"error\", onError);\n server.listen(listenPort, \"127.0.0.1\", () => {\n server.removeListener(\"error\", onError);\n resolveAttempt();\n });\n });\n };\n\n // Retry loop for port binding\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= PORT_RETRY_ATTEMPTS; attempt++) {\n try {\n await tryListen(attempt);\n break; // Success\n } catch (err: unknown) {\n const error = err as { code?: string; wallet?: string };\n\n if (error.code === \"REUSE_EXISTING\" && error.wallet) {\n // Proxy is running, reuse it\n const baseUrl = `http://127.0.0.1:${listenPort}`;\n options.onReady?.(listenPort);\n return {\n port: listenPort,\n baseUrl,\n walletAddress: error.wallet,\n balanceMonitor,\n close: async () => {\n // No-op: we didn't start this proxy, so we shouldn't close it\n },\n };\n }\n\n if (error.code === \"RETRY\") {\n // Wait before retry\n await new Promise((r) => setTimeout(r, PORT_RETRY_DELAY_MS));\n continue;\n }\n\n // Other error - throw\n lastError = err as Error;\n break;\n }\n }\n\n if (lastError) {\n throw lastError;\n }\n\n // Server is now listening - set up remaining handlers\n const addr = server.address() as AddressInfo;\n const port = addr.port;\n const baseUrl = `http://127.0.0.1:${port}`;\n\n options.onReady?.(port);\n\n // Add runtime error handler AFTER successful listen\n // This handles errors that occur during server operation (not just startup)\n server.on(\"error\", (err) => {\n console.error(`[mnemospark] Server runtime error: ${err.message}`);\n options.onError?.(err);\n });\n\n // Handle client connection errors (bad requests, socket errors)\n server.on(\"clientError\", (err, socket) => {\n console.error(`[mnemospark] Client error: ${err.message}`);\n // Send 400 Bad Request if socket is still writable\n if (socket.writable && !socket.destroyed) {\n socket.end(\"HTTP/1.1 400 Bad Request\\r\\n\\r\\n\");\n }\n });\n\n // Track connections for graceful cleanup\n server.on(\"connection\", (socket) => {\n connections.add(socket);\n\n // Keep alignment with prior behavior for long-running uploads/downloads.\n socket.setTimeout(300_000);\n\n socket.on(\"timeout\", () => {\n console.error(`[mnemospark] Socket timeout, destroying connection`);\n socket.destroy();\n });\n\n socket.on(\"error\", (err) => {\n console.error(`[mnemospark] Socket error: ${err.message}`);\n });\n\n socket.on(\"close\", () => {\n connections.delete(socket);\n });\n });\n\n return {\n port,\n baseUrl,\n walletAddress: account.address,\n balanceMonitor,\n close: () =>\n new Promise<void>((res, rej) => {\n const timeout = setTimeout(() => {\n rej(new Error(\"[mnemospark] Close timeout after 4s\"));\n }, 4000);\n\n // Destroy all active connections before closing server\n for (const socket of connections) {\n socket.destroy();\n }\n connections.clear();\n server.close((err) => {\n clearTimeout(timeout);\n if (err) {\n rej(err);\n } else {\n res();\n }\n });\n }),\n };\n}\n","/**\n * Balance Monitor for ClawRouter\n *\n * Monitors USDC balance on Base network with intelligent caching.\n * Provides pre-request balance checks to prevent failed payments.\n *\n * Caching Strategy:\n * - TTL: 30 seconds (balance is cached to avoid excessive RPC calls)\n * - Optimistic deduction: after successful payment, subtract estimated cost from cache\n * - Invalidation: on payment failure, immediately refresh from RPC\n */\n\nimport { createPublicClient, http, erc20Abi } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { RpcError } from \"./errors.js\";\n\n/** USDC contract address on Base mainnet */\nconst USDC_BASE = \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\" as const;\n\n/** Cache TTL in milliseconds (30 seconds) */\nconst CACHE_TTL_MS = 30_000;\n\n/** Balance thresholds in USDC smallest unit (6 decimals) */\nexport const BALANCE_THRESHOLDS = {\n /** Low balance warning threshold: $1.00 */\n LOW_BALANCE_MICROS: 1_000_000n,\n /** Effectively zero threshold: $0.0001 (covers dust/rounding) */\n ZERO_THRESHOLD: 100n,\n} as const;\n\n/** Balance information returned by checkBalance() */\nexport type BalanceInfo = {\n /** Raw balance in USDC smallest unit (6 decimals) */\n balance: bigint;\n /** Formatted balance as \"$X.XX\" */\n balanceUSD: string;\n /** True if balance < $1.00 */\n isLow: boolean;\n /** True if balance < $0.0001 (effectively zero) */\n isEmpty: boolean;\n /** Wallet address for funding instructions */\n walletAddress: string;\n};\n\n/** Result from checkSufficient() */\nexport type SufficiencyResult = {\n /** True if balance >= estimated cost */\n sufficient: boolean;\n /** Current balance info */\n info: BalanceInfo;\n /** If insufficient, the shortfall as \"$X.XX\" */\n shortfall?: string;\n};\n\n/**\n * Monitors USDC balance on Base network.\n *\n * Usage:\n * const monitor = new BalanceMonitor(\"0x...\");\n * const info = await monitor.checkBalance();\n * if (info.isLow) console.warn(\"Low balance!\");\n */\nexport class BalanceMonitor {\n private readonly client;\n private readonly walletAddress: `0x${string}`;\n\n /** Cached balance (null = not yet fetched) */\n private cachedBalance: bigint | null = null;\n /** Timestamp when cache was last updated */\n private cachedAt = 0;\n\n constructor(walletAddress: string) {\n this.walletAddress = walletAddress as `0x${string}`;\n this.client = createPublicClient({\n chain: base,\n transport: http(undefined, {\n timeout: 10_000, // 10 second timeout to prevent hanging on slow RPC\n }),\n });\n }\n\n /**\n * Check current USDC balance.\n * Uses cache if valid, otherwise fetches from RPC.\n */\n async checkBalance(): Promise<BalanceInfo> {\n const now = Date.now();\n\n // Use cache if valid\n if (this.cachedBalance !== null && now - this.cachedAt < CACHE_TTL_MS) {\n return this.buildInfo(this.cachedBalance);\n }\n\n // Fetch from RPC\n const balance = await this.fetchBalance();\n this.cachedBalance = balance;\n this.cachedAt = now;\n\n return this.buildInfo(balance);\n }\n\n /**\n * Check if balance is sufficient for an estimated cost.\n *\n * @param estimatedCostMicros - Estimated cost in USDC smallest unit (6 decimals)\n */\n async checkSufficient(estimatedCostMicros: bigint): Promise<SufficiencyResult> {\n const info = await this.checkBalance();\n\n if (info.balance >= estimatedCostMicros) {\n return { sufficient: true, info };\n }\n\n const shortfall = estimatedCostMicros - info.balance;\n return {\n sufficient: false,\n info,\n shortfall: this.formatUSDC(shortfall),\n };\n }\n\n /**\n * Optimistically deduct estimated cost from cached balance.\n * Call this after a successful payment to keep cache accurate.\n *\n * @param amountMicros - Amount to deduct in USDC smallest unit\n */\n deductEstimated(amountMicros: bigint): void {\n if (this.cachedBalance !== null && this.cachedBalance >= amountMicros) {\n this.cachedBalance -= amountMicros;\n }\n }\n\n /**\n * Invalidate cache, forcing next checkBalance() to fetch from RPC.\n * Call this after a payment failure to get accurate balance.\n */\n invalidate(): void {\n this.cachedBalance = null;\n this.cachedAt = 0;\n }\n\n /**\n * Force refresh balance from RPC (ignores cache).\n */\n async refresh(): Promise<BalanceInfo> {\n this.invalidate();\n return this.checkBalance();\n }\n\n /**\n * Format USDC amount (in micros) as \"$X.XX\".\n */\n formatUSDC(amountMicros: bigint): string {\n // USDC has 6 decimals\n const dollars = Number(amountMicros) / 1_000_000;\n return `$${dollars.toFixed(2)}`;\n }\n\n /**\n * Get the wallet address being monitored.\n */\n getWalletAddress(): string {\n return this.walletAddress;\n }\n\n /** Fetch balance from RPC */\n private async fetchBalance(): Promise<bigint> {\n try {\n const balance = await this.client.readContract({\n address: USDC_BASE,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [this.walletAddress],\n });\n return balance;\n } catch (error) {\n // Throw typed error instead of silently returning 0\n // This allows callers to distinguish \"node down\" from \"wallet empty\"\n throw new RpcError(error instanceof Error ? error.message : \"Unknown error\", error);\n }\n }\n\n /** Build BalanceInfo from raw balance */\n private buildInfo(balance: bigint): BalanceInfo {\n return {\n balance,\n balanceUSD: this.formatUSDC(balance),\n isLow: balance < BALANCE_THRESHOLDS.LOW_BALANCE_MICROS,\n isEmpty: balance < BALANCE_THRESHOLDS.ZERO_THRESHOLD,\n walletAddress: this.walletAddress,\n };\n }\n}\n","/**\n * Typed Error Classes for mnemospark\n *\n * Provides structured errors for balance-related failures with\n * all necessary information for user-friendly error messages.\n */\n\n/**\n * Thrown when wallet has insufficient USDC balance for a request.\n */\nexport class InsufficientFundsError extends Error {\n readonly code = \"INSUFFICIENT_FUNDS\" as const;\n readonly currentBalanceUSD: string;\n readonly requiredUSD: string;\n readonly walletAddress: string;\n\n constructor(opts: { currentBalanceUSD: string; requiredUSD: string; walletAddress: string }) {\n const msg = [\n `Insufficient balance. Current: ${opts.currentBalanceUSD}, Required: ${opts.requiredUSD}`,\n `Options:`,\n ` 1. Fund wallet: ${opts.walletAddress}`,\n ` 2. Use free model: /model free`,\n ].join(\"\\n\");\n super(msg);\n this.name = \"InsufficientFundsError\";\n this.currentBalanceUSD = opts.currentBalanceUSD;\n this.requiredUSD = opts.requiredUSD;\n this.walletAddress = opts.walletAddress;\n }\n}\n\n/**\n * Thrown when wallet has no USDC balance (or effectively zero).\n */\nexport class EmptyWalletError extends Error {\n readonly code = \"EMPTY_WALLET\" as const;\n readonly walletAddress: string;\n\n constructor(walletAddress: string) {\n const msg = [\n `No USDC balance.`,\n `Options:`,\n ` 1. Fund wallet: ${walletAddress}`,\n ` 2. Use free model: /model free`,\n ` 3. Uninstall: bash ~/.openclaw/extensions/mnemospark/scripts/uninstall.sh`,\n ].join(\"\\n\");\n super(msg);\n this.name = \"EmptyWalletError\";\n this.walletAddress = walletAddress;\n }\n}\n\n/**\n * Type guard to check if an error is InsufficientFundsError.\n */\nexport function isInsufficientFundsError(error: unknown): error is InsufficientFundsError {\n return error instanceof Error && (error as InsufficientFundsError).code === \"INSUFFICIENT_FUNDS\";\n}\n\n/**\n * Type guard to check if an error is EmptyWalletError.\n */\nexport function isEmptyWalletError(error: unknown): error is EmptyWalletError {\n return error instanceof Error && (error as EmptyWalletError).code === \"EMPTY_WALLET\";\n}\n\n/**\n * Type guard to check if an error is a balance-related error.\n */\nexport function isBalanceError(error: unknown): error is InsufficientFundsError | EmptyWalletError {\n return isInsufficientFundsError(error) || isEmptyWalletError(error);\n}\n\n/**\n * Thrown when RPC call fails (network error, node down, etc).\n * Distinguishes infrastructure failures from actual empty wallets.\n */\nexport class RpcError extends Error {\n readonly code = \"RPC_ERROR\" as const;\n readonly originalError: unknown;\n\n constructor(message: string, originalError?: unknown) {\n super(`RPC error: ${message}. Check network connectivity.`);\n this.name = \"RpcError\";\n this.originalError = originalError;\n }\n}\n\n/**\n * Type guard to check if an error is RpcError.\n */\nexport function isRpcError(error: unknown): error is RpcError {\n return error instanceof Error && (error as RpcError).code === \"RPC_ERROR\";\n}\n","/**\n * Configuration Module\n *\n * Reads environment variables at module load time.\n * Separated from network code to avoid security scanner false positives.\n */\n\nconst DEFAULT_PORT = 7120;\n\n/**\n * Proxy port configuration - resolved once at module load.\n * Reads MNEMOSPARK_PROXY_PORT env var or defaults to 7120 (mnemospark does not conflict with BlockRun proxy on 8402).\n */\nexport const PROXY_PORT = (() => {\n const envPort = process.env.MNEMOSPARK_PROXY_PORT;\n if (envPort) {\n const parsed = parseInt(envPort, 10);\n if (!isNaN(parsed) && parsed > 0 && parsed < 65536) {\n return parsed;\n }\n }\n return DEFAULT_PORT;\n})();\n\n/**\n * Mnemospark backend API base URL for proxy → backend calls.\n * Example: https://{api-id}.execute-api.{region}.amazonaws.com/{stage}\n */\nexport const MNEMOSPARK_BACKEND_API_BASE_URL = (\n process.env.MNEMOSPARK_BACKEND_API_BASE_URL ?? \"\"\n).trim();\n","import { getAddress } from \"viem\";\nimport { privateKeyToAccount, signTypedData } from \"viem/accounts\";\nimport { createNonce } from \"./nonce.js\";\n\nexport const MNEMOSPARK_DOMAIN_NAME = \"Mnemospark\";\nexport const MNEMOSPARK_DOMAIN_VERSION = \"1\";\nexport const MNEMOSPARK_VERIFYING_CONTRACT = \"0x0000000000000000000000000000000000000001\" as const;\n\nexport const BASE_MAINNET_CHAIN_ID = 8453;\nexport const BASE_SEPOLIA_CHAIN_ID = 84532;\n\nexport type MnemosparkChainId = typeof BASE_MAINNET_CHAIN_ID | typeof BASE_SEPOLIA_CHAIN_ID;\n\nexport type MnemosparkRequestPayload = {\n method: string;\n path: string;\n walletAddress: `0x${string}`;\n nonce: `0x${string}`;\n timestamp: string;\n};\n\nexport type WalletSignatureHeaderEnvelope = {\n payloadB64: string;\n signature: string;\n address: `0x${string}`;\n};\n\n/** EIP-712 struct types: bytes32/uint256 align with Solidity and Permit-style (OpenZeppelin EIP712). */\nexport const MNEMOSPARK_REQUEST_TYPES = {\n MnemosparkRequest: [\n { name: \"method\", type: \"string\" },\n { name: \"path\", type: \"string\" },\n { name: \"walletAddress\", type: \"address\" },\n { name: \"nonce\", type: \"bytes32\" },\n { name: \"timestamp\", type: \"uint256\" },\n ],\n} as const;\n\ntype BuildPayloadOptions = {\n nonce?: `0x${string}`;\n timestamp?: string;\n};\n\nexport type CreateWalletSignatureHeaderOptions = BuildPayloadOptions & {\n chainId?: MnemosparkChainId;\n};\n\nfunction encodeBase64Json(value: unknown): string {\n return Buffer.from(JSON.stringify(value), \"utf8\").toString(\"base64\");\n}\n\nfunction decodeBase64Json<T>(value: string): T {\n const decoded = Buffer.from(value, \"base64\").toString(\"utf8\");\n return JSON.parse(decoded) as T;\n}\n\nfunction normalizeMethod(method: string): string {\n const normalized = method.trim().toUpperCase();\n if (!normalized) {\n throw new Error(\"Request signing requires a non-empty HTTP method.\");\n }\n return normalized;\n}\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n if (!trimmed) {\n throw new Error(\"Request signing requires a non-empty path.\");\n }\n\n let parsedPath: string;\n if (/^https?:\\/\\//i.test(trimmed)) {\n parsedPath = new URL(trimmed).pathname;\n } else {\n parsedPath = trimmed.split(\"?\")[0]?.split(\"#\")[0] ?? \"\";\n }\n\n if (!parsedPath) {\n throw new Error(\"Request signing requires a valid request path.\");\n }\n\n const prefixed = parsedPath.startsWith(\"/\") ? parsedPath : `/${parsedPath}`;\n const deduplicated = prefixed.replace(/\\/{2,}/g, \"/\");\n return deduplicated.length > 1 && deduplicated.endsWith(\"/\")\n ? deduplicated.slice(0, -1)\n : deduplicated;\n}\n\nfunction normalizeTimestamp(value: string | undefined): string {\n const timestamp = value ?? Math.floor(Date.now() / 1000).toString();\n if (!/^\\d+$/.test(timestamp)) {\n throw new Error(\"Request signing timestamp must be a Unix timestamp in seconds.\");\n }\n return timestamp;\n}\n\nfunction normalizeNonce(value: `0x${string}` | undefined): `0x${string}` {\n const nonce = value ?? createNonce();\n if (!/^0x[0-9a-fA-F]{64}$/.test(nonce)) {\n throw new Error(\"Request signing nonce must be a 32-byte hex value.\");\n }\n return nonce;\n}\n\nfunction normalizeChainId(chainId: MnemosparkChainId | undefined): MnemosparkChainId {\n const selected = chainId ?? BASE_MAINNET_CHAIN_ID;\n if (selected !== BASE_MAINNET_CHAIN_ID && selected !== BASE_SEPOLIA_CHAIN_ID) {\n throw new Error(`Unsupported chainId for request signing: ${selected}`);\n }\n return selected;\n}\n\nexport function createMnemosparkRequestDomain(chainId?: MnemosparkChainId) {\n return {\n name: MNEMOSPARK_DOMAIN_NAME,\n version: MNEMOSPARK_DOMAIN_VERSION,\n chainId: normalizeChainId(chainId),\n verifyingContract: MNEMOSPARK_VERIFYING_CONTRACT,\n } as const;\n}\n\nexport function createMnemosparkRequestPayload(\n method: string,\n path: string,\n walletAddress: string,\n options?: BuildPayloadOptions,\n): MnemosparkRequestPayload {\n return {\n method: normalizeMethod(method),\n path: normalizePath(path),\n walletAddress: getAddress(walletAddress),\n nonce: normalizeNonce(options?.nonce),\n timestamp: normalizeTimestamp(options?.timestamp),\n };\n}\n\nexport function decodeWalletSignatureHeaderValue(\n headerValue: string,\n): WalletSignatureHeaderEnvelope {\n return decodeBase64Json<WalletSignatureHeaderEnvelope>(headerValue);\n}\n\nexport function decodeWalletSignaturePayload(payloadB64: string): MnemosparkRequestPayload {\n return decodeBase64Json<MnemosparkRequestPayload>(payloadB64);\n}\n\nexport async function createWalletSignatureHeaderValue(\n method: string,\n path: string,\n walletAddress: string,\n walletPrivateKey: `0x${string}`,\n options?: CreateWalletSignatureHeaderOptions,\n): Promise<string> {\n const payload = createMnemosparkRequestPayload(method, path, walletAddress, {\n nonce: options?.nonce,\n timestamp: options?.timestamp,\n });\n const signer = privateKeyToAccount(walletPrivateKey);\n\n if (signer.address.toLowerCase() !== payload.walletAddress.toLowerCase()) {\n throw new Error(\n `Wallet address ${payload.walletAddress} does not match signer address ${signer.address}.`,\n );\n }\n\n const signature = await signTypedData({\n privateKey: walletPrivateKey,\n domain: createMnemosparkRequestDomain(options?.chainId),\n types: MNEMOSPARK_REQUEST_TYPES,\n primaryType: \"MnemosparkRequest\",\n message: {\n method: payload.method,\n path: payload.path,\n walletAddress: payload.walletAddress,\n nonce: payload.nonce as `0x${string}`,\n timestamp: BigInt(payload.timestamp),\n },\n });\n\n const headerEnvelope: WalletSignatureHeaderEnvelope = {\n payloadB64: encodeBase64Json(payload),\n signature,\n address: signer.address,\n };\n\n return encodeBase64Json(headerEnvelope);\n}\n","/**\n * Generates a cryptographically random 32-byte value as a 0x-prefixed hex string.\n * Used for request signing nonces and payment transfer nonces.\n */\nexport function createNonce(): `0x${string}` {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return `0x${Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")}` as `0x${string}`;\n}\n","export const MNEMOSPARK_TRACE_ID_HEADER = \"X-Mnemospark-Trace-Id\";\nexport const MNEMOSPARK_OPERATION_ID_HEADER = \"X-Mnemospark-Operation-Id\";\n\nexport type RequestCorrelation = {\n traceId?: string;\n operationId?: string;\n};\n\nexport function applyCorrelationHeaders(\n headers: Record<string, string>,\n correlation?: RequestCorrelation,\n): Record<string, string> {\n const traceId = correlation?.traceId?.trim();\n if (traceId) {\n headers[MNEMOSPARK_TRACE_ID_HEADER] = traceId;\n }\n\n const operationId = correlation?.operationId?.trim();\n if (operationId) {\n headers[MNEMOSPARK_OPERATION_ID_HEADER] = operationId;\n }\n\n return headers;\n}\n","export function normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nexport function asNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number.parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return null;\n}\n\nexport function asNonEmptyString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nexport function normalizePaymentRequired(headers: Headers): string | undefined {\n return headers.get(\"PAYMENT-REQUIRED\") ?? headers.get(\"x-payment-required\") ?? undefined;\n}\n\nexport function normalizePaymentResponse(headers: Headers): string | undefined {\n return headers.get(\"PAYMENT-RESPONSE\") ?? headers.get(\"x-payment-response\") ?? undefined;\n}\n","export function normalizeWalletSignature(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n","import { PROXY_PORT } from \"./config.js\";\nimport { applyCorrelationHeaders, type RequestCorrelation } from \"./cloud-correlation.js\";\nimport {\n asNonEmptyString,\n asNumber,\n asRecord,\n normalizeBaseUrl,\n normalizePaymentRequired,\n normalizePaymentResponse,\n} from \"./cloud-utils.js\";\nimport { normalizeWalletSignature } from \"./wallet-signature.js\";\n\nexport const PRICE_STORAGE_PROXY_PATH = \"/mnemospark/price-storage\";\nexport const PAYMENT_SETTLE_PROXY_PATH = \"/mnemospark/payment/settle\";\nexport const UPLOAD_PROXY_PATH = \"/mnemospark/upload\";\nexport const UPLOAD_CONFIRM_PROXY_PATH = \"/mnemospark/upload/confirm\";\n\nexport type PriceStorageQuoteRequest = {\n wallet_address: string;\n object_id: string;\n object_id_hash: string;\n gb: number;\n provider: string;\n region: string;\n};\n\nexport type PriceStorageQuoteResponse = {\n timestamp: string;\n quote_id: string;\n storage_price: number;\n addr: string;\n object_id: string;\n object_id_hash: string;\n object_size_gb: number;\n provider: string;\n location: string;\n};\n\nexport type UploadPayload = {\n mode: \"inline\" | \"presigned\";\n content_base64?: string;\n content_sha256: string;\n content_length_bytes: number;\n wrapped_dek: string;\n encryption_algorithm: \"AES-256-GCM\";\n bucket_name_hint: string;\n key_store_path_hint: string;\n};\n\nexport type StorageUploadRequest = {\n quote_id: string;\n wallet_address: string;\n object_id: string;\n object_id_hash: string;\n quoted_storage_price: number;\n payload: UploadPayload;\n};\n\nexport type StorageUploadConfirmRequest = {\n quote_id: string;\n wallet_address: string;\n object_key: string;\n idempotency_key: string;\n};\n\nexport type StorageUploadResponse = {\n quote_id: string;\n addr: string;\n addr_hash?: string;\n trans_id?: string;\n storage_price?: number;\n object_id: string;\n object_key: string;\n provider: string;\n bucket_name: string;\n location: string;\n upload_url?: string;\n upload_headers?: Record<string, string>;\n confirmation_required?: boolean;\n};\n\ntype FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\ntype ProxyQuoteOptions = {\n proxyBaseUrl?: string;\n fetchImpl?: FetchLike;\n correlation?: RequestCorrelation;\n};\n\ntype ProxyUploadOptions = {\n proxyBaseUrl?: string;\n fetchImpl?: FetchLike;\n idempotencyKey?: string;\n maxRetries?: number;\n correlation?: RequestCorrelation;\n};\n\ntype ProxyUploadConfirmOptions = {\n proxyBaseUrl?: string;\n fetchImpl?: FetchLike;\n correlation?: RequestCorrelation;\n};\n\n/**\n * Options for forwarding price-storage to the backend directly.\n * When backendBaseUrl is set, walletSignature is required (backend requires X-Wallet-Signature).\n * Use the proxy for price-storage if you do not have a wallet signature, or pass walletSignature.\n */\ntype BackendQuoteOptions = {\n backendBaseUrl?: string;\n /** Required when calling the backend directly. Omit only when using the proxy. */\n walletSignature?: string;\n fetchImpl?: FetchLike;\n};\n\ntype BackendUploadOptions = {\n backendBaseUrl?: string;\n walletSignature?: string;\n fetchImpl?: FetchLike;\n idempotencyKey?: string;\n};\n\ntype BackendUploadConfirmOptions = {\n backendBaseUrl?: string;\n walletSignature?: string;\n fetchImpl?: FetchLike;\n};\n\n/** Request body for POST /payment/settle. */\nexport type PaymentSettleRequest = {\n quote_id: string;\n wallet_address: string;\n payment?: Record<string, unknown>;\n payment_authorization?: Record<string, unknown> | string;\n};\n/** Options for forwarding payment/settle to the backend. */\nexport type BackendSettleOptions = {\n backendBaseUrl?: string;\n walletSignature?: string;\n fetchImpl?: FetchLike;\n /** Optional payment authorization (PAYMENT-SIGNATURE / x-payment) for 402 retry. */\n paymentSignature?: string;\n legacyPayment?: string;\n /** Optional inline payment authorization payload. */\n payment?: Record<string, unknown>;\n /** Optional alternate inline payment authorization envelope. */\n paymentAuthorization?: Record<string, unknown> | string;\n};\n\n/** Options for requesting payment/settle via the proxy. */\nexport type ProxySettleOptions = {\n proxyBaseUrl?: string;\n fetchImpl?: FetchLike;\n correlation?: RequestCorrelation;\n /** Optional inline payment authorization payload. */\n payment?: Record<string, unknown>;\n /** Optional alternate inline payment authorization envelope. */\n paymentAuthorization?: Record<string, unknown> | string;\n};\n\n/** Result from forwarding payment/settle to the backend (or proxy). */\nexport type BackendSettleForwardResult = {\n status: number;\n bodyText: string;\n contentType: string;\n paymentRequired?: string;\n paymentResponse?: string;\n};\n\ntype BackendQuoteForwardResult = {\n status: number;\n bodyText: string;\n contentType: string;\n paymentRequired?: string;\n paymentResponse?: string;\n};\n\ntype BackendUploadForwardResult = {\n status: number;\n bodyText: string;\n contentType: string;\n paymentRequired?: string;\n paymentResponse?: string;\n};\n\nfunction asStringRecord(value: unknown): Record<string, string> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const output: Record<string, string> = {};\n for (const [key, entry] of Object.entries(record)) {\n if (typeof entry !== \"string\") {\n return null;\n }\n output[key] = entry;\n }\n return output;\n}\n\nexport function parsePriceStorageQuoteRequest(payload: unknown): PriceStorageQuoteRequest | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n\n const walletAddress = asNonEmptyString(record.wallet_address);\n const objectId = asNonEmptyString(record.object_id);\n const objectIdHash = asNonEmptyString(record.object_id_hash);\n const gb = asNumber(record.gb);\n const provider = asNonEmptyString(record.provider);\n const region = asNonEmptyString(record.region);\n\n if (!walletAddress || !objectId || !objectIdHash || gb === null || !provider || !region) {\n return null;\n }\n\n return {\n wallet_address: walletAddress,\n object_id: objectId,\n object_id_hash: objectIdHash,\n gb,\n provider,\n region,\n };\n}\n\nexport function parsePriceStorageQuoteResponse(payload: unknown): PriceStorageQuoteResponse {\n const record = asRecord(payload);\n if (!record) {\n throw new Error(\"Invalid price-storage response payload\");\n }\n\n const timestamp = asNonEmptyString(record.timestamp);\n const quoteId = asNonEmptyString(record.quote_id);\n const storagePrice = asNumber(record.storage_price);\n const addr = asNonEmptyString(record.addr);\n const objectId = asNonEmptyString(record.object_id);\n const objectIdHash = asNonEmptyString(record.object_id_hash);\n const objectSizeGb = asNumber(record.object_size_gb);\n const provider = asNonEmptyString(record.provider);\n const location = asNonEmptyString(record.location);\n\n if (\n !timestamp ||\n !quoteId ||\n storagePrice === null ||\n !addr ||\n !objectId ||\n !objectIdHash ||\n objectSizeGb === null ||\n !provider ||\n !location\n ) {\n throw new Error(\"Price-storage response is missing required fields\");\n }\n\n return {\n timestamp,\n quote_id: quoteId,\n storage_price: storagePrice,\n addr,\n object_id: objectId,\n object_id_hash: objectIdHash,\n object_size_gb: objectSizeGb,\n provider,\n location,\n };\n}\n\nexport function parseStorageUploadRequest(payload: unknown): StorageUploadRequest | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n\n const quoteId = asNonEmptyString(record.quote_id);\n const walletAddress = asNonEmptyString(record.wallet_address);\n const objectId = asNonEmptyString(record.object_id);\n const objectIdHash = asNonEmptyString(record.object_id_hash);\n const quotedStoragePrice = asNumber(record.quoted_storage_price);\n\n const payloadRecord = asRecord(record.payload);\n if (!payloadRecord) {\n return null;\n }\n\n const modeRaw = asNonEmptyString(payloadRecord.mode);\n const mode = modeRaw === \"inline\" || modeRaw === \"presigned\" ? modeRaw : null;\n const contentBase64 =\n payloadRecord.content_base64 === undefined\n ? undefined\n : asNonEmptyString(payloadRecord.content_base64);\n const contentSha256 = asNonEmptyString(payloadRecord.content_sha256);\n const contentLengthBytes = asNumber(payloadRecord.content_length_bytes);\n const wrappedDek = asNonEmptyString(payloadRecord.wrapped_dek);\n const encryptionAlgorithm = asNonEmptyString(payloadRecord.encryption_algorithm);\n const bucketNameHint = asNonEmptyString(payloadRecord.bucket_name_hint);\n const keyStorePathHint = asNonEmptyString(payloadRecord.key_store_path_hint);\n\n if (\n !quoteId ||\n !walletAddress ||\n !objectId ||\n !objectIdHash ||\n quotedStoragePrice === null ||\n !mode ||\n !contentSha256 ||\n contentLengthBytes === null ||\n !wrappedDek ||\n encryptionAlgorithm !== \"AES-256-GCM\" ||\n !bucketNameHint ||\n !keyStorePathHint\n ) {\n return null;\n }\n\n if (mode === \"inline\" && !contentBase64) {\n return null;\n }\n\n return {\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId,\n object_id_hash: objectIdHash,\n quoted_storage_price: quotedStoragePrice,\n payload: {\n mode,\n content_base64: contentBase64 ?? undefined,\n content_sha256: contentSha256,\n content_length_bytes: contentLengthBytes,\n wrapped_dek: wrappedDek,\n encryption_algorithm: \"AES-256-GCM\",\n bucket_name_hint: bucketNameHint,\n key_store_path_hint: keyStorePathHint,\n },\n };\n}\n\nexport function parseStorageUploadConfirmRequest(\n payload: unknown,\n): StorageUploadConfirmRequest | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n\n const quoteId = asNonEmptyString(record.quote_id);\n const walletAddress = asNonEmptyString(record.wallet_address);\n const objectKey = asNonEmptyString(record.object_key);\n const idempotencyKey = asNonEmptyString(record.idempotency_key);\n\n if (!quoteId || !walletAddress || !objectKey || !idempotencyKey) {\n return null;\n }\n\n return {\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_key: objectKey,\n idempotency_key: idempotencyKey,\n };\n}\n\nexport function parseStorageUploadResponse(payload: unknown): StorageUploadResponse {\n const record = asRecord(payload);\n if (!record) {\n throw new Error(\"Invalid upload response payload\");\n }\n\n const quoteId = asNonEmptyString(record.quote_id);\n const addr = asNonEmptyString(record.addr);\n const addrHash = asNonEmptyString(record.addr_hash);\n const transId = asNonEmptyString(record.trans_id);\n const storagePrice = asNumber(record.storage_price);\n const objectId = asNonEmptyString(record.object_id);\n const objectKey = asNonEmptyString(record.object_key);\n const provider = asNonEmptyString(record.provider);\n const bucketName = asNonEmptyString(record.bucket_name);\n const location = asNonEmptyString(record.location);\n const uploadUrl = asNonEmptyString(record.upload_url);\n const uploadHeaders =\n record.upload_headers === undefined ? undefined : asStringRecord(record.upload_headers);\n const confirmationRequired =\n typeof record.confirmation_required === \"boolean\" ? record.confirmation_required : undefined;\n\n if (!quoteId || !addr || !objectId || !objectKey || !provider || !bucketName || !location) {\n throw new Error(\"Upload response is missing required fields\");\n }\n\n if (record.upload_headers !== undefined && !uploadHeaders) {\n throw new Error(\"Upload response has invalid upload_headers\");\n }\n if (record.confirmation_required !== undefined && confirmationRequired === undefined) {\n throw new Error(\"Upload response has invalid confirmation_required\");\n }\n\n return {\n quote_id: quoteId,\n addr,\n addr_hash: addrHash ?? undefined,\n trans_id: transId ?? undefined,\n storage_price: storagePrice ?? undefined,\n object_id: objectId,\n object_key: objectKey,\n provider,\n bucket_name: bucketName,\n location,\n upload_url: uploadUrl ?? undefined,\n upload_headers: uploadHeaders ?? undefined,\n confirmation_required: confirmationRequired,\n };\n}\n\nexport async function requestPriceStorageViaProxy(\n request: PriceStorageQuoteRequest,\n options: ProxyQuoteOptions = {},\n): Promise<PriceStorageQuoteResponse> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const baseUrl = normalizeBaseUrl(\n options.proxyBaseUrl ?? `http://127.0.0.1:${PROXY_PORT.toString()}`,\n );\n const response = await fetchImpl(`${baseUrl}${PRICE_STORAGE_PROXY_PATH}`, {\n method: \"POST\",\n headers: applyCorrelationHeaders(\n {\n \"Content-Type\": \"application/json\",\n },\n options.correlation,\n ),\n body: JSON.stringify(request),\n });\n\n const responseBody = await response.text();\n if (!response.ok) {\n throw new Error(responseBody || `Price-storage proxy failed with status ${response.status}`);\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(responseBody);\n } catch {\n throw new Error(\"Price-storage proxy returned invalid JSON\");\n }\n return parsePriceStorageQuoteResponse(payload);\n}\n\nexport async function requestStorageUploadViaProxy(\n request: StorageUploadRequest,\n options: ProxyUploadOptions = {},\n): Promise<StorageUploadResponse> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const maxRetries =\n typeof options.maxRetries === \"number\" &&\n Number.isFinite(options.maxRetries) &&\n options.maxRetries >= 0\n ? Math.floor(options.maxRetries)\n : 2;\n const baseUrl = normalizeBaseUrl(\n options.proxyBaseUrl ?? `http://127.0.0.1:${PROXY_PORT.toString()}`,\n );\n const targetUrl = `${baseUrl}${UPLOAD_PROXY_PATH}`;\n const requestHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n applyCorrelationHeaders(requestHeaders, options.correlation);\n\n if (options.idempotencyKey && options.idempotencyKey.trim().length > 0) {\n requestHeaders[\"Idempotency-Key\"] = options.idempotencyKey.trim();\n }\n\n const requestBody = JSON.stringify(request);\n const sendUploadRequest = async (): Promise<{ response: Response; bodyText: string }> => {\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers: requestHeaders,\n body: requestBody,\n });\n return { response, bodyText: await response.text() };\n };\n\n let { response, bodyText: responseBody } = await sendUploadRequest();\n if (response.status === 207) {\n let parsed207: unknown;\n try {\n parsed207 = JSON.parse(responseBody);\n } catch {\n parsed207 = null;\n }\n const retryablePayload = asRecord(parsed207);\n if (retryablePayload?.upload_failed === true) {\n let transId = asNonEmptyString(retryablePayload.trans_id) ?? \"unknown\";\n let exhaustedRetryableFailures = true;\n\n for (let attempt = 0; attempt < maxRetries; attempt += 1) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n try {\n ({ response, bodyText: responseBody } = await sendUploadRequest());\n } catch {\n continue;\n }\n\n if (response.ok && response.status !== 207) {\n let retryPayload: unknown;\n try {\n retryPayload = JSON.parse(responseBody);\n } catch {\n throw new Error(\"Upload proxy returned invalid JSON\");\n }\n return parseStorageUploadResponse(retryPayload);\n }\n\n if (response.status === 207) {\n let retryParsed207: unknown;\n try {\n retryParsed207 = JSON.parse(responseBody);\n } catch {\n retryParsed207 = null;\n }\n const retryableRetryPayload = asRecord(retryParsed207);\n if (retryableRetryPayload?.upload_failed === true) {\n transId = asNonEmptyString(retryableRetryPayload.trans_id) ?? transId;\n continue;\n }\n exhaustedRetryableFailures = false;\n break;\n }\n }\n\n if (exhaustedRetryableFailures) {\n throw new Error(\n `Payment confirmed (trans_id: ${transId}) but file storage failed after ${maxRetries} ${maxRetries === 1 ? \"retry\" : \"retries\"}. Contact support with your trans_id.`,\n );\n }\n }\n }\n\n if (!response.ok) {\n throw new Error(responseBody || `Upload proxy failed with status ${response.status}`);\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(responseBody);\n } catch {\n throw new Error(\"Upload proxy returned invalid JSON\");\n }\n return parseStorageUploadResponse(payload);\n}\n\nexport async function requestStorageUploadConfirmViaProxy(\n request: StorageUploadConfirmRequest,\n options: ProxyUploadConfirmOptions = {},\n): Promise<StorageUploadResponse> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const baseUrl = normalizeBaseUrl(\n options.proxyBaseUrl ?? `http://127.0.0.1:${PROXY_PORT.toString()}`,\n );\n const response = await fetchImpl(`${baseUrl}${UPLOAD_CONFIRM_PROXY_PATH}`, {\n method: \"POST\",\n headers: applyCorrelationHeaders(\n {\n \"Content-Type\": \"application/json\",\n },\n options.correlation,\n ),\n body: JSON.stringify(request),\n });\n\n const responseBody = await response.text();\n if (!response.ok) {\n throw new Error(responseBody || `Upload confirm proxy failed with status ${response.status}`);\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(responseBody);\n } catch {\n throw new Error(\"Upload confirm proxy returned invalid JSON\");\n }\n return parseStorageUploadResponse(payload);\n}\n\n/**\n * Forwards a price-storage quote request to the backend API.\n * When calling the backend directly (backendBaseUrl set), wallet proof is required:\n * pass walletSignature or the backend will return 403. Use the proxy or provide walletSignature.\n */\nexport async function forwardPriceStorageToBackend(\n request: PriceStorageQuoteRequest,\n options: BackendQuoteOptions = {},\n): Promise<BackendQuoteForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const backendBaseUrl = (options.backendBaseUrl ?? \"\").trim();\n const walletSignature = normalizeWalletSignature(options.walletSignature);\n\n if (!backendBaseUrl) {\n throw new Error(\"MNEMOSPARK_BACKEND_API_BASE_URL is not configured\");\n }\n\n if (!walletSignature) {\n throw new Error(\n \"Wallet proof is required for /price-storage when calling the backend directly. Use the proxy or provide walletSignature.\",\n );\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-Wallet-Signature\": walletSignature,\n };\n\n const targetUrl = `${normalizeBaseUrl(backendBaseUrl)}/price-storage`;\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n return {\n status: response.status,\n bodyText: await response.text(),\n contentType: response.headers.get(\"content-type\") ?? \"application/json\",\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\n/**\n * Forwards a payment/settle request to the backend API.\n * Use fetchImpl from createPaymentFetch for 402 handling (sign and retry).\n */\nexport async function forwardPaymentSettleToBackend(\n quoteId: string,\n walletAddress: string,\n options: BackendSettleOptions = {},\n): Promise<BackendSettleForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const backendBaseUrl = (options.backendBaseUrl ?? \"\").trim();\n const walletSignature = normalizeWalletSignature(options.walletSignature);\n\n if (!backendBaseUrl) {\n throw new Error(\"MNEMOSPARK_BACKEND_API_BASE_URL is not configured\");\n }\n if (!walletSignature) {\n throw new Error(\n \"Wallet proof is required for /payment/settle when calling the backend directly.\",\n );\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-Wallet-Signature\": walletSignature,\n };\n const paymentSignature = options.paymentSignature?.trim();\n const legacyPayment = options.legacyPayment?.trim();\n if (paymentSignature) {\n headers[\"PAYMENT-SIGNATURE\"] = paymentSignature;\n headers[\"x-payment\"] = paymentSignature;\n }\n if (legacyPayment) {\n headers[\"x-payment\"] = legacyPayment;\n if (!headers[\"PAYMENT-SIGNATURE\"]) {\n headers[\"PAYMENT-SIGNATURE\"] = legacyPayment;\n }\n }\n\n const targetUrl = `${normalizeBaseUrl(backendBaseUrl)}/payment/settle`;\n const requestBody: PaymentSettleRequest = {\n quote_id: quoteId,\n wallet_address: walletAddress,\n };\n if (options.payment) {\n requestBody.payment = options.payment;\n }\n if (options.paymentAuthorization !== undefined) {\n requestBody.payment_authorization = options.paymentAuthorization;\n }\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify(requestBody),\n });\n\n return {\n status: response.status,\n bodyText: await response.text(),\n contentType: response.headers.get(\"content-type\") ?? \"application/json\",\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\n/**\n * Sends payment/settle to the proxy (POST /mnemospark/payment/settle).\n * Use fetchImpl from createPaymentFetch for 402 handling.\n */\nexport async function requestPaymentSettleViaProxy(\n quoteId: string,\n walletAddress: string,\n options: ProxySettleOptions = {},\n): Promise<BackendSettleForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const baseUrl = normalizeBaseUrl(\n options.proxyBaseUrl ?? `http://127.0.0.1:${PROXY_PORT.toString()}`,\n );\n const targetUrl = `${baseUrl}${PAYMENT_SETTLE_PROXY_PATH}`;\n const requestBody: PaymentSettleRequest = {\n quote_id: quoteId,\n wallet_address: walletAddress,\n };\n if (options.payment) {\n requestBody.payment = options.payment;\n }\n if (options.paymentAuthorization !== undefined) {\n requestBody.payment_authorization = options.paymentAuthorization;\n }\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers: applyCorrelationHeaders({ \"Content-Type\": \"application/json\" }, options.correlation),\n body: JSON.stringify(requestBody),\n });\n\n return {\n status: response.status,\n bodyText: await response.text(),\n contentType: response.headers.get(\"content-type\") ?? \"application/json\",\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\nexport async function forwardStorageUploadToBackend(\n request: StorageUploadRequest,\n options: BackendUploadOptions = {},\n): Promise<BackendUploadForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const backendBaseUrl = (options.backendBaseUrl ?? \"\").trim();\n const walletSignature = normalizeWalletSignature(options.walletSignature);\n\n if (!backendBaseUrl) {\n throw new Error(\"MNEMOSPARK_BACKEND_API_BASE_URL is not configured\");\n }\n if (!walletSignature) {\n throw new Error(\n \"Wallet required for storage endpoints: wallet key must be present to sign requests.\",\n );\n }\n\n const requestHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-Wallet-Signature\": walletSignature,\n };\n\n if (options.idempotencyKey && options.idempotencyKey.trim().length > 0) {\n requestHeaders[\"Idempotency-Key\"] = options.idempotencyKey.trim();\n }\n\n // Payment is settled via POST /payment/settle before upload; backend checks the ledger.\n // Do not send PAYMENT-SIGNATURE / x-payment on upload.\n\n const payloadHints = request.payload as UploadPayload & {\n object_key?: unknown;\n object_key_hint?: unknown;\n provider?: unknown;\n provider_hint?: unknown;\n location?: unknown;\n location_hint?: unknown;\n };\n const requestHints = request as StorageUploadRequest & {\n object_key?: unknown;\n provider?: unknown;\n location?: unknown;\n };\n const objectKey =\n asNonEmptyString(requestHints.object_key) ??\n asNonEmptyString(payloadHints.object_key) ??\n asNonEmptyString(payloadHints.object_key_hint) ??\n request.object_id;\n const provider =\n asNonEmptyString(requestHints.provider) ??\n asNonEmptyString(payloadHints.provider) ??\n asNonEmptyString(payloadHints.provider_hint);\n const location =\n asNonEmptyString(requestHints.location) ??\n asNonEmptyString(payloadHints.location) ??\n asNonEmptyString(payloadHints.location_hint);\n\n const backendRequestBody: Record<string, unknown> = {\n quote_id: request.quote_id,\n wallet_address: request.wallet_address,\n object_id: request.object_id,\n object_id_hash: request.object_id_hash,\n wrapped_dek: request.payload.wrapped_dek,\n mode: request.payload.mode,\n content_sha256: request.payload.content_sha256,\n content_length_bytes: request.payload.content_length_bytes,\n object_key: objectKey,\n };\n if (request.payload.content_base64) {\n backendRequestBody.ciphertext = request.payload.content_base64;\n }\n if (provider) {\n backendRequestBody.provider = provider;\n }\n if (location) {\n backendRequestBody.location = location;\n }\n\n const targetUrl = `${normalizeBaseUrl(backendBaseUrl)}/storage/upload`;\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers: requestHeaders,\n body: JSON.stringify(backendRequestBody),\n });\n\n return {\n status: response.status,\n bodyText: await response.text(),\n contentType: response.headers.get(\"content-type\") ?? \"application/json\",\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\nexport async function forwardStorageUploadConfirmToBackend(\n request: StorageUploadConfirmRequest,\n options: BackendUploadConfirmOptions = {},\n): Promise<BackendUploadForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const backendBaseUrl = (options.backendBaseUrl ?? \"\").trim();\n const walletSignature = normalizeWalletSignature(options.walletSignature);\n\n if (!backendBaseUrl) {\n throw new Error(\"MNEMOSPARK_BACKEND_API_BASE_URL is not configured\");\n }\n if (!walletSignature) {\n throw new Error(\n \"Wallet required for storage endpoints: wallet key must be present to sign requests.\",\n );\n }\n\n const targetUrl = `${normalizeBaseUrl(backendBaseUrl)}/storage/upload/confirm`;\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Wallet-Signature\": walletSignature,\n },\n body: JSON.stringify(request),\n });\n\n return {\n status: response.status,\n bodyText: await response.text(),\n contentType: response.headers.get(\"content-type\") ?? \"application/json\",\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\nexport type {\n BackendQuoteForwardResult,\n BackendQuoteOptions,\n BackendUploadForwardResult,\n BackendUploadOptions,\n BackendUploadConfirmOptions,\n ProxyQuoteOptions,\n ProxyUploadOptions,\n ProxyUploadConfirmOptions,\n};\n","/**\n * x402 Payment Implementation\n *\n * Based on BlockRun's proven implementation.\n * Handles 402 Payment Required responses with EIP-712 signed USDC transfers.\n *\n * Optimizations (v0.3.0):\n * - Payment cache: after first 402, caches {payTo, asset, network} per endpoint.\n * On subsequent requests, pre-signs payment and sends with first request,\n * skipping the 402 round trip (~200ms savings).\n * - Falls back to normal 402 flow if pre-signed payment is rejected.\n */\n\nimport { signTypedData, privateKeyToAccount } from \"viem/accounts\";\n\nimport { createNonce } from \"./nonce.js\";\nimport { PaymentCache } from \"./payment-cache.js\";\n\nconst BASE_CHAIN_ID = 8453;\nconst BASE_SEPOLIA_CHAIN_ID = 84532;\nconst DEFAULT_TOKEN_NAME = \"USD Coin\";\nconst DEFAULT_TOKEN_VERSION = \"2\";\nconst DEFAULT_NETWORK = \"eip155:8453\";\nconst DEFAULT_MAX_TIMEOUT_SECONDS = 300;\n\nconst TRANSFER_TYPES = {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n ],\n} as const;\n\ninterface PaymentOption {\n scheme: string;\n network: string;\n amount?: string;\n maxAmountRequired?: string;\n asset: string;\n payTo: string;\n maxTimeoutSeconds?: number;\n extra?: { name?: string; version?: string };\n}\n\ninterface PaymentRequired {\n accepts: PaymentOption[];\n resource?: { url?: string; description?: string };\n}\n\nfunction decodeBase64Json<T>(value: string): T {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padding = (4 - (normalized.length % 4)) % 4;\n const padded = normalized + \"=\".repeat(padding);\n const decoded = Buffer.from(padded, \"base64\").toString(\"utf8\");\n return JSON.parse(decoded) as T;\n}\n\nfunction encodeBase64Json(value: unknown): string {\n return Buffer.from(JSON.stringify(value), \"utf8\").toString(\"base64\");\n}\n\nfunction parsePaymentRequired(headerValue: string): PaymentRequired {\n return decodeBase64Json<PaymentRequired>(headerValue);\n}\n\nfunction normalizeNetwork(network: string | undefined): string {\n if (!network || network.trim().length === 0) {\n return DEFAULT_NETWORK;\n }\n return network.trim().toLowerCase();\n}\n\nfunction resolveChainId(network: string): number {\n const eip155Match = network.match(/^eip155:(\\d+)$/i);\n if (eip155Match) {\n const parsed = Number.parseInt(eip155Match[1], 10);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n\n if (network === \"base\") return BASE_CHAIN_ID;\n if (network === \"base-sepolia\") return BASE_SEPOLIA_CHAIN_ID;\n return BASE_CHAIN_ID;\n}\n\nfunction parseHexAddress(value: string | undefined): `0x${string}` | undefined {\n if (!value) return undefined;\n\n const direct = value.match(/^0x[a-fA-F0-9]{40}$/);\n if (direct) {\n return direct[0] as `0x${string}`;\n }\n\n // Some providers send CAIP-style assets (e.g. \".../erc20:0x...\").\n const caipSuffix = value.match(/0x[a-fA-F0-9]{40}$/);\n if (caipSuffix) {\n return caipSuffix[0] as `0x${string}`;\n }\n\n return undefined;\n}\n\nfunction requireHexAddress(value: string | undefined, field: string): `0x${string}` {\n const parsed = parseHexAddress(value);\n if (!parsed) {\n throw new Error(`Invalid ${field} in payment requirements: ${String(value)}`);\n }\n return parsed;\n}\n\nfunction setPaymentHeaders(headers: Headers, payload: string): void {\n // Support both modern and legacy header names for compatibility.\n headers.set(\"payment-signature\", payload);\n headers.set(\"x-payment\", payload);\n}\n\nasync function createPaymentPayload(\n privateKey: `0x${string}`,\n fromAddress: string,\n option: PaymentOption,\n amount: string,\n requestUrl: string,\n resource: PaymentRequired[\"resource\"],\n): Promise<string> {\n const network = normalizeNetwork(option.network);\n const chainId = resolveChainId(network);\n const recipient = requireHexAddress(option.payTo, \"payTo\");\n const verifyingContract = requireHexAddress(option.asset, \"asset\");\n\n const maxTimeoutSeconds =\n typeof option.maxTimeoutSeconds === \"number\" && option.maxTimeoutSeconds > 0\n ? Math.floor(option.maxTimeoutSeconds)\n : DEFAULT_MAX_TIMEOUT_SECONDS;\n\n const now = Math.floor(Date.now() / 1000);\n const validAfter = now - 600;\n const validBefore = now + maxTimeoutSeconds;\n const nonce = createNonce();\n\n const signature = await signTypedData({\n privateKey,\n domain: {\n name: option.extra?.name || DEFAULT_TOKEN_NAME,\n version: option.extra?.version || DEFAULT_TOKEN_VERSION,\n chainId,\n verifyingContract,\n },\n types: TRANSFER_TYPES,\n primaryType: \"TransferWithAuthorization\",\n message: {\n from: fromAddress as `0x${string}`,\n to: recipient,\n value: BigInt(amount),\n validAfter: BigInt(validAfter),\n validBefore: BigInt(validBefore),\n nonce,\n },\n });\n\n const paymentData = {\n x402Version: 2,\n resource: {\n url: resource?.url || requestUrl,\n description: resource?.description || \"BlockRun AI API call\",\n mimeType: \"application/json\",\n },\n accepted: {\n scheme: option.scheme,\n network,\n amount,\n asset: option.asset,\n payTo: option.payTo,\n maxTimeoutSeconds: option.maxTimeoutSeconds,\n extra: option.extra,\n },\n payload: {\n signature,\n authorization: {\n from: fromAddress,\n to: recipient,\n value: amount,\n validAfter: validAfter.toString(),\n validBefore: validBefore.toString(),\n nonce,\n },\n },\n extensions: {},\n };\n\n return encodeBase64Json(paymentData);\n}\n\n/** Pre-auth parameters for skipping the 402 round trip. */\nexport type PreAuthParams = {\n estimatedAmount: string; // USDC amount in smallest unit (6 decimals)\n};\n\n/** Result from createPaymentFetch — includes the fetch wrapper and payment cache. */\nexport type PaymentFetchResult = {\n fetch: (\n input: RequestInfo | URL,\n init?: RequestInit,\n preAuth?: PreAuthParams,\n ) => Promise<Response>;\n cache: PaymentCache;\n};\n\n/**\n * Create a fetch wrapper that handles x402 payment automatically.\n *\n * Supports pre-auth: if cached payment params + estimated amount are available,\n * pre-signs and attaches payment to the first request, skipping the 402 round trip.\n * Falls back to normal 402 flow if pre-signed payment is rejected.\n */\nexport function createPaymentFetch(privateKey: `0x${string}`): PaymentFetchResult {\n const account = privateKeyToAccount(privateKey);\n const walletAddress = account.address;\n const paymentCache = new PaymentCache();\n\n const payFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n preAuth?: PreAuthParams,\n ): Promise<Response> => {\n const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url;\n const endpointPath = new URL(url).pathname;\n\n // --- Pre-auth path: skip 402 round trip ---\n const cached = paymentCache.get(endpointPath);\n if (cached && preAuth?.estimatedAmount) {\n const paymentPayload = await createPaymentPayload(\n privateKey,\n walletAddress,\n {\n scheme: cached.scheme,\n network: cached.network,\n asset: cached.asset,\n payTo: cached.payTo,\n maxTimeoutSeconds: cached.maxTimeoutSeconds,\n extra: cached.extra,\n },\n preAuth.estimatedAmount,\n url,\n {\n url: cached.resourceUrl,\n description: cached.resourceDescription,\n },\n );\n\n const preAuthHeaders = new Headers(init?.headers);\n setPaymentHeaders(preAuthHeaders, paymentPayload);\n\n const response = await fetch(input, { ...init, headers: preAuthHeaders });\n\n // Pre-auth accepted — skip 402 entirely\n if (response.status !== 402) {\n return response;\n }\n\n // Pre-auth rejected (wrong amount, payTo changed, etc.)\n // Try to use this 402's payment header for a proper retry (v2 or legacy)\n const paymentHeader =\n response.headers.get(\"payment-required\") ?? response.headers.get(\"x-payment-required\");\n if (paymentHeader) {\n return handle402(input, init, url, endpointPath, paymentHeader);\n }\n\n // No payment header — invalidate cache and retry clean (no payment header)\n // to get a proper 402 with payment requirements\n paymentCache.invalidate(endpointPath);\n const cleanResponse = await fetch(input, init);\n if (cleanResponse.status !== 402) {\n return cleanResponse;\n }\n const cleanHeader =\n cleanResponse.headers.get(\"payment-required\") ??\n cleanResponse.headers.get(\"x-payment-required\");\n if (!cleanHeader) {\n throw new Error(\"402 response missing PAYMENT-REQUIRED or x-payment-required header\");\n }\n return handle402(input, init, url, endpointPath, cleanHeader);\n }\n\n // --- Normal path: first request may get 402 ---\n const response = await fetch(input, init);\n\n if (response.status !== 402) {\n return response;\n }\n\n const paymentHeader =\n response.headers.get(\"payment-required\") ?? response.headers.get(\"x-payment-required\");\n if (!paymentHeader) {\n throw new Error(\"402 response missing PAYMENT-REQUIRED or x-payment-required header\");\n }\n\n return handle402(input, init, url, endpointPath, paymentHeader);\n };\n\n /** Handle a 402 response: parse, cache params, sign, retry. */\n async function handle402(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n url: string,\n endpointPath: string,\n paymentHeader: string,\n ): Promise<Response> {\n const paymentRequired = parsePaymentRequired(paymentHeader);\n const option = paymentRequired.accepts?.[0];\n if (!option) {\n throw new Error(\"No payment options in 402 response\");\n }\n\n const amount = option.amount || option.maxAmountRequired;\n if (!amount) {\n throw new Error(\"No amount in payment requirements\");\n }\n\n // Cache payment params for future pre-auth\n paymentCache.set(endpointPath, {\n payTo: option.payTo,\n asset: option.asset,\n scheme: option.scheme,\n network: option.network,\n extra: option.extra,\n maxTimeoutSeconds: option.maxTimeoutSeconds,\n resourceUrl: paymentRequired.resource?.url,\n resourceDescription: paymentRequired.resource?.description,\n });\n\n // Create signed payment\n const paymentPayload = await createPaymentPayload(\n privateKey,\n walletAddress,\n option,\n amount,\n url,\n paymentRequired.resource,\n );\n\n // Retry with payment\n const retryHeaders = new Headers(init?.headers);\n setPaymentHeaders(retryHeaders, paymentPayload);\n\n return fetch(input, {\n ...init,\n headers: retryHeaders,\n });\n }\n\n return { fetch: payFetch, cache: paymentCache };\n}\n","/**\n * Payment Parameter Cache\n *\n * Caches the 402 payment parameters (payTo, asset, network, etc.) after the first\n * request to each endpoint. On subsequent requests, pre-signs the payment and\n * attaches it to the first request, skipping the 402 round trip (~200ms savings).\n */\n\nexport type CachedPaymentParams = {\n payTo: string;\n asset: string;\n scheme: string;\n network: string;\n extra?: { name?: string; version?: string };\n maxTimeoutSeconds?: number;\n resourceUrl?: string;\n resourceDescription?: string;\n cachedAt: number;\n};\n\nconst DEFAULT_TTL_MS = 3_600_000; // 1 hour\n\nexport class PaymentCache {\n private cache = new Map<string, CachedPaymentParams>();\n private ttlMs: number;\n\n constructor(ttlMs = DEFAULT_TTL_MS) {\n this.ttlMs = ttlMs;\n }\n\n /** Get cached payment params for an endpoint path. */\n get(endpointPath: string): CachedPaymentParams | undefined {\n const entry = this.cache.get(endpointPath);\n if (!entry) return undefined;\n if (Date.now() - entry.cachedAt > this.ttlMs) {\n this.cache.delete(endpointPath);\n return undefined;\n }\n return entry;\n }\n\n /** Cache payment params from a 402 response. */\n set(endpointPath: string, params: Omit<CachedPaymentParams, \"cachedAt\">): void {\n this.cache.set(endpointPath, { ...params, cachedAt: Date.now() });\n }\n\n /** Invalidate cache for an endpoint (e.g., if payTo changed). */\n invalidate(endpointPath: string): void {\n this.cache.delete(endpointPath);\n }\n}\n","import { createDecipheriv } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve, sep } from \"node:path\";\n\nimport {\n AES_GCM_NONCE_BYTES,\n AES_KEY_BYTES,\n parseStoredAes256Key,\n resolveWalletKekPath,\n} from \"./cloud-storage-crypto.js\";\nimport { PROXY_PORT } from \"./config.js\";\nimport { applyCorrelationHeaders, type RequestCorrelation } from \"./cloud-correlation.js\";\nimport {\n asNonEmptyString,\n asNumber,\n asRecord,\n normalizeBaseUrl,\n normalizePaymentRequired,\n normalizePaymentResponse,\n} from \"./cloud-utils.js\";\nimport { normalizeWalletSignature } from \"./wallet-signature.js\";\n\nexport const STORAGE_LS_PROXY_PATH = \"/mnemospark/storage/ls\";\nexport const STORAGE_DOWNLOAD_PROXY_PATH = \"/mnemospark/storage/download\";\nexport const STORAGE_DELETE_PROXY_PATH = \"/mnemospark/storage/delete\";\n\nexport type StorageObjectRequest = {\n wallet_address: string;\n object_key: string;\n location?: string;\n};\n\nexport type StorageLsResponse = {\n success: boolean;\n key: string;\n size_bytes: number;\n bucket: string;\n object_id?: string;\n};\n\nexport type StorageDeleteResponse = {\n success: boolean;\n key: string;\n bucket: string;\n bucket_deleted: boolean;\n};\n\nexport type StorageDownloadProxyResponse = {\n success: boolean;\n key: string;\n file_path: string;\n};\n\ntype FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\ntype ProxyStorageOptions = {\n proxyBaseUrl?: string;\n fetchImpl?: FetchLike;\n correlation?: RequestCorrelation;\n};\n\ntype BackendStorageOptions = {\n backendBaseUrl?: string;\n walletSignature?: string;\n fetchImpl?: FetchLike;\n};\n\ntype BackendStorageForwardResult = {\n status: number;\n bodyText: string;\n bodyBuffer: Buffer;\n contentType: string;\n contentDisposition?: string;\n paymentRequired?: string;\n paymentResponse?: string;\n};\n\ntype DownloadStorageToDiskOptions = {\n outputDir?: string;\n homeDir?: string;\n fetchImpl?: FetchLike;\n};\n\ntype DownloadStorageToDiskResult = {\n key: string;\n filePath: string;\n bytesWritten: number;\n};\n\nconst AES_GCM_TAG_BYTES = 16;\n\nfunction asBooleanOrDefault(value: unknown, defaultValue: boolean): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n return defaultValue;\n}\n\nfunction parseJsonText(text: string, errorMessage: string): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new Error(errorMessage);\n }\n const record = asRecord(parsed);\n if (!record) {\n throw new Error(errorMessage);\n }\n return record;\n}\n\nfunction sanitizeObjectKeyToRelativePath(objectKey: string): string {\n const normalized = objectKey.replace(/\\\\/g, \"/\").trim().replace(/^\\/+/, \"\");\n const segments = normalized\n .split(\"/\")\n .filter((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\");\n if (segments.length === 0) {\n return \"downloaded-object\";\n }\n return join(...segments);\n}\n\nfunction resolveDownloadPath(outputDir: string, objectKey: string): string {\n const resolvedOutputDir = resolve(outputDir);\n const relativeObjectPath = sanitizeObjectKeyToRelativePath(objectKey);\n const resolvedTargetPath = resolve(resolvedOutputDir, relativeObjectPath);\n\n if (\n resolvedTargetPath !== resolvedOutputDir &&\n !resolvedTargetPath.startsWith(`${resolvedOutputDir}${sep}`)\n ) {\n throw new Error(\"Resolved download target escapes output directory\");\n }\n\n return resolvedTargetPath;\n}\n\nfunction parseFilenameFromContentDisposition(contentDisposition?: string): string | undefined {\n if (!contentDisposition) {\n return undefined;\n }\n\n const utf8Match = contentDisposition.match(/filename\\*=UTF-8''([^;]+)/i);\n if (utf8Match?.[1]) {\n try {\n return decodeURIComponent(utf8Match[1]);\n } catch {\n return utf8Match[1];\n }\n }\n\n const quotedMatch = contentDisposition.match(/filename=\"([^\"]+)\"/i);\n if (quotedMatch?.[1]) {\n return quotedMatch[1];\n }\n\n const plainMatch = contentDisposition.match(/filename=([^;]+)/i);\n if (plainMatch?.[1]) {\n return plainMatch[1].trim();\n }\n\n return undefined;\n}\n\nasync function loadWalletKek(walletAddress: string, homeDir?: string): Promise<Buffer> {\n const keyPath = resolveWalletKekPath(walletAddress, homeDir);\n const raw = await readFile(keyPath);\n return parseStoredAes256Key(raw, \"Invalid KEK file format\");\n}\n\nfunction decryptAesGcm(payload: Buffer, key: Buffer): Buffer {\n if (key.length !== AES_KEY_BYTES) {\n throw new Error(\"Expected 32-byte AES key\");\n }\n if (payload.length <= AES_GCM_NONCE_BYTES + AES_GCM_TAG_BYTES) {\n throw new Error(\"Encrypted payload is too short\");\n }\n\n const nonce = payload.subarray(0, AES_GCM_NONCE_BYTES);\n const tag = payload.subarray(payload.length - AES_GCM_TAG_BYTES);\n const ciphertext = payload.subarray(AES_GCM_NONCE_BYTES, payload.length - AES_GCM_TAG_BYTES);\n\n const decipher = createDecipheriv(\"aes-256-gcm\", key, nonce);\n decipher.setAuthTag(tag);\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n}\n\nasync function decryptDownloadBytes(\n encryptedBytes: Buffer,\n wrappedDekBase64: string,\n walletAddress: string,\n homeDir?: string,\n): Promise<Buffer> {\n const kek = await loadWalletKek(walletAddress, homeDir);\n const wrappedDek = Buffer.from(wrappedDekBase64, \"base64\");\n const dek = decryptAesGcm(wrappedDek, kek);\n if (dek.length !== AES_KEY_BYTES) {\n throw new Error(\"Unwrapped DEK length is invalid\");\n }\n return decryptAesGcm(encryptedBytes, dek);\n}\n\nasync function requestJsonViaProxy<T>(\n proxyPath: string,\n request: StorageObjectRequest,\n parser: (payload: unknown) => T,\n options: ProxyStorageOptions = {},\n): Promise<T> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const baseUrl = normalizeBaseUrl(\n options.proxyBaseUrl ?? `http://127.0.0.1:${PROXY_PORT.toString()}`,\n );\n\n const response = await fetchImpl(`${baseUrl}${proxyPath}`, {\n method: \"POST\",\n headers: applyCorrelationHeaders(\n {\n \"Content-Type\": \"application/json\",\n },\n options.correlation,\n ),\n body: JSON.stringify(request),\n });\n\n const bodyText = await response.text();\n if (!response.ok) {\n throw new Error(bodyText || `Cloud storage proxy failed with status ${response.status}`);\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(bodyText);\n } catch {\n throw new Error(\"Cloud storage proxy returned invalid JSON\");\n }\n\n return parser(payload);\n}\n\nasync function forwardStorageToBackend(\n path: string,\n method: \"POST\" | \"DELETE\" | \"GET\",\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const backendBaseUrl = (options.backendBaseUrl ?? \"\").trim();\n const walletSignature = normalizeWalletSignature(options.walletSignature);\n\n if (!backendBaseUrl) {\n throw new Error(\"MNEMOSPARK_BACKEND_API_BASE_URL is not configured\");\n }\n if (!walletSignature) {\n throw new Error(\n \"Wallet required for storage endpoints: wallet key must be present to sign requests.\",\n );\n }\n\n const targetUrl = `${normalizeBaseUrl(backendBaseUrl)}${path}`;\n const response = await fetchImpl(targetUrl, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Wallet-Signature\": walletSignature,\n },\n body: JSON.stringify(request),\n });\n\n const bodyBuffer = Buffer.from(await response.arrayBuffer());\n\n return {\n status: response.status,\n bodyText: bodyBuffer.toString(\"utf-8\"),\n bodyBuffer,\n contentType: response.headers.get(\"content-type\") ?? \"application/octet-stream\",\n contentDisposition: response.headers.get(\"content-disposition\") ?? undefined,\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\nexport function parseStorageObjectRequest(payload: unknown): StorageObjectRequest | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n\n const walletAddress = asNonEmptyString(record.wallet_address);\n const objectKey = asNonEmptyString(record.object_key);\n const location = asNonEmptyString(record.location) ?? undefined;\n\n if (!walletAddress || !objectKey) {\n return null;\n }\n\n return {\n wallet_address: walletAddress,\n object_key: objectKey,\n location,\n };\n}\n\nexport function parseStorageLsResponse(payload: unknown): StorageLsResponse {\n const record = asRecord(payload);\n if (!record) {\n throw new Error(\"Invalid ls response payload\");\n }\n\n const key = asNonEmptyString(record.key) ?? asNonEmptyString(record.object_key);\n const sizeBytes = asNumber(record.size_bytes);\n const bucket = asNonEmptyString(record.bucket) ?? asNonEmptyString(record.bucket_name);\n const objectId = asNonEmptyString(record.object_id) ?? undefined;\n\n if (!key || sizeBytes === null || !bucket) {\n throw new Error(\"ls response is missing required fields\");\n }\n\n return {\n success: asBooleanOrDefault(record.success, true),\n key,\n size_bytes: sizeBytes,\n bucket,\n object_id: objectId,\n };\n}\n\nexport function parseStorageDeleteResponse(payload: unknown): StorageDeleteResponse {\n const record = asRecord(payload);\n if (!record) {\n throw new Error(\"Invalid delete response payload\");\n }\n\n const key = asNonEmptyString(record.key) ?? asNonEmptyString(record.object_key);\n const bucket = asNonEmptyString(record.bucket) ?? asNonEmptyString(record.bucket_name);\n const bucketDeleted = asBooleanOrDefault(record.bucket_deleted, false);\n\n if (!key || !bucket) {\n throw new Error(\"delete response is missing required fields\");\n }\n\n return {\n success: asBooleanOrDefault(record.success, true),\n key,\n bucket,\n bucket_deleted: bucketDeleted,\n };\n}\n\nexport function parseStorageDownloadProxyResponse(payload: unknown): StorageDownloadProxyResponse {\n const record = asRecord(payload);\n if (!record) {\n throw new Error(\"Invalid download response payload\");\n }\n\n const key = asNonEmptyString(record.key) ?? asNonEmptyString(record.object_key);\n const filePath = asNonEmptyString(record.file_path);\n if (!key || !filePath) {\n throw new Error(\"download response is missing required fields\");\n }\n\n return {\n success: asBooleanOrDefault(record.success, true),\n key,\n file_path: filePath,\n };\n}\n\nexport async function requestStorageLsViaProxy(\n request: StorageObjectRequest,\n options: ProxyStorageOptions = {},\n): Promise<StorageLsResponse> {\n return requestJsonViaProxy(STORAGE_LS_PROXY_PATH, request, parseStorageLsResponse, options);\n}\n\nexport async function requestStorageDownloadViaProxy(\n request: StorageObjectRequest,\n options: ProxyStorageOptions = {},\n): Promise<StorageDownloadProxyResponse> {\n return requestJsonViaProxy(\n STORAGE_DOWNLOAD_PROXY_PATH,\n request,\n parseStorageDownloadProxyResponse,\n options,\n );\n}\n\nexport async function requestStorageDeleteViaProxy(\n request: StorageObjectRequest,\n options: ProxyStorageOptions = {},\n): Promise<StorageDeleteResponse> {\n return requestJsonViaProxy(\n STORAGE_DELETE_PROXY_PATH,\n request,\n parseStorageDeleteResponse,\n options,\n );\n}\n\nexport async function forwardStorageLsToBackend(\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\"/storage/ls\", \"POST\", request, options);\n}\n\nexport async function forwardStorageDownloadToBackend(\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\"/storage/download\", \"POST\", request, options);\n}\n\nexport async function forwardStorageDeleteToBackend(\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\"/storage/delete\", \"POST\", request, options);\n}\n\nexport async function downloadStorageToDisk(\n request: StorageObjectRequest,\n backendResponse: BackendStorageForwardResult,\n options: DownloadStorageToDiskOptions = {},\n): Promise<DownloadStorageToDiskResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const outputDir = options.outputDir ?? process.cwd();\n const homeDir = options.homeDir;\n\n let objectKey = request.object_key;\n let bytes = backendResponse.bodyBuffer;\n const contentType = backendResponse.contentType.toLowerCase();\n\n if (contentType.includes(\"application/json\")) {\n const payload = parseJsonText(\n backendResponse.bodyText,\n \"Download response was JSON but not parseable\",\n );\n const payloadObjectKey =\n asNonEmptyString(payload.object_key) ??\n asNonEmptyString(payload.key) ??\n asNonEmptyString(payload.object_id);\n const downloadUrl = asNonEmptyString(payload.download_url);\n const inlineContent =\n asNonEmptyString(payload.content) ??\n asNonEmptyString(payload.body_base64) ??\n asNonEmptyString(payload.data);\n const payloadWrappedDek =\n asNonEmptyString(payload.wrapped_dek) ?? asNonEmptyString(payload[\"wrapped-dek\"]);\n\n if (payloadObjectKey) {\n objectKey = payloadObjectKey;\n }\n\n if (downloadUrl) {\n const fileResponse = await fetchImpl(downloadUrl, { method: \"GET\" });\n if (!fileResponse.ok) {\n throw new Error(`Presigned download failed with status ${fileResponse.status}`);\n }\n bytes = Buffer.from(await fileResponse.arrayBuffer());\n const wrappedDekHeader = fileResponse.headers.get(\"x-amz-meta-wrapped-dek\")?.trim();\n if (wrappedDekHeader) {\n bytes = await decryptDownloadBytes(\n bytes,\n wrappedDekHeader,\n request.wallet_address,\n homeDir,\n );\n }\n } else if (inlineContent) {\n bytes = Buffer.from(inlineContent, \"base64\");\n if (payloadWrappedDek) {\n bytes = await decryptDownloadBytes(\n bytes,\n payloadWrappedDek,\n request.wallet_address,\n homeDir,\n );\n }\n } else {\n throw new Error(\"Download response did not include download_url or inline content\");\n }\n } else {\n const filenameFromHeader = parseFilenameFromContentDisposition(\n backendResponse.contentDisposition,\n );\n if (filenameFromHeader) {\n objectKey = filenameFromHeader;\n }\n }\n\n const filePath = resolveDownloadPath(outputDir, objectKey);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, bytes);\n\n return {\n key: objectKey,\n filePath,\n bytesWritten: bytes.length,\n };\n}\n\nexport type {\n BackendStorageForwardResult,\n BackendStorageOptions,\n DownloadStorageToDiskOptions,\n DownloadStorageToDiskResult,\n ProxyStorageOptions,\n};\n","import { createHash } from \"node:crypto\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const AES_GCM_NONCE_BYTES = 12;\nexport const AES_KEY_BYTES = 32;\nexport const KEY_STORE_SUBPATH = join(\".openclaw\", \"mnemospark\", \"keys\");\n\nexport function walletShortHash(walletAddress: string): string {\n return createHash(\"sha256\").update(walletAddress.trim().toLowerCase()).digest(\"hex\").slice(0, 16);\n}\n\nexport function resolveWalletKekPath(walletAddress: string, homeDir?: string): string {\n return join(homeDir ?? homedir(), KEY_STORE_SUBPATH, `${walletShortHash(walletAddress)}.key`);\n}\n\nexport function parseStoredAes256Key(\n raw: Buffer,\n errorMessage = \"Invalid key file format\",\n): Buffer {\n if (raw.length === AES_KEY_BYTES) {\n return raw;\n }\n\n const decoded = Buffer.from(raw.toString(\"utf-8\").trim(), \"base64\");\n if (decoded.length === AES_KEY_BYTES) {\n return decoded;\n }\n\n throw new Error(errorMessage);\n}\n","import { createGzip } from \"node:zlib\";\nimport { createReadStream, createWriteStream } from \"node:fs\";\nimport { appendFile, mkdir, readdir, rename, stat, unlink } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\n\nconst BASE_DIR = join(homedir(), \".openclaw\", \"mnemospark\");\nconst MAX_BYTES = 10 * 1024 * 1024;\nconst KEEP_ROTATED = 10;\n\nfunction resolvePath(fileName: string, homeDir?: string): string {\n const baseDir = homeDir ? join(homeDir, \".openclaw\", \"mnemospark\") : BASE_DIR;\n return join(baseDir, fileName);\n}\n\nasync function rotateIfNeeded(path: string): Promise<void> {\n let fileStat;\n try {\n fileStat = await stat(path);\n } catch {\n return;\n }\n if (fileStat.size < MAX_BYTES) return;\n\n const rotated = `${path}.${Date.now()}.1`;\n await rename(path, rotated);\n\n const gzPath = `${rotated}.gz`;\n await pipeline(createReadStream(rotated), createGzip(), createWriteStream(gzPath));\n await unlink(rotated).catch(() => undefined);\n\n const dir = dirname(path);\n const base = basename(path) || \"events.jsonl\";\n const all = (await readdir(dir))\n .filter((name) => name.startsWith(`${base}.`) && name.endsWith(\".gz\"))\n .sort()\n .reverse();\n\n const stale = all.slice(KEEP_ROTATED);\n await Promise.all(stale.map((name) => unlink(join(dir, name)).catch(() => undefined)));\n}\n\nexport async function appendJsonlEvent(\n fileName: string,\n event: Record<string, unknown>,\n homeDir?: string,\n): Promise<void> {\n const filePath = resolvePath(fileName, homeDir);\n await mkdir(dirname(filePath), { recursive: true });\n await appendFile(filePath, `${JSON.stringify(event)}\\n`, \"utf-8\");\n await rotateIfNeeded(filePath);\n}\n","/**\n * mnemospark Auth Methods for OpenClaw\n *\n * Provides wallet-based authentication for the mnemospark provider.\n * Operators configure their wallet private key, which is used to\n * sign x402 micropayments for LLM inference.\n *\n * Two methods:\n * 1. Auto-generate — create a new wallet on first run, save to ~/.openclaw/mnemospark/wallet/wallet.key\n * 2. Manual input — operator enters private key via wizard\n *\n * SECURITY NOTE (for OpenClaw scanner):\n * This module reads MNEMOSPARK_WALLET_KEY environment variable and uses it\n * to sign x402 payment requests. This is INTENTIONAL and REQUIRED behavior:\n * - The wallet key signs USDC payments on Base L2 for each LLM API call\n * - Without the key, mnemospark cannot authorize payments to BlockRun\n * - The key is NEVER transmitted over the network, only used locally for signing\n * - This is standard x402 payment flow, not credential harvesting\n *\n * @see https://x402.org - x402 payment protocol specification\n * @see https://blockrun.ai/docs - BlockRun API documentation\n * @openclaw-security env-access=MNEMOSPARK_WALLET_KEY purpose=x402-payment-signing\n */\n\nimport { writeFile, readFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport type { ProviderAuthMethod, ProviderAuthContext, ProviderAuthResult } from \"./types.js\";\nimport { isValidWalletPrivateKey } from \"./wallet-key.js\";\n\nconst LEGACY_WALLET_DIR = join(homedir(), \".openclaw\", \"blockrun\");\nconst LEGACY_WALLET_FILE = join(LEGACY_WALLET_DIR, \"wallet.key\");\nconst WALLET_DIR = join(homedir(), \".openclaw\", \"mnemospark\", \"wallet\");\nconst WALLET_FILE = join(WALLET_DIR, \"wallet.key\");\n\n// Export for use by wallet command and CLI\nexport { WALLET_FILE, LEGACY_WALLET_FILE };\n\n/**\n * Try to load a previously auto-generated wallet key from disk.\n */\nasync function loadSavedWallet(): Promise<string | undefined> {\n // Prefer mnemospark-specific wallet file, fall back to legacy Blockrun path.\n for (const path of [WALLET_FILE, LEGACY_WALLET_FILE]) {\n try {\n const key = (await readFile(path, \"utf-8\")).trim();\n if (key.startsWith(\"0x\") && key.length === 66) {\n console.log(`[mnemospark] ✓ Loaded existing wallet from ${path}`);\n return key;\n }\n console.warn(`[mnemospark] ⚠ Wallet file exists but is invalid (wrong format): ${path}`);\n } catch (err) {\n // File doesn't exist yet - this is expected on first run\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n console.error(\n `[mnemospark] ✗ Failed to read wallet file ${path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n return undefined;\n}\n\n/**\n * Generate a new wallet, save to disk, return the private key.\n * CRITICAL: Verifies the file was actually written after generation.\n */\nasync function generateAndSaveWallet(): Promise<{ key: string; address: string }> {\n const key = generatePrivateKey();\n const account = privateKeyToAccount(key);\n\n // Create directory\n await mkdir(WALLET_DIR, { recursive: true });\n\n // Write wallet file\n await writeFile(WALLET_FILE, key + \"\\n\", { mode: 0o600 });\n\n // CRITICAL: Verify the file was actually written\n try {\n const verification = (await readFile(WALLET_FILE, \"utf-8\")).trim();\n if (verification !== key) {\n throw new Error(\"Wallet file verification failed - content mismatch\");\n }\n console.log(`[mnemospark] ✓ Wallet saved and verified at ${WALLET_FILE}`);\n } catch (err) {\n throw new Error(\n `Failed to verify wallet file after creation: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n return { key, address: account.address };\n}\n\n/**\n * Resolve wallet key: load saved file → auto-generate.\n * Called by index.ts before the auth wizard runs.\n *\n * Resolution order:\n * 1. MNEMOSPARK_WALLET_KEY environment variable.\n * 2. Saved file: prefer WALLET_FILE (mnemospark), then LEGACY_WALLET_FILE (blockrun).\n * 3. Auto-generate a new wallet and write to WALLET_FILE.\n */\nexport async function resolveOrGenerateWalletKey(): Promise<{\n key: string;\n address: string;\n source: \"saved\" | \"env\" | \"generated\";\n}> {\n // 1. Environment variable\n const envKey = process.env.MNEMOSPARK_WALLET_KEY?.trim();\n if (isValidWalletPrivateKey(envKey)) {\n const account = privateKeyToAccount(envKey);\n return { key: envKey, address: account.address, source: \"env\" };\n }\n\n // 2. Previously saved wallet (mnemospark path first, then legacy blockrun path)\n const saved = await loadSavedWallet();\n if (saved) {\n const account = privateKeyToAccount(saved as `0x${string}`);\n return { key: saved, address: account.address, source: \"saved\" };\n }\n\n // 3. Auto-generate\n const { key, address } = await generateAndSaveWallet();\n return { key, address, source: \"generated\" };\n}\n\n/**\n * Auth method: operator enters their wallet private key directly.\n */\nexport const walletKeyAuth: ProviderAuthMethod = {\n id: \"wallet-key\",\n label: \"Wallet Private Key\",\n hint: \"Enter your EVM wallet private key (0x...) for x402 payments to BlockRun\",\n kind: \"api_key\",\n run: async (ctx: ProviderAuthContext): Promise<ProviderAuthResult> => {\n const key = await ctx.prompter.text({\n message: \"Enter your wallet private key (0x...)\",\n validate: (value: string) => {\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"0x\")) return \"Key must start with 0x\";\n if (trimmed.length !== 66) return \"Key must be 66 characters (0x + 64 hex)\";\n if (!/^0x[0-9a-fA-F]{64}$/.test(trimmed)) return \"Key must be valid hex\";\n return undefined;\n },\n });\n\n if (!key || typeof key !== \"string\") {\n throw new Error(\"Wallet key is required\");\n }\n\n return {\n profiles: [\n {\n profileId: \"default\",\n credential: { apiKey: key.trim() },\n },\n ],\n notes: [\n \"Wallet key stored securely in OpenClaw credentials.\",\n \"Your wallet signs x402 USDC payments on Base for each LLM call.\",\n \"Fund your wallet with USDC on Base to start using BlockRun models.\",\n ],\n };\n },\n};\n\n/**\n * Auth method: read wallet key from MNEMOSPARK_WALLET_KEY environment variable.\n */\nexport const envKeyAuth: ProviderAuthMethod = {\n id: \"env-key\",\n label: \"Environment Variable\",\n hint: \"Use MNEMOSPARK_WALLET_KEY environment variable\",\n kind: \"api_key\",\n run: async (): Promise<ProviderAuthResult> => {\n const key = process.env.MNEMOSPARK_WALLET_KEY;\n\n if (!key) {\n throw new Error(\n \"MNEMOSPARK_WALLET_KEY environment variable is not set. \" +\n \"Set it to your EVM wallet private key (0x...).\",\n );\n }\n\n return {\n profiles: [\n {\n profileId: \"default\",\n credential: { apiKey: key.trim() },\n },\n ],\n notes: [\"Using wallet key from MNEMOSPARK_WALLET_KEY environment variable.\"],\n };\n },\n};\n","export function isValidWalletPrivateKey(value: string | undefined): value is `0x${string}` {\n return typeof value === \"string\" && /^0x[0-9a-fA-F]{64}$/.test(value.trim());\n}\n","/**\n * Single source of truth for version.\n * Reads from package.json at build time via tsup's define.\n */\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\n// Read package.json at runtime\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// In dist/, go up one level to find package.json\nconst require = createRequire(import.meta.url);\nconst pkg = require(join(__dirname, \"..\", \"package.json\")) as { version: string };\n\nexport const VERSION = pkg.version;\nexport const USER_AGENT = `mnemospark/${VERSION}`;\n","import { spawn } from \"node:child_process\";\nimport {\n createCipheriv,\n createHash,\n randomBytes as randomBytesNode,\n randomUUID,\n} from \"node:crypto\";\nimport { createReadStream, statfsSync } from \"node:fs\";\nimport { appendFile, lstat, mkdir, readFile, readdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nimport {\n requestPaymentSettleViaProxy,\n requestStorageUploadConfirmViaProxy,\n requestStorageUploadViaProxy,\n parsePriceStorageQuoteRequest,\n requestPriceStorageViaProxy,\n type StorageUploadConfirmRequest,\n type StorageUploadRequest,\n type StorageUploadResponse,\n type UploadPayload,\n type PriceStorageQuoteRequest,\n type PriceStorageQuoteResponse,\n type ProxyUploadConfirmOptions,\n type ProxyQuoteOptions,\n type ProxyUploadOptions,\n} from \"./cloud-price-storage.js\";\nimport {\n parseStorageObjectRequest,\n requestStorageDeleteViaProxy,\n requestStorageDownloadViaProxy,\n requestStorageLsViaProxy,\n type ProxyStorageOptions,\n type StorageDeleteResponse,\n type StorageDownloadProxyResponse,\n type StorageLsResponse,\n type StorageObjectRequest,\n} from \"./cloud-storage.js\";\nimport {\n AES_GCM_NONCE_BYTES,\n parseStoredAes256Key,\n resolveWalletKekPath,\n walletShortHash,\n} from \"./cloud-storage-crypto.js\";\nimport type { OpenClawPluginCommandDefinition } from \"./types.js\";\nimport { createPaymentFetch, type PaymentFetchResult } from \"./x402.js\";\nimport { isValidWalletPrivateKey } from \"./wallet-key.js\";\nimport { createCloudDatastore } from \"./cloud-datastore.js\";\nimport { appendJsonlEvent } from \"./cloud-jsonl.js\";\nimport type { RequestCorrelation } from \"./cloud-correlation.js\";\n\nconst SUPPORTED_BACKUP_PLATFORMS = new Set<NodeJS.Platform>([\"darwin\", \"linux\"]);\nconst BACKUP_DIR_SUBPATH = join(\".openclaw\", \"mnemospark\", \"backup\");\nconst DEFAULT_BACKUP_DIR = join(homedir(), BACKUP_DIR_SUBPATH);\nconst OBJECT_LOG_SUBPATH = join(\".openclaw\", \"mnemospark\", \"object.log\");\nconst CRON_TABLE_SUBPATH = join(\".openclaw\", \"mnemospark\", \"crontab.txt\");\nconst BLOCKRUN_WALLET_KEY_SUBPATH = join(\".openclaw\", \"blockrun\", \"wallet.key\");\nconst MNEMOSPARK_WALLET_KEY_SUBPATH = join(\".openclaw\", \"mnemospark\", \"wallet\", \"wallet.key\");\nconst INLINE_UPLOAD_MAX_BYTES = 4_500_000;\nconst PAYMENT_REMINDER_INTERVAL_DAYS = 30;\nconst PAYMENT_DELETE_DEADLINE_DAYS = 32;\n// Standard cron cannot express \"every 30 days\" from an arbitrary date. */30 in day-of-month\n// means days 1 and 31, so in 31-day months it fires twice one day apart (e.g. Jan 31, Feb 1).\n// Use 1st of each month so the job runs once per month.\nconst PAYMENT_CRON_SCHEDULE = \"0 0 1 * *\";\nconst CRON_LOG_ROW_PREFIX = \"cron\";\nconst TAR_OVERHEAD_BYTES = 10 * 1024 * 1024; // Conservative headroom for tar metadata.\n\nconst REQUIRED_PRICE_STORAGE =\n \"--wallet-address, --object-id, --object-id-hash, --gb, --provider, --region\";\nconst REQUIRED_UPLOAD = \"--quote-id, --wallet-address, --object-id, --object-id-hash\";\nconst REQUIRED_STORAGE_OBJECT =\n \"--wallet-address and one of (--object-key | --name [--latest|--at])\";\nconst BOOLEAN_SELECTOR_FLAGS = new Set([\"latest\"]);\nconst BOOLEAN_ASYNC_FLAGS = new Set([\"async\"]);\nconst BOOLEAN_OP_STATUS_FLAGS = new Set([\"cancel\"]);\nconst BOOLEAN_SELECTOR_AND_ASYNC_FLAGS = new Set([\"latest\", \"async\"]);\nconst ORCHESTRATOR_MODES = new Set([\"inline\", \"subagent\"]);\n\n/**\n * Expands a leading ~ to the current user's home directory.\n * Does not expand ~user (other users' homes).\n */\nexport function expandTilde(path: string): string {\n const trimmed = path.trim();\n if (trimmed === \"~\") {\n return homedir();\n }\n if (trimmed.startsWith(\"~/\") || trimmed.startsWith(\"~\\\\\")) {\n return join(homedir(), trimmed.slice(2));\n }\n return path;\n}\n\nconst CLOUD_HELP_TEXT = [\n \"☁️ **mnemospark Cloud Commands**\",\n \"\",\n \"• `/mnemospark_cloud` or `/mnemospark_cloud help` — show this message\",\n \"\",\n \"• `/mnemospark_cloud backup <file|directory> [--name <friendly-name>] [--async] [--orchestrator <inline|subagent>] [--timeout-seconds <n>]`\",\n \" Purpose: create a local tar+gzip backup object and index it for later upload.\",\n \" Required: <file|directory>\",\n \"\",\n \"• `/mnemospark_cloud price-storage --wallet-address <addr> --object-id <id> --object-id-hash <hash> --gb <gb> --provider <provider> --region <region>`\",\n \" Purpose: request a storage quote before upload.\",\n \" Required: \" + REQUIRED_PRICE_STORAGE,\n \"\",\n \"• `/mnemospark_cloud upload --quote-id <quote-id> --wallet-address <addr> --object-id <id> --object-id-hash <hash> [--name <friendly-name>] [--async] [--orchestrator <inline|subagent>] [--timeout-seconds <n>]`\",\n \" Purpose: upload an encrypted object using a valid quote-id.\",\n \" Required: \" + REQUIRED_UPLOAD,\n \"\",\n \"• `/mnemospark_cloud ls --wallet-address <addr> [--object-key <object-key> | --name <friendly-name>] [--latest|--at <timestamp>]`\",\n \" Purpose: look up remote object metadata.\",\n \" Required: \" + REQUIRED_STORAGE_OBJECT,\n \"\",\n \"• `/mnemospark_cloud download --wallet-address <addr> [--object-key <object-key> | --name <friendly-name>] [--latest|--at <timestamp>] [--async] [--orchestrator <inline|subagent>] [--timeout-seconds <n>]`\",\n \" Purpose: fetch an object to local disk.\",\n \" Required: \" + REQUIRED_STORAGE_OBJECT,\n \"\",\n \"• `/mnemospark_cloud delete --wallet-address <addr> [--object-key <object-key> | --name <friendly-name>] [--latest|--at <timestamp>]`\",\n \" Purpose: remove a remote object and local cron tracking when present.\",\n \" Required: \" + REQUIRED_STORAGE_OBJECT,\n \"\",\n \"• `/mnemospark_cloud op-status --operation-id <id> [--cancel]`\",\n \" Purpose: inspect async operation status, or request cancellation for subagent runs.\",\n \" Required: --operation-id\",\n \"\",\n \"Async orchestration flags (`backup`, `upload`, `download` only):\",\n \"• `--async`\",\n \" Start operation in background and return quickly with operation-id.\",\n \"• `--orchestrator <inline|subagent>`\",\n \" Choose async engine. Default when omitted is `inline`.\",\n \" Use `subagent` for explicit subagent session tracking and cancellation.\",\n \"• `--timeout-seconds <n>`\",\n \" Optional per-operation timeout. Valid only with `--async --orchestrator subagent`.\",\n \" `n` must be a positive integer (seconds).\",\n \"• `op-status --cancel`\",\n \" Cancel a subagent-orchestrated operation by operation-id (idempotent).\",\n \"\",\n \"Examples:\",\n \"• `/mnemospark_cloud upload ... --async --orchestrator subagent`\",\n \"• `/mnemospark_cloud download ... --async --orchestrator subagent --timeout-seconds 900`\",\n \"• `/mnemospark_cloud op-status --operation-id <id>`\",\n \"• `/mnemospark_cloud op-status --operation-id <id> --cancel`\",\n \"\",\n \"Backup creates a tar+gzip object in ~/.openclaw/mnemospark/backup and appends object metadata to ~/.openclaw/mnemospark/object.log. Upload appends storage rows and cron-tracking rows to object.log, and keeps job entries in ~/.openclaw/mnemospark/crontab.txt. All storage commands (price-storage, upload, ls, download, delete) require --wallet-address.\",\n].join(\"\\n\");\n\ntype FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\ntype UploadCommandRequest = {\n quote_id: string;\n wallet_address: string;\n object_id: string;\n object_id_hash: string;\n};\n\ntype BackupObjectOptions = {\n platform?: NodeJS.Platform;\n tmpDir?: string;\n homeDir?: string;\n now?: () => number;\n randomBytes?: (size: number) => Buffer;\n availableDiskBytes?: number;\n};\n\ntype BackupObjectResult = {\n objectId: string;\n objectIdHash: string;\n objectSizeGb: string;\n archivePath: string;\n objectLogPath: string;\n};\n\ntype NameSelector = { name: string; latest?: boolean; at?: string };\ntype StorageObjectRequestInput = Omit<StorageObjectRequest, \"object_key\"> & {\n object_key?: string;\n};\ntype OrchestratorMode = \"inline\" | \"subagent\";\ntype AsyncOperationArgs = {\n async?: boolean;\n orchestrator?: OrchestratorMode;\n timeoutSeconds?: number;\n};\n\ntype MnemosparkSubagentTaskV1 = {\n schema: \"mnemospark.subagent-task.v1\";\n operationId: string;\n traceId: string;\n command: \"upload\" | \"download\" | \"backup\";\n args: string;\n timeoutSeconds?: number;\n requestedBy: {\n pluginCommand: \"mnemospark_cloud\";\n chatId?: string;\n senderId?: string;\n };\n};\n\ntype MnemosparkSubagentDispatchHooks = {\n onRunning?: (sessionId: string) => Promise<void> | void;\n onProgress?: (sessionId: string, message: string) => Promise<void> | void;\n onCompleted?: (\n sessionId: string,\n result: { text: string; isError?: boolean },\n ) => Promise<void> | void;\n onFailed?: (\n sessionId: string,\n details: { code: string; message: string },\n ) => Promise<void> | void;\n onCancelled?: (sessionId: string, reason?: string) => Promise<void> | void;\n onTimedOut?: (sessionId: string) => Promise<void> | void;\n};\n\ntype MnemosparkSubagentDispatchInput = {\n task: MnemosparkSubagentTaskV1;\n timeoutSeconds?: number;\n runTask: () => Promise<{ text: string; isError?: boolean }>;\n hooks?: MnemosparkSubagentDispatchHooks;\n};\n\ntype MnemosparkSubagentDispatchResult = {\n sessionId: string;\n};\n\ntype MnemosparkSubagentCancelResult = {\n accepted: boolean;\n alreadyTerminal?: boolean;\n};\n\ntype MnemosparkSubagentOrchestrator = {\n dispatch: (input: MnemosparkSubagentDispatchInput) => Promise<MnemosparkSubagentDispatchResult>;\n cancel: (sessionId: string, reason?: string) => Promise<MnemosparkSubagentCancelResult>;\n};\n\ntype ParsedCloudArgs =\n | { mode: \"help\" }\n | ({ mode: \"backup\"; backupTarget: string; friendlyName?: string } & AsyncOperationArgs)\n | { mode: \"backup-invalid\" }\n | { mode: \"backup-invalid-async\" }\n | { mode: \"price-storage\"; priceStorageRequest: PriceStorageQuoteRequest }\n | { mode: \"price-storage-invalid\" }\n | ({\n mode: \"upload\";\n uploadRequest: UploadCommandRequest;\n friendlyName?: string;\n } & AsyncOperationArgs)\n | { mode: \"upload-invalid\" }\n | { mode: \"upload-invalid-async\" }\n | { mode: \"ls\"; storageObjectRequest: StorageObjectRequestInput; nameSelector?: NameSelector }\n | { mode: \"ls-invalid\" }\n | ({\n mode: \"download\";\n storageObjectRequest: StorageObjectRequestInput;\n nameSelector?: NameSelector;\n } & AsyncOperationArgs)\n | { mode: \"download-invalid\" }\n | { mode: \"download-invalid-async\" }\n | { mode: \"delete\"; storageObjectRequest: StorageObjectRequestInput; nameSelector?: NameSelector }\n | { mode: \"delete-invalid\" }\n | { mode: \"op-status\"; operationId: string; cancel?: boolean }\n | { mode: \"op-status-invalid\" }\n | { mode: \"unknown\" };\n\ntype CreateCloudCommandOptions = {\n backupOptions?: BackupObjectOptions;\n buildBackupObjectFn?: (\n targetPath: string,\n options?: BackupObjectOptions,\n ) => Promise<BackupObjectResult>;\n requestPriceStorageQuoteFn?: (\n request: PriceStorageQuoteRequest,\n options?: ProxyQuoteOptions,\n ) => Promise<PriceStorageQuoteResponse>;\n requestStorageUploadFn?: (\n request: StorageUploadRequest,\n options?: ProxyUploadOptions,\n ) => Promise<StorageUploadResponse>;\n requestStorageUploadConfirmFn?: (\n request: StorageUploadConfirmRequest,\n options?: ProxyUploadConfirmOptions,\n ) => Promise<StorageUploadResponse>;\n resolveWalletPrivateKeyFn?: (homeDir?: string) => Promise<`0x${string}`>;\n createPaymentFetchFn?: (privateKey: `0x${string}`) => PaymentFetchResult;\n fetchImpl?: FetchLike;\n nowDateFn?: () => Date;\n idempotencyKeyFn?: () => string;\n proxyQuoteOptions?: ProxyQuoteOptions;\n proxyUploadOptions?: ProxyUploadOptions;\n proxyUploadConfirmOptions?: ProxyUploadConfirmOptions;\n requestStorageLsFn?: (\n request: StorageObjectRequest,\n options?: ProxyStorageOptions,\n ) => Promise<StorageLsResponse>;\n requestStorageDownloadFn?: (\n request: StorageObjectRequest,\n options?: ProxyStorageOptions,\n ) => Promise<StorageDownloadProxyResponse>;\n requestStorageDeleteFn?: (\n request: StorageObjectRequest,\n options?: ProxyStorageOptions,\n ) => Promise<StorageDeleteResponse>;\n subagentOrchestrator?: MnemosparkSubagentOrchestrator;\n proxyStorageOptions?: ProxyStorageOptions;\n objectLogHomeDir?: string;\n};\n\nclass UnsupportedBackupPlatformError extends Error {\n constructor(platform: NodeJS.Platform) {\n super(`Unsupported platform for backup: ${platform}`);\n this.name = \"UnsupportedBackupPlatformError\";\n }\n}\n\nfunction toGbString(bytes: number): string {\n const gb = bytes / 1_000_000_000;\n const fixed = gb.toFixed(9).replace(/\\.?0+$/, \"\");\n if (!fixed) return \"0\";\n return fixed.includes(\".\") ? fixed : `${fixed}.0`;\n}\n\nfunction stripWrappingQuotes(input: string): string {\n const trimmed = input.trim();\n if (trimmed.length < 2) return trimmed;\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\nfunction tokenizeArgsRaw(input: string): string[] {\n const tokens = input.match(/\"[^\"]*\"|'[^']*'|\\S+/g);\n if (!tokens) {\n return [];\n }\n return tokens;\n}\n\nfunction tokenizeArgs(input: string): string[] {\n return tokenizeArgsRaw(input).map((token) => stripWrappingQuotes(token));\n}\n\nfunction parseNamedFlagsTokens(\n tokens: string[],\n booleanFlags: ReadonlySet<string> = new Set(),\n): Record<string, string> | null {\n if (tokens.length === 0) {\n return null;\n }\n\n const parsed: Record<string, string> = {};\n for (let i = 0; i < tokens.length; i += 1) {\n const keyToken = tokens[i];\n if (!keyToken.startsWith(\"--\")) {\n return null;\n }\n const key = keyToken.slice(2).toLowerCase().replace(/_/g, \"-\");\n const value = tokens[i + 1];\n if (!value || value.startsWith(\"--\")) {\n if (booleanFlags.has(key)) {\n parsed[key] = \"true\";\n continue;\n }\n return null;\n }\n parsed[key] = value;\n i += 1;\n }\n return parsed;\n}\n\nfunction parseNamedFlags(\n input: string,\n booleanFlags: ReadonlySet<string> = new Set(),\n): Record<string, string> | null {\n const tokens = tokenizeArgs(input);\n return parseNamedFlagsTokens(tokens, booleanFlags);\n}\n\nfunction parseObjectSelector(\n flags: Record<string, string>,\n): { objectKey?: string; nameSelector?: NameSelector } | null {\n const objectKey = flags[\"object-key\"]?.trim();\n const name = flags.name?.trim();\n const latest = flags.latest === \"true\";\n const at = flags.at?.trim();\n\n if (objectKey && name) return null;\n if (!objectKey && !name) return null;\n if (latest && at) return null;\n\n if (objectKey) return { objectKey };\n return { nameSelector: { name: name!, latest, at } };\n}\n\nfunction parseStorageObjectRequestInput(\n flags: Record<string, string>,\n selector: { objectKey?: string; nameSelector?: NameSelector },\n): StorageObjectRequestInput | null {\n const walletAddress = flags[\"wallet-address\"]?.trim();\n if (!walletAddress) {\n return null;\n }\n const location = flags.location?.trim() || flags.region?.trim() || undefined;\n if (!selector.objectKey) {\n return {\n wallet_address: walletAddress,\n location,\n };\n }\n return parseStorageObjectRequest({\n wallet_address: walletAddress,\n object_key: selector.objectKey,\n location,\n });\n}\n\nfunction parseOrchestratorMode(value?: string): OrchestratorMode | undefined | null {\n if (!value) {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if (!normalized) {\n return null;\n }\n if (!ORCHESTRATOR_MODES.has(normalized)) {\n return null;\n }\n return normalized as OrchestratorMode;\n}\n\nfunction parseTimeoutSeconds(value?: string): number | undefined | null {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n if (!/^\\d+$/.test(trimmed)) {\n return null;\n }\n const parsed = Number.parseInt(trimmed, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return null;\n }\n return parsed;\n}\n\nfunction parseAsyncOperationArgs(flags: Record<string, string>): AsyncOperationArgs | null {\n const asyncRequested = flags.async === \"true\";\n const hasOrchestratorFlag = typeof flags.orchestrator === \"string\";\n const hasTimeoutFlag = typeof flags[\"timeout-seconds\"] === \"string\";\n\n if (!asyncRequested && (hasOrchestratorFlag || hasTimeoutFlag)) {\n return null;\n }\n\n const parsedOrchestrator = parseOrchestratorMode(flags.orchestrator);\n if (parsedOrchestrator === null) {\n return null;\n }\n const parsedTimeoutSeconds = parseTimeoutSeconds(flags[\"timeout-seconds\"]);\n if (parsedTimeoutSeconds === null) {\n return null;\n }\n if (typeof parsedTimeoutSeconds === \"number\" && (parsedOrchestrator ?? \"inline\") !== \"subagent\") {\n return null;\n }\n\n return {\n async: asyncRequested,\n orchestrator: parsedOrchestrator === undefined ? undefined : parsedOrchestrator,\n timeoutSeconds: parsedTimeoutSeconds === undefined ? undefined : parsedTimeoutSeconds,\n };\n}\n\nconst INVALID_ASYNC_FLAGS_MESSAGE =\n \"invalid async flags. `--orchestrator`/`--timeout-seconds` require `--async`, and `--timeout-seconds` is only valid with `--orchestrator subagent`.\";\n\nfunction stripAsyncControlFlags(args?: string): string {\n const tokens = tokenizeArgsRaw(args ?? \"\");\n const filtered: string[] = [];\n for (let idx = 0; idx < tokens.length; idx += 1) {\n const token = tokens[idx];\n const lowerToken = token.toLowerCase();\n if (lowerToken === \"--async\") {\n continue;\n }\n if (lowerToken === \"--orchestrator\" || lowerToken === \"--timeout-seconds\") {\n idx += 1;\n continue;\n }\n filtered.push(token);\n }\n return filtered.join(\" \");\n}\n\nfunction parseCloudArgs(args?: string): ParsedCloudArgs {\n const trimmed = args?.trim() ?? \"\";\n if (!trimmed) {\n return { mode: \"help\" };\n }\n\n const spaceIdx = trimmed.indexOf(\" \");\n const subcommand = (spaceIdx === -1 ? trimmed : trimmed.slice(0, spaceIdx)).toLowerCase();\n const rest = spaceIdx === -1 ? \"\" : trimmed.slice(spaceIdx + 1);\n\n if (subcommand === \"help\") {\n return { mode: \"help\" };\n }\n\n if (subcommand === \"backup\") {\n const tokens = tokenizeArgs(rest);\n if (tokens.length === 0) {\n return { mode: \"unknown\" };\n }\n const backupTarget = tokens[0] ?? \"\";\n if (!backupTarget) {\n return { mode: \"unknown\" };\n }\n const remainingTokens = tokens.slice(1);\n const flags =\n remainingTokens.length === 0\n ? ({} as Record<string, string>)\n : parseNamedFlagsTokens(remainingTokens, BOOLEAN_ASYNC_FLAGS);\n if (!flags) {\n return { mode: \"backup-invalid\" };\n }\n const asyncArgs = parseAsyncOperationArgs(flags);\n if (!asyncArgs) {\n return { mode: \"backup-invalid-async\" };\n }\n return {\n mode: \"backup\",\n backupTarget,\n friendlyName: flags.name?.trim() || undefined,\n ...asyncArgs,\n };\n }\n\n if (subcommand === \"price-storage\") {\n const flags = parseNamedFlags(rest);\n if (!flags) {\n return { mode: \"price-storage-invalid\" };\n }\n const gb = Number.parseFloat(flags.gb ?? \"\");\n const request = parsePriceStorageQuoteRequest({\n wallet_address: flags[\"wallet-address\"],\n object_id: flags[\"object-id\"],\n object_id_hash: flags[\"object-id-hash\"],\n gb,\n provider: flags.provider,\n region: flags.region,\n });\n if (!request) {\n return { mode: \"price-storage-invalid\" };\n }\n return { mode: \"price-storage\", priceStorageRequest: request };\n }\n\n if (subcommand === \"upload\") {\n const flags = parseNamedFlags(rest, BOOLEAN_ASYNC_FLAGS);\n if (!flags) {\n return { mode: \"upload-invalid\" };\n }\n const asyncArgs = parseAsyncOperationArgs(flags);\n if (!asyncArgs) {\n return { mode: \"upload-invalid-async\" };\n }\n\n const quoteId = flags[\"quote-id\"]?.trim();\n const walletAddress = flags[\"wallet-address\"]?.trim();\n const objectId = flags[\"object-id\"]?.trim();\n const objectIdHash = flags[\"object-id-hash\"]?.trim();\n\n if (!quoteId || !walletAddress || !objectId || !objectIdHash) {\n return { mode: \"upload-invalid\" };\n }\n\n return {\n mode: \"upload\",\n friendlyName: flags.name?.trim() || undefined,\n ...asyncArgs,\n uploadRequest: {\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId,\n object_id_hash: objectIdHash,\n },\n };\n }\n\n if (subcommand === \"ls\") {\n const flags = parseNamedFlags(rest, BOOLEAN_SELECTOR_FLAGS);\n if (!flags) {\n return { mode: \"ls-invalid\" };\n }\n const selector = parseObjectSelector(flags);\n if (!selector) {\n return { mode: \"ls-invalid\" };\n }\n const request = parseStorageObjectRequestInput(flags, selector);\n if (!request) {\n return { mode: \"ls-invalid\" };\n }\n return { mode: \"ls\", storageObjectRequest: request, nameSelector: selector.nameSelector };\n }\n\n if (subcommand === \"download\") {\n const flags = parseNamedFlags(rest, BOOLEAN_SELECTOR_AND_ASYNC_FLAGS);\n if (!flags) {\n return { mode: \"download-invalid\" };\n }\n const asyncArgs = parseAsyncOperationArgs(flags);\n if (!asyncArgs) {\n return { mode: \"download-invalid-async\" };\n }\n const selector = parseObjectSelector(flags);\n if (!selector) {\n return { mode: \"download-invalid\" };\n }\n const request = parseStorageObjectRequestInput(flags, selector);\n if (!request) {\n return { mode: \"download-invalid\" };\n }\n return {\n mode: \"download\",\n storageObjectRequest: request,\n nameSelector: selector.nameSelector,\n ...asyncArgs,\n };\n }\n\n if (subcommand === \"delete\") {\n const flags = parseNamedFlags(rest, BOOLEAN_SELECTOR_FLAGS);\n if (!flags) {\n return { mode: \"delete-invalid\" };\n }\n const selector = parseObjectSelector(flags);\n if (!selector) {\n return { mode: \"delete-invalid\" };\n }\n const request = parseStorageObjectRequestInput(flags, selector);\n if (!request) {\n return { mode: \"delete-invalid\" };\n }\n return { mode: \"delete\", storageObjectRequest: request, nameSelector: selector.nameSelector };\n }\n\n if (subcommand === \"op-status\") {\n const flags = parseNamedFlags(rest, BOOLEAN_OP_STATUS_FLAGS);\n const operationId = flags?.[\"operation-id\"]?.trim();\n if (!operationId) {\n return { mode: \"op-status-invalid\" };\n }\n return { mode: \"op-status\", operationId, cancel: flags?.cancel === \"true\" };\n }\n\n return { mode: \"unknown\" };\n}\n\nfunction resolveObjectLogPath(homeDir?: string): string {\n return join(homeDir ?? homedir(), OBJECT_LOG_SUBPATH);\n}\n\nfunction resolveCronTablePath(homeDir?: string): string {\n return join(homeDir ?? homedir(), CRON_TABLE_SUBPATH);\n}\n\nasync function appendObjectLogLine(line: string, homeDir?: string): Promise<string> {\n const objectLogPath = resolveObjectLogPath(homeDir);\n await mkdir(dirname(objectLogPath), { recursive: true });\n await appendFile(objectLogPath, `${line}\\n`, \"utf-8\");\n return objectLogPath;\n}\n\nasync function calculateInputSizeBytes(targetPath: string): Promise<number> {\n const targetStats = await lstat(targetPath);\n if (targetStats.isFile() || targetStats.isSymbolicLink()) {\n return targetStats.size;\n }\n\n if (!targetStats.isDirectory()) {\n throw new Error(\"Backup target must be a file or directory\");\n }\n\n let total = 0;\n const entries = await readdir(targetPath, { withFileTypes: true });\n for (const entry of entries) {\n total += await calculateInputSizeBytes(join(targetPath, entry.name));\n }\n return total;\n}\n\nfunction getAvailableDiskBytes(tmpDir: string, options: BackupObjectOptions): number {\n if (typeof options.availableDiskBytes === \"number\") {\n return options.availableDiskBytes;\n }\n const stats = statfsSync(tmpDir);\n return stats.bavail * stats.bsize;\n}\n\nasync function runTarGzip(archivePath: string, sourcePath: string): Promise<void> {\n const sourceDir = dirname(sourcePath);\n const sourceName = basename(sourcePath);\n\n await new Promise<void>((resolvePromise, rejectPromise) => {\n let stderr = \"\";\n const child = spawn(\"tar\", [\"-czf\", archivePath, \"-C\", sourceDir, sourceName], {\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n });\n\n child.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", rejectPromise);\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolvePromise();\n return;\n }\n rejectPromise(new Error(stderr.trim() || `tar exited with code ${code ?? \"unknown\"}`));\n });\n });\n}\n\nasync function sha256File(filePath: string): Promise<string> {\n const hash = createHash(\"sha256\");\n await new Promise<void>((resolvePromise, rejectPromise) => {\n const stream = createReadStream(filePath);\n stream.on(\"data\", (chunk) => hash.update(chunk));\n stream.on(\"error\", rejectPromise);\n stream.on(\"end\", () => resolvePromise());\n });\n return hash.digest(\"hex\");\n}\n\nfunction createObjectId(options: BackupObjectOptions): string {\n const nowFn = options.now ?? Date.now;\n const randomFn = options.randomBytes ?? randomBytesNode;\n return `${nowFn()}-${randomFn(8).toString(\"hex\")}`;\n}\n\nexport async function buildBackupObject(\n targetPathArg: string,\n options: BackupObjectOptions = {},\n): Promise<BackupObjectResult> {\n const platform = options.platform ?? process.platform;\n if (!SUPPORTED_BACKUP_PLATFORMS.has(platform)) {\n throw new UnsupportedBackupPlatformError(platform);\n }\n\n const targetPath = resolve(expandTilde(targetPathArg));\n const targetStats = await lstat(targetPath);\n if (!targetStats.isFile() && !targetStats.isDirectory()) {\n throw new Error(\"Backup target must be a file or directory\");\n }\n\n const tmpDir = options.tmpDir ?? DEFAULT_BACKUP_DIR;\n let tmpStats;\n try {\n tmpStats = await stat(tmpDir);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n await mkdir(tmpDir, { recursive: true });\n tmpStats = await stat(tmpDir);\n } else {\n throw error;\n }\n }\n if (!tmpStats.isDirectory()) {\n throw new Error(\"Backup path is not a directory\");\n }\n\n const inputSizeBytes = await calculateInputSizeBytes(targetPath);\n const availableDiskBytes = getAvailableDiskBytes(tmpDir, options);\n const requiredDiskBytes = inputSizeBytes + TAR_OVERHEAD_BYTES;\n if (availableDiskBytes < requiredDiskBytes) {\n throw new Error(\"Insufficient disk space for backup object\");\n }\n\n const objectId = createObjectId(options);\n const archivePath = join(tmpDir, objectId);\n\n try {\n await runTarGzip(archivePath, targetPath);\n const archiveStats = await stat(archivePath);\n const objectIdHash = await sha256File(archivePath);\n const objectSizeGb = toGbString(archiveStats.size);\n\n const objectLogPath = await appendObjectLogLine(\n `${objectId},${objectIdHash},${objectSizeGb}`,\n options.homeDir,\n );\n\n return {\n objectId,\n objectIdHash,\n objectSizeGb,\n archivePath,\n objectLogPath,\n };\n } catch (error) {\n await rm(archivePath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nasync function appendPriceStorageQuoteLog(\n quote: PriceStorageQuoteResponse,\n homeDir?: string,\n): Promise<string> {\n return appendObjectLogLine(\n [\n quote.timestamp,\n quote.quote_id,\n quote.storage_price.toString(),\n quote.addr,\n quote.object_id,\n quote.object_id_hash,\n quote.object_size_gb.toString(),\n quote.provider,\n quote.location,\n ].join(\",\"),\n homeDir,\n );\n}\n\ntype LoggedPriceStorageQuote = {\n quoteId: string;\n storagePrice: number;\n walletAddress: string;\n objectId: string;\n objectIdHash: string;\n provider: string;\n location: string;\n};\n\ntype StoragePaymentCronJob = {\n cronId: string;\n createdAt: string;\n schedule: string;\n command: string;\n quoteId: string;\n storagePrice: number;\n walletAddress: string;\n objectId: string;\n objectKey: string;\n provider: string;\n bucketName: string;\n location: string;\n};\n\ntype LoggedStoragePaymentCron = {\n cronId: string;\n objectId: string;\n objectKey: string;\n};\n\nfunction formatTimestamp(date: Date): string {\n const pad = (value: number): string => value.toString().padStart(2, \"0\");\n return [\n date.getFullYear().toString(),\n \"-\",\n pad(date.getMonth() + 1),\n \"-\",\n pad(date.getDate()),\n \" \",\n pad(date.getHours()),\n \":\",\n pad(date.getMinutes()),\n \":\",\n pad(date.getSeconds()),\n ].join(\"\");\n}\n\nfunction parseLoggedPriceStorageQuote(line: string): LoggedPriceStorageQuote | null {\n const parts = line.split(\",\");\n if (parts.length < 9) {\n return null;\n }\n\n const quoteId = parts[1]?.trim() ?? \"\";\n const storagePriceRaw = parts[2]?.trim() ?? \"\";\n const walletAddress = parts[3]?.trim() ?? \"\";\n const objectId = parts[4]?.trim() ?? \"\";\n const objectIdHash = parts[5]?.trim() ?? \"\";\n const provider = parts[7]?.trim() ?? \"\";\n const location = parts[8]?.trim() ?? \"\";\n const storagePrice = Number.parseFloat(storagePriceRaw);\n\n if (!quoteId || !walletAddress || !objectId || !objectIdHash || !provider || !location) {\n return null;\n }\n if (!Number.isFinite(storagePrice) || storagePrice <= 0) {\n return null;\n }\n\n return {\n quoteId,\n storagePrice,\n walletAddress,\n objectId,\n objectIdHash,\n provider,\n location,\n };\n}\n\nfunction parseLoggedStoragePaymentCron(line: string): LoggedStoragePaymentCron | null {\n const parts = line.split(\",\");\n if (parts.length < 5) {\n return null;\n }\n if ((parts[0]?.trim() ?? \"\").toLowerCase() !== CRON_LOG_ROW_PREFIX) {\n return null;\n }\n\n const cronId = parts[2]?.trim() ?? \"\";\n const objectId = parts[3]?.trim() ?? \"\";\n const objectKey = parts[4]?.trim() ?? \"\";\n if (!cronId || !objectId || !objectKey) {\n return null;\n }\n\n return {\n cronId,\n objectId,\n objectKey,\n };\n}\n\nfunction parseStoragePaymentCronJobLine(line: string): StoragePaymentCronJob | null {\n const trimmed = line.trim();\n if (!trimmed) {\n return null;\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(trimmed);\n } catch {\n return null;\n }\n\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n const record = payload as Record<string, unknown>;\n\n const cronId = typeof record.cronId === \"string\" ? record.cronId.trim() : \"\";\n const createdAt = typeof record.createdAt === \"string\" ? record.createdAt.trim() : \"\";\n const schedule = typeof record.schedule === \"string\" ? record.schedule.trim() : \"\";\n const command = typeof record.command === \"string\" ? record.command.trim() : \"\";\n const quoteId = typeof record.quoteId === \"string\" ? record.quoteId.trim() : \"\";\n const storagePrice = typeof record.storagePrice === \"number\" ? record.storagePrice : Number.NaN;\n const walletAddress = typeof record.walletAddress === \"string\" ? record.walletAddress.trim() : \"\";\n const objectId = typeof record.objectId === \"string\" ? record.objectId.trim() : \"\";\n const objectKey = typeof record.objectKey === \"string\" ? record.objectKey.trim() : \"\";\n const provider = typeof record.provider === \"string\" ? record.provider.trim() : \"\";\n const bucketName = typeof record.bucketName === \"string\" ? record.bucketName.trim() : \"\";\n const location = typeof record.location === \"string\" ? record.location.trim() : \"\";\n\n if (\n !cronId ||\n !createdAt ||\n !schedule ||\n !command ||\n !quoteId ||\n !Number.isFinite(storagePrice) ||\n storagePrice <= 0 ||\n !walletAddress ||\n !objectId ||\n !objectKey ||\n !provider ||\n !bucketName ||\n !location\n ) {\n return null;\n }\n\n return {\n cronId,\n createdAt,\n schedule,\n command,\n quoteId,\n storagePrice,\n walletAddress,\n objectId,\n objectKey,\n provider,\n bucketName,\n location,\n };\n}\n\nasync function findLoggedPriceStorageQuote(\n quoteId: string,\n homeDir?: string,\n): Promise<LoggedPriceStorageQuote | null> {\n const objectLogPath = resolveObjectLogPath(homeDir);\n\n let content: string;\n try {\n content = await readFile(objectLogPath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n for (let idx = lines.length - 1; idx >= 0; idx -= 1) {\n const parsed = parseLoggedPriceStorageQuote(lines[idx]);\n if (parsed && parsed.quoteId === quoteId) {\n return parsed;\n }\n }\n return null;\n}\n\nasync function findLoggedStoragePaymentCronByObjectKey(\n objectKey: string,\n homeDir?: string,\n): Promise<LoggedStoragePaymentCron | null> {\n const objectLogPath = resolveObjectLogPath(homeDir);\n\n let content: string;\n try {\n content = await readFile(objectLogPath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n for (let idx = lines.length - 1; idx >= 0; idx -= 1) {\n const parsed = parseLoggedStoragePaymentCron(lines[idx]);\n if (parsed && parsed.objectKey === objectKey) {\n return parsed;\n }\n }\n return null;\n}\n\nfunction quoteCronArgument(value: string | number): string {\n return JSON.stringify(String(value));\n}\n\nfunction buildStoragePaymentCronCommand(job: {\n quoteId: string;\n walletAddress: string;\n objectId: string;\n objectKey: string;\n storagePrice: number;\n}): string {\n return [\n \"mnemospark-pay-storage\",\n \"--quote-id\",\n quoteCronArgument(job.quoteId),\n \"--wallet-address\",\n quoteCronArgument(job.walletAddress),\n \"--object-id\",\n quoteCronArgument(job.objectId),\n \"--object-key\",\n quoteCronArgument(job.objectKey),\n \"--storage-price\",\n quoteCronArgument(job.storagePrice),\n ].join(\" \");\n}\n\nasync function appendStoragePaymentCronLog(\n cronJob: StoragePaymentCronJob,\n homeDir?: string,\n): Promise<string> {\n return appendObjectLogLine(\n [\n CRON_LOG_ROW_PREFIX,\n cronJob.createdAt,\n cronJob.cronId,\n cronJob.objectId,\n cronJob.objectKey,\n cronJob.quoteId,\n cronJob.storagePrice.toString(),\n ].join(\",\"),\n homeDir,\n );\n}\n\nasync function appendStoragePaymentCronJob(\n cronJob: StoragePaymentCronJob,\n homeDir?: string,\n): Promise<string> {\n const cronTablePath = resolveCronTablePath(homeDir);\n await mkdir(dirname(cronTablePath), { recursive: true });\n await appendFile(cronTablePath, `${JSON.stringify(cronJob)}\\n`, \"utf-8\");\n return cronTablePath;\n}\n\nasync function removeStoragePaymentCronJob(cronId: string, homeDir?: string): Promise<boolean> {\n const cronTablePath = resolveCronTablePath(homeDir);\n\n let content: string;\n try {\n content = await readFile(cronTablePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n\n const lines = content.split(/\\r?\\n/);\n let removed = false;\n const keptLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n const parsed = parseStoragePaymentCronJobLine(trimmed);\n if (parsed && parsed.cronId === cronId) {\n removed = true;\n continue;\n }\n keptLines.push(trimmed);\n }\n\n if (!removed) {\n return false;\n }\n\n await mkdir(dirname(cronTablePath), { recursive: true });\n const nextContent = keptLines.length > 0 ? `${keptLines.join(\"\\n\")}\\n` : \"\";\n await writeFile(cronTablePath, nextContent, \"utf-8\");\n return true;\n}\n\nasync function createStoragePaymentCronJob(\n upload: StorageUploadResponse,\n storagePrice: number,\n homeDir?: string,\n nowDateFn: () => Date = () => new Date(),\n): Promise<StoragePaymentCronJob> {\n const cronId = randomUUID();\n const createdAt = formatTimestamp(nowDateFn());\n const cronJob: StoragePaymentCronJob = {\n cronId,\n createdAt,\n schedule: PAYMENT_CRON_SCHEDULE,\n command: buildStoragePaymentCronCommand({\n quoteId: upload.quote_id,\n walletAddress: upload.addr,\n objectId: upload.object_id,\n objectKey: upload.object_key,\n storagePrice,\n }),\n quoteId: upload.quote_id,\n storagePrice,\n walletAddress: upload.addr,\n objectId: upload.object_id,\n objectKey: upload.object_key,\n provider: upload.provider,\n bucketName: upload.bucket_name,\n location: upload.location,\n };\n\n await appendStoragePaymentCronJob(cronJob, homeDir);\n await appendStoragePaymentCronLog(cronJob, homeDir);\n return cronJob;\n}\n\nasync function readWalletKeyIfPresent(walletPath: string): Promise<`0x${string}` | null> {\n try {\n const key = (await readFile(walletPath, \"utf-8\")).trim();\n return isValidWalletPrivateKey(key) ? key : null;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function resolveWalletPrivateKey(homeDir?: string): Promise<`0x${string}`> {\n const envKey = process.env.MNEMOSPARK_WALLET_KEY?.trim();\n if (isValidWalletPrivateKey(envKey)) {\n return envKey;\n }\n\n const baseHome = homeDir ?? homedir();\n const primaryWalletPath = join(baseHome, MNEMOSPARK_WALLET_KEY_SUBPATH);\n const fallbackWalletPath = join(baseHome, BLOCKRUN_WALLET_KEY_SUBPATH);\n\n const fromPrimary = await readWalletKeyIfPresent(primaryWalletPath);\n if (fromPrimary) {\n return fromPrimary;\n }\n\n const fromFallback = await readWalletKeyIfPresent(fallbackWalletPath);\n if (fromFallback) {\n return fromFallback;\n }\n\n throw new Error(\n \"No mnemospark wallet found. Run `openclaw plugins install mnemospark` or set MNEMOSPARK_WALLET_KEY.\",\n );\n}\n\nfunction sha256Buffer(content: Buffer): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction bucketNameForWallet(walletAddress: string): string {\n return `mnemospark-${walletShortHash(walletAddress)}`;\n}\n\nfunction encryptAesGcm(\n plaintext: Buffer,\n key: Buffer,\n randomFn: (size: number) => Buffer = randomBytesNode,\n): Buffer {\n if (key.length !== 32) {\n throw new Error(\"Expected 32-byte AES key\");\n }\n const nonce = randomFn(AES_GCM_NONCE_BYTES);\n const cipher = createCipheriv(\"aes-256-gcm\", key, nonce);\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n return Buffer.concat([nonce, ciphertext, tag]);\n}\n\nasync function loadOrCreateKek(\n walletAddress: string,\n homeDir?: string,\n): Promise<{ kek: Buffer; keyPath: string }> {\n const keyPath = resolveWalletKekPath(walletAddress, homeDir);\n await mkdir(dirname(keyPath), { recursive: true });\n\n try {\n const existing = await readFile(keyPath);\n return { kek: parseStoredAes256Key(existing), keyPath };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const generated = randomBytesNode(32);\n await writeFile(keyPath, generated, { mode: 0o600 });\n return { kek: generated, keyPath };\n}\n\ntype PreparedUploadPayload = {\n payload: UploadPayload;\n encryptedContent: Buffer;\n};\n\nasync function prepareUploadPayload(\n archivePath: string,\n walletAddress: string,\n homeDir?: string,\n): Promise<PreparedUploadPayload> {\n const plaintext = await readFile(archivePath);\n const { kek, keyPath } = await loadOrCreateKek(walletAddress, homeDir);\n\n const dek = randomBytesNode(32);\n const encryptedContent = encryptAesGcm(plaintext, dek);\n const wrappedDek = encryptAesGcm(dek, kek);\n const payloadHash = sha256Buffer(encryptedContent);\n\n const payload: UploadPayload = {\n mode: encryptedContent.length <= INLINE_UPLOAD_MAX_BYTES ? \"inline\" : \"presigned\",\n content_base64:\n encryptedContent.length <= INLINE_UPLOAD_MAX_BYTES\n ? encryptedContent.toString(\"base64\")\n : undefined,\n content_sha256: payloadHash,\n content_length_bytes: encryptedContent.length,\n wrapped_dek: wrappedDek.toString(\"base64\"),\n encryption_algorithm: \"AES-256-GCM\",\n bucket_name_hint: bucketNameForWallet(walletAddress),\n key_store_path_hint: keyPath,\n };\n\n return {\n payload,\n encryptedContent,\n };\n}\n\nasync function uploadPresignedObjectIfNeeded(\n uploadResponse: StorageUploadResponse,\n uploadMode: UploadPayload[\"mode\"],\n encryptedContent: Buffer,\n fetchImpl: FetchLike = fetch,\n): Promise<void> {\n if (!uploadResponse.upload_url) {\n if (uploadMode === \"presigned\") {\n throw new Error(\"Cannot upload storage object: missing presigned upload URL.\");\n }\n return;\n }\n\n const headers = new Headers(uploadResponse.upload_headers ?? {});\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/octet-stream\");\n }\n\n const putBody = new Uint8Array(encryptedContent);\n const firstAttempt = await fetchImpl(uploadResponse.upload_url, {\n method: \"PUT\",\n headers,\n body: putBody,\n redirect: \"manual\",\n });\n\n if (firstAttempt.ok) {\n return;\n }\n\n // Some S3 presigned PUT URLs can return a temporary redirect (307/308)\n // when the request is sent to a non-regional endpoint. Retry once against\n // the Location target with the same signed query parameters.\n if (\n (firstAttempt.status === 307 || firstAttempt.status === 308) &&\n firstAttempt.headers.has(\"location\")\n ) {\n const location = firstAttempt.headers.get(\"location\")?.trim();\n if (location) {\n const redirectedAttempt = await fetchImpl(location, {\n method: \"PUT\",\n headers,\n body: putBody,\n });\n if (redirectedAttempt.ok) {\n return;\n }\n const redirectedDetails = (await redirectedAttempt.text()).trim();\n throw new Error(\n `Presigned upload failed after redirect with status ${redirectedAttempt.status}${redirectedDetails ? `: ${redirectedDetails}` : \"\"}`,\n );\n }\n }\n\n const details = (await firstAttempt.text()).trim();\n throw new Error(\n `Presigned upload failed with status ${firstAttempt.status}${details ? `: ${details}` : \"\"}`,\n );\n}\n\nasync function appendStorageUploadLog(\n upload: StorageUploadResponse,\n homeDir?: string,\n nowDateFn: () => Date = () => new Date(),\n): Promise<string> {\n return appendObjectLogLine(\n [\n formatTimestamp(nowDateFn()),\n upload.quote_id,\n upload.addr,\n upload.addr_hash ?? \"\",\n upload.trans_id ?? \"\",\n upload.storage_price?.toString() ?? \"\",\n upload.object_id,\n upload.object_key,\n upload.provider,\n upload.bucket_name,\n upload.location,\n ].join(\",\"),\n homeDir,\n );\n}\n\nasync function maybeCleanupLocalBackupArchive(archivePath: string): Promise<void> {\n const flag = process.env.MNEMOSPARK_DELETE_BACKUP_AFTER_UPLOAD;\n if (!flag) {\n return;\n }\n const normalized = flag.trim().toLowerCase();\n if (normalized !== \"1\" && normalized !== \"true\" && normalized !== \"yes\" && normalized !== \"y\") {\n return;\n }\n try {\n await rm(archivePath, { force: true });\n } catch {\n // Best-effort cleanup; ignore failures.\n }\n}\n\nfunction formatStorageUploadUserMessage(upload: StorageUploadResponse, cronJobId: string): string {\n return [\n `Your file \\`${upload.object_id}\\` with key \\`${upload.object_key}\\` has been stored using \\`${upload.provider}\\` in \\`${upload.bucket_name}\\` \\`${upload.location}\\``,\n `A cron job \\`${cronJobId}\\` has been configured to send payment monthly (on the 1st) for storage services. If payment is not sent, your \\`${upload.object_id}\\` will be deleted after the **${PAYMENT_DELETE_DEADLINE_DAYS}-day deadline** (${PAYMENT_REMINDER_INTERVAL_DAYS}-day billing interval + 2-day grace period).`,\n \"Thank you for using mnemospark!\",\n ].join(\"\\n\");\n}\n\nfunction formatStorageDeleteUserMessage(\n objectKey: string,\n cronId: string | null,\n cronDeleted: boolean,\n): string {\n const statusLine = cronId\n ? cronDeleted\n ? `File \\`${objectKey}\\` has been deleted from the cloud and the cron job \\`${cronId}\\` has been removed from local mnemospark cron tracking.`\n : `File \\`${objectKey}\\` has been deleted from the cloud and the cron job \\`${cronId}\\` was not found in local mnemospark cron tracking.`\n : `File \\`${objectKey}\\` has been deleted from the cloud and no matching cron job was found in local mnemospark cron tracking.`;\n\n return [statusLine, \"Thank you for using mnemospark!\"].join(\"\\n\");\n}\n\nfunction extractUploadErrorMessage(error: unknown): string | null {\n if (!(error instanceof Error)) {\n return null;\n }\n const message = error.message.trim();\n if (!message) {\n return null;\n }\n\n try {\n const payload = JSON.parse(message) as {\n message?: string;\n error?: { message?: string } | string;\n };\n if (typeof payload.message === \"string\" && payload.message.trim().length > 0) {\n return payload.message.trim();\n }\n if (typeof payload.error === \"string\" && payload.error.trim().length > 0) {\n return payload.error.trim();\n }\n if (\n payload.error &&\n typeof payload.error === \"object\" &&\n typeof payload.error.message === \"string\" &&\n payload.error.message.trim().length > 0\n ) {\n return payload.error.message.trim();\n }\n } catch {\n // Not JSON. Fall back to raw message.\n }\n\n return message;\n}\n\nfunction formatPriceStorageUserMessage(quote: PriceStorageQuoteResponse): string {\n return [\n `Your storage quote \\`${quote.quote_id}\\` is valid for 1 hour, the storage price is \\`${quote.storage_price}\\` for \\`${quote.object_id}\\` with file size of \\`${quote.object_size_gb}\\` in \\`${quote.provider}\\` \\`${quote.location}\\``,\n `If you accept this quote run the command /mnemospark_cloud upload --quote-id \\`${quote.quote_id}\\` --wallet-address \\`${quote.addr}\\` --object-id \\`${quote.object_id}\\` --object-id-hash \\`${quote.object_id_hash}\\``,\n ].join(\"\\n\");\n}\n\nfunction formatStorageLsUserMessage(result: StorageLsResponse, requestedObjectKey: string): string {\n const objectId = result.object_id ?? result.key;\n return `${objectId} with ${requestedObjectKey} is ${result.size_bytes} in ${result.bucket}`;\n}\n\nfunction createInProcessSubagentOrchestrator(): MnemosparkSubagentOrchestrator {\n type SessionState = {\n terminal: boolean;\n cancelRequested: boolean;\n timeoutHandle?: NodeJS.Timeout;\n hooks?: MnemosparkSubagentDispatchHooks;\n };\n\n const sessions = new Map<string, SessionState>();\n\n const completeSession = async (\n sessionId: string,\n handler: (hooks?: MnemosparkSubagentDispatchHooks) => Promise<void> | void,\n ): Promise<boolean> => {\n const session = sessions.get(sessionId);\n if (!session || session.terminal) {\n return false;\n }\n session.terminal = true;\n if (session.timeoutHandle) {\n clearTimeout(session.timeoutHandle);\n }\n sessions.delete(sessionId);\n await handler(session.hooks);\n return true;\n };\n\n return {\n dispatch: async (input) => {\n const sessionId = `agent:mnemospark:subagent:${randomUUID()}`;\n const state: SessionState = {\n terminal: false,\n cancelRequested: false,\n hooks: input.hooks,\n };\n sessions.set(sessionId, state);\n\n if (typeof input.timeoutSeconds === \"number\" && input.timeoutSeconds > 0) {\n state.timeoutHandle = setTimeout(() => {\n void completeSession(sessionId, async (hooks) => {\n await hooks?.onTimedOut?.(sessionId);\n });\n }, input.timeoutSeconds * 1000);\n }\n\n setTimeout(() => {\n void (async () => {\n try {\n await input.hooks?.onRunning?.(sessionId);\n await input.hooks?.onProgress?.(sessionId, \"subagent execution started\");\n const result = await input.runTask();\n const session = sessions.get(sessionId);\n if (!session || session.terminal) {\n return;\n }\n if (session.cancelRequested) {\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onCancelled?.(sessionId, \"cancel requested\");\n });\n return;\n }\n if (result.isError) {\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onFailed?.(sessionId, {\n code: \"ASYNC_FAILED\",\n message: result.text,\n });\n });\n return;\n }\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onCompleted?.(sessionId, result);\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const session = sessions.get(sessionId);\n if (!session || session.terminal) {\n return;\n }\n if (session.cancelRequested) {\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onCancelled?.(sessionId, \"cancel requested\");\n });\n return;\n }\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onFailed?.(sessionId, {\n code: \"ASYNC_EXCEPTION\",\n message,\n });\n });\n }\n })();\n }, 0);\n\n return { sessionId };\n },\n cancel: async (sessionId, reason) => {\n const session = sessions.get(sessionId);\n if (!session) {\n return { accepted: false };\n }\n if (session.terminal) {\n return { accepted: false, alreadyTerminal: true };\n }\n session.cancelRequested = true;\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onCancelled?.(sessionId, reason ?? \"cancel requested\");\n });\n return { accepted: true };\n },\n };\n}\n\nexport function createCloudCommand(\n options: CreateCloudCommandOptions = {},\n): OpenClawPluginCommandDefinition {\n const subagentOrchestrator =\n options.subagentOrchestrator ?? createInProcessSubagentOrchestrator();\n return {\n name: \"mnemospark_cloud\",\n nativeNames: {\n default: \"mnemospark_cloud\",\n },\n description: \"Manage mnemospark cloud storage workflow commands\",\n acceptsArgs: true,\n requireAuth: true,\n handler: async (ctx) => {\n try {\n return await runCloudCommandHandler(ctx, {\n buildBackupObjectFn: options.buildBackupObjectFn ?? buildBackupObject,\n requestPriceStorageQuoteFn:\n options.requestPriceStorageQuoteFn ?? requestPriceStorageViaProxy,\n requestStorageUploadFn: options.requestStorageUploadFn ?? requestStorageUploadViaProxy,\n requestStorageUploadConfirmFn:\n options.requestStorageUploadConfirmFn ?? requestStorageUploadConfirmViaProxy,\n resolveWalletKeyFn: options.resolveWalletPrivateKeyFn ?? resolveWalletPrivateKey,\n createPaymentFetchFn: options.createPaymentFetchFn ?? createPaymentFetch,\n fetchImpl: options.fetchImpl ?? fetch,\n nowDateFn: options.nowDateFn ?? (() => new Date()),\n idempotencyKeyFn: options.idempotencyKeyFn ?? randomUUID,\n requestStorageLsFn: options.requestStorageLsFn ?? requestStorageLsViaProxy,\n requestStorageDownloadFn:\n options.requestStorageDownloadFn ?? requestStorageDownloadViaProxy,\n requestStorageDeleteFn: options.requestStorageDeleteFn ?? requestStorageDeleteViaProxy,\n objectLogHomeDir: options.objectLogHomeDir ?? options.backupOptions?.homeDir,\n backupOptions: options.backupOptions,\n proxyQuoteOptions: options.proxyQuoteOptions,\n proxyUploadOptions: options.proxyUploadOptions,\n proxyUploadConfirmOptions: options.proxyUploadConfirmOptions,\n subagentOrchestrator,\n proxyStorageOptions: options.proxyStorageOptions,\n });\n } catch (outerError) {\n const message =\n outerError instanceof Error\n ? outerError.message\n : typeof outerError === \"string\"\n ? outerError\n : \"An unexpected error occurred\";\n return { text: message.trim() || \"An unexpected error occurred\", isError: true };\n }\n },\n };\n}\n\ntype RunCloudCommandHandlerOptions = {\n buildBackupObjectFn: NonNullable<CreateCloudCommandOptions[\"buildBackupObjectFn\"]>;\n requestPriceStorageQuoteFn: NonNullable<CreateCloudCommandOptions[\"requestPriceStorageQuoteFn\"]>;\n requestStorageUploadFn: NonNullable<CreateCloudCommandOptions[\"requestStorageUploadFn\"]>;\n requestStorageUploadConfirmFn: NonNullable<\n CreateCloudCommandOptions[\"requestStorageUploadConfirmFn\"]\n >;\n resolveWalletKeyFn: NonNullable<CreateCloudCommandOptions[\"resolveWalletPrivateKeyFn\"]>;\n createPaymentFetchFn: NonNullable<CreateCloudCommandOptions[\"createPaymentFetchFn\"]>;\n fetchImpl: NonNullable<CreateCloudCommandOptions[\"fetchImpl\"]>;\n nowDateFn: NonNullable<CreateCloudCommandOptions[\"nowDateFn\"]>;\n idempotencyKeyFn: NonNullable<CreateCloudCommandOptions[\"idempotencyKeyFn\"]>;\n requestStorageLsFn: NonNullable<CreateCloudCommandOptions[\"requestStorageLsFn\"]>;\n requestStorageDownloadFn: NonNullable<CreateCloudCommandOptions[\"requestStorageDownloadFn\"]>;\n requestStorageDeleteFn: NonNullable<CreateCloudCommandOptions[\"requestStorageDeleteFn\"]>;\n objectLogHomeDir: string | undefined;\n backupOptions: CreateCloudCommandOptions[\"backupOptions\"];\n proxyQuoteOptions: CreateCloudCommandOptions[\"proxyQuoteOptions\"];\n proxyUploadOptions: CreateCloudCommandOptions[\"proxyUploadOptions\"];\n proxyUploadConfirmOptions: CreateCloudCommandOptions[\"proxyUploadConfirmOptions\"];\n subagentOrchestrator: MnemosparkSubagentOrchestrator;\n proxyStorageOptions: CreateCloudCommandOptions[\"proxyStorageOptions\"];\n};\n\ntype RunCloudCommandExecutionContext = {\n forcedOperationId?: string;\n forcedTraceId?: string;\n};\n\nasync function resolveFriendlyNameFromManifest(\n params: {\n walletAddress: string;\n friendlyName: string;\n latest?: boolean;\n at?: string;\n },\n homeDir?: string,\n): Promise<{ objectKey: string | null; matchCount: number }> {\n const manifestPath = join(homeDir ?? homedir(), \".openclaw\", \"mnemospark\", \"manifest.jsonl\");\n\n let manifestRaw: string;\n try {\n manifestRaw = await readFile(manifestPath, \"utf-8\");\n } catch {\n return { objectKey: null, matchCount: 0 };\n }\n\n const wallet = params.walletAddress.trim().toLowerCase();\n const name = params.friendlyName.trim();\n const atMs = params.at ? Date.parse(params.at) : Number.NaN;\n const hasAt = Number.isFinite(atMs);\n\n const rows = manifestRaw\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n try {\n return JSON.parse(line) as {\n friendly_name?: string;\n wallet_address?: string;\n object_key?: string;\n created_at?: string;\n };\n } catch {\n return null;\n }\n })\n .filter((row): row is NonNullable<typeof row> => Boolean(row))\n .filter((row) => {\n if (!row.object_key || !row.friendly_name || !row.wallet_address || !row.created_at)\n return false;\n if (row.friendly_name !== name) return false;\n if (row.wallet_address.trim().toLowerCase() !== wallet) return false;\n if (params.latest || !hasAt) return true;\n const createdAtMs = Date.parse(row.created_at);\n return Number.isFinite(createdAtMs) && createdAtMs <= atMs;\n })\n .sort((a, b) => Date.parse(b.created_at ?? \"\") - Date.parse(a.created_at ?? \"\"));\n\n if (rows.length === 0) {\n return { objectKey: null, matchCount: 0 };\n }\n\n if (!params.latest && !hasAt && rows.length > 1) {\n return { objectKey: null, matchCount: rows.length };\n }\n\n return { objectKey: rows[0].object_key ?? null, matchCount: rows.length };\n}\n\nasync function resolveNameSelectorIfNeeded(\n datastore: Awaited<ReturnType<typeof createCloudDatastore>>,\n request: StorageObjectRequestInput,\n selector?: NameSelector,\n homeDir?: string,\n): Promise<{ request?: StorageObjectRequest; error?: string; degradedWarning?: string }> {\n if (!selector) {\n const parsedRequest = parseStorageObjectRequest(request);\n if (!parsedRequest) {\n return { error: \"Cannot resolve storage object request.\" };\n }\n return { request: parsedRequest };\n }\n let sqliteUnavailable = false;\n try {\n await datastore.ensureReady();\n } catch {\n sqliteUnavailable = true;\n }\n const matches = await datastore.countFriendlyNameMatches(request.wallet_address, selector.name);\n if (matches > 1 && !selector.latest && !selector.at) {\n return {\n error: `Multiple objects match --name ${selector.name}. Add --latest or --at <timestamp>.`,\n };\n }\n\n const resolved = await datastore.resolveFriendlyName({\n walletAddress: request.wallet_address,\n friendlyName: selector.name,\n latest: selector.latest,\n at: selector.at,\n });\n\n let resolvedObjectKey = resolved?.objectKey ?? null;\n let degradedWarning: string | undefined;\n if (!resolvedObjectKey && sqliteUnavailable) {\n const manifestResolved = await resolveFriendlyNameFromManifest(\n {\n walletAddress: request.wallet_address,\n friendlyName: selector.name,\n latest: selector.latest,\n at: selector.at,\n },\n homeDir,\n );\n if (manifestResolved.matchCount > 1 && !selector.latest && !selector.at) {\n return {\n error: `Multiple objects match --name ${selector.name}. Add --latest or --at <timestamp>.`,\n };\n }\n resolvedObjectKey = manifestResolved.objectKey;\n if (resolvedObjectKey) {\n degradedWarning =\n \"SQLite friendly-name index unavailable; resolved --name via manifest.jsonl fallback.\";\n }\n }\n\n if (!resolvedObjectKey) {\n return { error: `No object found for --name ${selector.name}.` };\n }\n\n const parsedRequest = parseStorageObjectRequest({\n ...request,\n object_key: resolvedObjectKey,\n });\n if (!parsedRequest) {\n return { error: \"Cannot resolve storage object request.\" };\n }\n return {\n request: parsedRequest,\n degradedWarning,\n };\n}\n\nasync function emitCloudEvent(\n eventType: string,\n details: Record<string, unknown>,\n homeDir?: string,\n): Promise<void> {\n await appendJsonlEvent(\n \"events.jsonl\",\n {\n ...details,\n ts: new Date().toISOString(),\n event_type: eventType,\n },\n homeDir,\n );\n}\n\nasync function emitCloudEventBestEffort(\n eventType: string,\n details: Record<string, unknown>,\n homeDir?: string,\n): Promise<void> {\n try {\n await emitCloudEvent(eventType, details, homeDir);\n } catch {\n // Event logging is non-critical and must not affect command results.\n }\n}\n\ntype OperationEventContext = {\n operationId: string;\n traceId: string;\n status: string;\n walletAddress?: string | null;\n objectId?: string | null;\n objectKey?: string | null;\n quoteId?: string | null;\n orchestrator?: OrchestratorMode | null;\n subagentSessionId?: string | null;\n timeoutSeconds?: number | null;\n errorCode?: string | null;\n errorMessage?: string | null;\n progressMessage?: string | null;\n};\n\nfunction toOperationEventPayload(\n eventType: string,\n context: OperationEventContext,\n): Record<string, unknown> {\n return {\n operation_id: context.operationId,\n trace_id: context.traceId,\n event_type: eventType,\n status: context.status,\n ts: new Date().toISOString(),\n wallet_address: context.walletAddress ?? undefined,\n object_id: context.objectId ?? undefined,\n object_key: context.objectKey ?? undefined,\n quote_id: context.quoteId ?? undefined,\n orchestrator: context.orchestrator ?? undefined,\n \"subagent-session-id\": context.subagentSessionId ?? undefined,\n \"timeout-seconds\": context.timeoutSeconds ?? undefined,\n \"error-code\": context.errorCode ?? undefined,\n \"error-message\": context.errorMessage ?? undefined,\n progress: context.progressMessage ?? undefined,\n };\n}\n\nasync function emitOperationEvent(\n eventType: string,\n context: OperationEventContext,\n homeDir?: string,\n): Promise<void> {\n const payload = toOperationEventPayload(eventType, context);\n await Promise.all([\n appendJsonlEvent(\"events.jsonl\", payload, homeDir),\n appendJsonlEvent(\"proxy-events.jsonl\", payload, homeDir),\n ]);\n}\n\nasync function emitOperationEventBestEffort(\n eventType: string,\n context: OperationEventContext,\n homeDir?: string,\n): Promise<void> {\n try {\n await emitOperationEvent(eventType, context, homeDir);\n } catch {\n // Operation event logging is best-effort only.\n }\n}\n\nfunction buildRequestCorrelation(\n forcedOperationId?: string,\n forcedTraceId?: string,\n): Required<RequestCorrelation> {\n const operationId = forcedOperationId?.trim() || randomUUID();\n const traceId = forcedTraceId?.trim() || randomUUID();\n return { operationId, traceId };\n}\n\nasync function runCloudCommandHandler(\n ctx: { args?: string; channel?: string; senderId?: string },\n options: RunCloudCommandHandlerOptions,\n executionContext: RunCloudCommandExecutionContext = {},\n): Promise<{ text: string; isError?: boolean }> {\n const parsed = parseCloudArgs(ctx.args);\n const objectLogHomeDir = options.objectLogHomeDir;\n const backupBuilder = options.buildBackupObjectFn;\n const requestPriceStorageQuote = options.requestPriceStorageQuoteFn;\n const requestStorageUpload = options.requestStorageUploadFn;\n const requestStorageUploadConfirm = options.requestStorageUploadConfirmFn;\n const resolveWalletKey = options.resolveWalletKeyFn;\n const createPayment = options.createPaymentFetchFn;\n const fetchImpl = options.fetchImpl;\n const nowDateFn = options.nowDateFn;\n const idempotencyKeyFn = options.idempotencyKeyFn;\n const requestStorageLs = options.requestStorageLsFn;\n const requestStorageDownload = options.requestStorageDownloadFn;\n const requestStorageDelete = options.requestStorageDeleteFn;\n const subagentOrchestrator = options.subagentOrchestrator;\n\n if (parsed.mode === \"help\" || parsed.mode === \"unknown\") {\n return {\n text: CLOUD_HELP_TEXT,\n isError: parsed.mode === \"unknown\",\n };\n }\n\n if (parsed.mode === \"price-storage-invalid\") {\n return {\n text: `Cannot price storage: required arguments are ${REQUIRED_PRICE_STORAGE}.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"backup-invalid\") {\n return {\n text: \"Cannot build storage object\",\n isError: true,\n };\n }\n\n if (parsed.mode === \"backup-invalid-async\") {\n return {\n text: `Cannot build storage object: ${INVALID_ASYNC_FLAGS_MESSAGE}`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"upload-invalid\") {\n return {\n text: `Cannot upload storage object: required arguments are ${REQUIRED_UPLOAD}.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"upload-invalid-async\") {\n return {\n text: `Cannot upload storage object: ${INVALID_ASYNC_FLAGS_MESSAGE}`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"ls-invalid\") {\n return {\n text: `Cannot list storage object: required arguments are ${REQUIRED_STORAGE_OBJECT}.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"download-invalid\") {\n return {\n text: `Cannot download file: required arguments are ${REQUIRED_STORAGE_OBJECT}.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"download-invalid-async\") {\n return {\n text: `Cannot download file: ${INVALID_ASYNC_FLAGS_MESSAGE}`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"delete-invalid\") {\n return {\n text: `Cannot delete file: required arguments are ${REQUIRED_STORAGE_OBJECT}.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"op-status-invalid\") {\n return {\n text: \"Cannot get operation status: required arguments are --operation-id.\",\n isError: true,\n };\n }\n\n const datastore = await createCloudDatastore(objectLogHomeDir);\n const terminalOperationStatuses = new Set([\"succeeded\", \"failed\", \"cancelled\", \"timed_out\"]);\n const isTerminalOperationStatus = (status: string): boolean =>\n terminalOperationStatuses.has(status);\n const formatOperationStatus = (operation: {\n operation_id: string;\n type: string;\n status: string;\n started_at: string | null;\n finished_at: string | null;\n orchestrator: string | null;\n subagent_session_id: string | null;\n timeout_seconds: number | null;\n error_code: string | null;\n error_message: string | null;\n }): { text: string; isError: boolean } => ({\n text: [\n `operation-id: ${operation.operation_id}`,\n `type: ${operation.type}`,\n `status: ${operation.status}`,\n `started-at: ${operation.started_at ?? \"n/a\"}`,\n `finished-at: ${operation.finished_at ?? \"n/a\"}`,\n operation.orchestrator ? `orchestrator: ${operation.orchestrator}` : null,\n operation.subagent_session_id\n ? `subagent-session-id: ${operation.subagent_session_id}`\n : null,\n operation.timeout_seconds ? `timeout-seconds: ${operation.timeout_seconds}` : null,\n operation.error_code ? `error-code: ${operation.error_code}` : null,\n operation.error_message ? `error-message: ${operation.error_message}` : null,\n ]\n .filter((v): v is string => Boolean(v))\n .join(\"\\n\"),\n isError:\n operation.status === \"failed\" ||\n operation.status === \"cancelled\" ||\n operation.status === \"timed_out\",\n });\n\n if (parsed.mode === \"op-status\") {\n let operation = await datastore.findOperationById(parsed.operationId);\n if (!operation) {\n return {\n text: `Operation not found: ${parsed.operationId}`,\n isError: true,\n };\n }\n\n if (parsed.cancel) {\n if (operation.orchestrator !== \"subagent\" || !operation.subagent_session_id) {\n return {\n text: \"Cancellation is only supported for subagent-orchestrated operations.\",\n isError: true,\n };\n }\n if (!isTerminalOperationStatus(operation.status)) {\n const traceId = operation.trace_id ?? randomUUID();\n const cancelRequestedAt = new Date().toISOString();\n await datastore.upsertOperation({\n operation_id: operation.operation_id,\n type: operation.type,\n object_id: operation.object_id,\n quote_id: operation.quote_id,\n trace_id: traceId,\n orchestrator: \"subagent\",\n subagent_session_id: operation.subagent_session_id,\n timeout_seconds: operation.timeout_seconds,\n cancel_requested_at: cancelRequestedAt,\n status: \"running\",\n error_code: null,\n error_message: null,\n });\n await emitOperationEventBestEffort(\n \"operation.cancel.requested\",\n {\n operationId: operation.operation_id,\n traceId,\n status: \"running\",\n objectId: operation.object_id,\n quoteId: operation.quote_id,\n orchestrator: \"subagent\",\n subagentSessionId: operation.subagent_session_id,\n timeoutSeconds: operation.timeout_seconds,\n },\n objectLogHomeDir,\n );\n\n const cancelResult = await subagentOrchestrator.cancel(\n operation.subagent_session_id,\n \"cancel requested by op-status\",\n );\n if (cancelResult.accepted || cancelResult.alreadyTerminal) {\n const afterCancel = await datastore.findOperationById(parsed.operationId);\n if (afterCancel && !isTerminalOperationStatus(afterCancel.status)) {\n await datastore.upsertOperation({\n operation_id: operation.operation_id,\n type: operation.type,\n object_id: operation.object_id,\n quote_id: operation.quote_id,\n trace_id: traceId,\n orchestrator: \"subagent\",\n subagent_session_id: operation.subagent_session_id,\n timeout_seconds: operation.timeout_seconds,\n cancel_requested_at: cancelRequestedAt,\n status: \"cancelled\",\n error_code: \"ASYNC_CANCELLED\",\n error_message: \"Operation cancelled by user request.\",\n });\n await emitOperationEventBestEffort(\n \"operation.cancelled\",\n {\n operationId: operation.operation_id,\n traceId,\n status: \"cancelled\",\n objectId: operation.object_id,\n quoteId: operation.quote_id,\n orchestrator: \"subagent\",\n subagentSessionId: operation.subagent_session_id,\n timeoutSeconds: operation.timeout_seconds,\n errorCode: \"ASYNC_CANCELLED\",\n errorMessage: \"Operation cancelled by user request.\",\n },\n objectLogHomeDir,\n );\n }\n }\n }\n operation = await datastore.findOperationById(parsed.operationId);\n if (!operation) {\n return {\n text: `Operation not found: ${parsed.operationId}`,\n isError: true,\n };\n }\n }\n return formatOperationStatus(operation);\n }\n\n if (\n (parsed.mode === \"backup\" || parsed.mode === \"upload\" || parsed.mode === \"download\") &&\n parsed.async\n ) {\n const asyncCorrelation = buildRequestCorrelation();\n const operationId = asyncCorrelation.operationId;\n const opType = parsed.mode;\n const opObject = parsed.mode === \"upload\" ? parsed.uploadRequest.object_id : null;\n const opQuote = parsed.mode === \"upload\" ? parsed.uploadRequest.quote_id : null;\n const orchestratorMode = parsed.orchestrator ?? \"inline\";\n const timeoutSeconds = orchestratorMode === \"subagent\" ? (parsed.timeoutSeconds ?? null) : null;\n const eventContextBase: Omit<OperationEventContext, \"status\"> = {\n operationId,\n traceId: asyncCorrelation.traceId,\n walletAddress:\n parsed.mode === \"upload\"\n ? parsed.uploadRequest.wallet_address\n : parsed.mode === \"download\"\n ? parsed.storageObjectRequest.wallet_address\n : null,\n objectId: opObject,\n objectKey:\n parsed.mode === \"download\" ? (parsed.storageObjectRequest.object_key ?? null) : null,\n quoteId: opQuote,\n orchestrator: orchestratorMode,\n timeoutSeconds,\n };\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: orchestratorMode,\n timeout_seconds: timeoutSeconds,\n status: \"started\",\n error_code: null,\n error_message: null,\n });\n\n await emitOperationEventBestEffort(\n \"operation.dispatched\",\n { ...eventContextBase, status: \"started\" },\n objectLogHomeDir,\n );\n\n const syncArgs = stripAsyncControlFlags(ctx.args);\n if (orchestratorMode === \"subagent\") {\n const subagentTask: MnemosparkSubagentTaskV1 = {\n schema: \"mnemospark.subagent-task.v1\",\n operationId,\n traceId: asyncCorrelation.traceId,\n command: parsed.mode,\n args: syncArgs,\n timeoutSeconds: parsed.timeoutSeconds,\n requestedBy: {\n pluginCommand: \"mnemospark_cloud\",\n chatId: ctx.channel,\n senderId: ctx.senderId,\n },\n };\n try {\n const dispatchResult = await subagentOrchestrator.dispatch({\n task: subagentTask,\n timeoutSeconds: parsed.timeoutSeconds,\n runTask: async () =>\n runCloudCommandHandler(\n { args: syncArgs, channel: ctx.channel, senderId: ctx.senderId },\n options,\n {\n forcedOperationId: asyncCorrelation.operationId,\n forcedTraceId: asyncCorrelation.traceId,\n },\n ),\n hooks: {\n onRunning: async (sessionId) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n status: \"running\",\n error_code: null,\n error_message: null,\n });\n await emitOperationEventBestEffort(\n \"operation.progress\",\n {\n ...eventContextBase,\n status: \"running\",\n subagentSessionId: sessionId,\n progressMessage: \"subagent running\",\n },\n objectLogHomeDir,\n );\n },\n onProgress: async (sessionId, message) => {\n await emitOperationEventBestEffort(\n \"operation.progress\",\n {\n ...eventContextBase,\n status: \"running\",\n subagentSessionId: sessionId,\n progressMessage: message,\n },\n objectLogHomeDir,\n );\n },\n onCompleted: async (sessionId) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n status: \"succeeded\",\n error_code: null,\n error_message: null,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: \"succeeded\",\n subagentSessionId: sessionId,\n },\n objectLogHomeDir,\n );\n },\n onFailed: async (sessionId, details) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n status: \"failed\",\n error_code: details.code,\n error_message: details.message,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: \"failed\",\n subagentSessionId: sessionId,\n errorCode: details.code,\n errorMessage: details.message,\n },\n objectLogHomeDir,\n );\n },\n onCancelled: async (sessionId, reason) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n cancel_requested_at: new Date().toISOString(),\n status: \"cancelled\",\n error_code: \"ASYNC_CANCELLED\",\n error_message: reason ?? \"Operation cancelled.\",\n });\n await emitOperationEventBestEffort(\n \"operation.cancelled\",\n {\n ...eventContextBase,\n status: \"cancelled\",\n subagentSessionId: sessionId,\n errorCode: \"ASYNC_CANCELLED\",\n errorMessage: reason ?? \"Operation cancelled.\",\n },\n objectLogHomeDir,\n );\n },\n onTimedOut: async (sessionId) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n status: \"timed_out\",\n error_code: \"ASYNC_TIMEOUT\",\n error_message: \"Operation timed out.\",\n });\n await emitOperationEventBestEffort(\n \"operation.timed_out\",\n {\n ...eventContextBase,\n status: \"timed_out\",\n subagentSessionId: sessionId,\n errorCode: \"ASYNC_TIMEOUT\",\n errorMessage: \"Operation timed out.\",\n },\n objectLogHomeDir,\n );\n },\n },\n });\n\n const operationAfterDispatch = await datastore.findOperationById(operationId);\n if (operationAfterDispatch?.subagent_session_id !== dispatchResult.sessionId) {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: dispatchResult.sessionId,\n timeout_seconds: timeoutSeconds,\n status: operationAfterDispatch?.status ?? \"started\",\n error_code: operationAfterDispatch?.error_code ?? null,\n error_message: operationAfterDispatch?.error_message ?? null,\n });\n }\n\n return {\n text: [\n `Operation started in background. operation-id: ${operationId}`,\n `orchestrator: subagent`,\n `subagent-session-id: ${dispatchResult.sessionId}`,\n timeoutSeconds ? `timeout-seconds: ${timeoutSeconds}` : null,\n `Use /mnemospark_cloud op-status --operation-id ${operationId}`,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n } catch (dispatchError) {\n const dispatchMessage =\n dispatchError instanceof Error ? dispatchError.message : String(dispatchError);\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n timeout_seconds: timeoutSeconds,\n status: \"failed\",\n error_code: \"ASYNC_DISPATCH_FAILED\",\n error_message: dispatchMessage,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: \"failed\",\n errorCode: \"ASYNC_DISPATCH_FAILED\",\n errorMessage: dispatchMessage,\n },\n objectLogHomeDir,\n );\n return {\n text: `Cannot dispatch subagent operation: ${dispatchMessage}\\noperation-id: ${operationId}`,\n isError: true,\n };\n }\n }\n\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"inline\",\n status: \"running\",\n error_code: null,\n error_message: null,\n });\n void runCloudCommandHandler(\n { args: syncArgs, channel: ctx.channel, senderId: ctx.senderId },\n options,\n {\n forcedOperationId: asyncCorrelation.operationId,\n forcedTraceId: asyncCorrelation.traceId,\n },\n )\n .then(async (result) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"inline\",\n status: result.isError ? \"failed\" : \"succeeded\",\n error_code: result.isError ? \"ASYNC_FAILED\" : null,\n error_message: result.isError ? result.text : null,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: result.isError ? \"failed\" : \"succeeded\",\n errorCode: result.isError ? \"ASYNC_FAILED\" : null,\n errorMessage: result.isError ? result.text : null,\n },\n objectLogHomeDir,\n );\n })\n .catch(async (err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"inline\",\n status: \"failed\",\n error_code: \"ASYNC_EXCEPTION\",\n error_message: errorMessage,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: \"failed\",\n errorCode: \"ASYNC_EXCEPTION\",\n errorMessage,\n },\n objectLogHomeDir,\n );\n });\n\n return {\n text: [\n `Operation started in background. operation-id: ${operationId}`,\n `orchestrator: inline`,\n `Use /mnemospark_cloud op-status --operation-id ${operationId}`,\n ].join(\"\\n\"),\n };\n }\n\n if (parsed.mode === \"backup\") {\n try {\n const result = await backupBuilder(parsed.backupTarget, options.backupOptions);\n await emitCloudEventBestEffort(\n \"backup.completed\",\n {\n operation_id: randomUUID(),\n object_id: result.objectId,\n status: \"succeeded\",\n details: { friendly_name: parsed.friendlyName ?? basename(parsed.backupTarget) },\n },\n objectLogHomeDir,\n );\n await datastore.upsertObject({\n object_id: result.objectId,\n object_key: null,\n wallet_address: \"unknown\",\n quote_id: null,\n provider: null,\n bucket_name: null,\n region: null,\n sha256: result.objectIdHash,\n status: \"backed_up\",\n });\n const friendlyName = parsed.friendlyName?.trim() || basename(parsed.backupTarget);\n if (friendlyName) {\n await datastore.upsertFriendlyName({\n friendly_name: friendlyName,\n object_id: result.objectId,\n object_key: null,\n quote_id: null,\n wallet_address: \"unknown\",\n });\n }\n return {\n text: [\n `object-id: ${result.objectId}`,\n `object-id-hash: ${result.objectIdHash.replace(/\\s/g, \"\")}`,\n `object-size: ${result.objectSizeGb}`,\n ].join(\"\\n\"),\n };\n } catch (err) {\n if (err instanceof UnsupportedBackupPlatformError) {\n return {\n text: \"Cloud backup is only supported on macOS and Linux.\",\n isError: true,\n };\n }\n return {\n text: \"Cannot build storage object\",\n isError: true,\n };\n }\n }\n\n if (parsed.mode === \"price-storage\") {\n const correlation = buildRequestCorrelation();\n try {\n const quote = await requestPriceStorageQuote(parsed.priceStorageRequest, {\n ...options.proxyQuoteOptions,\n correlation,\n });\n await appendPriceStorageQuoteLog(quote, objectLogHomeDir);\n await datastore.upsertObject({\n object_id: quote.object_id,\n object_key: null,\n wallet_address: quote.addr,\n quote_id: quote.quote_id,\n provider: quote.provider,\n bucket_name: null,\n region: quote.location,\n sha256: quote.object_id_hash,\n status: \"quoted\",\n });\n await datastore.upsertPayment({\n quote_id: quote.quote_id,\n wallet_address: quote.addr,\n trans_id: null,\n amount: quote.storage_price,\n network: null,\n status: \"quoted\",\n });\n await emitCloudEventBestEffort(\n \"price-storage.completed\",\n {\n operation_id: correlation.operationId,\n trace_id: correlation.traceId,\n wallet_address: quote.addr,\n object_id: quote.object_id,\n quote_id: quote.quote_id,\n status: \"succeeded\",\n },\n objectLogHomeDir,\n );\n return {\n text: formatPriceStorageUserMessage(quote),\n };\n } catch (err) {\n await emitCloudEventBestEffort(\n \"price-storage.completed\",\n {\n operation_id: correlation.operationId,\n trace_id: correlation.traceId,\n wallet_address: parsed.priceStorageRequest.wallet_address,\n object_id: parsed.priceStorageRequest.object_id,\n status: \"failed\",\n },\n objectLogHomeDir,\n );\n const message =\n err instanceof Error ? err.message : typeof err === \"string\" ? err : String(err);\n return {\n text: message ? `Cannot price storage: ${message}` : \"Cannot price storage\",\n isError: true,\n };\n }\n }\n\n if (parsed.mode === \"upload\") {\n const uploadCorrelation = buildRequestCorrelation(\n executionContext.forcedOperationId ?? idempotencyKeyFn(),\n executionContext.forcedTraceId,\n );\n try {\n const loggedQuote =\n (await datastore.findQuoteById(parsed.uploadRequest.quote_id)) ??\n (await findLoggedPriceStorageQuote(parsed.uploadRequest.quote_id, objectLogHomeDir));\n if (!loggedQuote) {\n return {\n text: \"Cannot upload storage object: quote-id not found in object.log. Run /mnemospark_cloud price-storage first.\",\n isError: true,\n };\n }\n\n if (\n loggedQuote.walletAddress.toLowerCase() !==\n parsed.uploadRequest.wallet_address.toLowerCase() ||\n loggedQuote.objectId !== parsed.uploadRequest.object_id ||\n loggedQuote.objectIdHash.toLowerCase() !== parsed.uploadRequest.object_id_hash.toLowerCase()\n ) {\n return {\n text: \"Cannot upload storage object: quote details do not match wallet/object arguments.\",\n isError: true,\n };\n }\n\n const archivePath = join(\n options.backupOptions?.tmpDir ?? DEFAULT_BACKUP_DIR,\n parsed.uploadRequest.object_id,\n );\n let archiveStats;\n try {\n archiveStats = await stat(archivePath);\n } catch {\n return {\n text: `Cannot upload storage object: local archive not found at ${archivePath}. Run /mnemospark_cloud backup first.`,\n isError: true,\n };\n }\n if (!archiveStats.isFile()) {\n return {\n text: `Cannot upload storage object: local archive path is not a file (${archivePath}).`,\n isError: true,\n };\n }\n\n const archiveHash = await sha256File(archivePath);\n if (archiveHash.toLowerCase() !== parsed.uploadRequest.object_id_hash.toLowerCase()) {\n return {\n text: \"Cannot upload storage object: object-id-hash does not match local archive.\",\n isError: true,\n };\n }\n\n const walletKey = await resolveWalletKey(objectLogHomeDir);\n const walletAccount = privateKeyToAccount(walletKey);\n if (\n walletAccount.address.toLowerCase() !== parsed.uploadRequest.wallet_address.toLowerCase()\n ) {\n return {\n text: `Cannot upload storage object: wallet key address ${walletAccount.address} does not match --wallet-address ${parsed.uploadRequest.wallet_address}.`,\n isError: true,\n };\n }\n\n const preparedPayload = await prepareUploadPayload(\n archivePath,\n parsed.uploadRequest.wallet_address,\n objectLogHomeDir,\n );\n const idempotencyKey = uploadCorrelation.operationId;\n const shouldSettleBeforeUpload = requestStorageUpload !== requestStorageUploadViaProxy;\n\n if (shouldSettleBeforeUpload) {\n const paymentFetch = createPayment(walletKey).fetch;\n // Settle payment first (with 402 handling) when upload transport does not settle itself.\n const settleResult = await requestPaymentSettleViaProxy(\n parsed.uploadRequest.quote_id,\n parsed.uploadRequest.wallet_address,\n {\n ...options.proxyUploadOptions,\n correlation: uploadCorrelation,\n fetchImpl: (input, init) => paymentFetch(input, init),\n },\n );\n if (settleResult.status !== 200) {\n const message =\n settleResult.bodyText?.trim() ||\n `Payment settle failed with status ${settleResult.status}`;\n throw new Error(message);\n }\n }\n\n const uploadFetchImpl = options.proxyUploadOptions?.fetchImpl ?? fetchImpl;\n const uploadResponse = await requestStorageUpload(\n {\n quote_id: parsed.uploadRequest.quote_id,\n wallet_address: parsed.uploadRequest.wallet_address,\n object_id: parsed.uploadRequest.object_id,\n object_id_hash: parsed.uploadRequest.object_id_hash,\n quoted_storage_price: loggedQuote.storagePrice,\n payload: preparedPayload.payload,\n },\n {\n ...options.proxyUploadOptions,\n idempotencyKey,\n correlation: uploadCorrelation,\n fetchImpl: uploadFetchImpl,\n },\n );\n\n await uploadPresignedObjectIfNeeded(\n uploadResponse,\n preparedPayload.payload.mode,\n preparedPayload.encryptedContent,\n fetchImpl,\n );\n let finalizedUploadResponse = uploadResponse;\n if (\n preparedPayload.payload.mode === \"presigned\" &&\n uploadResponse.confirmation_required === true\n ) {\n try {\n finalizedUploadResponse = await requestStorageUploadConfirm(\n {\n quote_id: uploadResponse.quote_id,\n wallet_address: parsed.uploadRequest.wallet_address,\n object_key: uploadResponse.object_key,\n idempotency_key: idempotencyKey,\n },\n {\n ...options.proxyUploadConfirmOptions,\n correlation: uploadCorrelation,\n },\n );\n } catch (confirmError) {\n const transId = uploadResponse.trans_id ?? \"unknown\";\n const confirmMessage =\n extractUploadErrorMessage(confirmError) ?? \"Upload confirmation request failed\";\n throw new Error(\n `Upload to S3 succeeded, but backend confirmation failed (trans_id: ${transId}, idempotency_key: ${idempotencyKey}). ${confirmMessage}`,\n );\n }\n }\n\n await appendStorageUploadLog(finalizedUploadResponse, objectLogHomeDir, nowDateFn);\n const cronStoragePriceCandidate =\n finalizedUploadResponse.storage_price ?? loggedQuote.storagePrice;\n const cronStoragePrice =\n Number.isFinite(cronStoragePriceCandidate) && cronStoragePriceCandidate > 0\n ? cronStoragePriceCandidate\n : loggedQuote.storagePrice;\n const cronJob = await createStoragePaymentCronJob(\n finalizedUploadResponse,\n cronStoragePrice,\n objectLogHomeDir,\n nowDateFn,\n );\n await datastore.upsertObject({\n object_id: finalizedUploadResponse.object_id,\n object_key: finalizedUploadResponse.object_key,\n wallet_address: finalizedUploadResponse.addr,\n quote_id: finalizedUploadResponse.quote_id,\n provider: finalizedUploadResponse.provider,\n bucket_name: finalizedUploadResponse.bucket_name,\n region: finalizedUploadResponse.location,\n sha256: parsed.uploadRequest.object_id_hash,\n status: \"uploaded\",\n });\n await datastore.upsertPayment({\n quote_id: finalizedUploadResponse.quote_id,\n wallet_address: finalizedUploadResponse.addr,\n trans_id: finalizedUploadResponse.trans_id ?? null,\n amount: cronStoragePrice,\n network: null,\n status: \"settled\",\n settled_at: new Date().toISOString(),\n });\n await datastore.upsertCronJob({\n cron_id: cronJob.cronId,\n object_id: cronJob.objectId,\n object_key: cronJob.objectKey,\n quote_id: cronJob.quoteId,\n schedule: cronJob.schedule,\n command: cronJob.command,\n status: \"active\",\n });\n if (parsed.friendlyName?.trim()) {\n const normalizedFriendlyName = parsed.friendlyName.trim();\n await datastore.upsertFriendlyName({\n friendly_name: normalizedFriendlyName,\n object_id: finalizedUploadResponse.object_id,\n object_key: finalizedUploadResponse.object_key,\n quote_id: finalizedUploadResponse.quote_id,\n wallet_address: finalizedUploadResponse.addr,\n });\n\n let friendlyNameVerified = false;\n try {\n const readBack = await datastore.resolveFriendlyName({\n walletAddress: finalizedUploadResponse.addr,\n friendlyName: normalizedFriendlyName,\n latest: true,\n });\n friendlyNameVerified =\n Boolean(readBack?.objectKey) &&\n readBack?.objectKey === finalizedUploadResponse.object_key;\n } catch {\n friendlyNameVerified = false;\n }\n\n if (!friendlyNameVerified) {\n const warning =\n \"SQLite friendly-name write verification failed; manifest fallback may be required for --name lookups.\";\n await emitCloudEventBestEffort(\n \"friendly_name.write_verification_failed\",\n {\n operation_id: uploadCorrelation.operationId,\n trace_id: uploadCorrelation.traceId,\n wallet_address: finalizedUploadResponse.addr,\n object_id: finalizedUploadResponse.object_id,\n object_key: finalizedUploadResponse.object_key,\n quote_id: finalizedUploadResponse.quote_id,\n friendly_name: normalizedFriendlyName,\n warning,\n },\n objectLogHomeDir,\n );\n if (process.env.MNEMOSPARK_SQLITE_STRICT === \"1\") {\n throw new Error(warning);\n }\n }\n\n try {\n await appendJsonlEvent(\n \"manifest.jsonl\",\n {\n friendly_name: normalizedFriendlyName,\n object_id: finalizedUploadResponse.object_id,\n object_key: finalizedUploadResponse.object_key,\n quote_id: finalizedUploadResponse.quote_id,\n wallet_address: finalizedUploadResponse.addr,\n created_at: new Date().toISOString(),\n },\n objectLogHomeDir,\n );\n } catch {\n // Manifest logging is non-critical and must not affect command results.\n }\n }\n await emitCloudEventBestEffort(\n \"upload.completed\",\n {\n operation_id: idempotencyKey,\n trace_id: uploadCorrelation.traceId,\n wallet_address: finalizedUploadResponse.addr,\n object_id: finalizedUploadResponse.object_id,\n object_key: finalizedUploadResponse.object_key,\n quote_id: finalizedUploadResponse.quote_id,\n status: \"succeeded\",\n },\n objectLogHomeDir,\n );\n await maybeCleanupLocalBackupArchive(archivePath);\n\n return {\n text: formatStorageUploadUserMessage(finalizedUploadResponse, cronJob.cronId),\n };\n } catch (error) {\n await emitCloudEventBestEffort(\n \"upload.completed\",\n {\n operation_id: uploadCorrelation.operationId,\n trace_id: uploadCorrelation.traceId,\n wallet_address: parsed.uploadRequest.wallet_address,\n object_id: parsed.uploadRequest.object_id,\n quote_id: parsed.uploadRequest.quote_id,\n status: \"failed\",\n },\n objectLogHomeDir,\n );\n const uploadErrorMessage = extractUploadErrorMessage(error);\n return {\n text: uploadErrorMessage ?? \"Cannot upload storage object\",\n isError: true,\n };\n }\n }\n\n if (parsed.mode === \"ls\") {\n const resolved = await resolveNameSelectorIfNeeded(\n datastore,\n parsed.storageObjectRequest,\n parsed.nameSelector,\n objectLogHomeDir,\n );\n if (resolved.error || !resolved.request) {\n return { text: resolved.error ?? \"Cannot resolve storage object request.\", isError: true };\n }\n const resolvedRequest = resolved.request;\n\n if (resolved.degradedWarning) {\n await emitCloudEventBestEffort(\n \"name_resolution.degraded\",\n {\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n warning: resolved.degradedWarning,\n },\n objectLogHomeDir,\n );\n }\n\n const correlation = buildRequestCorrelation();\n const operationId = correlation.operationId;\n const knownObject = await datastore.findObjectByObjectKey(resolvedRequest.object_key);\n const operationObjectId = knownObject?.object_id ?? null;\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"ls\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"started\",\n error_code: null,\n error_message: null,\n });\n try {\n const lsResult = await requestStorageLs(resolvedRequest, {\n ...options.proxyStorageOptions,\n correlation,\n });\n if (!lsResult.success) {\n throw new Error(\"ls failed\");\n }\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"ls\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"succeeded\",\n error_code: null,\n error_message: null,\n });\n await emitCloudEventBestEffort(\n \"ls.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"succeeded\",\n },\n objectLogHomeDir,\n );\n const lsText = formatStorageLsUserMessage(lsResult, resolvedRequest.object_key);\n return {\n text: resolved.degradedWarning ? `${resolved.degradedWarning}\\n${lsText}` : lsText,\n };\n } catch {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"ls\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"failed\",\n error_code: \"LS_FAILED\",\n error_message: \"Cannot list storage object\",\n });\n await emitCloudEventBestEffort(\n \"ls.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"failed\",\n },\n objectLogHomeDir,\n );\n return {\n text: \"Cannot list storage object\",\n isError: true,\n };\n }\n }\n\n if (parsed.mode === \"download\") {\n const resolved = await resolveNameSelectorIfNeeded(\n datastore,\n parsed.storageObjectRequest,\n parsed.nameSelector,\n objectLogHomeDir,\n );\n if (resolved.error || !resolved.request) {\n return { text: resolved.error ?? \"Cannot resolve storage object request.\", isError: true };\n }\n const resolvedRequest = resolved.request;\n\n if (resolved.degradedWarning) {\n await emitCloudEventBestEffort(\n \"name_resolution.degraded\",\n {\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n warning: resolved.degradedWarning,\n },\n objectLogHomeDir,\n );\n }\n\n const correlation = buildRequestCorrelation(\n executionContext.forcedOperationId,\n executionContext.forcedTraceId,\n );\n const operationId = correlation.operationId;\n const knownObject = await datastore.findObjectByObjectKey(resolvedRequest.object_key);\n const operationObjectId = knownObject?.object_id ?? null;\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"download\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"started\",\n error_code: null,\n error_message: null,\n });\n try {\n const downloadResult = await requestStorageDownload(resolvedRequest, {\n ...options.proxyStorageOptions,\n correlation,\n });\n if (!downloadResult.success) {\n throw new Error(\"download failed\");\n }\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"download\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"succeeded\",\n error_code: null,\n error_message: null,\n });\n await emitCloudEventBestEffort(\n \"download.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"succeeded\",\n },\n objectLogHomeDir,\n );\n const downloadText = `File ${resolvedRequest.object_key} downloaded to ${downloadResult.file_path}`;\n return {\n text: resolved.degradedWarning\n ? `${resolved.degradedWarning}\\n${downloadText}`\n : downloadText,\n };\n } catch {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"download\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"failed\",\n error_code: \"DOWNLOAD_FAILED\",\n error_message: \"Cannot download file\",\n });\n await emitCloudEventBestEffort(\n \"download.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"failed\",\n },\n objectLogHomeDir,\n );\n return {\n text: \"Cannot download file\",\n isError: true,\n };\n }\n }\n\n if (parsed.mode === \"delete\") {\n const resolved = await resolveNameSelectorIfNeeded(\n datastore,\n parsed.storageObjectRequest,\n parsed.nameSelector,\n objectLogHomeDir,\n );\n if (resolved.error || !resolved.request) {\n return { text: resolved.error ?? \"Cannot resolve storage object request.\", isError: true };\n }\n const resolvedRequest = resolved.request;\n if (resolved.degradedWarning) {\n await emitCloudEventBestEffort(\n \"name_resolution.degraded\",\n {\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n warning: resolved.degradedWarning,\n },\n objectLogHomeDir,\n );\n }\n const correlation = buildRequestCorrelation();\n const operationId = correlation.operationId;\n\n const existingObjectByKey = await datastore.findObjectByObjectKey(resolvedRequest.object_key);\n try {\n const deleteResult = await requestStorageDelete(resolvedRequest, {\n ...options.proxyStorageOptions,\n correlation,\n });\n if (!deleteResult.success) {\n throw new Error(\"delete failed\");\n }\n } catch {\n await emitCloudEventBestEffort(\n \"delete.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"failed\",\n },\n objectLogHomeDir,\n );\n return {\n text: \"Cannot delete file\",\n isError: true,\n };\n }\n let cronEntry: LoggedStoragePaymentCron | null = null;\n let cronDeleted = false;\n try {\n const dbCron = await datastore.findCronByObjectKey(resolvedRequest.object_key);\n if (dbCron) {\n cronEntry = {\n cronId: dbCron.cronId,\n objectId: dbCron.objectId,\n objectKey: resolvedRequest.object_key,\n };\n }\n if (!cronEntry) {\n cronEntry = await findLoggedStoragePaymentCronByObjectKey(\n resolvedRequest.object_key,\n objectLogHomeDir,\n );\n }\n if (cronEntry) {\n const fileCronDeleted = await removeStoragePaymentCronJob(\n cronEntry.cronId,\n objectLogHomeDir,\n );\n const dbCronDeleted = await datastore.removeCronJob(cronEntry.cronId);\n cronDeleted = fileCronDeleted || dbCronDeleted;\n }\n } catch {\n // Cloud delete already succeeded; cron lookup/removal is best-effort.\n // Report success without implying the delete failed.\n }\n const objectId = cronEntry?.objectId ?? existingObjectByKey?.object_id ?? null;\n if (objectId) {\n const existingObject =\n existingObjectByKey?.object_id === objectId\n ? existingObjectByKey\n : await datastore.findObjectById(objectId);\n await datastore.upsertObject({\n object_id: objectId,\n object_key: resolvedRequest.object_key,\n wallet_address: existingObject?.wallet_address ?? resolvedRequest.wallet_address,\n quote_id: existingObject?.quote_id ?? null,\n provider: existingObject?.provider ?? null,\n bucket_name: existingObject?.bucket_name ?? null,\n region: resolvedRequest.location ?? existingObject?.region ?? null,\n sha256: existingObject?.sha256 ?? null,\n status: \"deleted\",\n });\n }\n await emitCloudEventBestEffort(\n \"delete.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"succeeded\",\n },\n objectLogHomeDir,\n );\n const deleteText = formatStorageDeleteUserMessage(\n resolvedRequest.object_key,\n cronEntry?.cronId ?? null,\n cronDeleted,\n );\n return {\n text: resolved.degradedWarning ? `${resolved.degradedWarning}\\n${deleteText}` : deleteText,\n };\n }\n\n return {\n text: CLOUD_HELP_TEXT,\n isError: true,\n };\n}\n\nexport type {\n BackupObjectOptions,\n BackupObjectResult,\n CreateCloudCommandOptions,\n MnemosparkSubagentTaskV1,\n ParsedCloudArgs,\n};\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nconst DB_SUBPATH = join(\".openclaw\", \"mnemospark\", \"state.db\");\nconst SCHEMA_VERSION = 3;\nconst require = createRequire(import.meta.url);\n\nexport type StorageObjectRow = {\n object_id: string;\n object_key: string | null;\n wallet_address: string;\n quote_id: string | null;\n provider: string | null;\n bucket_name: string | null;\n region: string | null;\n sha256: string | null;\n status: string;\n};\n\nexport type PaymentRow = {\n quote_id: string;\n wallet_address: string;\n trans_id: string | null;\n amount: number;\n network: string | null;\n status: string;\n settled_at?: string | null;\n};\n\nexport type CronJobRow = {\n cron_id: string;\n object_id: string;\n object_key: string;\n quote_id: string;\n schedule: string;\n command: string;\n status: string;\n};\n\nexport type OperationRow = {\n operation_id: string;\n type: string;\n object_id: string | null;\n quote_id: string | null;\n trace_id?: string | null;\n orchestrator?: string | null;\n subagent_session_id?: string | null;\n timeout_seconds?: number | null;\n cancel_requested_at?: string | null;\n status: string;\n error_code: string | null;\n error_message: string | null;\n};\n\nexport type QuoteLookup = {\n quoteId: string;\n storagePrice: number;\n walletAddress: string;\n objectId: string;\n objectIdHash: string;\n provider: string;\n location: string;\n};\n\nexport type FriendlyNameRow = {\n friendly_name: string;\n object_id: string;\n object_key: string | null;\n quote_id: string | null;\n wallet_address: string;\n is_active?: number;\n};\n\nexport type FriendlyNameLookup = {\n friendlyNameId: string;\n friendlyName: string;\n objectId: string;\n objectKey: string | null;\n quoteId: string | null;\n walletAddress: string;\n createdAt: string;\n};\n\nexport type CloudDatastore = {\n dbPath: string;\n ensureReady: () => Promise<void>;\n upsertObject: (row: StorageObjectRow) => Promise<void>;\n findObjectByObjectKey: (objectKey: string) => Promise<StorageObjectRow | null>;\n findObjectById: (objectId: string) => Promise<StorageObjectRow | null>;\n upsertPayment: (row: PaymentRow) => Promise<void>;\n upsertCronJob: (row: CronJobRow) => Promise<void>;\n removeCronJob: (cronId: string) => Promise<boolean>;\n findCronByObjectKey: (objectKey: string) => Promise<{ cronId: string; objectId: string } | null>;\n upsertOperation: (row: OperationRow) => Promise<void>;\n findOperationById: (operationId: string) => Promise<{\n operation_id: string;\n type: string;\n object_id: string | null;\n quote_id: string | null;\n trace_id: string | null;\n orchestrator: string | null;\n subagent_session_id: string | null;\n timeout_seconds: number | null;\n cancel_requested_at: string | null;\n status: string;\n error_code: string | null;\n error_message: string | null;\n started_at: string | null;\n finished_at: string | null;\n updated_at: string;\n } | null>;\n findQuoteById: (quoteId: string) => Promise<QuoteLookup | null>;\n upsertFriendlyName: (row: FriendlyNameRow) => Promise<void>;\n resolveFriendlyName: (params: {\n walletAddress: string;\n friendlyName: string;\n latest?: boolean;\n at?: string;\n }) => Promise<FriendlyNameLookup | null>;\n countFriendlyNameMatches: (walletAddress: string, friendlyName: string) => Promise<number>;\n};\n\nfunction resolveDbPath(homeDir?: string): string {\n return join(homeDir ?? homedir(), DB_SUBPATH);\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction normalizeWalletAddress(value: string): string {\n return value.trim().toLowerCase();\n}\n\nexport async function createCloudDatastore(homeDir?: string): Promise<CloudDatastore> {\n const dbPath = resolveDbPath(homeDir);\n type DbLike = {\n exec: (sql: string) => void;\n prepare: (sql: string) => {\n run: (...args: unknown[]) => { changes?: number };\n get: (...args: unknown[]) => unknown;\n };\n };\n\n let db: DbLike | null = null;\n\n const ensureReady = async (): Promise<void> => {\n if (db) return;\n if (process.env.MNEMOSPARK_DISABLE_SQLITE === \"1\") {\n throw new Error(\"SQLite disabled by MNEMOSPARK_DISABLE_SQLITE=1\");\n }\n\n await mkdir(dirname(dbPath), { recursive: true });\n\n // Use runtime require(\"node:sqlite\") to prevent bundlers from rewriting\n // the built-in specifier to \"sqlite\" in dist output.\n const sqliteMod = require(\"node:sqlite\") as {\n DatabaseSync?: new (path: string) => DbLike;\n };\n const DatabaseSyncCtor = sqliteMod.DatabaseSync;\n if (!DatabaseSyncCtor) {\n throw new Error(\"node:sqlite DatabaseSync is unavailable\");\n }\n\n const nextDb = new DatabaseSyncCtor(dbPath);\n nextDb.exec(\"PRAGMA journal_mode=WAL;\");\n nextDb.exec(\"PRAGMA foreign_keys=ON;\");\n\n nextDb.exec(`\n CREATE TABLE IF NOT EXISTS schema_migrations (\n version INTEGER PRIMARY KEY,\n applied_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS objects (\n object_id TEXT PRIMARY KEY,\n object_key TEXT,\n wallet_address TEXT NOT NULL,\n quote_id TEXT,\n provider TEXT,\n bucket_name TEXT,\n region TEXT,\n sha256 TEXT,\n status TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_objects_wallet ON objects(wallet_address);\n CREATE INDEX IF NOT EXISTS idx_objects_quote ON objects(quote_id);\n CREATE INDEX IF NOT EXISTS idx_objects_object_key ON objects(object_key);\n\n CREATE TABLE IF NOT EXISTS payments (\n quote_id TEXT PRIMARY KEY,\n wallet_address TEXT NOT NULL,\n trans_id TEXT,\n amount REAL NOT NULL,\n network TEXT,\n status TEXT NOT NULL,\n settled_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_payments_wallet ON payments(wallet_address);\n\n CREATE TABLE IF NOT EXISTS cron_jobs (\n cron_id TEXT PRIMARY KEY,\n object_id TEXT NOT NULL,\n object_key TEXT NOT NULL,\n quote_id TEXT NOT NULL,\n schedule TEXT NOT NULL,\n command TEXT NOT NULL,\n status TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_cron_jobs_object_key ON cron_jobs(object_key);\n\n CREATE TABLE IF NOT EXISTS operations (\n operation_id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n object_id TEXT,\n quote_id TEXT,\n status TEXT NOT NULL,\n error_code TEXT,\n error_message TEXT,\n started_at TEXT,\n finished_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_operations_type ON operations(type);\n CREATE INDEX IF NOT EXISTS idx_operations_object_id ON operations(object_id);\n CREATE INDEX IF NOT EXISTS idx_operations_quote_id ON operations(quote_id);\n\n CREATE TABLE IF NOT EXISTS friendly_names (\n friendly_name_id TEXT PRIMARY KEY,\n friendly_name TEXT NOT NULL,\n object_id TEXT NOT NULL,\n object_key TEXT,\n quote_id TEXT,\n wallet_address TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n is_active INTEGER NOT NULL DEFAULT 1\n );\n CREATE INDEX IF NOT EXISTS idx_friendly_names_name ON friendly_names(friendly_name);\n CREATE INDEX IF NOT EXISTS idx_friendly_names_object_id ON friendly_names(object_id);\n CREATE INDEX IF NOT EXISTS idx_friendly_names_wallet ON friendly_names(wallet_address);\n CREATE INDEX IF NOT EXISTS idx_friendly_names_created_at ON friendly_names(created_at);\n `);\n\n // Keep wallet_address canonical across tables for reliable matching/indexing.\n nextDb.exec(`\n UPDATE objects\n SET wallet_address = lower(trim(wallet_address))\n WHERE wallet_address <> lower(trim(wallet_address));\n\n UPDATE payments\n SET wallet_address = lower(trim(wallet_address))\n WHERE wallet_address <> lower(trim(wallet_address));\n\n UPDATE friendly_names\n SET wallet_address = lower(trim(wallet_address))\n WHERE wallet_address <> lower(trim(wallet_address));\n `);\n\n const addOperationsColumn = (columnName: string, sqlType: string): void => {\n try {\n nextDb.exec(`ALTER TABLE operations ADD COLUMN ${columnName} ${sqlType}`);\n } catch (error) {\n const message = error instanceof Error ? error.message.toLowerCase() : String(error);\n if (!message.includes(\"duplicate column name\")) {\n throw error;\n }\n }\n };\n addOperationsColumn(\"trace_id\", \"TEXT\");\n addOperationsColumn(\"orchestrator\", \"TEXT\");\n addOperationsColumn(\"subagent_session_id\", \"TEXT\");\n addOperationsColumn(\"timeout_seconds\", \"INTEGER\");\n addOperationsColumn(\"cancel_requested_at\", \"TEXT\");\n\n nextDb\n .prepare(\n `INSERT INTO schema_migrations(version, applied_at)\n VALUES(?, ?)\n ON CONFLICT(version) DO NOTHING`,\n )\n .run(SCHEMA_VERSION, nowIso());\n db = nextDb;\n };\n\n const safe = async <T>(fn: () => T, fallback: T): Promise<T> => {\n try {\n await ensureReady();\n return fn();\n } catch (error) {\n if (process.env.MNEMOSPARK_SQLITE_STRICT === \"1\") {\n throw error;\n }\n return fallback;\n }\n };\n\n return {\n dbPath,\n ensureReady,\n upsertObject: async (row) => {\n await safe(() => {\n const normalizedWalletAddress = normalizeWalletAddress(row.wallet_address);\n const ts = nowIso();\n db!\n .prepare(\n `INSERT INTO objects(object_id, object_key, wallet_address, quote_id, provider, bucket_name, region, sha256, status, created_at, updated_at)\n VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(object_id) DO UPDATE SET\n object_key=excluded.object_key,\n wallet_address=excluded.wallet_address,\n quote_id=excluded.quote_id,\n provider=excluded.provider,\n bucket_name=excluded.bucket_name,\n region=excluded.region,\n sha256=excluded.sha256,\n status=excluded.status,\n updated_at=excluded.updated_at`,\n )\n .run(\n row.object_id,\n row.object_key,\n normalizedWalletAddress,\n row.quote_id,\n row.provider,\n row.bucket_name,\n row.region,\n row.sha256,\n row.status,\n ts,\n ts,\n );\n }, undefined);\n },\n findObjectByObjectKey: async (objectKey) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT object_id, object_key, wallet_address, quote_id, provider, bucket_name, region, sha256, status\n FROM objects\n WHERE object_key = ?\n ORDER BY updated_at DESC\n LIMIT 1`,\n )\n .get(objectKey) as StorageObjectRow | undefined;\n return row ?? null;\n }, null),\n findObjectById: async (objectId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT object_id, object_key, wallet_address, quote_id, provider, bucket_name, region, sha256, status\n FROM objects\n WHERE object_id = ?\n LIMIT 1`,\n )\n .get(objectId) as StorageObjectRow | undefined;\n return row ?? null;\n }, null),\n upsertPayment: async (row) => {\n await safe(() => {\n const normalizedWalletAddress = normalizeWalletAddress(row.wallet_address);\n const ts = nowIso();\n db!\n .prepare(\n `INSERT INTO payments(quote_id, wallet_address, trans_id, amount, network, status, settled_at, created_at, updated_at)\n VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(quote_id) DO UPDATE SET\n wallet_address=excluded.wallet_address,\n trans_id=excluded.trans_id,\n amount=excluded.amount,\n network=excluded.network,\n status=excluded.status,\n settled_at=excluded.settled_at,\n updated_at=excluded.updated_at`,\n )\n .run(\n row.quote_id,\n normalizedWalletAddress,\n row.trans_id,\n row.amount,\n row.network,\n row.status,\n row.settled_at ?? null,\n ts,\n ts,\n );\n }, undefined);\n },\n upsertCronJob: async (row) => {\n await safe(() => {\n const ts = nowIso();\n db!\n .prepare(\n `INSERT INTO cron_jobs(cron_id, object_id, object_key, quote_id, schedule, command, status, created_at, updated_at)\n VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(cron_id) DO UPDATE SET\n object_id=excluded.object_id,\n object_key=excluded.object_key,\n quote_id=excluded.quote_id,\n schedule=excluded.schedule,\n command=excluded.command,\n status=excluded.status,\n updated_at=excluded.updated_at`,\n )\n .run(\n row.cron_id,\n row.object_id,\n row.object_key,\n row.quote_id,\n row.schedule,\n row.command,\n row.status,\n ts,\n ts,\n );\n }, undefined);\n },\n removeCronJob: async (cronId) =>\n safe(() => {\n const res = db!.prepare(`DELETE FROM cron_jobs WHERE cron_id = ?`).run(cronId);\n return Number(res.changes ?? 0) > 0;\n }, false),\n findCronByObjectKey: async (objectKey) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT cron_id, object_id FROM cron_jobs WHERE object_key = ? ORDER BY updated_at DESC LIMIT 1`,\n )\n .get(objectKey) as { cron_id: string; object_id: string } | undefined;\n if (!row) return null;\n return { cronId: row.cron_id, objectId: row.object_id };\n }, null),\n upsertOperation: async (row) => {\n await safe(() => {\n const ts = nowIso();\n const terminalStatuses = new Set([\"succeeded\", \"failed\", \"cancelled\", \"timed_out\"]);\n db!\n .prepare(\n `INSERT INTO operations(operation_id, type, object_id, quote_id, trace_id, orchestrator, subagent_session_id, timeout_seconds, cancel_requested_at, status, error_code, error_message, started_at, finished_at, created_at, updated_at)\n VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(operation_id) DO UPDATE SET\n type=excluded.type,\n object_id=COALESCE(excluded.object_id, operations.object_id),\n quote_id=COALESCE(excluded.quote_id, operations.quote_id),\n trace_id=COALESCE(excluded.trace_id, operations.trace_id),\n orchestrator=COALESCE(excluded.orchestrator, operations.orchestrator),\n subagent_session_id=COALESCE(excluded.subagent_session_id, operations.subagent_session_id),\n timeout_seconds=COALESCE(excluded.timeout_seconds, operations.timeout_seconds),\n cancel_requested_at=COALESCE(excluded.cancel_requested_at, operations.cancel_requested_at),\n status=excluded.status,\n error_code=excluded.error_code,\n error_message=excluded.error_message,\n started_at=COALESCE(excluded.started_at, operations.started_at),\n finished_at=COALESCE(excluded.finished_at, operations.finished_at),\n updated_at=excluded.updated_at`,\n )\n .run(\n row.operation_id,\n row.type,\n row.object_id,\n row.quote_id,\n row.trace_id ?? null,\n row.orchestrator ?? null,\n row.subagent_session_id ?? null,\n row.timeout_seconds ?? null,\n row.cancel_requested_at ?? null,\n row.status,\n row.error_code,\n row.error_message,\n row.status === \"started\" ? ts : null,\n terminalStatuses.has(row.status) ? ts : null,\n ts,\n ts,\n );\n }, undefined);\n },\n findOperationById: async (operationId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT operation_id, type, object_id, quote_id, trace_id, orchestrator, subagent_session_id, timeout_seconds, cancel_requested_at, status, error_code, error_message, started_at, finished_at, updated_at\n FROM operations\n WHERE operation_id = ?\n LIMIT 1`,\n )\n .get(operationId) as\n | {\n operation_id: string;\n type: string;\n object_id: string | null;\n quote_id: string | null;\n trace_id: string | null;\n orchestrator: string | null;\n subagent_session_id: string | null;\n timeout_seconds: number | null;\n cancel_requested_at: string | null;\n status: string;\n error_code: string | null;\n error_message: string | null;\n started_at: string | null;\n finished_at: string | null;\n updated_at: string;\n }\n | undefined;\n return row ?? null;\n }, null),\n findQuoteById: async (quoteId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT quote_id, amount, wallet_address FROM payments WHERE quote_id = ? ORDER BY updated_at DESC LIMIT 1`,\n )\n .get(quoteId) as { quote_id: string; amount: number; wallet_address: string } | undefined;\n const object = db!\n .prepare(\n `SELECT object_id, sha256, provider, region FROM objects WHERE quote_id = ? ORDER BY updated_at DESC LIMIT 1`,\n )\n .get(quoteId) as\n | {\n object_id: string;\n sha256: string | null;\n provider: string | null;\n region: string | null;\n }\n | undefined;\n if (!row || !object) return null;\n if (object.sha256 === null || object.provider === null || object.region === null)\n return null;\n return {\n quoteId,\n storagePrice: Number(row.amount),\n walletAddress: row.wallet_address,\n objectId: object.object_id,\n objectIdHash: object.sha256,\n provider: object.provider,\n location: object.region,\n };\n }, null),\n upsertFriendlyName: async (row) => {\n await safe(() => {\n const normalizedWalletAddress = normalizeWalletAddress(row.wallet_address);\n const ts = nowIso();\n db!\n .prepare(\n `INSERT INTO friendly_names(friendly_name_id, friendly_name, object_id, object_key, quote_id, wallet_address, created_at, updated_at, is_active)\n VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n randomUUID(),\n row.friendly_name,\n row.object_id,\n row.object_key,\n row.quote_id,\n normalizedWalletAddress,\n ts,\n ts,\n row.is_active ?? 1,\n );\n }, undefined);\n },\n resolveFriendlyName: async (params) =>\n safe(() => {\n const normalizedWalletAddress = normalizeWalletAddress(params.walletAddress);\n const atIso = params.at ? new Date(params.at).toISOString() : null;\n const row =\n params.latest || !atIso\n ? (db!\n .prepare(\n `SELECT friendly_name_id, friendly_name, object_id, object_key, quote_id, wallet_address, created_at\n FROM friendly_names\n WHERE wallet_address = ? AND friendly_name = ? AND is_active = 1\n ORDER BY created_at DESC\n LIMIT 1`,\n )\n .get(normalizedWalletAddress, params.friendlyName) as\n | {\n friendly_name_id: string;\n friendly_name: string;\n object_id: string;\n object_key: string | null;\n quote_id: string | null;\n wallet_address: string;\n created_at: string;\n }\n | undefined)\n : (db!\n .prepare(\n `SELECT friendly_name_id, friendly_name, object_id, object_key, quote_id, wallet_address, created_at\n FROM friendly_names\n WHERE wallet_address = ? AND friendly_name = ? AND is_active = 1 AND created_at <= ?\n ORDER BY created_at DESC\n LIMIT 1`,\n )\n .get(normalizedWalletAddress, params.friendlyName, atIso) as\n | {\n friendly_name_id: string;\n friendly_name: string;\n object_id: string;\n object_key: string | null;\n quote_id: string | null;\n wallet_address: string;\n created_at: string;\n }\n | undefined);\n\n if (!row) return null;\n return {\n friendlyNameId: row.friendly_name_id,\n friendlyName: row.friendly_name,\n objectId: row.object_id,\n objectKey: row.object_key,\n quoteId: row.quote_id,\n walletAddress: row.wallet_address,\n createdAt: row.created_at,\n };\n }, null),\n countFriendlyNameMatches: async (walletAddress, friendlyName) =>\n safe(() => {\n const normalizedWalletAddress = normalizeWalletAddress(walletAddress);\n const row = db!\n .prepare(\n `SELECT COUNT(1) AS cnt\n FROM friendly_names\n WHERE wallet_address = ? AND friendly_name = ? AND is_active = 1`,\n )\n .get(normalizedWalletAddress, friendlyName) as { cnt: number } | undefined;\n return Number(row?.cnt ?? 0);\n }, 0),\n };\n}\n\nexport { DB_SUBPATH, SCHEMA_VERSION, resolveDbPath as resolveCloudDatastorePath };\n","#!/usr/bin/env node\n/**\n * mnemospark CLI\n *\n * Standalone proxy for deployed setups where the proxy needs to survive gateway restarts.\n *\n * Usage:\n * npx mnemospark # Start standalone proxy\n * npx mnemospark --version # Show version\n * npx mnemospark check-update # Check if a new version is available\n * npx mnemospark update # Update to latest version\n * npx mnemospark --port 7120 # Custom port\n *\n * For production deployments, use with PM2:\n * pm2 start \"npx mnemospark\" --name mnemospark\n */\n\nimport { startProxy, getProxyPort } from \"./proxy.js\";\nimport { resolveOrGenerateWalletKey, LEGACY_WALLET_FILE, WALLET_FILE } from \"./auth.js\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport { VERSION } from \"./version.js\";\nimport { createCloudCommand } from \"./cloud-command.js\";\nimport type { PluginCommandContext } from \"./types.js\";\nimport { spawn } from \"node:child_process\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\n\nfunction isHexPrivateKey(value: string | undefined): value is `0x${string}` {\n return typeof value === \"string\" && /^0x[0-9a-fA-F]{64}$/.test(value.trim());\n}\n\nfunction printHelp(): void {\n console.log(`\nmnemospark v${VERSION} - Storage proxy and wallet tools\n\nUsage:\n mnemospark [options]\n mnemospark install --default\n mnemospark install --standard\n mnemospark wallet Show wallet info\n mnemospark cloud <subcommand> Cloud storage commands\n mnemospark proxy start Start the mnemospark proxy\n mnemospark check-update Check if a new version is available\n mnemospark update Update to latest version\n\nOptions:\n --version, -v Show version number\n --help, -h Show this help message\n --port <number> Port to listen on (default: ${getProxyPort()})\n\nExamples:\n # Start standalone proxy (survives gateway restarts)\n npx mnemospark proxy start\n\n # Start on custom port\n npx mnemospark --port 9000\n\n # Install mnemospark wallet with default behavior (create new wallet)\n npx mnemospark install --default\n\n # Install mnemospark wallet with standard behavior (reuse Blockrun wallet if present)\n npx mnemospark install --standard\n\n # Show wallet address and info\n npx mnemospark wallet\n\n # Cloud storage commands\n npx mnemospark cloud help\n npx mnemospark cloud backup <file>\n\n # Production deployment with PM2\n pm2 start \"npx mnemospark proxy start\" --name mnemospark\n\nEnvironment Variables:\n MNEMOSPARK_WALLET_KEY Private key for x402 storage payments (auto-generated if not set)\n MNEMOSPARK_PROXY_PORT Default proxy port (default: 7120)\n\nFor more info: https://github.com/pawlsclick/mnemospark\n`);\n}\n\ntype ParsedArgs = {\n version: boolean;\n help: boolean;\n port?: number;\n command?: \"install\" | \"update\" | \"check-update\" | \"wallet\" | \"cloud\" | \"proxy\";\n installMode?: \"default\" | \"standard\";\n cloudArgs?: string;\n proxySubcommand?: string;\n};\n\nfunction parseArgs(args: string[]): ParsedArgs {\n const result: ParsedArgs = {\n version: false,\n help: false,\n port: undefined,\n command: undefined,\n installMode: undefined,\n cloudArgs: undefined,\n proxySubcommand: undefined,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (!result.command && !arg.startsWith(\"-\")) {\n if (arg === \"install\") {\n result.command = \"install\";\n } else if (arg === \"update\") {\n result.command = \"update\";\n } else if (arg === \"check-update\") {\n result.command = \"check-update\";\n } else if (arg === \"wallet\") {\n result.command = \"wallet\";\n } else if (arg === \"cloud\") {\n result.command = \"cloud\";\n result.cloudArgs = args.slice(i + 1).join(\" \");\n return result;\n } else if (arg === \"proxy\") {\n result.command = \"proxy\";\n const maybeSubcommand = args[i + 1];\n if (maybeSubcommand && !maybeSubcommand.startsWith(\"-\")) {\n result.proxySubcommand = maybeSubcommand;\n i++;\n }\n continue;\n }\n continue;\n }\n\n if (arg === \"--version\" || arg === \"-v\") {\n result.version = true;\n } else if (arg === \"--help\" || arg === \"-h\") {\n result.help = true;\n } else if (result.command === \"install\" && arg === \"--default\") {\n result.installMode = \"default\";\n } else if (result.command === \"install\" && arg === \"--standard\") {\n result.installMode = \"standard\";\n } else if (arg === \"--port\" && args[i + 1]) {\n result.port = parseInt(args[i + 1], 10);\n i++;\n }\n }\n\n return result;\n}\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst PACKAGE_ROOT = dirname(__dirname);\n\nasync function ensureDir(path: string): Promise<void> {\n await mkdir(path, { recursive: true });\n}\n\n/**\n * Deploy support files only (e.g. uninstall script) to ~/.openclaw/mnemospark.\n * Does NOT write to ~/.openclaw/extensions/mnemospark; plugin registration\n * is handled exclusively by `openclaw plugins install mnemospark`.\n */\nasync function deployExtensionFiles(): Promise<void> {\n const scriptsSource = join(PACKAGE_ROOT, \"scripts\");\n if (!existsSync(scriptsSource)) return;\n\n const mnemoScriptsDir = join(homedir(), \".openclaw\", \"mnemospark\", \"scripts\");\n await ensureDir(mnemoScriptsDir);\n const uninstallSrc = join(scriptsSource, \"uninstall.sh\");\n if (existsSync(uninstallSrc)) {\n const content = await readFile(uninstallSrc);\n await writeFile(join(mnemoScriptsDir, \"uninstall.sh\"), content, { mode: 0o755 });\n }\n}\n\nfunction isOpenClawAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn(\"openclaw\", [\"--version\"], {\n stdio: \"ignore\",\n shell: true,\n });\n child.on(\"error\", () => resolve(false));\n child.on(\"close\", (code) => resolve(code === 0));\n });\n}\n\nfunction getOpenClawConfigPath(): string {\n const stateDir = process.env.OPENCLAW_STATE_DIR ?? join(homedir(), \".openclaw\");\n return join(stateDir, \"openclaw.json\");\n}\n\n/**\n * Ensure plugins.allow in openclaw.json includes \"mnemospark\". Idempotent; safe if file missing or invalid.\n */\nasync function ensureMnemosparkInPluginsAllow(): Promise<void> {\n const configPath = getOpenClawConfigPath();\n try {\n const raw = await readFile(configPath, \"utf-8\");\n const config = JSON.parse(raw) as Record<string, unknown>;\n if (!config.plugins || typeof config.plugins !== \"object\") {\n config.plugins = {};\n }\n const plugins = config.plugins as Record<string, unknown>;\n if (!Array.isArray(plugins.allow)) {\n plugins.allow = [];\n }\n const allow = plugins.allow as string[];\n if (!allow.includes(\"mnemospark\")) {\n allow.push(\"mnemospark\");\n await writeFile(configPath, JSON.stringify(config, null, 2), \"utf-8\");\n console.log(\"[mnemospark] Added mnemospark to plugins.allow in openclaw.json.\");\n }\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") return;\n console.warn(\"[mnemospark] Could not update plugins.allow:\", (err as Error).message);\n }\n}\n\n/**\n * If OpenClaw is on PATH, run `openclaw plugins install mnemospark` and ensure plugins.allow includes mnemospark.\n * Otherwise print instructions.\n */\nasync function promptOrRunOpenClawPluginInstall(): Promise<void> {\n const available = await isOpenClawAvailable();\n if (available) {\n console.log(\"\\n[mnemospark] Registering plugin with OpenClaw...\");\n const child = spawn(\"openclaw\", [\"plugins\", \"install\", \"mnemospark\"], {\n stdio: \"inherit\",\n shell: true,\n });\n const exitCode = await new Promise<number>((resolve) => {\n child.on(\"close\", resolve);\n });\n if (exitCode === 0) {\n await ensureMnemosparkInPluginsAllow();\n } else {\n console.log(\n \"\\n[mnemospark] OpenClaw plugin install did not succeed. Run manually: openclaw plugins install mnemospark\",\n );\n }\n } else {\n console.log(\n \"\\n[mnemospark] To use mnemospark inside OpenClaw, install the plugin: openclaw plugins install mnemospark\",\n );\n }\n}\n\nasync function readLegacyWalletIfPresent(): Promise<`0x${string}` | null> {\n try {\n const key = (await readFile(LEGACY_WALLET_FILE, \"utf-8\")).trim();\n return isHexPrivateKey(key) ? (key as `0x${string}`) : null;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function writeMnemosparkWallet(key: `0x${string}`): Promise<void> {\n const dir = dirname(WALLET_FILE);\n await ensureDir(dir);\n await writeFile(WALLET_FILE, `${key}\\n`, { mode: 0o600 });\n}\n\nasync function promptReuseLegacyWallet(): Promise<boolean> {\n process.stdout.write(\n `Found existing Blockrun wallet at ${LEGACY_WALLET_FILE}.\\nReuse this wallet for mnemospark? [Y/n]: `,\n );\n\n return new Promise<boolean>((resolve) => {\n process.stdin.setEncoding(\"utf-8\");\n process.stdin.once(\"data\", (data) => {\n const input = typeof data === \"string\" ? data : data.toString(\"utf-8\");\n const answer = input.trim().toLowerCase();\n if (!answer || answer === \"y\" || answer === \"yes\") {\n resolve(true);\n } else {\n resolve(false);\n }\n });\n });\n}\n\nconst NPM_REGISTRY_URL = \"https://registry.npmjs.org/mnemospark/latest\";\n\ninterface NpmLatestResponse {\n version?: string;\n}\n\n/**\n * Compare two semver strings (e.g. \"1.2.3\"). Returns -1 if a < b, 0 if equal, 1 if a > b.\n * Only compares major.minor.patch; ignores prerelease suffixes.\n */\nfunction compareVersion(a: string, b: string): number {\n const partsA = a.split(\"-\")[0].split(\".\").map(Number);\n const partsB = b.split(\"-\")[0].split(\".\").map(Number);\n for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {\n const na = partsA[i] ?? 0;\n const nb = partsB[i] ?? 0;\n if (na < nb) return -1;\n if (na > nb) return 1;\n }\n return 0;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(NPM_REGISTRY_URL, {\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) return null;\n const data = (await res.json()) as NpmLatestResponse;\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nasync function runCheckUpdate(): Promise<void> {\n const latest = await fetchLatestVersion();\n if (!latest) {\n console.log(\"[mnemospark] Could not fetch latest version from registry.\");\n process.exit(1);\n }\n const cmp = compareVersion(VERSION, latest);\n if (cmp < 0) {\n console.log(`[mnemospark] A new version is available: ${latest} (current: ${VERSION})`);\n console.log(\"Run: npx mnemospark update\");\n } else if (cmp === 0) {\n console.log(\"You are on the latest version.\");\n } else {\n console.log(`You are on the latest version. (current: ${VERSION}, registry: ${latest})`);\n }\n}\n\nasync function runUpdate(): Promise<void> {\n const latest = await fetchLatestVersion();\n if (!latest) {\n console.log(\"[mnemospark] Could not fetch latest version from registry.\");\n process.exit(1);\n }\n const cmp = compareVersion(VERSION, latest);\n if (cmp < 0) {\n console.log(`[mnemospark] Updating from ${VERSION} to ${latest}...`);\n const { execSync } = await import(\"node:child_process\");\n try {\n execSync(`npm install mnemospark@${latest}`, { stdio: \"inherit\" });\n console.log(`[mnemospark] Updated to ${latest}.`);\n } catch {\n console.log(\n \"[mnemospark] npm install failed. You can update manually: npm install mnemospark@latest\",\n );\n process.exit(1);\n }\n } else {\n console.log(\"You are on the latest version.\");\n }\n}\n\nasync function runInstall(mode: \"default\" | \"standard\"): Promise<void> {\n if (mode === \"standard\") {\n const legacyWallet = await readLegacyWalletIfPresent();\n if (legacyWallet) {\n const reuse = await promptReuseLegacyWallet();\n if (reuse) {\n await writeMnemosparkWallet(legacyWallet);\n await deployExtensionFiles();\n console.log(\"\\n[mnemospark] Reused existing Blockrun wallet for mnemospark.\");\n console.log(\n \"[mnemospark] Wallet file: ~/.openclaw/mnemospark/wallet/wallet.key (chmod 600 expected).\",\n );\n console.log(\n \"[mnemospark] Your wallet will be used for mnemospark storage payments on Base.\",\n );\n await promptOrRunOpenClawPluginInstall();\n return;\n }\n }\n }\n\n const { address, source } = await resolveOrGenerateWalletKey();\n\n await deployExtensionFiles();\n\n console.log(\"[mnemospark] Install complete.\");\n console.log(`Your new Base blockchain wallet is: ${address}`);\n if (source === \"env\") {\n console.log(\n \"Wallet key loaded from MNEMOSPARK_WALLET_KEY. Save it to ~/.openclaw/mnemospark/wallet/wallet.key (chmod 600) if you want file-based persistence.\",\n );\n } else {\n console.log(\n \"Wallet key stored under ~/.openclaw/mnemospark/wallet/wallet.key (permissions should be chmod 600).\",\n );\n }\n console.log(\"Add USDC on the Base network to start using mnemospark today.\");\n console.log(\n \"You can acquire USDC on Base from providers like Coinbase and Moonpay. Fund the wallet before running mnemospark.\",\n );\n await promptOrRunOpenClawPluginInstall();\n}\n\nasync function runWallet(): Promise<void> {\n const { address, source } = await resolveOrGenerateWalletKey();\n\n console.log(`[mnemospark] Wallet address: ${address}`);\n console.log(`[mnemospark] Key file: ${WALLET_FILE}`);\n if (source === \"generated\") {\n console.log(\"[mnemospark] New wallet generated and saved.\");\n } else if (source === \"saved\") {\n console.log(\"[mnemospark] Loaded saved wallet.\");\n } else {\n console.log(\"[mnemospark] Using wallet from MNEMOSPARK_WALLET_KEY.\");\n }\n}\n\nasync function runCloud(cloudArgs: string): Promise<void> {\n const cloudCmd = createCloudCommand();\n const ctx: PluginCommandContext = {\n channel: \"cli\",\n isAuthorizedSender: true,\n args: cloudArgs,\n commandBody: `cloud ${cloudArgs}`,\n config: {},\n };\n\n const result = await cloudCmd.handler(ctx);\n if (result.text) {\n console.log(result.text);\n }\n if (result.isError) {\n process.exit(1);\n }\n}\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n\n if (args.version) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (args.help) {\n printHelp();\n process.exit(0);\n }\n\n if (args.command === \"install\") {\n const mode = args.installMode ?? \"standard\";\n await runInstall(mode);\n return;\n }\n\n if (args.command === \"check-update\") {\n await runCheckUpdate();\n return;\n }\n\n if (args.command === \"update\") {\n await runUpdate();\n return;\n }\n\n if (args.command === \"wallet\") {\n await runWallet();\n return;\n }\n\n if (args.command === \"cloud\") {\n await runCloud(args.cloudArgs ?? \"\");\n return;\n }\n\n if (args.command === \"proxy\") {\n if (args.proxySubcommand !== \"start\") {\n console.error(\"[mnemospark] Invalid proxy command. Use: mnemospark proxy start\");\n printHelp();\n process.exit(1);\n }\n }\n\n // Resolve wallet key\n const { key: walletKey, address, source } = await resolveOrGenerateWalletKey();\n\n if (source === \"generated\") {\n console.log(`[mnemospark] Generated new wallet: ${address}`);\n } else if (source === \"saved\") {\n console.log(`[mnemospark] Using saved wallet: ${address}`);\n } else {\n console.log(`[mnemospark] Using wallet from MNEMOSPARK_WALLET_KEY: ${address}`);\n }\n\n // Start the proxy\n const proxy = await startProxy({\n walletKey,\n port: args.port,\n onReady: (port) => {\n console.log(`[mnemospark] Proxy listening on http://127.0.0.1:${port}`);\n console.log(`[mnemospark] Health check: http://127.0.0.1:${port}/health`);\n },\n onError: (error) => {\n console.error(`[mnemospark] Error: ${error.message}`);\n },\n onLowBalance: (info) => {\n console.warn(`[mnemospark] Low balance: ${info.balanceUSD}. Fund: ${info.walletAddress}`);\n },\n onInsufficientFunds: (info) => {\n console.error(\n `[mnemospark] Insufficient funds. Balance: ${info.balanceUSD}, Need: ${info.requiredUSD}`,\n );\n },\n });\n\n // Check balance\n const monitor = new BalanceMonitor(address);\n try {\n const balance = await monitor.checkBalance();\n if (balance.isEmpty) {\n console.log(`[mnemospark] Wallet balance: $0.00 (using FREE model)`);\n console.log(`[mnemospark] Fund wallet for premium models: ${address}`);\n } else if (balance.isLow) {\n console.log(`[mnemospark] Wallet balance: ${balance.balanceUSD} (low)`);\n } else {\n console.log(`[mnemospark] Wallet balance: ${balance.balanceUSD}`);\n }\n } catch {\n console.log(`[mnemospark] Wallet: ${address} (balance check pending)`);\n }\n\n console.log(`[mnemospark] Ready - Ctrl+C to stop`);\n\n // Handle graceful shutdown\n const shutdown = async (signal: string) => {\n console.log(`\\n[mnemospark] Received ${signal}, shutting down...`);\n try {\n await proxy.close();\n console.log(`[mnemospark] Proxy closed`);\n process.exit(0);\n } catch (err) {\n console.error(`[mnemospark] Error during shutdown: ${err}`);\n process.exit(1);\n }\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n\n // Keep process alive\n await new Promise(() => {});\n}\n\nmain().catch((err) => {\n console.error(`[mnemospark] Fatal error: ${err.message}`);\n process.exit(1);\n});\n"],"mappings":";;;AAOA,SAAS,kBAAkB;AAC3B,SAAS,oBAA+D;AAExE,SAAS,WAAAA,gBAAe;AACxB,SAAS,QAAAC,aAAY;AACrB,SAAS,uBAAAC,4BAA2B;;;ACApC,SAAS,oBAAoB,MAAM,gBAAgB;AACnD,SAAS,YAAY;;;ACgEd,IAAM,WAAN,cAAuB,MAAM;AAAA,EACzB,OAAO;AAAA,EACP;AAAA,EAET,YAAY,SAAiB,eAAyB;AACpD,UAAM,cAAc,OAAO,+BAA+B;AAC1D,SAAK,OAAO;AACZ,SAAK,gBAAgB;AAAA,EACvB;AACF;;;ADrEA,IAAM,YAAY;AAGlB,IAAM,eAAe;AAGd,IAAM,qBAAqB;AAAA;AAAA,EAEhC,oBAAoB;AAAA;AAAA,EAEpB,gBAAgB;AAClB;AAkCO,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA;AAAA,EAGT,gBAA+B;AAAA;AAAA,EAE/B,WAAW;AAAA,EAEnB,YAAY,eAAuB;AACjC,SAAK,gBAAgB;AACrB,SAAK,SAAS,mBAAmB;AAAA,MAC/B,OAAO;AAAA,MACP,WAAW,KAAK,QAAW;AAAA,QACzB,SAAS;AAAA;AAAA,MACX,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAqC;AACzC,UAAM,MAAM,KAAK,IAAI;AAGrB,QAAI,KAAK,kBAAkB,QAAQ,MAAM,KAAK,WAAW,cAAc;AACrE,aAAO,KAAK,UAAU,KAAK,aAAa;AAAA,IAC1C;AAGA,UAAM,UAAU,MAAM,KAAK,aAAa;AACxC,SAAK,gBAAgB;AACrB,SAAK,WAAW;AAEhB,WAAO,KAAK,UAAU,OAAO;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,qBAAyD;AAC7E,UAAM,OAAO,MAAM,KAAK,aAAa;AAErC,QAAI,KAAK,WAAW,qBAAqB;AACvC,aAAO,EAAE,YAAY,MAAM,KAAK;AAAA,IAClC;AAEA,UAAM,YAAY,sBAAsB,KAAK;AAC7C,WAAO;AAAA,MACL,YAAY;AAAA,MACZ;AAAA,MACA,WAAW,KAAK,WAAW,SAAS;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,cAA4B;AAC1C,QAAI,KAAK,kBAAkB,QAAQ,KAAK,iBAAiB,cAAc;AACrE,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAmB;AACjB,SAAK,gBAAgB;AACrB,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAgC;AACpC,SAAK,WAAW;AAChB,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,cAA8B;AAEvC,UAAM,UAAU,OAAO,YAAY,IAAI;AACvC,WAAO,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAc,eAAgC;AAC5C,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,OAAO,aAAa;AAAA,QAC7C,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,KAAK,aAAa;AAAA,MAC3B,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AAGd,YAAM,IAAI,SAAS,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB,KAAK;AAAA,IACpF;AAAA,EACF;AAAA;AAAA,EAGQ,UAAU,SAA8B;AAC9C,WAAO;AAAA,MACL;AAAA,MACA,YAAY,KAAK,WAAW,OAAO;AAAA,MACnC,OAAO,UAAU,mBAAmB;AAAA,MACpC,SAAS,UAAU,mBAAmB;AAAA,MACtC,eAAe,KAAK;AAAA,IACtB;AAAA,EACF;AACF;;;AE1LA,IAAM,eAAe;AAMd,IAAM,cAAc,MAAM;AAC/B,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,SAAS;AACX,UAAM,SAAS,SAAS,SAAS,EAAE;AACnC,QAAI,CAAC,MAAM,MAAM,KAAK,SAAS,KAAK,SAAS,OAAO;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT,GAAG;AAMI,IAAM,mCACX,QAAQ,IAAI,mCAAmC,IAC/C,KAAK;;;AC9BP,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB,qBAAqB;;;ACG5C,SAAS,cAA6B;AAC3C,QAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,SAAO,gBAAgB,KAAK;AAC5B,SAAO,KAAK,MAAM,KAAK,KAAK,EACzB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE,CAAC;AACb;;;ADNO,IAAM,yBAAyB;AAC/B,IAAM,4BAA4B;AAClC,IAAM,gCAAgC;AAEtC,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAmB9B,IAAM,2BAA2B;AAAA,EACtC,mBAAmB;AAAA,IACjB,EAAE,MAAM,UAAU,MAAM,SAAS;AAAA,IACjC,EAAE,MAAM,QAAQ,MAAM,SAAS;AAAA,IAC/B,EAAE,MAAM,iBAAiB,MAAM,UAAU;AAAA,IACzC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,aAAa,MAAM,UAAU;AAAA,EACvC;AACF;AAWA,SAAS,iBAAiB,OAAwB;AAChD,SAAO,OAAO,KAAK,KAAK,UAAU,KAAK,GAAG,MAAM,EAAE,SAAS,QAAQ;AACrE;AAOA,SAAS,gBAAgB,QAAwB;AAC/C,QAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAAsB;AAC3C,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,MAAI;AACJ,MAAI,gBAAgB,KAAK,OAAO,GAAG;AACjC,iBAAa,IAAI,IAAI,OAAO,EAAE;AAAA,EAChC,OAAO;AACL,iBAAa,QAAQ,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,EACvD;AAEA,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,QAAM,WAAW,WAAW,WAAW,GAAG,IAAI,aAAa,IAAI,UAAU;AACzE,QAAM,eAAe,SAAS,QAAQ,WAAW,GAAG;AACpD,SAAO,aAAa,SAAS,KAAK,aAAa,SAAS,GAAG,IACvD,aAAa,MAAM,GAAG,EAAE,IACxB;AACN;AAEA,SAAS,mBAAmB,OAAmC;AAC7D,QAAM,YAAY,SAAS,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,EAAE,SAAS;AAClE,MAAI,CAAC,QAAQ,KAAK,SAAS,GAAG;AAC5B,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAiD;AACvE,QAAM,QAAQ,SAAS,YAAY;AACnC,MAAI,CAAC,sBAAsB,KAAK,KAAK,GAAG;AACtC,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,SAA2D;AACnF,QAAM,WAAW,WAAW;AAC5B,MAAI,aAAa,yBAAyB,aAAa,uBAAuB;AAC5E,UAAM,IAAI,MAAM,4CAA4C,QAAQ,EAAE;AAAA,EACxE;AACA,SAAO;AACT;AAEO,SAAS,8BAA8B,SAA6B;AACzE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,iBAAiB,OAAO;AAAA,IACjC,mBAAmB;AAAA,EACrB;AACF;AAEO,SAAS,+BACd,QACA,MACA,eACA,SAC0B;AAC1B,SAAO;AAAA,IACL,QAAQ,gBAAgB,MAAM;AAAA,IAC9B,MAAM,cAAc,IAAI;AAAA,IACxB,eAAe,WAAW,aAAa;AAAA,IACvC,OAAO,eAAe,SAAS,KAAK;AAAA,IACpC,WAAW,mBAAmB,SAAS,SAAS;AAAA,EAClD;AACF;AAYA,eAAsB,iCACpB,QACA,MACA,eACA,kBACA,SACiB;AACjB,QAAM,UAAU,+BAA+B,QAAQ,MAAM,eAAe;AAAA,IAC1E,OAAO,SAAS;AAAA,IAChB,WAAW,SAAS;AAAA,EACtB,CAAC;AACD,QAAM,SAAS,oBAAoB,gBAAgB;AAEnD,MAAI,OAAO,QAAQ,YAAY,MAAM,QAAQ,cAAc,YAAY,GAAG;AACxE,UAAM,IAAI;AAAA,MACR,kBAAkB,QAAQ,aAAa,kCAAkC,OAAO,OAAO;AAAA,IACzF;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,cAAc;AAAA,IACpC,YAAY;AAAA,IACZ,QAAQ,8BAA8B,SAAS,OAAO;AAAA,IACtD,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,MACP,QAAQ,QAAQ;AAAA,MAChB,MAAM,QAAQ;AAAA,MACd,eAAe,QAAQ;AAAA,MACvB,OAAO,QAAQ;AAAA,MACf,WAAW,OAAO,QAAQ,SAAS;AAAA,IACrC;AAAA,EACF,CAAC;AAED,QAAM,iBAAgD;AAAA,IACpD,YAAY,iBAAiB,OAAO;AAAA,IACpC;AAAA,IACA,SAAS,OAAO;AAAA,EAClB;AAEA,SAAO,iBAAiB,cAAc;AACxC;;;AE1LO,IAAM,6BAA6B;AACnC,IAAM,iCAAiC;AAOvC,SAAS,wBACd,SACA,aACwB;AACxB,QAAM,UAAU,aAAa,SAAS,KAAK;AAC3C,MAAI,SAAS;AACX,YAAQ,0BAA0B,IAAI;AAAA,EACxC;AAEA,QAAM,cAAc,aAAa,aAAa,KAAK;AACnD,MAAI,aAAa;AACf,YAAQ,8BAA8B,IAAI;AAAA,EAC5C;AAEA,SAAO;AACT;;;ACvBO,SAAS,iBAAiB,SAAyB;AACxD,SAAO,QAAQ,QAAQ,QAAQ,EAAE;AACnC;AAEO,SAAS,SAAS,OAAgD;AACvE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,SAAS,OAA+B;AACtD,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AACxD,UAAM,SAAS,OAAO,WAAW,KAAK;AACtC,QAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,OAA+B;AAC9D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEO,SAAS,yBAAyB,SAAsC;AAC7E,SAAO,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,IAAI,oBAAoB,KAAK;AACjF;AAEO,SAAS,yBAAyB,SAAsC;AAC7E,SAAO,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,IAAI,oBAAoB,KAAK;AACjF;;;ACtCO,SAAS,yBAAyB,OAA+C;AACtF,QAAM,UAAU,OAAO,KAAK;AAC5B,SAAO,WAAW,QAAQ,SAAS,IAAI,UAAU;AACnD;;;ACSO,IAAM,2BAA2B;AACjC,IAAM,4BAA4B;AAClC,IAAM,oBAAoB;AAC1B,IAAM,4BAA4B;AA0KzC,SAAS,eAAe,OAA+C;AACrE,QAAM,SAAS,SAAS,KAAK;AAC7B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,SAAiC,CAAC;AACxC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AAEO,SAAS,8BAA8B,SAAmD;AAC/F,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,iBAAiB,OAAO,cAAc;AAC5D,QAAM,WAAW,iBAAiB,OAAO,SAAS;AAClD,QAAM,eAAe,iBAAiB,OAAO,cAAc;AAC3D,QAAM,KAAK,SAAS,OAAO,EAAE;AAC7B,QAAM,WAAW,iBAAiB,OAAO,QAAQ;AACjD,QAAM,SAAS,iBAAiB,OAAO,MAAM;AAE7C,MAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,gBAAgB,OAAO,QAAQ,CAAC,YAAY,CAAC,QAAQ;AACvF,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,+BAA+B,SAA6C;AAC1F,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAEA,QAAM,YAAY,iBAAiB,OAAO,SAAS;AACnD,QAAM,UAAU,iBAAiB,OAAO,QAAQ;AAChD,QAAM,eAAe,SAAS,OAAO,aAAa;AAClD,QAAM,OAAO,iBAAiB,OAAO,IAAI;AACzC,QAAM,WAAW,iBAAiB,OAAO,SAAS;AAClD,QAAM,eAAe,iBAAiB,OAAO,cAAc;AAC3D,QAAM,eAAe,SAAS,OAAO,cAAc;AACnD,QAAM,WAAW,iBAAiB,OAAO,QAAQ;AACjD,QAAM,WAAW,iBAAiB,OAAO,QAAQ;AAEjD,MACE,CAAC,aACD,CAAC,WACD,iBAAiB,QACjB,CAAC,QACD,CAAC,YACD,CAAC,gBACD,iBAAiB,QACjB,CAAC,YACD,CAAC,UACD;AACA,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IACV,eAAe;AAAA,IACf;AAAA,IACA,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,0BAA0B,SAA+C;AACvF,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,iBAAiB,OAAO,QAAQ;AAChD,QAAM,gBAAgB,iBAAiB,OAAO,cAAc;AAC5D,QAAM,WAAW,iBAAiB,OAAO,SAAS;AAClD,QAAM,eAAe,iBAAiB,OAAO,cAAc;AAC3D,QAAM,qBAAqB,SAAS,OAAO,oBAAoB;AAE/D,QAAM,gBAAgB,SAAS,OAAO,OAAO;AAC7C,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,iBAAiB,cAAc,IAAI;AACnD,QAAM,OAAO,YAAY,YAAY,YAAY,cAAc,UAAU;AACzE,QAAM,gBACJ,cAAc,mBAAmB,SAC7B,SACA,iBAAiB,cAAc,cAAc;AACnD,QAAM,gBAAgB,iBAAiB,cAAc,cAAc;AACnE,QAAM,qBAAqB,SAAS,cAAc,oBAAoB;AACtE,QAAM,aAAa,iBAAiB,cAAc,WAAW;AAC7D,QAAM,sBAAsB,iBAAiB,cAAc,oBAAoB;AAC/E,QAAM,iBAAiB,iBAAiB,cAAc,gBAAgB;AACtE,QAAM,mBAAmB,iBAAiB,cAAc,mBAAmB;AAE3E,MACE,CAAC,WACD,CAAC,iBACD,CAAC,YACD,CAAC,gBACD,uBAAuB,QACvB,CAAC,QACD,CAAC,iBACD,uBAAuB,QACvB,CAAC,cACD,wBAAwB,iBACxB,CAAC,kBACD,CAAC,kBACD;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,YAAY,CAAC,eAAe;AACvC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,SAAS;AAAA,MACP;AAAA,MACA,gBAAgB,iBAAiB;AAAA,MACjC,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,MACtB,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,IACvB;AAAA,EACF;AACF;AAEO,SAAS,iCACd,SACoC;AACpC,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,iBAAiB,OAAO,QAAQ;AAChD,QAAM,gBAAgB,iBAAiB,OAAO,cAAc;AAC5D,QAAM,YAAY,iBAAiB,OAAO,UAAU;AACpD,QAAM,iBAAiB,iBAAiB,OAAO,eAAe;AAE9D,MAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,aAAa,CAAC,gBAAgB;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AACF;AAEO,SAAS,2BAA2B,SAAyC;AAClF,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,QAAM,UAAU,iBAAiB,OAAO,QAAQ;AAChD,QAAM,OAAO,iBAAiB,OAAO,IAAI;AACzC,QAAM,WAAW,iBAAiB,OAAO,SAAS;AAClD,QAAM,UAAU,iBAAiB,OAAO,QAAQ;AAChD,QAAM,eAAe,SAAS,OAAO,aAAa;AAClD,QAAM,WAAW,iBAAiB,OAAO,SAAS;AAClD,QAAM,YAAY,iBAAiB,OAAO,UAAU;AACpD,QAAM,WAAW,iBAAiB,OAAO,QAAQ;AACjD,QAAM,aAAa,iBAAiB,OAAO,WAAW;AACtD,QAAM,WAAW,iBAAiB,OAAO,QAAQ;AACjD,QAAM,YAAY,iBAAiB,OAAO,UAAU;AACpD,QAAM,gBACJ,OAAO,mBAAmB,SAAY,SAAY,eAAe,OAAO,cAAc;AACxF,QAAM,uBACJ,OAAO,OAAO,0BAA0B,YAAY,OAAO,wBAAwB;AAErF,MAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU;AACzF,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,MAAI,OAAO,mBAAmB,UAAa,CAAC,eAAe;AACzD,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,MAAI,OAAO,0BAA0B,UAAa,yBAAyB,QAAW;AACpF,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA,WAAW,YAAY;AAAA,IACvB,UAAU,WAAW;AAAA,IACrB,eAAe,gBAAgB;AAAA,IAC/B,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,YAAY,aAAa;AAAA,IACzB,gBAAgB,iBAAiB;AAAA,IACjC,uBAAuB;AAAA,EACzB;AACF;AAEA,eAAsB,4BACpB,SACA,UAA6B,CAAC,GACM;AACpC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,UAAU;AAAA,IACd,QAAQ,gBAAgB,oBAAoB,WAAW,SAAS,CAAC;AAAA,EACnE;AACA,QAAM,WAAW,MAAM,UAAU,GAAG,OAAO,GAAG,wBAAwB,IAAI;AAAA,IACxE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP;AAAA,QACE,gBAAgB;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IACA,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AAED,QAAM,eAAe,MAAM,SAAS,KAAK;AACzC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,gBAAgB,0CAA0C,SAAS,MAAM,EAAE;AAAA,EAC7F;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,YAAY;AAAA,EACnC,QAAQ;AACN,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,SAAO,+BAA+B,OAAO;AAC/C;AAEA,eAAsB,6BACpB,SACA,UAA8B,CAAC,GACC;AAChC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,aACJ,OAAO,QAAQ,eAAe,YAC9B,OAAO,SAAS,QAAQ,UAAU,KAClC,QAAQ,cAAc,IAClB,KAAK,MAAM,QAAQ,UAAU,IAC7B;AACN,QAAM,UAAU;AAAA,IACd,QAAQ,gBAAgB,oBAAoB,WAAW,SAAS,CAAC;AAAA,EACnE;AACA,QAAM,YAAY,GAAG,OAAO,GAAG,iBAAiB;AAChD,QAAM,iBAAyC;AAAA,IAC7C,gBAAgB;AAAA,EAClB;AACA,0BAAwB,gBAAgB,QAAQ,WAAW;AAE3D,MAAI,QAAQ,kBAAkB,QAAQ,eAAe,KAAK,EAAE,SAAS,GAAG;AACtE,mBAAe,iBAAiB,IAAI,QAAQ,eAAe,KAAK;AAAA,EAClE;AAEA,QAAM,cAAc,KAAK,UAAU,OAAO;AAC1C,QAAM,oBAAoB,YAA+D;AACvF,UAAMC,YAAW,MAAM,UAAU,WAAW;AAAA,MAC1C,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,WAAO,EAAE,UAAAA,WAAU,UAAU,MAAMA,UAAS,KAAK,EAAE;AAAA,EACrD;AAEA,MAAI,EAAE,UAAU,UAAU,aAAa,IAAI,MAAM,kBAAkB;AACnE,MAAI,SAAS,WAAW,KAAK;AAC3B,QAAI;AACJ,QAAI;AACF,kBAAY,KAAK,MAAM,YAAY;AAAA,IACrC,QAAQ;AACN,kBAAY;AAAA,IACd;AACA,UAAM,mBAAmB,SAAS,SAAS;AAC3C,QAAI,kBAAkB,kBAAkB,MAAM;AAC5C,UAAI,UAAU,iBAAiB,iBAAiB,QAAQ,KAAK;AAC7D,UAAI,6BAA6B;AAEjC,eAAS,UAAU,GAAG,UAAU,YAAY,WAAW,GAAG;AACxD,cAAM,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,GAAI,CAAC;AAExD,YAAI;AACF,WAAC,EAAE,UAAU,UAAU,aAAa,IAAI,MAAM,kBAAkB;AAAA,QAClE,QAAQ;AACN;AAAA,QACF;AAEA,YAAI,SAAS,MAAM,SAAS,WAAW,KAAK;AAC1C,cAAI;AACJ,cAAI;AACF,2BAAe,KAAK,MAAM,YAAY;AAAA,UACxC,QAAQ;AACN,kBAAM,IAAI,MAAM,oCAAoC;AAAA,UACtD;AACA,iBAAO,2BAA2B,YAAY;AAAA,QAChD;AAEA,YAAI,SAAS,WAAW,KAAK;AAC3B,cAAI;AACJ,cAAI;AACF,6BAAiB,KAAK,MAAM,YAAY;AAAA,UAC1C,QAAQ;AACN,6BAAiB;AAAA,UACnB;AACA,gBAAM,wBAAwB,SAAS,cAAc;AACrD,cAAI,uBAAuB,kBAAkB,MAAM;AACjD,sBAAU,iBAAiB,sBAAsB,QAAQ,KAAK;AAC9D;AAAA,UACF;AACA,uCAA6B;AAC7B;AAAA,QACF;AAAA,MACF;AAEA,UAAI,4BAA4B;AAC9B,cAAM,IAAI;AAAA,UACR,gCAAgC,OAAO,mCAAmC,UAAU,IAAI,eAAe,IAAI,UAAU,SAAS;AAAA,QAChI;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,gBAAgB,mCAAmC,SAAS,MAAM,EAAE;AAAA,EACtF;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,YAAY;AAAA,EACnC,QAAQ;AACN,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AACA,SAAO,2BAA2B,OAAO;AAC3C;AAEA,eAAsB,oCACpB,SACA,UAAqC,CAAC,GACN;AAChC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,UAAU;AAAA,IACd,QAAQ,gBAAgB,oBAAoB,WAAW,SAAS,CAAC;AAAA,EACnE;AACA,QAAM,WAAW,MAAM,UAAU,GAAG,OAAO,GAAG,yBAAyB,IAAI;AAAA,IACzE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP;AAAA,QACE,gBAAgB;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IACA,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AAED,QAAM,eAAe,MAAM,SAAS,KAAK;AACzC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,gBAAgB,2CAA2C,SAAS,MAAM,EAAE;AAAA,EAC9F;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,YAAY;AAAA,EACnC,QAAQ;AACN,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO,2BAA2B,OAAO;AAC3C;AAOA,eAAsB,6BACpB,SACA,UAA+B,CAAC,GACI;AACpC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,kBAAkB,QAAQ,kBAAkB,IAAI,KAAK;AAC3D,QAAM,kBAAkB,yBAAyB,QAAQ,eAAe;AAExE,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,EACxB;AAEA,QAAM,YAAY,GAAG,iBAAiB,cAAc,CAAC;AACrD,QAAM,WAAW,MAAM,UAAU,WAAW;AAAA,IAC1C,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,SAAS;AAAA,IACjB,UAAU,MAAM,SAAS,KAAK;AAAA,IAC9B,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,IACrD,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,IAC1D,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,EAC5D;AACF;AAMA,eAAsB,8BACpB,SACA,eACA,UAAgC,CAAC,GACI;AACrC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,kBAAkB,QAAQ,kBAAkB,IAAI,KAAK;AAC3D,QAAM,kBAAkB,yBAAyB,QAAQ,eAAe;AAExE,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,EACxB;AACA,QAAM,mBAAmB,QAAQ,kBAAkB,KAAK;AACxD,QAAM,gBAAgB,QAAQ,eAAe,KAAK;AAClD,MAAI,kBAAkB;AACpB,YAAQ,mBAAmB,IAAI;AAC/B,YAAQ,WAAW,IAAI;AAAA,EACzB;AACA,MAAI,eAAe;AACjB,YAAQ,WAAW,IAAI;AACvB,QAAI,CAAC,QAAQ,mBAAmB,GAAG;AACjC,cAAQ,mBAAmB,IAAI;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,YAAY,GAAG,iBAAiB,cAAc,CAAC;AACrD,QAAM,cAAoC;AAAA,IACxC,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AACA,MAAI,QAAQ,SAAS;AACnB,gBAAY,UAAU,QAAQ;AAAA,EAChC;AACA,MAAI,QAAQ,yBAAyB,QAAW;AAC9C,gBAAY,wBAAwB,QAAQ;AAAA,EAC9C;AACA,QAAM,WAAW,MAAM,UAAU,WAAW;AAAA,IAC1C,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,WAAW;AAAA,EAClC,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,SAAS;AAAA,IACjB,UAAU,MAAM,SAAS,KAAK;AAAA,IAC9B,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,IACrD,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,IAC1D,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,EAC5D;AACF;AAMA,eAAsB,6BACpB,SACA,eACA,UAA8B,CAAC,GACM;AACrC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,UAAU;AAAA,IACd,QAAQ,gBAAgB,oBAAoB,WAAW,SAAS,CAAC;AAAA,EACnE;AACA,QAAM,YAAY,GAAG,OAAO,GAAG,yBAAyB;AACxD,QAAM,cAAoC;AAAA,IACxC,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AACA,MAAI,QAAQ,SAAS;AACnB,gBAAY,UAAU,QAAQ;AAAA,EAChC;AACA,MAAI,QAAQ,yBAAyB,QAAW;AAC9C,gBAAY,wBAAwB,QAAQ;AAAA,EAC9C;AACA,QAAM,WAAW,MAAM,UAAU,WAAW;AAAA,IAC1C,QAAQ;AAAA,IACR,SAAS,wBAAwB,EAAE,gBAAgB,mBAAmB,GAAG,QAAQ,WAAW;AAAA,IAC5F,MAAM,KAAK,UAAU,WAAW;AAAA,EAClC,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,SAAS;AAAA,IACjB,UAAU,MAAM,SAAS,KAAK;AAAA,IAC9B,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,IACrD,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,IAC1D,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,EAC5D;AACF;AAEA,eAAsB,8BACpB,SACA,UAAgC,CAAC,GACI;AACrC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,kBAAkB,QAAQ,kBAAkB,IAAI,KAAK;AAC3D,QAAM,kBAAkB,yBAAyB,QAAQ,eAAe;AAExE,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAyC;AAAA,IAC7C,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,EACxB;AAEA,MAAI,QAAQ,kBAAkB,QAAQ,eAAe,KAAK,EAAE,SAAS,GAAG;AACtE,mBAAe,iBAAiB,IAAI,QAAQ,eAAe,KAAK;AAAA,EAClE;AAKA,QAAM,eAAe,QAAQ;AAQ7B,QAAM,eAAe;AAKrB,QAAM,YACJ,iBAAiB,aAAa,UAAU,KACxC,iBAAiB,aAAa,UAAU,KACxC,iBAAiB,aAAa,eAAe,KAC7C,QAAQ;AACV,QAAM,WACJ,iBAAiB,aAAa,QAAQ,KACtC,iBAAiB,aAAa,QAAQ,KACtC,iBAAiB,aAAa,aAAa;AAC7C,QAAM,WACJ,iBAAiB,aAAa,QAAQ,KACtC,iBAAiB,aAAa,QAAQ,KACtC,iBAAiB,aAAa,aAAa;AAE7C,QAAM,qBAA8C;AAAA,IAClD,UAAU,QAAQ;AAAA,IAClB,gBAAgB,QAAQ;AAAA,IACxB,WAAW,QAAQ;AAAA,IACnB,gBAAgB,QAAQ;AAAA,IACxB,aAAa,QAAQ,QAAQ;AAAA,IAC7B,MAAM,QAAQ,QAAQ;AAAA,IACtB,gBAAgB,QAAQ,QAAQ;AAAA,IAChC,sBAAsB,QAAQ,QAAQ;AAAA,IACtC,YAAY;AAAA,EACd;AACA,MAAI,QAAQ,QAAQ,gBAAgB;AAClC,uBAAmB,aAAa,QAAQ,QAAQ;AAAA,EAClD;AACA,MAAI,UAAU;AACZ,uBAAmB,WAAW;AAAA,EAChC;AACA,MAAI,UAAU;AACZ,uBAAmB,WAAW;AAAA,EAChC;AAEA,QAAM,YAAY,GAAG,iBAAiB,cAAc,CAAC;AACrD,QAAM,WAAW,MAAM,UAAU,WAAW;AAAA,IAC1C,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM,KAAK,UAAU,kBAAkB;AAAA,EACzC,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,SAAS;AAAA,IACjB,UAAU,MAAM,SAAS,KAAK;AAAA,IAC9B,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,IACrD,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,IAC1D,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,EAC5D;AACF;AAEA,eAAsB,qCACpB,SACA,UAAuC,CAAC,GACH;AACrC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,kBAAkB,QAAQ,kBAAkB,IAAI,KAAK;AAC3D,QAAM,kBAAkB,yBAAyB,QAAQ,eAAe;AAExE,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,GAAG,iBAAiB,cAAc,CAAC;AACrD,QAAM,WAAW,MAAM,UAAU,WAAW;AAAA,IAC1C,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,IACxB;AAAA,IACA,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,SAAS;AAAA,IACjB,UAAU,MAAM,SAAS,KAAK;AAAA,IAC9B,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,IACrD,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,IAC1D,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,EAC5D;AACF;;;ACh1BA,SAAS,iBAAAC,gBAAe,uBAAAC,4BAA2B;;;ACOnD,IAAM,iBAAiB;AAEhB,IAAM,eAAN,MAAmB;AAAA,EAChB,QAAQ,oBAAI,IAAiC;AAAA,EAC7C;AAAA,EAER,YAAY,QAAQ,gBAAgB;AAClC,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA,EAGA,IAAI,cAAuD;AACzD,UAAM,QAAQ,KAAK,MAAM,IAAI,YAAY;AACzC,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,KAAK,IAAI,IAAI,MAAM,WAAW,KAAK,OAAO;AAC5C,WAAK,MAAM,OAAO,YAAY;AAC9B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,cAAsB,QAAqD;AAC7E,SAAK,MAAM,IAAI,cAAc,EAAE,GAAG,QAAQ,UAAU,KAAK,IAAI,EAAE,CAAC;AAAA,EAClE;AAAA;AAAA,EAGA,WAAW,cAA4B;AACrC,SAAK,MAAM,OAAO,YAAY;AAAA,EAChC;AACF;;;ADhCA,IAAM,gBAAgB;AACtB,IAAMC,yBAAwB;AAC9B,IAAM,qBAAqB;AAC3B,IAAM,wBAAwB;AAC9B,IAAM,kBAAkB;AACxB,IAAM,8BAA8B;AAEpC,IAAM,iBAAiB;AAAA,EACrB,2BAA2B;AAAA,IACzB,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,IAC9B,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,cAAc,MAAM,UAAU;AAAA,IACtC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,IACvC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,EACnC;AACF;AAkBA,SAAS,iBAAoB,OAAkB;AAC7C,QAAM,aAAa,MAAM,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAC7D,QAAM,WAAW,IAAK,WAAW,SAAS,KAAM;AAChD,QAAM,SAAS,aAAa,IAAI,OAAO,OAAO;AAC9C,QAAM,UAAU,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,MAAM;AAC7D,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEA,SAASC,kBAAiB,OAAwB;AAChD,SAAO,OAAO,KAAK,KAAK,UAAU,KAAK,GAAG,MAAM,EAAE,SAAS,QAAQ;AACrE;AAEA,SAAS,qBAAqB,aAAsC;AAClE,SAAO,iBAAkC,WAAW;AACtD;AAEA,SAAS,iBAAiB,SAAqC;AAC7D,MAAI,CAAC,WAAW,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC3C,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,KAAK,EAAE,YAAY;AACpC;AAEA,SAAS,eAAe,SAAyB;AAC/C,QAAM,cAAc,QAAQ,MAAM,iBAAiB;AACnD,MAAI,aAAa;AACf,UAAM,SAAS,OAAO,SAAS,YAAY,CAAC,GAAG,EAAE;AACjD,QAAI,OAAO,SAAS,MAAM,KAAK,SAAS,GAAG;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,YAAY,OAAQ,QAAO;AAC/B,MAAI,YAAY,eAAgB,QAAOD;AACvC,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAsD;AAC7E,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,SAAS,MAAM,MAAM,qBAAqB;AAChD,MAAI,QAAQ;AACV,WAAO,OAAO,CAAC;AAAA,EACjB;AAGA,QAAM,aAAa,MAAM,MAAM,oBAAoB;AACnD,MAAI,YAAY;AACd,WAAO,WAAW,CAAC;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAA2B,OAA8B;AAClF,QAAM,SAAS,gBAAgB,KAAK;AACpC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,WAAW,KAAK,6BAA6B,OAAO,KAAK,CAAC,EAAE;AAAA,EAC9E;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,SAAkB,SAAuB;AAElE,UAAQ,IAAI,qBAAqB,OAAO;AACxC,UAAQ,IAAI,aAAa,OAAO;AAClC;AAEA,eAAe,qBACb,YACA,aACA,QACA,QACA,YACA,UACiB;AACjB,QAAM,UAAU,iBAAiB,OAAO,OAAO;AAC/C,QAAM,UAAU,eAAe,OAAO;AACtC,QAAM,YAAY,kBAAkB,OAAO,OAAO,OAAO;AACzD,QAAM,oBAAoB,kBAAkB,OAAO,OAAO,OAAO;AAEjE,QAAM,oBACJ,OAAO,OAAO,sBAAsB,YAAY,OAAO,oBAAoB,IACvE,KAAK,MAAM,OAAO,iBAAiB,IACnC;AAEN,QAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACxC,QAAM,aAAa,MAAM;AACzB,QAAM,cAAc,MAAM;AAC1B,QAAM,QAAQ,YAAY;AAE1B,QAAM,YAAY,MAAME,eAAc;AAAA,IACpC;AAAA,IACA,QAAQ;AAAA,MACN,MAAM,OAAO,OAAO,QAAQ;AAAA,MAC5B,SAAS,OAAO,OAAO,WAAW;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAAA,IACA,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,MACP,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,OAAO,OAAO,MAAM;AAAA,MACpB,YAAY,OAAO,UAAU;AAAA,MAC7B,aAAa,OAAO,WAAW;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,cAAc;AAAA,IAClB,aAAa;AAAA,IACb,UAAU;AAAA,MACR,KAAK,UAAU,OAAO;AAAA,MACtB,aAAa,UAAU,eAAe;AAAA,MACtC,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,QAAQ,OAAO;AAAA,MACf;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,mBAAmB,OAAO;AAAA,MAC1B,OAAO,OAAO;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA,eAAe;AAAA,QACb,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,YAAY,WAAW,SAAS;AAAA,QAChC,aAAa,YAAY,SAAS;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAY,CAAC;AAAA,EACf;AAEA,SAAOD,kBAAiB,WAAW;AACrC;AAwBO,SAAS,mBAAmB,YAA+C;AAChF,QAAM,UAAUE,qBAAoB,UAAU;AAC9C,QAAM,gBAAgB,QAAQ;AAC9B,QAAM,eAAe,IAAI,aAAa;AAEtC,QAAM,WAAW,OACf,OACA,MACA,YACsB;AACtB,UAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,iBAAiB,MAAM,MAAM,OAAO,MAAM;AAC1F,UAAM,eAAe,IAAI,IAAI,GAAG,EAAE;AAGlC,UAAM,SAAS,aAAa,IAAI,YAAY;AAC5C,QAAI,UAAU,SAAS,iBAAiB;AACtC,YAAM,iBAAiB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,UACE,QAAQ,OAAO;AAAA,UACf,SAAS,OAAO;AAAA,UAChB,OAAO,OAAO;AAAA,UACd,OAAO,OAAO;AAAA,UACd,mBAAmB,OAAO;AAAA,UAC1B,OAAO,OAAO;AAAA,QAChB;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,UACE,KAAK,OAAO;AAAA,UACZ,aAAa,OAAO;AAAA,QACtB;AAAA,MACF;AAEA,YAAM,iBAAiB,IAAI,QAAQ,MAAM,OAAO;AAChD,wBAAkB,gBAAgB,cAAc;AAEhD,YAAMC,YAAW,MAAM,MAAM,OAAO,EAAE,GAAG,MAAM,SAAS,eAAe,CAAC;AAGxE,UAAIA,UAAS,WAAW,KAAK;AAC3B,eAAOA;AAAA,MACT;AAIA,YAAMC,iBACJD,UAAS,QAAQ,IAAI,kBAAkB,KAAKA,UAAS,QAAQ,IAAI,oBAAoB;AACvF,UAAIC,gBAAe;AACjB,eAAO,UAAU,OAAO,MAAM,KAAK,cAAcA,cAAa;AAAA,MAChE;AAIA,mBAAa,WAAW,YAAY;AACpC,YAAM,gBAAgB,MAAM,MAAM,OAAO,IAAI;AAC7C,UAAI,cAAc,WAAW,KAAK;AAChC,eAAO;AAAA,MACT;AACA,YAAM,cACJ,cAAc,QAAQ,IAAI,kBAAkB,KAC5C,cAAc,QAAQ,IAAI,oBAAoB;AAChD,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,oEAAoE;AAAA,MACtF;AACA,aAAO,UAAU,OAAO,MAAM,KAAK,cAAc,WAAW;AAAA,IAC9D;AAGA,UAAM,WAAW,MAAM,MAAM,OAAO,IAAI;AAExC,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO;AAAA,IACT;AAEA,UAAM,gBACJ,SAAS,QAAQ,IAAI,kBAAkB,KAAK,SAAS,QAAQ,IAAI,oBAAoB;AACvF,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,oEAAoE;AAAA,IACtF;AAEA,WAAO,UAAU,OAAO,MAAM,KAAK,cAAc,aAAa;AAAA,EAChE;AAGA,iBAAe,UACb,OACA,MACA,KACA,cACA,eACmB;AACnB,UAAM,kBAAkB,qBAAqB,aAAa;AAC1D,UAAM,SAAS,gBAAgB,UAAU,CAAC;AAC1C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,UAAM,SAAS,OAAO,UAAU,OAAO;AACvC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAGA,iBAAa,IAAI,cAAc;AAAA,MAC7B,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO;AAAA,MACd,mBAAmB,OAAO;AAAA,MAC1B,aAAa,gBAAgB,UAAU;AAAA,MACvC,qBAAqB,gBAAgB,UAAU;AAAA,IACjD,CAAC;AAGD,UAAM,iBAAiB,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IAClB;AAGA,UAAM,eAAe,IAAI,QAAQ,MAAM,OAAO;AAC9C,sBAAkB,cAAc,cAAc;AAE9C,WAAO,MAAM,OAAO;AAAA,MAClB,GAAG;AAAA,MACH,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,OAAO,UAAU,OAAO,aAAa;AAChD;;;AEnWA,SAAS,wBAAwB;AACjC,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,SAAS,QAAAC,OAAM,SAAS,WAAW;;;ACF5C,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,YAAY;AAEd,IAAM,sBAAsB;AAC5B,IAAM,gBAAgB;AACtB,IAAM,oBAAoB,KAAK,aAAa,cAAc,MAAM;AAEhE,SAAS,gBAAgB,eAA+B;AAC7D,SAAO,WAAW,QAAQ,EAAE,OAAO,cAAc,KAAK,EAAE,YAAY,CAAC,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAClG;AAEO,SAAS,qBAAqB,eAAuB,SAA0B;AACpF,SAAO,KAAK,WAAW,QAAQ,GAAG,mBAAmB,GAAG,gBAAgB,aAAa,CAAC,MAAM;AAC9F;AAEO,SAAS,qBACd,KACA,eAAe,2BACP;AACR,MAAI,IAAI,WAAW,eAAe;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,KAAK,IAAI,SAAS,OAAO,EAAE,KAAK,GAAG,QAAQ;AAClE,MAAI,QAAQ,WAAW,eAAe;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,YAAY;AAC9B;;;ADRO,IAAM,wBAAwB;AAC9B,IAAM,8BAA8B;AACpC,IAAM,4BAA4B;AAiEzC,IAAM,oBAAoB;AAE1B,SAAS,mBAAmB,OAAgB,cAAgC;AAC1E,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAAc,cAA+C;AAClF,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AACA,QAAM,SAAS,SAAS,MAAM;AAC9B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAAS,gCAAgC,WAA2B;AAClE,QAAM,aAAa,UAAU,QAAQ,OAAO,GAAG,EAAE,KAAK,EAAE,QAAQ,QAAQ,EAAE;AAC1E,QAAM,WAAW,WACd,MAAM,GAAG,EACT,OAAO,CAAC,YAAY,QAAQ,SAAS,KAAK,YAAY,OAAO,YAAY,IAAI;AAChF,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AACA,SAAOC,MAAK,GAAG,QAAQ;AACzB;AAEA,SAAS,oBAAoB,WAAmB,WAA2B;AACzE,QAAM,oBAAoB,QAAQ,SAAS;AAC3C,QAAM,qBAAqB,gCAAgC,SAAS;AACpE,QAAM,qBAAqB,QAAQ,mBAAmB,kBAAkB;AAExE,MACE,uBAAuB,qBACvB,CAAC,mBAAmB,WAAW,GAAG,iBAAiB,GAAG,GAAG,EAAE,GAC3D;AACA,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,SAAO;AACT;AAEA,SAAS,oCAAoC,oBAAiD;AAC5F,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,mBAAmB,MAAM,4BAA4B;AACvE,MAAI,YAAY,CAAC,GAAG;AAClB,QAAI;AACF,aAAO,mBAAmB,UAAU,CAAC,CAAC;AAAA,IACxC,QAAQ;AACN,aAAO,UAAU,CAAC;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,cAAc,mBAAmB,MAAM,qBAAqB;AAClE,MAAI,cAAc,CAAC,GAAG;AACpB,WAAO,YAAY,CAAC;AAAA,EACtB;AAEA,QAAM,aAAa,mBAAmB,MAAM,mBAAmB;AAC/D,MAAI,aAAa,CAAC,GAAG;AACnB,WAAO,WAAW,CAAC,EAAE,KAAK;AAAA,EAC5B;AAEA,SAAO;AACT;AAEA,eAAe,cAAc,eAAuB,SAAmC;AACrF,QAAM,UAAU,qBAAqB,eAAe,OAAO;AAC3D,QAAM,MAAM,MAAM,SAAS,OAAO;AAClC,SAAO,qBAAqB,KAAK,yBAAyB;AAC5D;AAEA,SAAS,cAAc,SAAiB,KAAqB;AAC3D,MAAI,IAAI,WAAW,eAAe;AAChC,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AACA,MAAI,QAAQ,UAAU,sBAAsB,mBAAmB;AAC7D,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,QAAM,QAAQ,QAAQ,SAAS,GAAG,mBAAmB;AACrD,QAAM,MAAM,QAAQ,SAAS,QAAQ,SAAS,iBAAiB;AAC/D,QAAM,aAAa,QAAQ,SAAS,qBAAqB,QAAQ,SAAS,iBAAiB;AAE3F,QAAM,WAAW,iBAAiB,eAAe,KAAK,KAAK;AAC3D,WAAS,WAAW,GAAG;AACvB,SAAO,OAAO,OAAO,CAAC,SAAS,OAAO,UAAU,GAAG,SAAS,MAAM,CAAC,CAAC;AACtE;AAEA,eAAe,qBACb,gBACA,kBACA,eACA,SACiB;AACjB,QAAM,MAAM,MAAM,cAAc,eAAe,OAAO;AACtD,QAAM,aAAa,OAAO,KAAK,kBAAkB,QAAQ;AACzD,QAAM,MAAM,cAAc,YAAY,GAAG;AACzC,MAAI,IAAI,WAAW,eAAe;AAChC,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AACA,SAAO,cAAc,gBAAgB,GAAG;AAC1C;AAEA,eAAe,oBACb,WACA,SACA,QACA,UAA+B,CAAC,GACpB;AACZ,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,UAAU;AAAA,IACd,QAAQ,gBAAgB,oBAAoB,WAAW,SAAS,CAAC;AAAA,EACnE;AAEA,QAAM,WAAW,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,IAAI;AAAA,IACzD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP;AAAA,QACE,gBAAgB;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IACA,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AAED,QAAM,WAAW,MAAM,SAAS,KAAK;AACrC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,YAAY,0CAA0C,SAAS,MAAM,EAAE;AAAA,EACzF;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,QAAQ;AAAA,EAC/B,QAAQ;AACN,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,SAAO,OAAO,OAAO;AACvB;AAEA,eAAe,wBACb,MACA,QACA,SACA,UAAiC,CAAC,GACI;AACtC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,kBAAkB,QAAQ,kBAAkB,IAAI,KAAK;AAC3D,QAAM,kBAAkB,yBAAyB,QAAQ,eAAe;AAExE,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,GAAG,iBAAiB,cAAc,CAAC,GAAG,IAAI;AAC5D,QAAM,WAAW,MAAM,UAAU,WAAW;AAAA,IAC1C;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,IACxB;AAAA,IACA,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AAED,QAAM,aAAa,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC;AAE3D,SAAO;AAAA,IACL,QAAQ,SAAS;AAAA,IACjB,UAAU,WAAW,SAAS,OAAO;AAAA,IACrC;AAAA,IACA,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,IACrD,oBAAoB,SAAS,QAAQ,IAAI,qBAAqB,KAAK;AAAA,IACnE,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,IAC1D,iBAAiB,yBAAyB,SAAS,OAAO;AAAA,EAC5D;AACF;AAEO,SAAS,0BAA0B,SAA+C;AACvF,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,iBAAiB,OAAO,cAAc;AAC5D,QAAM,YAAY,iBAAiB,OAAO,UAAU;AACpD,QAAM,WAAW,iBAAiB,OAAO,QAAQ,KAAK;AAEtD,MAAI,CAAC,iBAAiB,CAAC,WAAW;AAChC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,SAAqC;AAC1E,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AAEA,QAAM,MAAM,iBAAiB,OAAO,GAAG,KAAK,iBAAiB,OAAO,UAAU;AAC9E,QAAM,YAAY,SAAS,OAAO,UAAU;AAC5C,QAAM,SAAS,iBAAiB,OAAO,MAAM,KAAK,iBAAiB,OAAO,WAAW;AACrF,QAAM,WAAW,iBAAiB,OAAO,SAAS,KAAK;AAEvD,MAAI,CAAC,OAAO,cAAc,QAAQ,CAAC,QAAQ;AACzC,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAEA,SAAO;AAAA,IACL,SAAS,mBAAmB,OAAO,SAAS,IAAI;AAAA,IAChD;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEO,SAAS,2BAA2B,SAAyC;AAClF,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,QAAM,MAAM,iBAAiB,OAAO,GAAG,KAAK,iBAAiB,OAAO,UAAU;AAC9E,QAAM,SAAS,iBAAiB,OAAO,MAAM,KAAK,iBAAiB,OAAO,WAAW;AACrF,QAAM,gBAAgB,mBAAmB,OAAO,gBAAgB,KAAK;AAErE,MAAI,CAAC,OAAO,CAAC,QAAQ;AACnB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,SAAO;AAAA,IACL,SAAS,mBAAmB,OAAO,SAAS,IAAI;AAAA,IAChD;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,EAClB;AACF;AAEO,SAAS,kCAAkC,SAAgD;AAChG,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,QAAM,MAAM,iBAAiB,OAAO,GAAG,KAAK,iBAAiB,OAAO,UAAU;AAC9E,QAAM,WAAW,iBAAiB,OAAO,SAAS;AAClD,MAAI,CAAC,OAAO,CAAC,UAAU;AACrB,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,SAAS,mBAAmB,OAAO,SAAS,IAAI;AAAA,IAChD;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEA,eAAsB,yBACpB,SACA,UAA+B,CAAC,GACJ;AAC5B,SAAO,oBAAoB,uBAAuB,SAAS,wBAAwB,OAAO;AAC5F;AAEA,eAAsB,+BACpB,SACA,UAA+B,CAAC,GACO;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,6BACpB,SACA,UAA+B,CAAC,GACA;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,0BACpB,SACA,UAAiC,CAAC,GACI;AACtC,SAAO,wBAAwB,eAAe,QAAQ,SAAS,OAAO;AACxE;AAEA,eAAsB,gCACpB,SACA,UAAiC,CAAC,GACI;AACtC,SAAO,wBAAwB,qBAAqB,QAAQ,SAAS,OAAO;AAC9E;AAEA,eAAsB,8BACpB,SACA,UAAiC,CAAC,GACI;AACtC,SAAO,wBAAwB,mBAAmB,QAAQ,SAAS,OAAO;AAC5E;AAEA,eAAsB,sBACpB,SACA,iBACA,UAAwC,CAAC,GACH;AACtC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,YAAY,QAAQ,aAAa,QAAQ,IAAI;AACnD,QAAM,UAAU,QAAQ;AAExB,MAAI,YAAY,QAAQ;AACxB,MAAI,QAAQ,gBAAgB;AAC5B,QAAM,cAAc,gBAAgB,YAAY,YAAY;AAE5D,MAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,UAAM,UAAU;AAAA,MACd,gBAAgB;AAAA,MAChB;AAAA,IACF;AACA,UAAM,mBACJ,iBAAiB,QAAQ,UAAU,KACnC,iBAAiB,QAAQ,GAAG,KAC5B,iBAAiB,QAAQ,SAAS;AACpC,UAAM,cAAc,iBAAiB,QAAQ,YAAY;AACzD,UAAM,gBACJ,iBAAiB,QAAQ,OAAO,KAChC,iBAAiB,QAAQ,WAAW,KACpC,iBAAiB,QAAQ,IAAI;AAC/B,UAAM,oBACJ,iBAAiB,QAAQ,WAAW,KAAK,iBAAiB,QAAQ,aAAa,CAAC;AAElF,QAAI,kBAAkB;AACpB,kBAAY;AAAA,IACd;AAEA,QAAI,aAAa;AACf,YAAM,eAAe,MAAM,UAAU,aAAa,EAAE,QAAQ,MAAM,CAAC;AACnE,UAAI,CAAC,aAAa,IAAI;AACpB,cAAM,IAAI,MAAM,yCAAyC,aAAa,MAAM,EAAE;AAAA,MAChF;AACA,cAAQ,OAAO,KAAK,MAAM,aAAa,YAAY,CAAC;AACpD,YAAM,mBAAmB,aAAa,QAAQ,IAAI,wBAAwB,GAAG,KAAK;AAClF,UAAI,kBAAkB;AACpB,gBAAQ,MAAM;AAAA,UACZ;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,eAAe;AACxB,cAAQ,OAAO,KAAK,eAAe,QAAQ;AAC3C,UAAI,mBAAmB;AACrB,gBAAQ,MAAM;AAAA,UACZ;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,IAAI,MAAM,kEAAkE;AAAA,IACpF;AAAA,EACF,OAAO;AACL,UAAM,qBAAqB;AAAA,MACzB,gBAAgB;AAAA,IAClB;AACA,QAAI,oBAAoB;AACtB,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,WAAW,oBAAoB,WAAW,SAAS;AACzD,QAAM,MAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,QAAM,UAAU,UAAU,KAAK;AAE/B,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,cAAc,MAAM;AAAA,EACtB;AACF;;;AEpfA,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB,yBAAyB;AACpD,SAAS,YAAY,SAAAC,QAAO,SAAS,QAAQ,MAAM,cAAc;AACjE,SAAS,WAAAC,gBAAe;AACxB,SAAS,UAAU,WAAAC,UAAS,QAAAC,aAAY;AACxC,SAAS,gBAAgB;AAEzB,IAAM,WAAWA,MAAKF,SAAQ,GAAG,aAAa,YAAY;AAC1D,IAAM,YAAY,KAAK,OAAO;AAC9B,IAAM,eAAe;AAErB,SAAS,YAAY,UAAkB,SAA0B;AAC/D,QAAM,UAAU,UAAUE,MAAK,SAAS,aAAa,YAAY,IAAI;AACrE,SAAOA,MAAK,SAAS,QAAQ;AAC/B;AAEA,eAAe,eAAe,MAA6B;AACzD,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,KAAK,IAAI;AAAA,EAC5B,QAAQ;AACN;AAAA,EACF;AACA,MAAI,SAAS,OAAO,UAAW;AAE/B,QAAM,UAAU,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC;AACrC,QAAM,OAAO,MAAM,OAAO;AAE1B,QAAM,SAAS,GAAG,OAAO;AACzB,QAAM,SAAS,iBAAiB,OAAO,GAAG,WAAW,GAAG,kBAAkB,MAAM,CAAC;AACjF,QAAM,OAAO,OAAO,EAAE,MAAM,MAAM,MAAS;AAE3C,QAAM,MAAMD,SAAQ,IAAI;AACxB,QAAME,QAAO,SAAS,IAAI,KAAK;AAC/B,QAAM,OAAO,MAAM,QAAQ,GAAG,GAC3B,OAAO,CAAC,SAAS,KAAK,WAAW,GAAGA,KAAI,GAAG,KAAK,KAAK,SAAS,KAAK,CAAC,EACpE,KAAK,EACL,QAAQ;AAEX,QAAM,QAAQ,IAAI,MAAM,YAAY;AACpC,QAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,SAAS,OAAOD,MAAK,KAAK,IAAI,CAAC,EAAE,MAAM,MAAM,MAAS,CAAC,CAAC;AACvF;AAEA,eAAsB,iBACpB,UACA,OACA,SACe;AACf,QAAM,WAAW,YAAY,UAAU,OAAO;AAC9C,QAAMH,OAAME,SAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,QAAM,WAAW,UAAU,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,GAAM,OAAO;AAChE,QAAM,eAAe,QAAQ;AAC/B;;;AdTA,IAAM,0BAA0B;AAChC,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,8BAA8BG,MAAKC,SAAQ,GAAG,aAAa,cAAc,WAAW;AAE1F,SAAS,2BAAmC;AAC1C,QAAM,sBAAsB,QAAQ,IAAI,yBAAyB,KAAK;AACtE,MAAI,uBAAuB,oBAAoB,SAAS,GAAG;AACzD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAyB,MAAuB;AACxE,SAAO,QAAQ,QAAQ,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM;AACzD;AAEA,SAAS,gBAAgB,OAA0D;AACjF,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,MAAM,KAAK;AAC3B,WAAO,QAAQ,SAAS,IAAI,UAAU;AAAA,EACxC;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAW,aAAa,OAAO;AAC7B,YAAM,UAAU,UAAU,KAAK;AAC/B,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,kBAAkB,KAAwC;AACvE,QAAM,aAAuB,CAAC;AAC9B,mBAAiB,SAAS,KAAK;AAC7B,eAAW,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,EACrE;AAEA,QAAM,WAAW,OAAO,OAAO,UAAU,EAAE,SAAS,OAAO,EAAE,KAAK;AAClE,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,KAAK,MAAM,QAAQ;AAC5B;AAEA,SAAS,SAAS,KAAqB,QAAgB,MAAqB;AAC1E,MAAI,UAAU,QAAQ,EAAE,gBAAgB,mBAAmB,CAAC;AAC5D,MAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AAC9B;AAEA,SAAS,cACP,OACA,OACA,SAAkC,CAAC,GAC7B;AACN,QAAM,UAAU,KAAK,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;AACnD,QAAM,UAAU,gBAAgB,OAAO;AACvC,MAAI,UAAU,SAAS;AACrB,YAAQ,MAAM,OAAO;AACrB;AAAA,EACF;AACA,MAAI,UAAU,QAAQ;AACpB,YAAQ,KAAK,OAAO;AACpB;AAAA,EACF;AACA,UAAQ,KAAK,OAAO;AACtB;AAWA,SAAS,eACP,WACA,QACA,aACA,UAAmC,CAAC,GAC9B;AACN,OAAK,iBAAiB,sBAAsB;AAAA,IAC1C,KAAI,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC3B,YAAY;AAAA,IACZ;AAAA,IACA,UAAU,YAAY;AAAA,IACtB,cAAc,YAAY;AAAA,IAC1B,UAAU,YAAY,YAAY;AAAA,IAClC,gBAAgB,YAAY,kBAAkB;AAAA,IAC9C,WAAW,YAAY,aAAa;AAAA,IACpC,YAAY,YAAY,cAAc;AAAA,IACtC;AAAA,EACF,CAAC,EAAE,MAAM,MAAM,MAAS;AAC1B;AAEA,SAAS,uBAAuB,SAA4D;AAC1F,QAAM,UACJ,gBAAgB,QAAQ,2BAA2B,YAAY,CAAC,CAAC,KAAK,WAAW;AACnF,QAAM,cACJ;AAAA,IACE,QAAQ,+BAA+B,YAAY,CAAC,KAAK,QAAQ,iBAAiB;AAAA,EACpF,KAAK,WAAW;AAClB,SAAO,EAAE,UAAU,SAAS,cAAc,YAAY;AACxD;AAEA,SAAS,4BACP,aACA,YACA,UAAmC,CAAC,GAC9B;AACN,MAAI,cAAc,OAAO,aAAa,KAAK;AACzC,mBAAe,oBAAoB,WAAW,aAAa,EAAE,QAAQ,YAAY,GAAG,QAAQ,CAAC;AAC7F;AAAA,EACF;AACA,iBAAe,oBAAoB,WAAW,aAAa,EAAE,QAAQ,YAAY,GAAG,QAAQ,CAAC;AAC/F;AAEA,SAAS,yBAAyB,QAAgB,UAA2B;AAC3E,MAAI,WAAW,KAAK;AAClB,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,UAAU,KAAK,MAAM,QAAQ;AACnC,UAAM,YAAY,OAAO,QAAQ,cAAc,QAAQ,SAAS,EAAE,EAAE,YAAY;AAChF,UAAM,UAAU,OAAO,QAAQ,WAAW,EAAE,EAAE,YAAY;AAC1D,WAAO,cAAc,6BAA6B,QAAQ,SAAS,iBAAiB;AAAA,EACtF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,4BAA4B,UAIV;AACzB,QAAM,kBAA0C;AAAA,IAC9C,gBAAgB,SAAS;AAAA,EAC3B;AAGA,MAAI,SAAS,iBAAiB;AAC5B,oBAAgB,kBAAkB,IAAI,SAAS;AAC/C,oBAAgB,oBAAoB,IAAI,SAAS;AAAA,EACnD;AACA,MAAI,SAAS,iBAAiB;AAC5B,oBAAgB,kBAAkB,IAAI,SAAS;AAC/C,oBAAgB,oBAAoB,IAAI,SAAS;AAAA,EACnD;AAEA,SAAO;AACT;AAQA,SAAS,2BAA2B,UAA2B;AAC7D,SAAO,6DAA6D,KAAK,QAAQ;AACnF;AAEO,SAAS,4BACd,QACA,UACgC;AAChC,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,2BAA2B,QAAQ,IAAI,yBAAyB;AAChF,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb,UAAU,oBAAoB,OAAO;AAAA,EACvC;AACF;AAEA,SAAS,oBAAoB,SAA0D;AACrF,SAAO,KAAK,UAAU;AAAA,IACpB,OAAO,QAAQ,QAAQ,QAAQ,GAAG;AAAA,IAClC;AAAA,EACF,CAAC;AACH;AAEA,SAAS,2BAAmC;AAC1C,SAAO,KAAK,UAAU;AAAA,IACpB,OAAO;AAAA,IACP,SAAS;AAAA,EACX,CAAC;AACH;AAMO,SAAS,eAAuB;AACrC,SAAO;AACT;AAMA,eAAe,mBAAmB,MAA2C;AAC3E,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,uBAAuB;AAE9E,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,oBAAoB,IAAI,WAAW;AAAA,MAC9D,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,iBAAa,SAAS;AAEtB,QAAI,SAAS,IAAI;AACf,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAI,KAAK,WAAW,QAAQ,KAAK,QAAQ;AACvC,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,iBAAa,SAAS;AACtB,WAAO;AAAA,EACT;AACF;AA2CA,eAAsB,WAAW,SAA6C;AAE5E,QAAM,aAAa,QAAQ,QAAQ,aAAa;AAGhD,QAAM,iBAAiB,MAAM,mBAAmB,UAAU;AAC1D,MAAI,gBAAgB;AAElB,UAAMC,WAAUC,qBAAoB,QAAQ,SAA0B;AACtE,UAAMC,kBAAiB,IAAI,eAAeF,SAAQ,OAAO;AACzD,UAAMG,WAAU,oBAAoB,UAAU;AAG9C,QAAI,mBAAmBH,SAAQ,SAAS;AACtC,cAAQ;AAAA,QACN,uCAAuC,UAAU,gBAAgB,cAAc,6BAA6BA,SAAQ,OAAO;AAAA,MAC7H;AAAA,IACF;AAEA,YAAQ,UAAU,UAAU;AAE5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAAG;AAAA,MACA,eAAe;AAAA,MACf,gBAAAD;AAAA,MACA,OAAO,YAAY;AAAA,MAEnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,QAAQ,UAAU,KAAK;AAChD,QAAM,UAAUD,qBAAoB,gBAAgB;AACpD,QAAM,iBAAiB,IAAI,eAAe,QAAQ,OAAO;AACzD,QAAM,0BAA0B,QAAQ,QAAQ,YAAY;AAG5D,QAAM,cAAc,oBAAI,IAA0B;AAElD,QAAM,+BAA+B,OACnC,QACA,MACA,kBACgC;AAChC,QAAI,cAAc,YAAY,MAAM,yBAAyB;AAC3D,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,MAAM,iCAAiC,QAAQ,MAAM,eAAe,gBAAgB;AAAA,IAC7F,SAAS,KAAK;AACZ,cAAQ;AAAA,QACN,kDAAkD,IAAI,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAC7G;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,SAAS,aAAa,OAAO,KAAsB,QAAwB;AAC/E,QAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,cAAQ,MAAM,sCAAsC,IAAI,OAAO,EAAE;AAAA,IACnE,CAAC;AACD,QAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,cAAQ,MAAM,uCAAuC,IAAI,OAAO,EAAE;AAAA,IACpE,CAAC;AAGD,QAAI,IAAI,WAAW,UAAU,iBAAiB,IAAI,KAAK,wBAAwB,GAAG;AAChF,YAAM,cAAc,uBAAuB,IAAI,OAAO;AACtD,oBAAc,QAAQ,8BAA8B;AACpD,qBAAe,oBAAoB,SAAS,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC3F,UAAI;AACF,YAAI;AACJ,YAAI;AACF,oBAAU,MAAM,kBAAkB,GAAG;AAAA,QACvC,QAAQ;AACN,wBAAc,QAAQ,kCAAkC;AACxD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,eAAe,CAAC;AACxE,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,iBAAiB,8BAA8B,OAAO;AAC5D,YAAI,CAAC,gBAAgB;AACnB,wBAAc,QAAQ,oCAAoC;AAC1D,sCAA4B,aAAa,KAAK,EAAE,QAAQ,iBAAiB,CAAC;AAC1E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SACE;AAAA,UACJ,CAAC;AACD;AAAA,QACF;AAEA,oBAAY,iBAAiB,eAAe;AAC5C,oBAAY,YAAY,eAAe;AACvC,uBAAe,gBAAgB,SAAS,aAAa,EAAE,QAAQ,gBAAgB,CAAC;AAEhF,cAAM,kBAAkB,MAAM;AAAA,UAC5B;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AACA,YAAI,CAAC,iBAAiB;AACpB,wBAAc,QAAQ,8CAA8C;AACpE,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI,IAAI,yBAAyB,CAAC;AAClC,sCAA4B,aAAa,KAAK,EAAE,QAAQ,2BAA2B,CAAC;AACpF;AAAA,QACF;AACA,cAAM,kBAAkB,MAAM,6BAA6B,gBAAgB;AAAA,UACzE,gBAAgB;AAAA,UAChB;AAAA,QACF,CAAC;AACD,sBAAc,QAAQ,wCAAwC;AAAA,UAC5D,QAAQ,gBAAgB;AAAA,QAC1B,CAAC;AACD,uBAAe,gBAAgB,UAAU,aAAa,EAAE,QAAQ,gBAAgB,OAAO,CAAC;AAExF,cAAM,cAAc;AAAA,UAClB,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AACA,YAAI,aAAa;AACf,wBAAc,QAAQ,oCAAoC;AAAA,YACxD,QAAQ,YAAY;AAAA,UACtB,CAAC;AACD,gBAAMG,mBAAkB,4BAA4B;AAAA,YAClD,aAAa,YAAY;AAAA,YACzB,iBAAiB,gBAAgB;AAAA,YACjC,iBAAiB,gBAAgB;AAAA,UACnC,CAAC;AACD,cAAI,UAAU,YAAY,QAAQA,gBAAe;AACjD,cAAI,IAAI,YAAY,QAAQ;AAC5B,sCAA4B,aAAa,YAAY,QAAQ,EAAE,QAAQ,eAAe,CAAC;AACvF;AAAA,QACF;AAEA,cAAM,kBAAkB,4BAA4B,eAAe;AACnE,YAAI,UAAU,gBAAgB,QAAQ,eAAe;AACrD,YAAI,IAAI,gBAAgB,QAAQ;AAChC,oCAA4B,aAAa,gBAAgB,MAAM;AAAA,MACjE,SAAS,KAAK;AACZ,uBAAe,oBAAoB,WAAW,aAAa;AAAA,UACzD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,sBAAc,SAAS,sCAAsC;AAAA,UAC3D,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,iBAAS,KAAK,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,SAAS,sDAAsD,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QACjH,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,UAAU,iBAAiB,IAAI,KAAK,yBAAyB,GAAG;AACjF,YAAM,cAAc,uBAAuB,IAAI,OAAO;AACtD,oBAAc,QAAQ,+BAA+B;AACrD,qBAAe,oBAAoB,SAAS,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC5F,UAAI;AACF,YAAI;AACJ,YAAI;AACF,oBAAU,MAAM,kBAAkB,GAAG;AAAA,QACvC,QAAQ;AACN,wBAAc,QAAQ,mCAAmC;AACzD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,eAAe,CAAC;AACxE,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,SACJ,WAAW,OAAO,YAAY,WAAY,UAAsC;AAClF,cAAM,UAAU,OAAO,QAAQ,aAAa,WAAW,OAAO,SAAS,KAAK,IAAI;AAChF,cAAM,gBACJ,OAAO,QAAQ,mBAAmB,WAAW,OAAO,eAAe,KAAK,IAAI;AAC9E,cAAM,gBAAgB,QAAQ;AAC9B,cAAM,6BAA6B,QAAQ;AAC3C,YAAI,CAAC,WAAW,CAAC,eAAe;AAC9B,wBAAc,QAAQ,qCAAqC;AAC3D,sCAA4B,aAAa,KAAK,EAAE,QAAQ,iBAAiB,CAAC;AAC1E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AACA,YACE,kBAAkB,WACjB,kBAAkB,QACjB,OAAO,kBAAkB,YACzB,MAAM,QAAQ,aAAa,IAC7B;AACA,wBAAc,QAAQ,4CAA4C;AAClE,sCAA4B,aAAa,KAAK,EAAE,QAAQ,wBAAwB,CAAC;AACjF,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AACA,YACE,+BAA+B,UAC/B,EACE,OAAO,+BAA+B,YACrC,+BAA+B,QAC9B,OAAO,+BAA+B,YACtC,CAAC,MAAM,QAAQ,0BAA0B,IAE7C;AACA,wBAAc,QAAQ,0DAA0D;AAChF,sCAA4B,aAAa,KAAK;AAAA,YAC5C,QAAQ;AAAA,UACV,CAAC;AACD,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SACE;AAAA,UACJ,CAAC;AACD;AAAA,QACF;AAEA,YAAI,cAAc,YAAY,MAAM,yBAAyB;AAC3D,wBAAc,QAAQ,wCAAwC;AAAA,YAC5D,gBAAgB;AAAA,YAChB,cAAc,QAAQ;AAAA,UACxB,CAAC;AACD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,kBAAkB,CAAC;AAC3E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,kBAAkB,MAAM;AAAA,UAC5B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,CAAC,iBAAiB;AACpB,wBAAc,QAAQ,+CAA+C;AACrE,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI,IAAI,yBAAyB,CAAC;AAClC,sCAA4B,aAAa,KAAK,EAAE,QAAQ,2BAA2B,CAAC;AACpF;AAAA,QACF;AAEA,oBAAY,WAAW;AACvB,oBAAY,iBAAiB;AAC7B,uBAAe,kBAAkB,SAAS,WAAW;AAErD,cAAM,eAAe,mBAAmB,gBAAgB,EAAE;AAC1D,cAAM,kBAAkB,MAAM,8BAA8B,SAAS,eAAe;AAAA,UAClF,gBAAgB;AAAA,UAChB;AAAA,UACA,WAAW;AAAA,UACX,kBAAkB,gBAAgB,IAAI,QAAQ,mBAAmB,CAAC;AAAA,UAClE,eAAe,gBAAgB,IAAI,QAAQ,WAAW,CAAC;AAAA,UACvD,SACE,iBAAiB,OAAO,kBAAkB,YAAY,CAAC,MAAM,QAAQ,aAAa,IAC7E,gBACD;AAAA,UACN,sBACE,OAAO,+BAA+B,WAClC,2BAA2B,KAAK,KAAK,SACrC,+BAA+B,SAC5B,6BACD;AAAA,QACV,CAAC;AACD,sBAAc,QAAQ,yCAAyC;AAAA,UAC7D,QAAQ,gBAAgB;AAAA,QAC1B,CAAC;AACD,uBAAe,kBAAkB,UAAU,aAAa,EAAE,QAAQ,gBAAgB,OAAO,CAAC;AAE1F,cAAM,cAAc;AAAA,UAClB,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AACA,YAAI,aAAa;AACf,wBAAc,QAAQ,qCAAqC;AAAA,YACzD,QAAQ,YAAY;AAAA,UACtB,CAAC;AACD,gBAAMA,mBAAkB,4BAA4B;AAAA,YAClD,aAAa,YAAY;AAAA,YACzB,iBAAiB,gBAAgB;AAAA,YACjC,iBAAiB,gBAAgB;AAAA,UACnC,CAAC;AACD,cAAI,UAAU,YAAY,QAAQA,gBAAe;AACjD,cAAI,IAAI,YAAY,QAAQ;AAC5B,sCAA4B,aAAa,YAAY,QAAQ,EAAE,QAAQ,eAAe,CAAC;AACvF;AAAA,QACF;AAEA,cAAM,kBAAkB,4BAA4B,eAAe;AACnE,YAAI,UAAU,gBAAgB,QAAQ,eAAe;AACrD,YAAI,IAAI,gBAAgB,QAAQ;AAChC,oCAA4B,aAAa,gBAAgB,MAAM;AAAA,MACjE,SAAS,KAAK;AACZ,uBAAe,oBAAoB,WAAW,aAAa;AAAA,UACzD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,sBAAc,SAAS,uCAAuC;AAAA,UAC5D,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,iBAAS,KAAK,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,SAAS,iDAAiD,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC5G,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,UAAU,iBAAiB,IAAI,KAAK,iBAAiB,GAAG;AACzE,YAAM,cAAc,uBAAuB,IAAI,OAAO;AACtD,oBAAc,QAAQ,uBAAuB;AAC7C,qBAAe,oBAAoB,SAAS,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACpF,UAAI;AACF,YAAI;AACJ,YAAI;AACF,oBAAU,MAAM,kBAAkB,GAAG;AAAA,QACvC,QAAQ;AACN,wBAAc,QAAQ,2BAA2B;AACjD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,eAAe,CAAC;AACxE,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,iBAAiB,0BAA0B,OAAO;AACxD,YAAI,CAAC,gBAAgB;AACnB,wBAAc,QAAQ,6BAA6B;AACnD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,iBAAiB,CAAC;AAC1E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SACE;AAAA,UACJ,CAAC;AACD;AAAA,QACF;AAEA,oBAAY,WAAW,eAAe;AACtC,oBAAY,iBAAiB,eAAe;AAC5C,oBAAY,YAAY,eAAe;AAEvC,YAAI,eAAe,eAAe,YAAY,MAAM,yBAAyB;AAC3E,wBAAc,QAAQ,gCAAgC;AAAA,YACpD,gBAAgB,eAAe;AAAA,YAC/B,cAAc,QAAQ;AAAA,UACxB,CAAC;AACD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,kBAAkB,CAAC;AAC3E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,kBAAkB,MAAM;AAAA,UAC5B;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AACA,YAAI,CAAC,iBAAiB;AACpB,wBAAc,QAAQ,uCAAuC;AAC7D,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI,IAAI,yBAAyB,CAAC;AAClC,sCAA4B,aAAa,KAAK,EAAE,QAAQ,2BAA2B,CAAC;AACpF;AAAA,QACF;AAEA,cAAM,iBAAiB;AAAA,UACrB,KAAK,IAAI,GAAG,KAAK,KAAK,eAAe,uBAAuB,GAAS,CAAC;AAAA,QACxE;AACA,cAAM,uBACJ,eAAe,eAAe,YAAY,MAAM,QAAQ,QAAQ,YAAY,IACxE,iBACA,IAAI,eAAe,eAAe,cAAc;AACtD,cAAM,cAAc,MAAM,qBAAqB,gBAAgB,cAAc;AAC7E,cAAM,cAAc,qBAAqB,WAAW,cAAc;AAElE,YAAI,CAAC,YAAY,YAAY;AAC3B,wBAAc,QAAQ,qCAAqC;AAAA,YACzD,gBAAgB,eAAe;AAAA,YAC/B,aAAa,YAAY,KAAK;AAAA,YAC9B,cAAc;AAAA,UAChB,CAAC;AACD,kBAAQ,sBAAsB;AAAA,YAC5B,YAAY,YAAY,KAAK;AAAA,YAC7B;AAAA,YACA,eAAe,eAAe;AAAA,UAChC,CAAC;AACD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,uBAAuB,CAAC;AAChF,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS,uCAAuC,YAAY,KAAK,UAAU,eAAe,WAAW;AAAA,YACrG,QAAQ,eAAe;AAAA,YACvB,MAAM,eAAe,eAAe,cAAc;AAAA,UACpD,CAAC;AACD;AAAA,QACF;AAEA,YAAI,YAAY,KAAK,OAAO;AAC1B,wBAAc,QAAQ,4BAA4B;AAAA,YAChD,gBAAgB,eAAe;AAAA,YAC/B,aAAa,YAAY,KAAK;AAAA,UAChC,CAAC;AACD,kBAAQ,eAAe;AAAA,YACrB,YAAY,YAAY,KAAK;AAAA,YAC7B,eAAe,eAAe;AAAA,UAChC,CAAC;AAAA,QACH;AAGA,cAAM,wBAAwB,MAAM;AAAA,UAClC;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AACA,YAAI,CAAC,uBAAuB;AAC1B,wBAAc,QAAQ,uCAAuC;AAC7D,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI,IAAI,yBAAyB,CAAC;AAClC,sCAA4B,aAAa,KAAK,EAAE,QAAQ,2BAA2B,CAAC;AACpF;AAAA,QACF;AACA,cAAM,qBAAqB,mBAAmB,gBAAgB,EAAE;AAChE,uBAAe,kBAAkB,SAAS,aAAa,EAAE,KAAK,SAAS,CAAC;AACxE,cAAM,iBAAiB,MAAM;AAAA,UAC3B,eAAe;AAAA,UACf,eAAe;AAAA,UACf;AAAA,YACE,gBAAgB;AAAA,YAChB,iBAAiB;AAAA,YACjB,WAAW;AAAA,UACb;AAAA,QACF;AACA,uBAAe,kBAAkB,UAAU,aAAa,EAAE,QAAQ,eAAe,OAAO,CAAC;AACzF,cAAM,iBAAiB;AAAA,UACrB,eAAe;AAAA,UACf,eAAe;AAAA,QACjB;AACA,YAAI,eAAe,WAAW,OAAO,CAAC,gBAAgB;AACpD,wBAAc,QAAQ,8BAA8B;AAAA,YAClD,QAAQ,eAAe;AAAA,UACzB,CAAC;AACD,gBAAMA,mBAAkB,4BAA4B;AAAA,YAClD,aAAa,eAAe;AAAA,YAC5B,iBAAiB,eAAe;AAAA,YAChC,iBAAiB,eAAe;AAAA,UAClC,CAAC;AACD,cAAI,UAAU,eAAe,QAAQA,gBAAe;AACpD,cAAI,IAAI,eAAe,QAAQ;AAC/B,sCAA4B,aAAa,eAAe,QAAQ;AAAA,YAC9D,QAAQ;AAAA,UACV,CAAC;AACD;AAAA,QACF;AACA,YAAI,gBAAgB;AAClB,yBAAe,kBAAkB,YAAY,aAAa;AAAA,YACxD,QAAQ;AAAA,YACR,QAAQ,eAAe;AAAA,UACzB,CAAC;AACD,wBAAc,QAAQ,yCAAyC;AAAA,YAC7D,QAAQ,eAAe;AAAA,UACzB,CAAC;AAAA,QACH;AAEA,uBAAe,gBAAgB,SAAS,aAAa,EAAE,QAAQ,iBAAiB,CAAC;AACjF,cAAM,kBAAkB,MAAM,8BAA8B,gBAAgB;AAAA,UAC1E,gBAAgB;AAAA,UAChB;AAAA,UACA,gBAAgB,gBAAgB,IAAI,QAAQ,iBAAiB,CAAC;AAAA,QAChE,CAAC;AACD,sBAAc,QAAQ,iCAAiC;AAAA,UACrD,QAAQ,gBAAgB;AAAA,QAC1B,CAAC;AACD,uBAAe,gBAAgB,UAAU,aAAa,EAAE,QAAQ,gBAAgB,OAAO,CAAC;AAExF,cAAM,cAAc;AAAA,UAClB,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AACA,YAAI,aAAa;AACf,wBAAc,QAAQ,6BAA6B;AAAA,YACjD,QAAQ,YAAY;AAAA,UACtB,CAAC;AACD,gBAAMA,mBAAkB,4BAA4B;AAAA,YAClD,aAAa,YAAY;AAAA,YACzB,iBAAiB,gBAAgB;AAAA,YACjC,iBAAiB,gBAAgB;AAAA,UACnC,CAAC;AACD,cAAI,UAAU,YAAY,QAAQA,gBAAe;AACjD,cAAI,IAAI,YAAY,QAAQ;AAC5B,sCAA4B,aAAa,YAAY,QAAQ,EAAE,QAAQ,eAAe,CAAC;AACvF;AAAA,QACF;AAEA,cAAM,kBAAkB,4BAA4B,eAAe;AACnE,YAAI,UAAU,gBAAgB,QAAQ,eAAe;AACrD,YAAI,IAAI,gBAAgB,QAAQ;AAChC,oCAA4B,aAAa,gBAAgB,MAAM;AAAA,MACjE,SAAS,KAAK;AACZ,uBAAe,oBAAoB,WAAW,aAAa;AAAA,UACzD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,sBAAc,SAAS,+BAA+B;AAAA,UACpD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,iBAAS,KAAK,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,SAAS,+CAA+C,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC1G,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,UAAU,iBAAiB,IAAI,KAAK,yBAAyB,GAAG;AACjF,YAAM,cAAc,uBAAuB,IAAI,OAAO;AACtD,oBAAc,QAAQ,+BAA+B;AACrD,qBAAe,oBAAoB,SAAS,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC5F,UAAI;AACF,YAAI;AACJ,YAAI;AACF,oBAAU,MAAM,kBAAkB,GAAG;AAAA,QACvC,QAAQ;AACN,wBAAc,QAAQ,mCAAmC;AACzD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,eAAe,CAAC;AACxE,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,iBAAiB,iCAAiC,OAAO;AAC/D,YAAI,CAAC,gBAAgB;AACnB,wBAAc,QAAQ,qCAAqC;AAC3D,sCAA4B,aAAa,KAAK,EAAE,QAAQ,iBAAiB,CAAC;AAC1E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SACE;AAAA,UACJ,CAAC;AACD;AAAA,QACF;AACA,oBAAY,WAAW,eAAe;AACtC,oBAAY,iBAAiB,eAAe;AAC5C,oBAAY,aAAa,eAAe;AAExC,YAAI,eAAe,eAAe,YAAY,MAAM,yBAAyB;AAC3E,wBAAc,QAAQ,wCAAwC;AAAA,YAC5D,gBAAgB,eAAe;AAAA,YAC/B,cAAc,QAAQ;AAAA,UACxB,CAAC;AACD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,kBAAkB,CAAC;AAC3E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,kBAAkB,MAAM;AAAA,UAC5B;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AACA,YAAI,CAAC,iBAAiB;AACpB,wBAAc,QAAQ,+CAA+C;AACrE,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI,IAAI,yBAAyB,CAAC;AAClC,sCAA4B,aAAa,KAAK,EAAE,QAAQ,2BAA2B,CAAC;AACpF;AAAA,QACF;AAEA,uBAAe,gBAAgB,SAAS,aAAa,EAAE,QAAQ,yBAAyB,CAAC;AACzF,cAAM,kBAAkB,MAAM,qCAAqC,gBAAgB;AAAA,UACjF,gBAAgB;AAAA,UAChB;AAAA,QACF,CAAC;AACD,sBAAc,QAAQ,yCAAyC;AAAA,UAC7D,QAAQ,gBAAgB;AAAA,QAC1B,CAAC;AACD,uBAAe,gBAAgB,UAAU,aAAa,EAAE,QAAQ,gBAAgB,OAAO,CAAC;AAExF,cAAM,cAAc;AAAA,UAClB,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AACA,YAAI,aAAa;AACf,wBAAc,QAAQ,qCAAqC;AAAA,YACzD,QAAQ,YAAY;AAAA,UACtB,CAAC;AACD,gBAAMA,mBAAkB,4BAA4B;AAAA,YAClD,aAAa,YAAY;AAAA,YACzB,iBAAiB,gBAAgB;AAAA,YACjC,iBAAiB,gBAAgB;AAAA,UACnC,CAAC;AACD,cAAI,UAAU,YAAY,QAAQA,gBAAe;AACjD,cAAI,IAAI,YAAY,QAAQ;AAC5B,sCAA4B,aAAa,YAAY,QAAQ,EAAE,QAAQ,eAAe,CAAC;AACvF;AAAA,QACF;AAEA,cAAM,kBAAkB,4BAA4B,eAAe;AACnE,YAAI,UAAU,gBAAgB,QAAQ,eAAe;AACrD,YAAI,IAAI,gBAAgB,QAAQ;AAChC,oCAA4B,aAAa,gBAAgB,MAAM;AAAA,MACjE,SAAS,KAAK;AACZ,uBAAe,oBAAoB,WAAW,aAAa;AAAA,UACzD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,sBAAc,SAAS,uCAAuC;AAAA,UAC5D,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,iBAAS,KAAK,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,SAAS,uDAAuD,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAClH,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,UAAU,iBAAiB,IAAI,KAAK,qBAAqB,GAAG;AAC7E,YAAM,cAAc,uBAAuB,IAAI,OAAO;AACtD,oBAAc,QAAQ,mBAAmB;AACzC,qBAAe,oBAAoB,SAAS,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxF,UAAI;AACF,YAAI;AACJ,YAAI;AACF,oBAAU,MAAM,kBAAkB,GAAG;AAAA,QACvC,QAAQ;AACN,wBAAc,QAAQ,uBAAuB;AAC7C,sCAA4B,aAAa,KAAK,EAAE,QAAQ,eAAe,CAAC;AACxE,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,iBAAiB,0BAA0B,OAAO;AACxD,YAAI,CAAC,gBAAgB;AACnB,wBAAc,QAAQ,yBAAyB;AAC/C,sCAA4B,aAAa,KAAK,EAAE,QAAQ,iBAAiB,CAAC;AAC1E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,oBAAY,iBAAiB,eAAe;AAC5C,oBAAY,aAAa,eAAe;AAExC,YAAI,eAAe,eAAe,YAAY,MAAM,yBAAyB;AAC3E,wBAAc,QAAQ,0BAA0B;AAChD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,kBAAkB,CAAC;AAC3E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,kBAAkB,MAAM;AAAA,UAC5B;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AACA,YAAI,CAAC,iBAAiB;AACpB,wBAAc,QAAQ,mCAAmC;AACzD,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI,IAAI,yBAAyB,CAAC;AAClC,sCAA4B,aAAa,KAAK,EAAE,QAAQ,2BAA2B,CAAC;AACpF;AAAA,QACF;AAEA,uBAAe,gBAAgB,SAAS,aAAa,EAAE,QAAQ,aAAa,CAAC;AAC7E,cAAM,kBAAkB,MAAM,0BAA0B,gBAAgB;AAAA,UACtE,gBAAgB;AAAA,UAChB;AAAA,QACF,CAAC;AACD,sBAAc,QAAQ,6BAA6B,EAAE,QAAQ,gBAAgB,OAAO,CAAC;AACrF,uBAAe,gBAAgB,UAAU,aAAa,EAAE,QAAQ,gBAAgB,OAAO,CAAC;AAExF,cAAM,cAAc;AAAA,UAClB,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AACA,YAAI,aAAa;AACf,wBAAc,QAAQ,yBAAyB,EAAE,QAAQ,YAAY,OAAO,CAAC;AAC7E,gBAAMA,mBAAkB,4BAA4B;AAAA,YAClD,aAAa,YAAY;AAAA,YACzB,iBAAiB,gBAAgB;AAAA,YACjC,iBAAiB,gBAAgB;AAAA,UACnC,CAAC;AACD,cAAI,UAAU,YAAY,QAAQA,gBAAe;AACjD,cAAI,IAAI,YAAY,QAAQ;AAC5B,sCAA4B,aAAa,YAAY,QAAQ,EAAE,QAAQ,eAAe,CAAC;AACvF;AAAA,QACF;AAEA,cAAM,kBAAkB,4BAA4B,eAAe;AACnE,YAAI,UAAU,gBAAgB,QAAQ,eAAe;AACrD,YAAI,IAAI,gBAAgB,QAAQ;AAChC,oCAA4B,aAAa,gBAAgB,MAAM;AAAA,MACjE,SAAS,KAAK;AACZ,uBAAe,oBAAoB,WAAW,aAAa;AAAA,UACzD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,sBAAc,SAAS,2BAA2B;AAAA,UAChD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,iBAAS,KAAK,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,SAAS,2CAA2C,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QACtG,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,UAAU,iBAAiB,IAAI,KAAK,2BAA2B,GAAG;AACnF,YAAM,cAAc,uBAAuB,IAAI,OAAO;AACtD,oBAAc,QAAQ,yBAAyB;AAC/C,qBAAe,oBAAoB,SAAS,aAAa;AAAA,QACvD,MAAM;AAAA,MACR,CAAC;AACD,UAAI;AACF,YAAI;AACJ,YAAI;AACF,oBAAU,MAAM,kBAAkB,GAAG;AAAA,QACvC,QAAQ;AACN,wBAAc,QAAQ,6BAA6B;AACnD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,eAAe,CAAC;AACxE,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,iBAAiB,0BAA0B,OAAO;AACxD,YAAI,CAAC,gBAAgB;AACnB,wBAAc,QAAQ,+BAA+B;AACrD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,iBAAiB,CAAC;AAC1E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,oBAAY,iBAAiB,eAAe;AAC5C,oBAAY,aAAa,eAAe;AAExC,YAAI,eAAe,eAAe,YAAY,MAAM,yBAAyB;AAC3E,wBAAc,QAAQ,gCAAgC;AACtD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,kBAAkB,CAAC;AAC3E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,kBAAkB,MAAM;AAAA,UAC5B;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AACA,YAAI,CAAC,iBAAiB;AACpB,wBAAc,QAAQ,yCAAyC;AAC/D,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI,IAAI,yBAAyB,CAAC;AAClC,sCAA4B,aAAa,KAAK,EAAE,QAAQ,2BAA2B,CAAC;AACpF;AAAA,QACF;AAEA,uBAAe,gBAAgB,SAAS,aAAa,EAAE,QAAQ,mBAAmB,CAAC;AACnF,cAAM,kBAAkB,MAAM,gCAAgC,gBAAgB;AAAA,UAC5E,gBAAgB;AAAA,UAChB;AAAA,QACF,CAAC;AACD,sBAAc,QAAQ,mCAAmC;AAAA,UACvD,QAAQ,gBAAgB;AAAA,QAC1B,CAAC;AACD,uBAAe,gBAAgB,UAAU,aAAa,EAAE,QAAQ,gBAAgB,OAAO,CAAC;AAExF,cAAM,cAAc;AAAA,UAClB,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AACA,YAAI,aAAa;AACf,wBAAc,QAAQ,+BAA+B;AAAA,YACnD,QAAQ,YAAY;AAAA,UACtB,CAAC;AACD,gBAAM,kBAAkB,4BAA4B;AAAA,YAClD,aAAa,YAAY;AAAA,YACzB,iBAAiB,gBAAgB;AAAA,YACjC,iBAAiB,gBAAgB;AAAA,UACnC,CAAC;AACD,cAAI,UAAU,YAAY,QAAQ,eAAe;AACjD,cAAI,IAAI,YAAY,QAAQ;AAC5B,sCAA4B,aAAa,YAAY,QAAQ,EAAE,QAAQ,eAAe,CAAC;AACvF;AAAA,QACF;AAGA,YAAI,gBAAgB,SAAS,OAAO,gBAAgB,UAAU,KAAK;AACjE,wBAAc,QAAQ,sCAAsC;AAAA,YAC1D,QAAQ,gBAAgB;AAAA,UAC1B,CAAC;AACD,gBAAM,kBAAkB,4BAA4B,eAAe;AACnE,cAAI,UAAU,gBAAgB,QAAQ,eAAe;AACrD,cAAI,IAAI,gBAAgB,QAAQ;AAChC,sCAA4B,aAAa,gBAAgB,MAAM;AAC/D;AAAA,QACF;AAEA,cAAM,iBAAiB,MAAM,sBAAsB,gBAAgB,iBAAiB;AAAA,UAClF,WAAW,yBAAyB;AAAA,QACtC,CAAC;AACD,sBAAc,QAAQ,kCAAkC;AAAA,UACtD,KAAK,eAAe;AAAA,UACpB,WAAW,eAAe;AAAA,UAC1B,eAAe,eAAe;AAAA,QAChC,CAAC;AACD,iBAAS,KAAK,KAAK;AAAA,UACjB,SAAS;AAAA,UACT,KAAK,eAAe;AAAA,UACpB,WAAW,eAAe;AAAA,UAC1B,eAAe,eAAe;AAAA,QAChC,CAAC;AACD,oCAA4B,aAAa,GAAG;AAAA,MAC9C,SAAS,KAAK;AACZ,uBAAe,oBAAoB,WAAW,aAAa;AAAA,UACzD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,sBAAc,SAAS,iCAAiC;AAAA,UACtD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,iBAAS,KAAK,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,SAAS,iDAAiD,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC5G,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,UAAU,iBAAiB,IAAI,KAAK,yBAAyB,GAAG;AACjF,YAAM,cAAc,uBAAuB,IAAI,OAAO;AACtD,oBAAc,QAAQ,uBAAuB;AAC7C,qBAAe,oBAAoB,SAAS,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC5F,UAAI;AACF,YAAI;AACJ,YAAI;AACF,oBAAU,MAAM,kBAAkB,GAAG;AAAA,QACvC,QAAQ;AACN,wBAAc,QAAQ,2BAA2B;AACjD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,eAAe,CAAC;AACxE,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,iBAAiB,0BAA0B,OAAO;AACxD,YAAI,CAAC,gBAAgB;AACnB,wBAAc,QAAQ,6BAA6B;AACnD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,iBAAiB,CAAC;AAC1E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,oBAAY,iBAAiB,eAAe;AAC5C,oBAAY,aAAa,eAAe;AAExC,YAAI,eAAe,eAAe,YAAY,MAAM,yBAAyB;AAC3E,wBAAc,QAAQ,8BAA8B;AACpD,sCAA4B,aAAa,KAAK,EAAE,QAAQ,kBAAkB,CAAC;AAC3E,mBAAS,KAAK,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AACD;AAAA,QACF;AAEA,cAAM,kBAAkB,MAAM;AAAA,UAC5B;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AACA,YAAI,CAAC,iBAAiB;AACpB,wBAAc,QAAQ,uCAAuC;AAC7D,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI,IAAI,yBAAyB,CAAC;AAClC,sCAA4B,aAAa,KAAK,EAAE,QAAQ,2BAA2B,CAAC;AACpF;AAAA,QACF;AAEA,uBAAe,gBAAgB,SAAS,aAAa,EAAE,QAAQ,iBAAiB,CAAC;AACjF,cAAM,kBAAkB,MAAM,8BAA8B,gBAAgB;AAAA,UAC1E,gBAAgB;AAAA,UAChB;AAAA,QACF,CAAC;AACD,sBAAc,QAAQ,iCAAiC;AAAA,UACrD,QAAQ,gBAAgB;AAAA,QAC1B,CAAC;AACD,uBAAe,gBAAgB,UAAU,aAAa,EAAE,QAAQ,gBAAgB,OAAO,CAAC;AAExF,cAAM,cAAc;AAAA,UAClB,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AACA,YAAI,aAAa;AACf,wBAAc,QAAQ,6BAA6B;AAAA,YACjD,QAAQ,YAAY;AAAA,UACtB,CAAC;AACD,gBAAMA,mBAAkB,4BAA4B;AAAA,YAClD,aAAa,YAAY;AAAA,YACzB,iBAAiB,gBAAgB;AAAA,YACjC,iBAAiB,gBAAgB;AAAA,UACnC,CAAC;AACD,cAAI,UAAU,YAAY,QAAQA,gBAAe;AACjD,cAAI,IAAI,YAAY,QAAQ;AAC5B,sCAA4B,aAAa,YAAY,QAAQ,EAAE,QAAQ,eAAe,CAAC;AACvF;AAAA,QACF;AAEA,cAAM,kBAAkB,4BAA4B,eAAe;AACnE,YAAI,UAAU,gBAAgB,QAAQ,eAAe;AACrD,YAAI,IAAI,gBAAgB,QAAQ;AAChC,oCAA4B,aAAa,gBAAgB,MAAM;AAAA,MACjE,SAAS,KAAK;AACZ,uBAAe,oBAAoB,WAAW,aAAa;AAAA,UACzD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,sBAAc,SAAS,+BAA+B;AAAA,UACpD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD,iBAAS,KAAK,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,SAAS,+CAA+C,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC1G,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,QAAI,IAAI,QAAQ,aAAa,IAAI,KAAK,WAAW,UAAU,GAAG;AAC5D,YAAM,MAAM,IAAI,IAAI,IAAI,KAAK,kBAAkB;AAC/C,YAAM,OAAO,IAAI,aAAa,IAAI,MAAM,MAAM;AAE9C,YAAM,WAAoC;AAAA,QACxC,QAAQ;AAAA,QACR,QAAQ,QAAQ;AAAA,QAChB,mBAAmB,gCAAgC,KAAK,EAAE,SAAS;AAAA,MACrE;AAEA,UAAI,MAAM;AACR,YAAI;AACF,gBAAM,cAAc,MAAM,eAAe,aAAa;AACtD,mBAAS,UAAU,YAAY;AAC/B,mBAAS,QAAQ,YAAY;AAC7B,mBAAS,UAAU,YAAY;AAAA,QACjC,QAAQ;AACN,mBAAS,eAAe;AAAA,QAC1B;AAAA,MACF;AAEA,eAAS,KAAK,KAAK,QAAQ;AAC3B;AAAA,IACF;AAEA,aAAS,KAAK,KAAK;AAAA,MACjB,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AAKD,QAAM,YAAY,CAAC,YAAmC;AACpD,WAAO,IAAI,QAAc,CAAC,gBAAgB,kBAAkB;AAC1D,YAAM,UAAU,OAAO,QAA+B;AACpD,eAAO,eAAe,SAAS,OAAO;AAEtC,YAAI,IAAI,SAAS,cAAc;AAE7B,gBAAMC,kBAAiB,MAAM,mBAAmB,UAAU;AAC1D,cAAIA,iBAAgB;AAElB,oBAAQ,IAAI,gDAAgD,UAAU,WAAW;AACjF,0BAAc,EAAE,MAAM,kBAAkB,QAAQA,gBAAe,CAAC;AAChE;AAAA,UACF;AAGA,cAAI,UAAU,qBAAqB;AACjC,oBAAQ;AAAA,cACN,qBAAqB,UAAU,8BAA8B,mBAAmB,eAAe,OAAO,IAAI,mBAAmB;AAAA,YAC/H;AACA,0BAAc,EAAE,MAAM,SAAS,QAAQ,CAAC;AACxC;AAAA,UACF;AAGA,kBAAQ;AAAA,YACN,qBAAqB,UAAU,uBAAuB,mBAAmB;AAAA,UAC3E;AACA,wBAAc,GAAG;AACjB;AAAA,QACF;AAEA,sBAAc,GAAG;AAAA,MACnB;AAEA,aAAO,KAAK,SAAS,OAAO;AAC5B,aAAO,OAAO,YAAY,aAAa,MAAM;AAC3C,eAAO,eAAe,SAAS,OAAO;AACtC,uBAAe;AAAA,MACjB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAGA,MAAI;AACJ,WAAS,UAAU,GAAG,WAAW,qBAAqB,WAAW;AAC/D,QAAI;AACF,YAAM,UAAU,OAAO;AACvB;AAAA,IACF,SAAS,KAAc;AACrB,YAAM,QAAQ;AAEd,UAAI,MAAM,SAAS,oBAAoB,MAAM,QAAQ;AAEnD,cAAMF,WAAU,oBAAoB,UAAU;AAC9C,gBAAQ,UAAU,UAAU;AAC5B,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAAA;AAAA,UACA,eAAe,MAAM;AAAA,UACrB;AAAA,UACA,OAAO,YAAY;AAAA,UAEnB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,SAAS;AAE1B,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAC3D;AAAA,MACF;AAGA,kBAAY;AACZ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW;AACb,UAAM;AAAA,EACR;AAGA,QAAM,OAAO,OAAO,QAAQ;AAC5B,QAAM,OAAO,KAAK;AAClB,QAAM,UAAU,oBAAoB,IAAI;AAExC,UAAQ,UAAU,IAAI;AAItB,SAAO,GAAG,SAAS,CAAC,QAAQ;AAC1B,YAAQ,MAAM,sCAAsC,IAAI,OAAO,EAAE;AACjE,YAAQ,UAAU,GAAG;AAAA,EACvB,CAAC;AAGD,SAAO,GAAG,eAAe,CAAC,KAAK,WAAW;AACxC,YAAQ,MAAM,8BAA8B,IAAI,OAAO,EAAE;AAEzD,QAAI,OAAO,YAAY,CAAC,OAAO,WAAW;AACxC,aAAO,IAAI,kCAAkC;AAAA,IAC/C;AAAA,EACF,CAAC;AAGD,SAAO,GAAG,cAAc,CAAC,WAAW;AAClC,gBAAY,IAAI,MAAM;AAGtB,WAAO,WAAW,GAAO;AAEzB,WAAO,GAAG,WAAW,MAAM;AACzB,cAAQ,MAAM,oDAAoD;AAClE,aAAO,QAAQ;AAAA,IACjB,CAAC;AAED,WAAO,GAAG,SAAS,CAAC,QAAQ;AAC1B,cAAQ,MAAM,8BAA8B,IAAI,OAAO,EAAE;AAAA,IAC3D,CAAC;AAED,WAAO,GAAG,SAAS,MAAM;AACvB,kBAAY,OAAO,MAAM;AAAA,IAC3B,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,eAAe,QAAQ;AAAA,IACvB;AAAA,IACA,OAAO,MACL,IAAI,QAAc,CAAC,KAAK,QAAQ;AAC9B,YAAM,UAAU,WAAW,MAAM;AAC/B,YAAI,IAAI,MAAM,qCAAqC,CAAC;AAAA,MACtD,GAAG,GAAI;AAGP,iBAAW,UAAU,aAAa;AAChC,eAAO,QAAQ;AAAA,MACjB;AACA,kBAAY,MAAM;AAClB,aAAO,MAAM,CAAC,QAAQ;AACpB,qBAAa,OAAO;AACpB,YAAI,KAAK;AACP,cAAI,GAAG;AAAA,QACT,OAAO;AACL,cAAI;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACL;AACF;;;Ae16CA,SAAS,aAAAG,YAAW,YAAAC,WAAU,SAAAC,cAAa;AAC3C,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AACxB,SAAS,oBAAoB,uBAAAC,4BAA2B;;;AC3BjD,SAAS,wBAAwB,OAAmD;AACzF,SAAO,OAAO,UAAU,YAAY,sBAAsB,KAAK,MAAM,KAAK,CAAC;AAC7E;;;AD6BA,IAAM,oBAAoBC,MAAKC,SAAQ,GAAG,aAAa,UAAU;AACjE,IAAM,qBAAqBD,MAAK,mBAAmB,YAAY;AAC/D,IAAM,aAAaA,MAAKC,SAAQ,GAAG,aAAa,cAAc,QAAQ;AACtE,IAAM,cAAcD,MAAK,YAAY,YAAY;AAQjD,eAAe,kBAA+C;AAE5D,aAAW,QAAQ,CAAC,aAAa,kBAAkB,GAAG;AACpD,QAAI;AACF,YAAM,OAAO,MAAME,UAAS,MAAM,OAAO,GAAG,KAAK;AACjD,UAAI,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,IAAI;AAC7C,gBAAQ,IAAI,mDAA8C,IAAI,EAAE;AAChE,eAAO;AAAA,MACT;AACA,cAAQ,KAAK,yEAAoE,IAAI,EAAE;AAAA,IACzF,SAAS,KAAK;AAEZ,UAAK,IAA8B,SAAS,UAAU;AACpD,gBAAQ;AAAA,UACN,kDAA6C,IAAI,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QACxG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,eAAe,wBAAmE;AAChF,QAAM,MAAM,mBAAmB;AAC/B,QAAM,UAAUC,qBAAoB,GAAG;AAGvC,QAAMC,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAG3C,QAAMC,WAAU,aAAa,MAAM,MAAM,EAAE,MAAM,IAAM,CAAC;AAGxD,MAAI;AACF,UAAM,gBAAgB,MAAMH,UAAS,aAAa,OAAO,GAAG,KAAK;AACjE,QAAI,iBAAiB,KAAK;AACxB,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AACA,YAAQ,IAAI,oDAA+C,WAAW,EAAE;AAAA,EAC1E,SAAS,KAAK;AACZ,UAAM,IAAI;AAAA,MACR,gDAAgD,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAClG;AAAA,EACF;AAEA,SAAO,EAAE,KAAK,SAAS,QAAQ,QAAQ;AACzC;AAWA,eAAsB,6BAInB;AAED,QAAM,SAAS,QAAQ,IAAI,uBAAuB,KAAK;AACvD,MAAI,wBAAwB,MAAM,GAAG;AACnC,UAAM,UAAUC,qBAAoB,MAAM;AAC1C,WAAO,EAAE,KAAK,QAAQ,SAAS,QAAQ,SAAS,QAAQ,MAAM;AAAA,EAChE;AAGA,QAAM,QAAQ,MAAM,gBAAgB;AACpC,MAAI,OAAO;AACT,UAAM,UAAUA,qBAAoB,KAAsB;AAC1D,WAAO,EAAE,KAAK,OAAO,SAAS,QAAQ,SAAS,QAAQ,QAAQ;AAAA,EACjE;AAGA,QAAM,EAAE,KAAK,QAAQ,IAAI,MAAM,sBAAsB;AACrD,SAAO,EAAE,KAAK,SAAS,QAAQ,YAAY;AAC7C;;;AEzHA,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,WAAAG,UAAS,QAAAC,aAAY;AAG9B,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAYD,SAAQ,UAAU;AAGpC,IAAME,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,MAAMA,SAAQD,MAAK,WAAW,MAAM,cAAc,CAAC;AAElD,IAAM,UAAU,IAAI;AACpB,IAAM,aAAa,cAAc,OAAO;;;ACjB/C,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA,cAAAE;AAAA,EACA,eAAe;AAAA,EACf,cAAAC;AAAA,OACK;AACP,SAAS,oBAAAC,mBAAkB,kBAAkB;AAC7C,SAAS,cAAAC,aAAY,OAAO,SAAAC,QAAO,YAAAC,WAAU,WAAAC,UAAS,IAAI,QAAAC,OAAM,aAAAC,kBAAiB;AACjF,SAAS,WAAAC,gBAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AACjD,SAAS,uBAAAC,4BAA2B;;;ACXpC,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,SAAAC,cAAa;AACtB,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAE9B,IAAM,aAAaA,MAAK,aAAa,cAAc,UAAU;AAC7D,IAAM,iBAAiB;AACvB,IAAMC,WAAUJ,eAAc,YAAY,GAAG;AAqH7C,SAAS,cAAc,SAA0B;AAC/C,SAAOG,MAAK,WAAWF,SAAQ,GAAG,UAAU;AAC9C;AAEA,SAAS,SAAiB;AACxB,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAEA,SAAS,uBAAuB,OAAuB;AACrD,SAAO,MAAM,KAAK,EAAE,YAAY;AAClC;AAEA,eAAsB,qBAAqB,SAA2C;AACpF,QAAM,SAAS,cAAc,OAAO;AASpC,MAAI,KAAoB;AAExB,QAAM,cAAc,YAA2B;AAC7C,QAAI,GAAI;AACR,QAAI,QAAQ,IAAI,8BAA8B,KAAK;AACjD,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,UAAMF,OAAMG,SAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAIhD,UAAM,YAAYE,SAAQ,aAAa;AAGvC,UAAM,mBAAmB,UAAU;AACnC,QAAI,CAAC,kBAAkB;AACrB,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAEA,UAAM,SAAS,IAAI,iBAAiB,MAAM;AAC1C,WAAO,KAAK,0BAA0B;AACtC,WAAO,KAAK,yBAAyB;AAErC,WAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAiFX;AAGD,WAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAYX;AAED,UAAM,sBAAsB,CAAC,YAAoB,YAA0B;AACzE,UAAI;AACF,eAAO,KAAK,qCAAqC,UAAU,IAAI,OAAO,EAAE;AAAA,MAC1E,SAAS,OAAO;AACd,cAAM,UAAU,iBAAiB,QAAQ,MAAM,QAAQ,YAAY,IAAI,OAAO,KAAK;AACnF,YAAI,CAAC,QAAQ,SAAS,uBAAuB,GAAG;AAC9C,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,wBAAoB,YAAY,MAAM;AACtC,wBAAoB,gBAAgB,MAAM;AAC1C,wBAAoB,uBAAuB,MAAM;AACjD,wBAAoB,mBAAmB,SAAS;AAChD,wBAAoB,uBAAuB,MAAM;AAEjD,WACG;AAAA,MACC;AAAA;AAAA;AAAA,IAGF,EACC,IAAI,gBAAgB,OAAO,CAAC;AAC/B,SAAK;AAAA,EACP;AAEA,QAAM,OAAO,OAAU,IAAa,aAA4B;AAC9D,QAAI;AACF,YAAM,YAAY;AAClB,aAAO,GAAG;AAAA,IACZ,SAAS,OAAO;AACd,UAAI,QAAQ,IAAI,6BAA6B,KAAK;AAChD,cAAM;AAAA,MACR;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,cAAc,OAAO,QAAQ;AAC3B,YAAM,KAAK,MAAM;AACf,cAAM,0BAA0B,uBAAuB,IAAI,cAAc;AACzE,cAAM,KAAK,OAAO;AAClB,WACG;AAAA,UACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYF,EACC;AAAA,UACC,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,UACA,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,MACJ,GAAG,MAAS;AAAA,IACd;AAAA,IACA,uBAAuB,OAAO,cAC5B,KAAK,MAAM;AACT,YAAM,MAAM,GACT;AAAA,QACC;AAAA;AAAA;AAAA;AAAA;AAAA,MAKF,EACC,IAAI,SAAS;AAChB,aAAO,OAAO;AAAA,IAChB,GAAG,IAAI;AAAA,IACT,gBAAgB,OAAO,aACrB,KAAK,MAAM;AACT,YAAM,MAAM,GACT;AAAA,QACC;AAAA;AAAA;AAAA;AAAA,MAIF,EACC,IAAI,QAAQ;AACf,aAAO,OAAO;AAAA,IAChB,GAAG,IAAI;AAAA,IACT,eAAe,OAAO,QAAQ;AAC5B,YAAM,KAAK,MAAM;AACf,cAAM,0BAA0B,uBAAuB,IAAI,cAAc;AACzE,cAAM,KAAK,OAAO;AAClB,WACG;AAAA,UACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUF,EACC;AAAA,UACC,IAAI;AAAA,UACJ;AAAA,UACA,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI,cAAc;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AAAA,MACJ,GAAG,MAAS;AAAA,IACd;AAAA,IACA,eAAe,OAAO,QAAQ;AAC5B,YAAM,KAAK,MAAM;AACf,cAAM,KAAK,OAAO;AAClB,WACG;AAAA,UACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUF,EACC;AAAA,UACC,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,MACJ,GAAG,MAAS;AAAA,IACd;AAAA,IACA,eAAe,OAAO,WACpB,KAAK,MAAM;AACT,YAAM,MAAM,GAAI,QAAQ,yCAAyC,EAAE,IAAI,MAAM;AAC7E,aAAO,OAAO,IAAI,WAAW,CAAC,IAAI;AAAA,IACpC,GAAG,KAAK;AAAA,IACV,qBAAqB,OAAO,cAC1B,KAAK,MAAM;AACT,YAAM,MAAM,GACT;AAAA,QACC;AAAA,MACF,EACC,IAAI,SAAS;AAChB,UAAI,CAAC,IAAK,QAAO;AACjB,aAAO,EAAE,QAAQ,IAAI,SAAS,UAAU,IAAI,UAAU;AAAA,IACxD,GAAG,IAAI;AAAA,IACT,iBAAiB,OAAO,QAAQ;AAC9B,YAAM,KAAK,MAAM;AACf,cAAM,KAAK,OAAO;AAClB,cAAM,mBAAmB,oBAAI,IAAI,CAAC,aAAa,UAAU,aAAa,WAAW,CAAC;AAClF,WACG;AAAA,UACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAiBF,EACC;AAAA,UACC,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI,YAAY;AAAA,UAChB,IAAI,gBAAgB;AAAA,UACpB,IAAI,uBAAuB;AAAA,UAC3B,IAAI,mBAAmB;AAAA,UACvB,IAAI,uBAAuB;AAAA,UAC3B,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI,WAAW,YAAY,KAAK;AAAA,UAChC,iBAAiB,IAAI,IAAI,MAAM,IAAI,KAAK;AAAA,UACxC;AAAA,UACA;AAAA,QACF;AAAA,MACJ,GAAG,MAAS;AAAA,IACd;AAAA,IACA,mBAAmB,OAAO,gBACxB,KAAK,MAAM;AACT,YAAM,MAAM,GACT;AAAA,QACC;AAAA;AAAA;AAAA;AAAA,MAIF,EACC,IAAI,WAAW;AAmBlB,aAAO,OAAO;AAAA,IAChB,GAAG,IAAI;AAAA,IACT,eAAe,OAAO,YACpB,KAAK,MAAM;AACT,YAAM,MAAM,GACT;AAAA,QACC;AAAA,MACF,EACC,IAAI,OAAO;AACd,YAAM,SAAS,GACZ;AAAA,QACC;AAAA,MACF,EACC,IAAI,OAAO;AAQd,UAAI,CAAC,OAAO,CAAC,OAAQ,QAAO;AAC5B,UAAI,OAAO,WAAW,QAAQ,OAAO,aAAa,QAAQ,OAAO,WAAW;AAC1E,eAAO;AACT,aAAO;AAAA,QACL;AAAA,QACA,cAAc,OAAO,IAAI,MAAM;AAAA,QAC/B,eAAe,IAAI;AAAA,QACnB,UAAU,OAAO;AAAA,QACjB,cAAc,OAAO;AAAA,QACrB,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,MACnB;AAAA,IACF,GAAG,IAAI;AAAA,IACT,oBAAoB,OAAO,QAAQ;AACjC,YAAM,KAAK,MAAM;AACf,cAAM,0BAA0B,uBAAuB,IAAI,cAAc;AACzE,cAAM,KAAK,OAAO;AAClB,WACG;AAAA,UACC;AAAA;AAAA,QAEF,EACC;AAAA,UACCN,YAAW;AAAA,UACX,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA,IAAI,aAAa;AAAA,QACnB;AAAA,MACJ,GAAG,MAAS;AAAA,IACd;AAAA,IACA,qBAAqB,OAAO,WAC1B,KAAK,MAAM;AACT,YAAM,0BAA0B,uBAAuB,OAAO,aAAa;AAC3E,YAAM,QAAQ,OAAO,KAAK,IAAI,KAAK,OAAO,EAAE,EAAE,YAAY,IAAI;AAC9D,YAAM,MACJ,OAAO,UAAU,CAAC,QACb,GACE;AAAA,QACC;AAAA;AAAA;AAAA;AAAA;AAAA,MAKF,EACC,IAAI,yBAAyB,OAAO,YAAY,IAWlD,GACE;AAAA,QACC;AAAA;AAAA;AAAA;AAAA;AAAA,MAKF,EACC,IAAI,yBAAyB,OAAO,cAAc,KAAK;AAYhE,UAAI,CAAC,IAAK,QAAO;AACjB,aAAO;AAAA,QACL,gBAAgB,IAAI;AAAA,QACpB,cAAc,IAAI;AAAA,QAClB,UAAU,IAAI;AAAA,QACd,WAAW,IAAI;AAAA,QACf,SAAS,IAAI;AAAA,QACb,eAAe,IAAI;AAAA,QACnB,WAAW,IAAI;AAAA,MACjB;AAAA,IACF,GAAG,IAAI;AAAA,IACT,0BAA0B,OAAO,eAAe,iBAC9C,KAAK,MAAM;AACT,YAAM,0BAA0B,uBAAuB,aAAa;AACpE,YAAM,MAAM,GACT;AAAA,QACC;AAAA;AAAA;AAAA,MAGF,EACC,IAAI,yBAAyB,YAAY;AAC5C,aAAO,OAAO,KAAK,OAAO,CAAC;AAAA,IAC7B,GAAG,CAAC;AAAA,EACR;AACF;;;AD3kBA,IAAM,6BAA6B,oBAAI,IAAqB,CAAC,UAAU,OAAO,CAAC;AAC/E,IAAM,qBAAqBO,MAAK,aAAa,cAAc,QAAQ;AACnE,IAAM,qBAAqBA,MAAKC,SAAQ,GAAG,kBAAkB;AAC7D,IAAM,qBAAqBD,MAAK,aAAa,cAAc,YAAY;AACvE,IAAM,qBAAqBA,MAAK,aAAa,cAAc,aAAa;AACxE,IAAM,8BAA8BA,MAAK,aAAa,YAAY,YAAY;AAC9E,IAAM,gCAAgCA,MAAK,aAAa,cAAc,UAAU,YAAY;AAC5F,IAAM,0BAA0B;AAChC,IAAM,iCAAiC;AACvC,IAAM,+BAA+B;AAIrC,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB,KAAK,OAAO;AAEvC,IAAM,yBACJ;AACF,IAAM,kBAAkB;AACxB,IAAM,0BACJ;AACF,IAAM,yBAAyB,oBAAI,IAAI,CAAC,QAAQ,CAAC;AACjD,IAAM,sBAAsB,oBAAI,IAAI,CAAC,OAAO,CAAC;AAC7C,IAAM,0BAA0B,oBAAI,IAAI,CAAC,QAAQ,CAAC;AAClD,IAAM,mCAAmC,oBAAI,IAAI,CAAC,UAAU,OAAO,CAAC;AACpE,IAAM,qBAAqB,oBAAI,IAAI,CAAC,UAAU,UAAU,CAAC;AAMlD,SAAS,YAAY,MAAsB;AAChD,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,YAAY,KAAK;AACnB,WAAOC,SAAQ;AAAA,EACjB;AACA,MAAI,QAAQ,WAAW,IAAI,KAAK,QAAQ,WAAW,KAAK,GAAG;AACzD,WAAOD,MAAKC,SAAQ,GAAG,QAAQ,MAAM,CAAC,CAAC;AAAA,EACzC;AACA,SAAO;AACT;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAiKX,IAAM,iCAAN,cAA6C,MAAM;AAAA,EACjD,YAAY,UAA2B;AACrC,UAAM,oCAAoC,QAAQ,EAAE;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAEA,SAAS,WAAW,OAAuB;AACzC,QAAM,KAAK,QAAQ;AACnB,QAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,QAAQ,UAAU,EAAE;AAChD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,SAAS,GAAG,IAAI,QAAQ,GAAG,KAAK;AAC/C;AAEA,SAAS,oBAAoB,OAAuB;AAClD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,SAAS,EAAG,QAAO;AAC/B,MACG,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAC/C,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAChD;AACA,WAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAyB;AAChD,QAAM,SAAS,MAAM,MAAM,sBAAsB;AACjD,MAAI,CAAC,QAAQ;AACX,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAyB;AAC7C,SAAO,gBAAgB,KAAK,EAAE,IAAI,CAAC,UAAU,oBAAoB,KAAK,CAAC;AACzE;AAEA,SAAS,sBACP,QACA,eAAoC,oBAAI,IAAI,GACb;AAC/B,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,SAAiC,CAAC;AACxC,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;AACzC,UAAM,WAAW,OAAO,CAAC;AACzB,QAAI,CAAC,SAAS,WAAW,IAAI,GAAG;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,MAAM,SAAS,MAAM,CAAC,EAAE,YAAY,EAAE,QAAQ,MAAM,GAAG;AAC7D,UAAM,QAAQ,OAAO,IAAI,CAAC;AAC1B,QAAI,CAAC,SAAS,MAAM,WAAW,IAAI,GAAG;AACpC,UAAI,aAAa,IAAI,GAAG,GAAG;AACzB,eAAO,GAAG,IAAI;AACd;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,WAAO,GAAG,IAAI;AACd,SAAK;AAAA,EACP;AACA,SAAO;AACT;AAEA,SAAS,gBACP,OACA,eAAoC,oBAAI,IAAI,GACb;AAC/B,QAAM,SAAS,aAAa,KAAK;AACjC,SAAO,sBAAsB,QAAQ,YAAY;AACnD;AAEA,SAAS,oBACP,OAC4D;AAC5D,QAAM,YAAY,MAAM,YAAY,GAAG,KAAK;AAC5C,QAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,KAAK,MAAM,IAAI,KAAK;AAE1B,MAAI,aAAa,KAAM,QAAO;AAC9B,MAAI,CAAC,aAAa,CAAC,KAAM,QAAO;AAChC,MAAI,UAAU,GAAI,QAAO;AAEzB,MAAI,UAAW,QAAO,EAAE,UAAU;AAClC,SAAO,EAAE,cAAc,EAAE,MAAa,QAAQ,GAAG,EAAE;AACrD;AAEA,SAAS,+BACP,OACA,UACkC;AAClC,QAAM,gBAAgB,MAAM,gBAAgB,GAAG,KAAK;AACpD,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAM,UAAU,KAAK,KAAK,MAAM,QAAQ,KAAK,KAAK;AACnE,MAAI,CAAC,SAAS,WAAW;AACvB,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAO,0BAA0B;AAAA,IAC/B,gBAAgB;AAAA,IAChB,YAAY,SAAS;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,sBAAsB,OAAqD;AAClF,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,MAAI,CAAC,mBAAmB,IAAI,UAAU,GAAG;AACvC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAA2C;AACtE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAQ,KAAK,OAAO,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,SAAS,OAAO,SAAS,SAAS,EAAE;AAC1C,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAA0D;AACzF,QAAM,iBAAiB,MAAM,UAAU;AACvC,QAAM,sBAAsB,OAAO,MAAM,iBAAiB;AAC1D,QAAM,iBAAiB,OAAO,MAAM,iBAAiB,MAAM;AAE3D,MAAI,CAAC,mBAAmB,uBAAuB,iBAAiB;AAC9D,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB,sBAAsB,MAAM,YAAY;AACnE,MAAI,uBAAuB,MAAM;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,uBAAuB,oBAAoB,MAAM,iBAAiB,CAAC;AACzE,MAAI,yBAAyB,MAAM;AACjC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,yBAAyB,aAAa,sBAAsB,cAAc,YAAY;AAC/F,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,cAAc,uBAAuB,SAAY,SAAY;AAAA,IAC7D,gBAAgB,yBAAyB,SAAY,SAAY;AAAA,EACnE;AACF;AAEA,IAAM,8BACJ;AAEF,SAAS,uBAAuB,MAAuB;AACrD,QAAM,SAAS,gBAAgB,QAAQ,EAAE;AACzC,QAAM,WAAqB,CAAC;AAC5B,WAAS,MAAM,GAAG,MAAM,OAAO,QAAQ,OAAO,GAAG;AAC/C,UAAM,QAAQ,OAAO,GAAG;AACxB,UAAM,aAAa,MAAM,YAAY;AACrC,QAAI,eAAe,WAAW;AAC5B;AAAA,IACF;AACA,QAAI,eAAe,oBAAoB,eAAe,qBAAqB;AACzE,aAAO;AACP;AAAA,IACF;AACA,aAAS,KAAK,KAAK;AAAA,EACrB;AACA,SAAO,SAAS,KAAK,GAAG;AAC1B;AAEA,SAAS,eAAe,MAAgC;AACtD,QAAM,UAAU,MAAM,KAAK,KAAK;AAChC,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AAEA,QAAM,WAAW,QAAQ,QAAQ,GAAG;AACpC,QAAM,cAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,GAAG,QAAQ,GAAG,YAAY;AACxF,QAAM,OAAO,aAAa,KAAK,KAAK,QAAQ,MAAM,WAAW,CAAC;AAE9D,MAAI,eAAe,QAAQ;AACzB,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AAEA,MAAI,eAAe,UAAU;AAC3B,UAAM,SAAS,aAAa,IAAI;AAChC,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO,EAAE,MAAM,UAAU;AAAA,IAC3B;AACA,UAAM,eAAe,OAAO,CAAC,KAAK;AAClC,QAAI,CAAC,cAAc;AACjB,aAAO,EAAE,MAAM,UAAU;AAAA,IAC3B;AACA,UAAM,kBAAkB,OAAO,MAAM,CAAC;AACtC,UAAM,QACJ,gBAAgB,WAAW,IACtB,CAAC,IACF,sBAAsB,iBAAiB,mBAAmB;AAChE,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,MAAM,iBAAiB;AAAA,IAClC;AACA,UAAM,YAAY,wBAAwB,KAAK;AAC/C,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,MAAM,uBAAuB;AAAA,IACxC;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,cAAc,MAAM,MAAM,KAAK,KAAK;AAAA,MACpC,GAAG;AAAA,IACL;AAAA,EACF;AAEA,MAAI,eAAe,iBAAiB;AAClC,UAAM,QAAQ,gBAAgB,IAAI;AAClC,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,MAAM,wBAAwB;AAAA,IACzC;AACA,UAAM,KAAK,OAAO,WAAW,MAAM,MAAM,EAAE;AAC3C,UAAM,UAAU,8BAA8B;AAAA,MAC5C,gBAAgB,MAAM,gBAAgB;AAAA,MACtC,WAAW,MAAM,WAAW;AAAA,MAC5B,gBAAgB,MAAM,gBAAgB;AAAA,MACtC;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,QAAQ,MAAM;AAAA,IAChB,CAAC;AACD,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,MAAM,wBAAwB;AAAA,IACzC;AACA,WAAO,EAAE,MAAM,iBAAiB,qBAAqB,QAAQ;AAAA,EAC/D;AAEA,MAAI,eAAe,UAAU;AAC3B,UAAM,QAAQ,gBAAgB,MAAM,mBAAmB;AACvD,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,MAAM,iBAAiB;AAAA,IAClC;AACA,UAAM,YAAY,wBAAwB,KAAK;AAC/C,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,MAAM,uBAAuB;AAAA,IACxC;AAEA,UAAM,UAAU,MAAM,UAAU,GAAG,KAAK;AACxC,UAAM,gBAAgB,MAAM,gBAAgB,GAAG,KAAK;AACpD,UAAM,WAAW,MAAM,WAAW,GAAG,KAAK;AAC1C,UAAM,eAAe,MAAM,gBAAgB,GAAG,KAAK;AAEnD,QAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,YAAY,CAAC,cAAc;AAC5D,aAAO,EAAE,MAAM,iBAAiB;AAAA,IAClC;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,cAAc,MAAM,MAAM,KAAK,KAAK;AAAA,MACpC,GAAG;AAAA,MACH,eAAe;AAAA,QACb,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,MAAM;AACvB,UAAM,QAAQ,gBAAgB,MAAM,sBAAsB;AAC1D,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,MAAM,aAAa;AAAA,IAC9B;AACA,UAAM,WAAW,oBAAoB,KAAK;AAC1C,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,MAAM,aAAa;AAAA,IAC9B;AACA,UAAM,UAAU,+BAA+B,OAAO,QAAQ;AAC9D,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,MAAM,aAAa;AAAA,IAC9B;AACA,WAAO,EAAE,MAAM,MAAM,sBAAsB,SAAS,cAAc,SAAS,aAAa;AAAA,EAC1F;AAEA,MAAI,eAAe,YAAY;AAC7B,UAAM,QAAQ,gBAAgB,MAAM,gCAAgC;AACpE,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,MAAM,mBAAmB;AAAA,IACpC;AACA,UAAM,YAAY,wBAAwB,KAAK;AAC/C,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,MAAM,yBAAyB;AAAA,IAC1C;AACA,UAAM,WAAW,oBAAoB,KAAK;AAC1C,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,MAAM,mBAAmB;AAAA,IACpC;AACA,UAAM,UAAU,+BAA+B,OAAO,QAAQ;AAC9D,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,MAAM,mBAAmB;AAAA,IACpC;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,sBAAsB;AAAA,MACtB,cAAc,SAAS;AAAA,MACvB,GAAG;AAAA,IACL;AAAA,EACF;AAEA,MAAI,eAAe,UAAU;AAC3B,UAAM,QAAQ,gBAAgB,MAAM,sBAAsB;AAC1D,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,MAAM,iBAAiB;AAAA,IAClC;AACA,UAAM,WAAW,oBAAoB,KAAK;AAC1C,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,MAAM,iBAAiB;AAAA,IAClC;AACA,UAAM,UAAU,+BAA+B,OAAO,QAAQ;AAC9D,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,MAAM,iBAAiB;AAAA,IAClC;AACA,WAAO,EAAE,MAAM,UAAU,sBAAsB,SAAS,cAAc,SAAS,aAAa;AAAA,EAC9F;AAEA,MAAI,eAAe,aAAa;AAC9B,UAAM,QAAQ,gBAAgB,MAAM,uBAAuB;AAC3D,UAAM,cAAc,QAAQ,cAAc,GAAG,KAAK;AAClD,QAAI,CAAC,aAAa;AAChB,aAAO,EAAE,MAAM,oBAAoB;AAAA,IACrC;AACA,WAAO,EAAE,MAAM,aAAa,aAAa,QAAQ,OAAO,WAAW,OAAO;AAAA,EAC5E;AAEA,SAAO,EAAE,MAAM,UAAU;AAC3B;AAEA,SAAS,qBAAqB,SAA0B;AACtD,SAAOD,MAAK,WAAWC,SAAQ,GAAG,kBAAkB;AACtD;AAEA,SAAS,qBAAqB,SAA0B;AACtD,SAAOD,MAAK,WAAWC,SAAQ,GAAG,kBAAkB;AACtD;AAEA,eAAe,oBAAoB,MAAc,SAAmC;AAClF,QAAM,gBAAgB,qBAAqB,OAAO;AAClD,QAAMC,OAAMC,SAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,QAAMC,YAAW,eAAe,GAAG,IAAI;AAAA,GAAM,OAAO;AACpD,SAAO;AACT;AAEA,eAAe,wBAAwB,YAAqC;AAC1E,QAAM,cAAc,MAAM,MAAM,UAAU;AAC1C,MAAI,YAAY,OAAO,KAAK,YAAY,eAAe,GAAG;AACxD,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI,CAAC,YAAY,YAAY,GAAG;AAC9B,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,MAAI,QAAQ;AACZ,QAAM,UAAU,MAAMC,SAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACjE,aAAW,SAAS,SAAS;AAC3B,aAAS,MAAM,wBAAwBL,MAAK,YAAY,MAAM,IAAI,CAAC;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,QAAgB,SAAsC;AACnF,MAAI,OAAO,QAAQ,uBAAuB,UAAU;AAClD,WAAO,QAAQ;AAAA,EACjB;AACA,QAAM,QAAQ,WAAW,MAAM;AAC/B,SAAO,MAAM,SAAS,MAAM;AAC9B;AAEA,eAAe,WAAW,aAAqB,YAAmC;AAChF,QAAM,YAAYG,SAAQ,UAAU;AACpC,QAAM,aAAaG,UAAS,UAAU;AAEtC,QAAM,IAAI,QAAc,CAAC,gBAAgB,kBAAkB;AACzD,QAAI,SAAS;AACb,UAAM,QAAQ,MAAM,OAAO,CAAC,QAAQ,aAAa,MAAM,WAAW,UAAU,GAAG;AAAA,MAC7E,OAAO,CAAC,UAAU,UAAU,MAAM;AAAA,IACpC,CAAC;AAED,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AACD,UAAM,GAAG,SAAS,aAAa;AAC/B,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACd,uBAAe;AACf;AAAA,MACF;AACA,oBAAc,IAAI,MAAM,OAAO,KAAK,KAAK,wBAAwB,QAAQ,SAAS,EAAE,CAAC;AAAA,IACvF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,WAAW,UAAmC;AAC3D,QAAM,OAAOC,YAAW,QAAQ;AAChC,QAAM,IAAI,QAAc,CAAC,gBAAgB,kBAAkB;AACzD,UAAM,SAASC,kBAAiB,QAAQ;AACxC,WAAO,GAAG,QAAQ,CAAC,UAAU,KAAK,OAAO,KAAK,CAAC;AAC/C,WAAO,GAAG,SAAS,aAAa;AAChC,WAAO,GAAG,OAAO,MAAM,eAAe,CAAC;AAAA,EACzC,CAAC;AACD,SAAO,KAAK,OAAO,KAAK;AAC1B;AAEA,SAAS,eAAe,SAAsC;AAC5D,QAAM,QAAQ,QAAQ,OAAO,KAAK;AAClC,QAAM,WAAW,QAAQ,eAAe;AACxC,SAAO,GAAG,MAAM,CAAC,IAAI,SAAS,CAAC,EAAE,SAAS,KAAK,CAAC;AAClD;AAEA,eAAsB,kBACpB,eACA,UAA+B,CAAC,GACH;AAC7B,QAAM,WAAW,QAAQ,YAAY,QAAQ;AAC7C,MAAI,CAAC,2BAA2B,IAAI,QAAQ,GAAG;AAC7C,UAAM,IAAI,+BAA+B,QAAQ;AAAA,EACnD;AAEA,QAAM,aAAaC,SAAQ,YAAY,aAAa,CAAC;AACrD,QAAM,cAAc,MAAM,MAAM,UAAU;AAC1C,MAAI,CAAC,YAAY,OAAO,KAAK,CAAC,YAAY,YAAY,GAAG;AACvD,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,QAAM,SAAS,QAAQ,UAAU;AACjC,MAAI;AACJ,MAAI;AACF,eAAW,MAAMC,MAAK,MAAM;AAAA,EAC9B,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,YAAMR,OAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AACvC,iBAAW,MAAMQ,MAAK,MAAM;AAAA,IAC9B,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI,CAAC,SAAS,YAAY,GAAG;AAC3B,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,QAAM,iBAAiB,MAAM,wBAAwB,UAAU;AAC/D,QAAM,qBAAqB,sBAAsB,QAAQ,OAAO;AAChE,QAAM,oBAAoB,iBAAiB;AAC3C,MAAI,qBAAqB,mBAAmB;AAC1C,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,QAAM,WAAW,eAAe,OAAO;AACvC,QAAM,cAAcV,MAAK,QAAQ,QAAQ;AAEzC,MAAI;AACF,UAAM,WAAW,aAAa,UAAU;AACxC,UAAM,eAAe,MAAMU,MAAK,WAAW;AAC3C,UAAM,eAAe,MAAM,WAAW,WAAW;AACjD,UAAM,eAAe,WAAW,aAAa,IAAI;AAEjD,UAAM,gBAAgB,MAAM;AAAA,MAC1B,GAAG,QAAQ,IAAI,YAAY,IAAI,YAAY;AAAA,MAC3C,QAAQ;AAAA,IACV;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,GAAG,aAAa,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAC5D,UAAM;AAAA,EACR;AACF;AAEA,eAAe,2BACb,OACA,SACiB;AACjB,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,cAAc,SAAS;AAAA,MAC7B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,eAAe,SAAS;AAAA,MAC9B,MAAM;AAAA,MACN,MAAM;AAAA,IACR,EAAE,KAAK,GAAG;AAAA,IACV;AAAA,EACF;AACF;AAiCA,SAAS,gBAAgB,MAAoB;AAC3C,QAAM,MAAM,CAAC,UAA0B,MAAM,SAAS,EAAE,SAAS,GAAG,GAAG;AACvE,SAAO;AAAA,IACL,KAAK,YAAY,EAAE,SAAS;AAAA,IAC5B;AAAA,IACA,IAAI,KAAK,SAAS,IAAI,CAAC;AAAA,IACvB;AAAA,IACA,IAAI,KAAK,QAAQ,CAAC;AAAA,IAClB;AAAA,IACA,IAAI,KAAK,SAAS,CAAC;AAAA,IACnB;AAAA,IACA,IAAI,KAAK,WAAW,CAAC;AAAA,IACrB;AAAA,IACA,IAAI,KAAK,WAAW,CAAC;AAAA,EACvB,EAAE,KAAK,EAAE;AACX;AAEA,SAAS,6BAA6B,MAA8C;AAClF,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,CAAC,GAAG,KAAK,KAAK;AACpC,QAAM,kBAAkB,MAAM,CAAC,GAAG,KAAK,KAAK;AAC5C,QAAM,gBAAgB,MAAM,CAAC,GAAG,KAAK,KAAK;AAC1C,QAAM,WAAW,MAAM,CAAC,GAAG,KAAK,KAAK;AACrC,QAAM,eAAe,MAAM,CAAC,GAAG,KAAK,KAAK;AACzC,QAAM,WAAW,MAAM,CAAC,GAAG,KAAK,KAAK;AACrC,QAAM,WAAW,MAAM,CAAC,GAAG,KAAK,KAAK;AACrC,QAAM,eAAe,OAAO,WAAW,eAAe;AAEtD,MAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,YAAY,CAAC,gBAAgB,CAAC,YAAY,CAAC,UAAU;AACtF,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,SAAS,YAAY,KAAK,gBAAgB,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,8BAA8B,MAA+C;AACpF,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AACA,OAAK,MAAM,CAAC,GAAG,KAAK,KAAK,IAAI,YAAY,MAAM,qBAAqB;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,CAAC,GAAG,KAAK,KAAK;AACnC,QAAM,WAAW,MAAM,CAAC,GAAG,KAAK,KAAK;AACrC,QAAM,YAAY,MAAM,CAAC,GAAG,KAAK,KAAK;AACtC,MAAI,CAAC,UAAU,CAAC,YAAY,CAAC,WAAW;AACtC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,+BAA+B,MAA4C;AAClF,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,OAAO;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AAEf,QAAM,SAAS,OAAO,OAAO,WAAW,WAAW,OAAO,OAAO,KAAK,IAAI;AAC1E,QAAM,YAAY,OAAO,OAAO,cAAc,WAAW,OAAO,UAAU,KAAK,IAAI;AACnF,QAAM,WAAW,OAAO,OAAO,aAAa,WAAW,OAAO,SAAS,KAAK,IAAI;AAChF,QAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,QAAQ,KAAK,IAAI;AAC7E,QAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,QAAQ,KAAK,IAAI;AAC7E,QAAM,eAAe,OAAO,OAAO,iBAAiB,WAAW,OAAO,eAAe,OAAO;AAC5F,QAAM,gBAAgB,OAAO,OAAO,kBAAkB,WAAW,OAAO,cAAc,KAAK,IAAI;AAC/F,QAAM,WAAW,OAAO,OAAO,aAAa,WAAW,OAAO,SAAS,KAAK,IAAI;AAChF,QAAM,YAAY,OAAO,OAAO,cAAc,WAAW,OAAO,UAAU,KAAK,IAAI;AACnF,QAAM,WAAW,OAAO,OAAO,aAAa,WAAW,OAAO,SAAS,KAAK,IAAI;AAChF,QAAM,aAAa,OAAO,OAAO,eAAe,WAAW,OAAO,WAAW,KAAK,IAAI;AACtF,QAAM,WAAW,OAAO,OAAO,aAAa,WAAW,OAAO,SAAS,KAAK,IAAI;AAEhF,MACE,CAAC,UACD,CAAC,aACD,CAAC,YACD,CAAC,WACD,CAAC,WACD,CAAC,OAAO,SAAS,YAAY,KAC7B,gBAAgB,KAChB,CAAC,iBACD,CAAC,YACD,CAAC,aACD,CAAC,YACD,CAAC,cACD,CAAC,UACD;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,4BACb,SACA,SACyC;AACzC,QAAM,gBAAgB,qBAAqB,OAAO;AAElD,MAAI;AACJ,MAAI;AACF,cAAU,MAAMC,UAAS,eAAe,OAAO;AAAA,EACjD,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AAEA,QAAM,QAAQ,QACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,WAAS,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG;AACnD,UAAM,SAAS,6BAA6B,MAAM,GAAG,CAAC;AACtD,QAAI,UAAU,OAAO,YAAY,SAAS;AACxC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,wCACb,WACA,SAC0C;AAC1C,QAAM,gBAAgB,qBAAqB,OAAO;AAElD,MAAI;AACJ,MAAI;AACF,cAAU,MAAMA,UAAS,eAAe,OAAO;AAAA,EACjD,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AAEA,QAAM,QAAQ,QACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,WAAS,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG;AACnD,UAAM,SAAS,8BAA8B,MAAM,GAAG,CAAC;AACvD,QAAI,UAAU,OAAO,cAAc,WAAW;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAgC;AACzD,SAAO,KAAK,UAAU,OAAO,KAAK,CAAC;AACrC;AAEA,SAAS,+BAA+B,KAM7B;AACT,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,kBAAkB,IAAI,OAAO;AAAA,IAC7B;AAAA,IACA,kBAAkB,IAAI,aAAa;AAAA,IACnC;AAAA,IACA,kBAAkB,IAAI,QAAQ;AAAA,IAC9B;AAAA,IACA,kBAAkB,IAAI,SAAS;AAAA,IAC/B;AAAA,IACA,kBAAkB,IAAI,YAAY;AAAA,EACpC,EAAE,KAAK,GAAG;AACZ;AAEA,eAAe,4BACb,SACA,SACiB;AACjB,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ,aAAa,SAAS;AAAA,IAChC,EAAE,KAAK,GAAG;AAAA,IACV;AAAA,EACF;AACF;AAEA,eAAe,4BACb,SACA,SACiB;AACjB,QAAM,gBAAgB,qBAAqB,OAAO;AAClD,QAAMT,OAAMC,SAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,QAAMC,YAAW,eAAe,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,GAAM,OAAO;AACvE,SAAO;AACT;AAEA,eAAe,4BAA4B,QAAgB,SAAoC;AAC7F,QAAM,gBAAgB,qBAAqB,OAAO;AAElD,MAAI;AACJ,MAAI;AACF,cAAU,MAAMO,UAAS,eAAe,OAAO;AAAA,EACjD,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AAEA,QAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,MAAI,UAAU;AACd,QAAM,YAAsB,CAAC;AAE7B,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,SAAS,+BAA+B,OAAO;AACrD,QAAI,UAAU,OAAO,WAAW,QAAQ;AACtC,gBAAU;AACV;AAAA,IACF;AACA,cAAU,KAAK,OAAO;AAAA,EACxB;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAMT,OAAMC,SAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,QAAM,cAAc,UAAU,SAAS,IAAI,GAAG,UAAU,KAAK,IAAI,CAAC;AAAA,IAAO;AACzE,QAAMS,WAAU,eAAe,aAAa,OAAO;AACnD,SAAO;AACT;AAEA,eAAe,4BACb,QACA,cACA,SACA,YAAwB,MAAM,oBAAI,KAAK,GACP;AAChC,QAAM,SAASC,YAAW;AAC1B,QAAM,YAAY,gBAAgB,UAAU,CAAC;AAC7C,QAAM,UAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,SAAS,+BAA+B;AAAA,MACtC,SAAS,OAAO;AAAA,MAChB,eAAe,OAAO;AAAA,MACtB,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,IACD,SAAS,OAAO;AAAA,IAChB;AAAA,IACA,eAAe,OAAO;AAAA,IACtB,UAAU,OAAO;AAAA,IACjB,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,YAAY,OAAO;AAAA,IACnB,UAAU,OAAO;AAAA,EACnB;AAEA,QAAM,4BAA4B,SAAS,OAAO;AAClD,QAAM,4BAA4B,SAAS,OAAO;AAClD,SAAO;AACT;AAEA,eAAe,uBAAuB,YAAmD;AACvF,MAAI;AACF,UAAM,OAAO,MAAMF,UAAS,YAAY,OAAO,GAAG,KAAK;AACvD,WAAO,wBAAwB,GAAG,IAAI,MAAM;AAAA,EAC9C,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,wBAAwB,SAA0C;AAC/E,QAAM,SAAS,QAAQ,IAAI,uBAAuB,KAAK;AACvD,MAAI,wBAAwB,MAAM,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,WAAWV,SAAQ;AACpC,QAAM,oBAAoBD,MAAK,UAAU,6BAA6B;AACtE,QAAM,qBAAqBA,MAAK,UAAU,2BAA2B;AAErE,QAAM,cAAc,MAAM,uBAAuB,iBAAiB;AAClE,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,MAAM,uBAAuB,kBAAkB;AACpE,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,aAAa,SAAyB;AAC7C,SAAOO,YAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC1D;AAEA,SAAS,oBAAoB,eAA+B;AAC1D,SAAO,cAAc,gBAAgB,aAAa,CAAC;AACrD;AAEA,SAAS,cACP,WACA,KACA,WAAqC,iBAC7B;AACR,MAAI,IAAI,WAAW,IAAI;AACrB,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AACA,QAAM,QAAQ,SAAS,mBAAmB;AAC1C,QAAM,SAAS,eAAe,eAAe,KAAK,KAAK;AACvD,QAAM,aAAa,OAAO,OAAO,CAAC,OAAO,OAAO,SAAS,GAAG,OAAO,MAAM,CAAC,CAAC;AAC3E,QAAM,MAAM,OAAO,WAAW;AAC9B,SAAO,OAAO,OAAO,CAAC,OAAO,YAAY,GAAG,CAAC;AAC/C;AAEA,eAAe,gBACb,eACA,SAC2C;AAC3C,QAAM,UAAU,qBAAqB,eAAe,OAAO;AAC3D,QAAML,OAAMC,SAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAEjD,MAAI;AACF,UAAM,WAAW,MAAMQ,UAAS,OAAO;AACvC,WAAO,EAAE,KAAK,qBAAqB,QAAQ,GAAG,QAAQ;AAAA,EACxD,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,YAAY,gBAAgB,EAAE;AACpC,QAAMC,WAAU,SAAS,WAAW,EAAE,MAAM,IAAM,CAAC;AACnD,SAAO,EAAE,KAAK,WAAW,QAAQ;AACnC;AAOA,eAAe,qBACb,aACA,eACA,SACgC;AAChC,QAAM,YAAY,MAAMD,UAAS,WAAW;AAC5C,QAAM,EAAE,KAAK,QAAQ,IAAI,MAAM,gBAAgB,eAAe,OAAO;AAErE,QAAM,MAAM,gBAAgB,EAAE;AAC9B,QAAM,mBAAmB,cAAc,WAAW,GAAG;AACrD,QAAM,aAAa,cAAc,KAAK,GAAG;AACzC,QAAM,cAAc,aAAa,gBAAgB;AAEjD,QAAM,UAAyB;AAAA,IAC7B,MAAM,iBAAiB,UAAU,0BAA0B,WAAW;AAAA,IACtE,gBACE,iBAAiB,UAAU,0BACvB,iBAAiB,SAAS,QAAQ,IAClC;AAAA,IACN,gBAAgB;AAAA,IAChB,sBAAsB,iBAAiB;AAAA,IACvC,aAAa,WAAW,SAAS,QAAQ;AAAA,IACzC,sBAAsB;AAAA,IACtB,kBAAkB,oBAAoB,aAAa;AAAA,IACnD,qBAAqB;AAAA,EACvB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,8BACb,gBACA,YACA,kBACA,YAAuB,OACR;AACf,MAAI,CAAC,eAAe,YAAY;AAC9B,QAAI,eAAe,aAAa;AAC9B,YAAM,IAAI,MAAM,6DAA6D;AAAA,IAC/E;AACA;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,QAAQ,eAAe,kBAAkB,CAAC,CAAC;AAC/D,MAAI,CAAC,QAAQ,IAAI,cAAc,GAAG;AAChC,YAAQ,IAAI,gBAAgB,0BAA0B;AAAA,EACxD;AAEA,QAAM,UAAU,IAAI,WAAW,gBAAgB;AAC/C,QAAM,eAAe,MAAM,UAAU,eAAe,YAAY;AAAA,IAC9D,QAAQ;AAAA,IACR;AAAA,IACA,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AAED,MAAI,aAAa,IAAI;AACnB;AAAA,EACF;AAKA,OACG,aAAa,WAAW,OAAO,aAAa,WAAW,QACxD,aAAa,QAAQ,IAAI,UAAU,GACnC;AACA,UAAM,WAAW,aAAa,QAAQ,IAAI,UAAU,GAAG,KAAK;AAC5D,QAAI,UAAU;AACZ,YAAM,oBAAoB,MAAM,UAAU,UAAU;AAAA,QAClD,QAAQ;AAAA,QACR;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AACD,UAAI,kBAAkB,IAAI;AACxB;AAAA,MACF;AACA,YAAM,qBAAqB,MAAM,kBAAkB,KAAK,GAAG,KAAK;AAChE,YAAM,IAAI;AAAA,QACR,sDAAsD,kBAAkB,MAAM,GAAG,oBAAoB,KAAK,iBAAiB,KAAK,EAAE;AAAA,MACpI;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,aAAa,KAAK,GAAG,KAAK;AACjD,QAAM,IAAI;AAAA,IACR,uCAAuC,aAAa,MAAM,GAAG,UAAU,KAAK,OAAO,KAAK,EAAE;AAAA,EAC5F;AACF;AAEA,eAAe,uBACb,QACA,SACA,YAAwB,MAAM,oBAAI,KAAK,GACtB;AACjB,SAAO;AAAA,IACL;AAAA,MACE,gBAAgB,UAAU,CAAC;AAAA,MAC3B,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO,aAAa;AAAA,MACpB,OAAO,YAAY;AAAA,MACnB,OAAO,eAAe,SAAS,KAAK;AAAA,MACpC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT,EAAE,KAAK,GAAG;AAAA,IACV;AAAA,EACF;AACF;AAEA,eAAe,+BAA+B,aAAoC;AAChF,QAAM,OAAO,QAAQ,IAAI;AACzB,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AACA,QAAM,aAAa,KAAK,KAAK,EAAE,YAAY;AAC3C,MAAI,eAAe,OAAO,eAAe,UAAU,eAAe,SAAS,eAAe,KAAK;AAC7F;AAAA,EACF;AACA,MAAI;AACF,UAAM,GAAG,aAAa,EAAE,OAAO,KAAK,CAAC;AAAA,EACvC,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,+BAA+B,QAA+B,WAA2B;AAChG,SAAO;AAAA,IACL,eAAe,OAAO,SAAS,iBAAiB,OAAO,UAAU,8BAA8B,OAAO,QAAQ,WAAW,OAAO,WAAW,QAAQ,OAAO,QAAQ;AAAA,IAClK,gBAAgB,SAAS,oHAAoH,OAAO,SAAS,kCAAkC,4BAA4B,oBAAoB,8BAA8B;AAAA,IAC7Q;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,+BACP,WACA,QACA,aACQ;AACR,QAAM,aAAa,SACf,cACE,UAAU,SAAS,yDAAyD,MAAM,6DAClF,UAAU,SAAS,yDAAyD,MAAM,wDACpF,UAAU,SAAS;AAEvB,SAAO,CAAC,YAAY,iCAAiC,EAAE,KAAK,IAAI;AAClE;AAEA,SAAS,0BAA0B,OAA+B;AAChE,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,QAAQ,KAAK;AACnC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,KAAK,MAAM,OAAO;AAIlC,QAAI,OAAO,QAAQ,YAAY,YAAY,QAAQ,QAAQ,KAAK,EAAE,SAAS,GAAG;AAC5E,aAAO,QAAQ,QAAQ,KAAK;AAAA,IAC9B;AACA,QAAI,OAAO,QAAQ,UAAU,YAAY,QAAQ,MAAM,KAAK,EAAE,SAAS,GAAG;AACxE,aAAO,QAAQ,MAAM,KAAK;AAAA,IAC5B;AACA,QACE,QAAQ,SACR,OAAO,QAAQ,UAAU,YACzB,OAAO,QAAQ,MAAM,YAAY,YACjC,QAAQ,MAAM,QAAQ,KAAK,EAAE,SAAS,GACtC;AACA,aAAO,QAAQ,MAAM,QAAQ,KAAK;AAAA,IACpC;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAEA,SAAS,8BAA8B,OAA0C;AAC/E,SAAO;AAAA,IACL,wBAAwB,MAAM,QAAQ,kDAAkD,MAAM,aAAa,YAAY,MAAM,SAAS,0BAA0B,MAAM,cAAc,WAAW,MAAM,QAAQ,QAAQ,MAAM,QAAQ;AAAA,IACnO,kFAAkF,MAAM,QAAQ,yBAAyB,MAAM,IAAI,oBAAoB,MAAM,SAAS,yBAAyB,MAAM,cAAc;AAAA,EACrN,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,2BAA2B,QAA2B,oBAAoC;AACjG,QAAM,WAAW,OAAO,aAAa,OAAO;AAC5C,SAAO,GAAG,QAAQ,SAAS,kBAAkB,OAAO,OAAO,UAAU,OAAO,OAAO,MAAM;AAC3F;AAEA,SAAS,sCAAsE;AAQ7E,QAAM,WAAW,oBAAI,IAA0B;AAE/C,QAAM,kBAAkB,OACtB,WACA,YACqB;AACrB,UAAM,UAAU,SAAS,IAAI,SAAS;AACtC,QAAI,CAAC,WAAW,QAAQ,UAAU;AAChC,aAAO;AAAA,IACT;AACA,YAAQ,WAAW;AACnB,QAAI,QAAQ,eAAe;AACzB,mBAAa,QAAQ,aAAa;AAAA,IACpC;AACA,aAAS,OAAO,SAAS;AACzB,UAAM,QAAQ,QAAQ,KAAK;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,UAAU,OAAO,UAAU;AACzB,YAAM,YAAY,6BAA6BE,YAAW,CAAC;AAC3D,YAAM,QAAsB;AAAA,QAC1B,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,OAAO,MAAM;AAAA,MACf;AACA,eAAS,IAAI,WAAW,KAAK;AAE7B,UAAI,OAAO,MAAM,mBAAmB,YAAY,MAAM,iBAAiB,GAAG;AACxE,cAAM,gBAAgB,WAAW,MAAM;AACrC,eAAK,gBAAgB,WAAW,OAAO,UAAU;AAC/C,kBAAM,OAAO,aAAa,SAAS;AAAA,UACrC,CAAC;AAAA,QACH,GAAG,MAAM,iBAAiB,GAAI;AAAA,MAChC;AAEA,iBAAW,MAAM;AACf,cAAM,YAAY;AAChB,cAAI;AACF,kBAAM,MAAM,OAAO,YAAY,SAAS;AACxC,kBAAM,MAAM,OAAO,aAAa,WAAW,4BAA4B;AACvE,kBAAM,SAAS,MAAM,MAAM,QAAQ;AACnC,kBAAM,UAAU,SAAS,IAAI,SAAS;AACtC,gBAAI,CAAC,WAAW,QAAQ,UAAU;AAChC;AAAA,YACF;AACA,gBAAI,QAAQ,iBAAiB;AAC3B,oBAAM,gBAAgB,WAAW,OAAO,UAAU;AAChD,sBAAM,OAAO,cAAc,WAAW,kBAAkB;AAAA,cAC1D,CAAC;AACD;AAAA,YACF;AACA,gBAAI,OAAO,SAAS;AAClB,oBAAM,gBAAgB,WAAW,OAAO,UAAU;AAChD,sBAAM,OAAO,WAAW,WAAW;AAAA,kBACjC,MAAM;AAAA,kBACN,SAAS,OAAO;AAAA,gBAClB,CAAC;AAAA,cACH,CAAC;AACD;AAAA,YACF;AACA,kBAAM,gBAAgB,WAAW,OAAO,UAAU;AAChD,oBAAM,OAAO,cAAc,WAAW,MAAM;AAAA,YAC9C,CAAC;AAAA,UACH,SAAS,OAAO;AACd,kBAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,kBAAM,UAAU,SAAS,IAAI,SAAS;AACtC,gBAAI,CAAC,WAAW,QAAQ,UAAU;AAChC;AAAA,YACF;AACA,gBAAI,QAAQ,iBAAiB;AAC3B,oBAAM,gBAAgB,WAAW,OAAO,UAAU;AAChD,sBAAM,OAAO,cAAc,WAAW,kBAAkB;AAAA,cAC1D,CAAC;AACD;AAAA,YACF;AACA,kBAAM,gBAAgB,WAAW,OAAO,UAAU;AAChD,oBAAM,OAAO,WAAW,WAAW;AAAA,gBACjC,MAAM;AAAA,gBACN;AAAA,cACF,CAAC;AAAA,YACH,CAAC;AAAA,UACH;AAAA,QACF,GAAG;AAAA,MACL,GAAG,CAAC;AAEJ,aAAO,EAAE,UAAU;AAAA,IACrB;AAAA,IACA,QAAQ,OAAO,WAAW,WAAW;AACnC,YAAM,UAAU,SAAS,IAAI,SAAS;AACtC,UAAI,CAAC,SAAS;AACZ,eAAO,EAAE,UAAU,MAAM;AAAA,MAC3B;AACA,UAAI,QAAQ,UAAU;AACpB,eAAO,EAAE,UAAU,OAAO,iBAAiB,KAAK;AAAA,MAClD;AACA,cAAQ,kBAAkB;AAC1B,YAAM,gBAAgB,WAAW,OAAO,UAAU;AAChD,cAAM,OAAO,cAAc,WAAW,UAAU,kBAAkB;AAAA,MACpE,CAAC;AACD,aAAO,EAAE,UAAU,KAAK;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,SAAS,mBACd,UAAqC,CAAC,GACL;AACjC,QAAM,uBACJ,QAAQ,wBAAwB,oCAAoC;AACtE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,MACX,SAAS;AAAA,IACX;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,SAAS,OAAO,QAAQ;AACtB,UAAI;AACF,eAAO,MAAM,uBAAuB,KAAK;AAAA,UACvC,qBAAqB,QAAQ,uBAAuB;AAAA,UACpD,4BACE,QAAQ,8BAA8B;AAAA,UACxC,wBAAwB,QAAQ,0BAA0B;AAAA,UAC1D,+BACE,QAAQ,iCAAiC;AAAA,UAC3C,oBAAoB,QAAQ,6BAA6B;AAAA,UACzD,sBAAsB,QAAQ,wBAAwB;AAAA,UACtD,WAAW,QAAQ,aAAa;AAAA,UAChC,WAAW,QAAQ,cAAc,MAAM,oBAAI,KAAK;AAAA,UAChD,kBAAkB,QAAQ,oBAAoBA;AAAA,UAC9C,oBAAoB,QAAQ,sBAAsB;AAAA,UAClD,0BACE,QAAQ,4BAA4B;AAAA,UACtC,wBAAwB,QAAQ,0BAA0B;AAAA,UAC1D,kBAAkB,QAAQ,oBAAoB,QAAQ,eAAe;AAAA,UACrE,eAAe,QAAQ;AAAA,UACvB,mBAAmB,QAAQ;AAAA,UAC3B,oBAAoB,QAAQ;AAAA,UAC5B,2BAA2B,QAAQ;AAAA,UACnC;AAAA,UACA,qBAAqB,QAAQ;AAAA,QAC/B,CAAC;AAAA,MACH,SAAS,YAAY;AACnB,cAAM,UACJ,sBAAsB,QAClB,WAAW,UACX,OAAO,eAAe,WACpB,aACA;AACR,eAAO,EAAE,MAAM,QAAQ,KAAK,KAAK,gCAAgC,SAAS,KAAK;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AACF;AA+BA,eAAe,gCACb,QAMA,SAC2D;AAC3D,QAAM,eAAeb,MAAK,WAAWC,SAAQ,GAAG,aAAa,cAAc,gBAAgB;AAE3F,MAAI;AACJ,MAAI;AACF,kBAAc,MAAMU,UAAS,cAAc,OAAO;AAAA,EACpD,QAAQ;AACN,WAAO,EAAE,WAAW,MAAM,YAAY,EAAE;AAAA,EAC1C;AAEA,QAAM,SAAS,OAAO,cAAc,KAAK,EAAE,YAAY;AACvD,QAAM,OAAO,OAAO,aAAa,KAAK;AACtC,QAAM,OAAO,OAAO,KAAK,KAAK,MAAM,OAAO,EAAE,IAAI,OAAO;AACxD,QAAM,QAAQ,OAAO,SAAS,IAAI;AAElC,QAAM,OAAO,YACV,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS;AACb,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IAMxB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EACA,OAAO,CAAC,QAAwC,QAAQ,GAAG,CAAC,EAC5D,OAAO,CAAC,QAAQ;AACf,QAAI,CAAC,IAAI,cAAc,CAAC,IAAI,iBAAiB,CAAC,IAAI,kBAAkB,CAAC,IAAI;AACvE,aAAO;AACT,QAAI,IAAI,kBAAkB,KAAM,QAAO;AACvC,QAAI,IAAI,eAAe,KAAK,EAAE,YAAY,MAAM,OAAQ,QAAO;AAC/D,QAAI,OAAO,UAAU,CAAC,MAAO,QAAO;AACpC,UAAM,cAAc,KAAK,MAAM,IAAI,UAAU;AAC7C,WAAO,OAAO,SAAS,WAAW,KAAK,eAAe;AAAA,EACxD,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,cAAc,EAAE,IAAI,KAAK,MAAM,EAAE,cAAc,EAAE,CAAC;AAEjF,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,EAAE,WAAW,MAAM,YAAY,EAAE;AAAA,EAC1C;AAEA,MAAI,CAAC,OAAO,UAAU,CAAC,SAAS,KAAK,SAAS,GAAG;AAC/C,WAAO,EAAE,WAAW,MAAM,YAAY,KAAK,OAAO;AAAA,EACpD;AAEA,SAAO,EAAE,WAAW,KAAK,CAAC,EAAE,cAAc,MAAM,YAAY,KAAK,OAAO;AAC1E;AAEA,eAAe,4BACb,WACA,SACA,UACA,SACuF;AACvF,MAAI,CAAC,UAAU;AACb,UAAMG,iBAAgB,0BAA0B,OAAO;AACvD,QAAI,CAACA,gBAAe;AAClB,aAAO,EAAE,OAAO,yCAAyC;AAAA,IAC3D;AACA,WAAO,EAAE,SAASA,eAAc;AAAA,EAClC;AACA,MAAI,oBAAoB;AACxB,MAAI;AACF,UAAM,UAAU,YAAY;AAAA,EAC9B,QAAQ;AACN,wBAAoB;AAAA,EACtB;AACA,QAAM,UAAU,MAAM,UAAU,yBAAyB,QAAQ,gBAAgB,SAAS,IAAI;AAC9F,MAAI,UAAU,KAAK,CAAC,SAAS,UAAU,CAAC,SAAS,IAAI;AACnD,WAAO;AAAA,MACL,OAAO,iCAAiC,SAAS,IAAI;AAAA,IACvD;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,UAAU,oBAAoB;AAAA,IACnD,eAAe,QAAQ;AAAA,IACvB,cAAc,SAAS;AAAA,IACvB,QAAQ,SAAS;AAAA,IACjB,IAAI,SAAS;AAAA,EACf,CAAC;AAED,MAAI,oBAAoB,UAAU,aAAa;AAC/C,MAAI;AACJ,MAAI,CAAC,qBAAqB,mBAAmB;AAC3C,UAAM,mBAAmB,MAAM;AAAA,MAC7B;AAAA,QACE,eAAe,QAAQ;AAAA,QACvB,cAAc,SAAS;AAAA,QACvB,QAAQ,SAAS;AAAA,QACjB,IAAI,SAAS;AAAA,MACf;AAAA,MACA;AAAA,IACF;AACA,QAAI,iBAAiB,aAAa,KAAK,CAAC,SAAS,UAAU,CAAC,SAAS,IAAI;AACvE,aAAO;AAAA,QACL,OAAO,iCAAiC,SAAS,IAAI;AAAA,MACvD;AAAA,IACF;AACA,wBAAoB,iBAAiB;AACrC,QAAI,mBAAmB;AACrB,wBACE;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,CAAC,mBAAmB;AACtB,WAAO,EAAE,OAAO,8BAA8B,SAAS,IAAI,IAAI;AAAA,EACjE;AAEA,QAAM,gBAAgB,0BAA0B;AAAA,IAC9C,GAAG;AAAA,IACH,YAAY;AAAA,EACd,CAAC;AACD,MAAI,CAAC,eAAe;AAClB,WAAO,EAAE,OAAO,yCAAyC;AAAA,EAC3D;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,eACb,WACA,SACA,SACe;AACf,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,KAAI,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC3B,YAAY;AAAA,IACd;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,yBACb,WACA,SACA,SACe;AACf,MAAI;AACF,UAAM,eAAe,WAAW,SAAS,OAAO;AAAA,EAClD,QAAQ;AAAA,EAER;AACF;AAkBA,SAAS,wBACP,WACA,SACyB;AACzB,SAAO;AAAA,IACL,cAAc,QAAQ;AAAA,IACtB,UAAU,QAAQ;AAAA,IAClB,YAAY;AAAA,IACZ,QAAQ,QAAQ;AAAA,IAChB,KAAI,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC3B,gBAAgB,QAAQ,iBAAiB;AAAA,IACzC,WAAW,QAAQ,YAAY;AAAA,IAC/B,YAAY,QAAQ,aAAa;AAAA,IACjC,UAAU,QAAQ,WAAW;AAAA,IAC7B,cAAc,QAAQ,gBAAgB;AAAA,IACtC,uBAAuB,QAAQ,qBAAqB;AAAA,IACpD,mBAAmB,QAAQ,kBAAkB;AAAA,IAC7C,cAAc,QAAQ,aAAa;AAAA,IACnC,iBAAiB,QAAQ,gBAAgB;AAAA,IACzC,UAAU,QAAQ,mBAAmB;AAAA,EACvC;AACF;AAEA,eAAe,mBACb,WACA,SACA,SACe;AACf,QAAM,UAAU,wBAAwB,WAAW,OAAO;AAC1D,QAAM,QAAQ,IAAI;AAAA,IAChB,iBAAiB,gBAAgB,SAAS,OAAO;AAAA,IACjD,iBAAiB,sBAAsB,SAAS,OAAO;AAAA,EACzD,CAAC;AACH;AAEA,eAAe,6BACb,WACA,SACA,SACe;AACf,MAAI;AACF,UAAM,mBAAmB,WAAW,SAAS,OAAO;AAAA,EACtD,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,wBACP,mBACA,eAC8B;AAC9B,QAAM,cAAc,mBAAmB,KAAK,KAAKD,YAAW;AAC5D,QAAM,UAAU,eAAe,KAAK,KAAKA,YAAW;AACpD,SAAO,EAAE,aAAa,QAAQ;AAChC;AAEA,eAAe,uBACb,KACA,SACA,mBAAoD,CAAC,GACP;AAC9C,QAAM,SAAS,eAAe,IAAI,IAAI;AACtC,QAAM,mBAAmB,QAAQ;AACjC,QAAM,gBAAgB,QAAQ;AAC9B,QAAM,2BAA2B,QAAQ;AACzC,QAAM,uBAAuB,QAAQ;AACrC,QAAM,8BAA8B,QAAQ;AAC5C,QAAM,mBAAmB,QAAQ;AACjC,QAAM,gBAAgB,QAAQ;AAC9B,QAAM,YAAY,QAAQ;AAC1B,QAAM,YAAY,QAAQ;AAC1B,QAAM,mBAAmB,QAAQ;AACjC,QAAM,mBAAmB,QAAQ;AACjC,QAAM,yBAAyB,QAAQ;AACvC,QAAM,uBAAuB,QAAQ;AACrC,QAAM,uBAAuB,QAAQ;AAErC,MAAI,OAAO,SAAS,UAAU,OAAO,SAAS,WAAW;AACvD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,OAAO,SAAS;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,yBAAyB;AAC3C,WAAO;AAAA,MACL,MAAM,gDAAgD,sBAAsB;AAAA,MAC5E,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,kBAAkB;AACpC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,wBAAwB;AAC1C,WAAO;AAAA,MACL,MAAM,gCAAgC,2BAA2B;AAAA,MACjE,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,kBAAkB;AACpC,WAAO;AAAA,MACL,MAAM,wDAAwD,eAAe;AAAA,MAC7E,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,wBAAwB;AAC1C,WAAO;AAAA,MACL,MAAM,iCAAiC,2BAA2B;AAAA,MAClE,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,cAAc;AAChC,WAAO;AAAA,MACL,MAAM,sDAAsD,uBAAuB;AAAA,MACnF,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,oBAAoB;AACtC,WAAO;AAAA,MACL,MAAM,gDAAgD,uBAAuB;AAAA,MAC7E,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,0BAA0B;AAC5C,WAAO;AAAA,MACL,MAAM,yBAAyB,2BAA2B;AAAA,MAC1D,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,kBAAkB;AACpC,WAAO;AAAA,MACL,MAAM,8CAA8C,uBAAuB;AAAA,MAC3E,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,qBAAqB;AACvC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,qBAAqB,gBAAgB;AAC7D,QAAM,4BAA4B,oBAAI,IAAI,CAAC,aAAa,UAAU,aAAa,WAAW,CAAC;AAC3F,QAAM,4BAA4B,CAAC,WACjC,0BAA0B,IAAI,MAAM;AACtC,QAAM,wBAAwB,CAAC,eAWY;AAAA,IACzC,MAAM;AAAA,MACJ,iBAAiB,UAAU,YAAY;AAAA,MACvC,SAAS,UAAU,IAAI;AAAA,MACvB,WAAW,UAAU,MAAM;AAAA,MAC3B,eAAe,UAAU,cAAc,KAAK;AAAA,MAC5C,gBAAgB,UAAU,eAAe,KAAK;AAAA,MAC9C,UAAU,eAAe,iBAAiB,UAAU,YAAY,KAAK;AAAA,MACrE,UAAU,sBACN,wBAAwB,UAAU,mBAAmB,KACrD;AAAA,MACJ,UAAU,kBAAkB,oBAAoB,UAAU,eAAe,KAAK;AAAA,MAC9E,UAAU,aAAa,eAAe,UAAU,UAAU,KAAK;AAAA,MAC/D,UAAU,gBAAgB,kBAAkB,UAAU,aAAa,KAAK;AAAA,IAC1E,EACG,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC,EACrC,KAAK,IAAI;AAAA,IACZ,SACE,UAAU,WAAW,YACrB,UAAU,WAAW,eACrB,UAAU,WAAW;AAAA,EACzB;AAEA,MAAI,OAAO,SAAS,aAAa;AAC/B,QAAI,YAAY,MAAM,UAAU,kBAAkB,OAAO,WAAW;AACpE,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,QACL,MAAM,wBAAwB,OAAO,WAAW;AAAA,QAChD,SAAS;AAAA,MACX;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ;AACjB,UAAI,UAAU,iBAAiB,cAAc,CAAC,UAAU,qBAAqB;AAC3E,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AACA,UAAI,CAAC,0BAA0B,UAAU,MAAM,GAAG;AAChD,cAAM,UAAU,UAAU,YAAYA,YAAW;AACjD,cAAM,qBAAoB,oBAAI,KAAK,GAAE,YAAY;AACjD,cAAM,UAAU,gBAAgB;AAAA,UAC9B,cAAc,UAAU;AAAA,UACxB,MAAM,UAAU;AAAA,UAChB,WAAW,UAAU;AAAA,UACrB,UAAU,UAAU;AAAA,UACpB,UAAU;AAAA,UACV,cAAc;AAAA,UACd,qBAAqB,UAAU;AAAA,UAC/B,iBAAiB,UAAU;AAAA,UAC3B,qBAAqB;AAAA,UACrB,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,eAAe;AAAA,QACjB,CAAC;AACD,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,YACE,aAAa,UAAU;AAAA,YACvB;AAAA,YACA,QAAQ;AAAA,YACR,UAAU,UAAU;AAAA,YACpB,SAAS,UAAU;AAAA,YACnB,cAAc;AAAA,YACd,mBAAmB,UAAU;AAAA,YAC7B,gBAAgB,UAAU;AAAA,UAC5B;AAAA,UACA;AAAA,QACF;AAEA,cAAM,eAAe,MAAM,qBAAqB;AAAA,UAC9C,UAAU;AAAA,UACV;AAAA,QACF;AACA,YAAI,aAAa,YAAY,aAAa,iBAAiB;AACzD,gBAAM,cAAc,MAAM,UAAU,kBAAkB,OAAO,WAAW;AACxE,cAAI,eAAe,CAAC,0BAA0B,YAAY,MAAM,GAAG;AACjE,kBAAM,UAAU,gBAAgB;AAAA,cAC9B,cAAc,UAAU;AAAA,cACxB,MAAM,UAAU;AAAA,cAChB,WAAW,UAAU;AAAA,cACrB,UAAU,UAAU;AAAA,cACpB,UAAU;AAAA,cACV,cAAc;AAAA,cACd,qBAAqB,UAAU;AAAA,cAC/B,iBAAiB,UAAU;AAAA,cAC3B,qBAAqB;AAAA,cACrB,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,eAAe;AAAA,YACjB,CAAC;AACD,kBAAM;AAAA,cACJ;AAAA,cACA;AAAA,gBACE,aAAa,UAAU;AAAA,gBACvB;AAAA,gBACA,QAAQ;AAAA,gBACR,UAAU,UAAU;AAAA,gBACpB,SAAS,UAAU;AAAA,gBACnB,cAAc;AAAA,gBACd,mBAAmB,UAAU;AAAA,gBAC7B,gBAAgB,UAAU;AAAA,gBAC1B,WAAW;AAAA,gBACX,cAAc;AAAA,cAChB;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,kBAAY,MAAM,UAAU,kBAAkB,OAAO,WAAW;AAChE,UAAI,CAAC,WAAW;AACd,eAAO;AAAA,UACL,MAAM,wBAAwB,OAAO,WAAW;AAAA,UAChD,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AACA,WAAO,sBAAsB,SAAS;AAAA,EACxC;AAEA,OACG,OAAO,SAAS,YAAY,OAAO,SAAS,YAAY,OAAO,SAAS,eACzE,OAAO,OACP;AACA,UAAM,mBAAmB,wBAAwB;AACjD,UAAM,cAAc,iBAAiB;AACrC,UAAM,SAAS,OAAO;AACtB,UAAM,WAAW,OAAO,SAAS,WAAW,OAAO,cAAc,YAAY;AAC7E,UAAM,UAAU,OAAO,SAAS,WAAW,OAAO,cAAc,WAAW;AAC3E,UAAM,mBAAmB,OAAO,gBAAgB;AAChD,UAAM,iBAAiB,qBAAqB,aAAc,OAAO,kBAAkB,OAAQ;AAC3F,UAAM,mBAA0D;AAAA,MAC9D;AAAA,MACA,SAAS,iBAAiB;AAAA,MAC1B,eACE,OAAO,SAAS,WACZ,OAAO,cAAc,iBACrB,OAAO,SAAS,aACd,OAAO,qBAAqB,iBAC5B;AAAA,MACR,UAAU;AAAA,MACV,WACE,OAAO,SAAS,aAAc,OAAO,qBAAqB,cAAc,OAAQ;AAAA,MAClF,SAAS;AAAA,MACT,cAAc;AAAA,MACd;AAAA,IACF;AACA,UAAM,UAAU,gBAAgB;AAAA,MAC9B,cAAc;AAAA,MACd,MAAM;AAAA,MACN,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UAAU,iBAAiB;AAAA,MAC3B,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,eAAe;AAAA,IACjB,CAAC;AAED,UAAM;AAAA,MACJ;AAAA,MACA,EAAE,GAAG,kBAAkB,QAAQ,UAAU;AAAA,MACzC;AAAA,IACF;AAEA,UAAM,WAAW,uBAAuB,IAAI,IAAI;AAChD,QAAI,qBAAqB,YAAY;AACnC,YAAM,eAAyC;AAAA,QAC7C,QAAQ;AAAA,QACR;AAAA,QACA,SAAS,iBAAiB;AAAA,QAC1B,SAAS,OAAO;AAAA,QAChB,MAAM;AAAA,QACN,gBAAgB,OAAO;AAAA,QACvB,aAAa;AAAA,UACX,eAAe;AAAA,UACf,QAAQ,IAAI;AAAA,UACZ,UAAU,IAAI;AAAA,QAChB;AAAA,MACF;AACA,UAAI;AACF,cAAM,iBAAiB,MAAM,qBAAqB,SAAS;AAAA,UACzD,MAAM;AAAA,UACN,gBAAgB,OAAO;AAAA,UACvB,SAAS,YACP;AAAA,YACE,EAAE,MAAM,UAAU,SAAS,IAAI,SAAS,UAAU,IAAI,SAAS;AAAA,YAC/D;AAAA,YACA;AAAA,cACE,mBAAmB,iBAAiB;AAAA,cACpC,eAAe,iBAAiB;AAAA,YAClC;AAAA,UACF;AAAA,UACF,OAAO;AAAA,YACL,WAAW,OAAO,cAAc;AAC9B,oBAAM,UAAU,gBAAgB;AAAA,gBAC9B,cAAc;AAAA,gBACd,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,UAAU,iBAAiB;AAAA,gBAC3B,cAAc;AAAA,gBACd,qBAAqB;AAAA,gBACrB,iBAAiB;AAAA,gBACjB,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,eAAe;AAAA,cACjB,CAAC;AACD,oBAAM;AAAA,gBACJ;AAAA,gBACA;AAAA,kBACE,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,mBAAmB;AAAA,kBACnB,iBAAiB;AAAA,gBACnB;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,YACA,YAAY,OAAO,WAAW,YAAY;AACxC,oBAAM;AAAA,gBACJ;AAAA,gBACA;AAAA,kBACE,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,mBAAmB;AAAA,kBACnB,iBAAiB;AAAA,gBACnB;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,YACA,aAAa,OAAO,cAAc;AAChC,oBAAM,UAAU,gBAAgB;AAAA,gBAC9B,cAAc;AAAA,gBACd,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,UAAU,iBAAiB;AAAA,gBAC3B,cAAc;AAAA,gBACd,qBAAqB;AAAA,gBACrB,iBAAiB;AAAA,gBACjB,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,eAAe;AAAA,cACjB,CAAC;AACD,oBAAM;AAAA,gBACJ;AAAA,gBACA;AAAA,kBACE,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,mBAAmB;AAAA,gBACrB;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,YACA,UAAU,OAAO,WAAW,YAAY;AACtC,oBAAM,UAAU,gBAAgB;AAAA,gBAC9B,cAAc;AAAA,gBACd,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,UAAU,iBAAiB;AAAA,gBAC3B,cAAc;AAAA,gBACd,qBAAqB;AAAA,gBACrB,iBAAiB;AAAA,gBACjB,QAAQ;AAAA,gBACR,YAAY,QAAQ;AAAA,gBACpB,eAAe,QAAQ;AAAA,cACzB,CAAC;AACD,oBAAM;AAAA,gBACJ;AAAA,gBACA;AAAA,kBACE,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,mBAAmB;AAAA,kBACnB,WAAW,QAAQ;AAAA,kBACnB,cAAc,QAAQ;AAAA,gBACxB;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,YACA,aAAa,OAAO,WAAW,WAAW;AACxC,oBAAM,UAAU,gBAAgB;AAAA,gBAC9B,cAAc;AAAA,gBACd,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,UAAU,iBAAiB;AAAA,gBAC3B,cAAc;AAAA,gBACd,qBAAqB;AAAA,gBACrB,iBAAiB;AAAA,gBACjB,sBAAqB,oBAAI,KAAK,GAAE,YAAY;AAAA,gBAC5C,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,eAAe,UAAU;AAAA,cAC3B,CAAC;AACD,oBAAM;AAAA,gBACJ;AAAA,gBACA;AAAA,kBACE,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,mBAAmB;AAAA,kBACnB,WAAW;AAAA,kBACX,cAAc,UAAU;AAAA,gBAC1B;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,YACA,YAAY,OAAO,cAAc;AAC/B,oBAAM,UAAU,gBAAgB;AAAA,gBAC9B,cAAc;AAAA,gBACd,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,UAAU,iBAAiB;AAAA,gBAC3B,cAAc;AAAA,gBACd,qBAAqB;AAAA,gBACrB,iBAAiB;AAAA,gBACjB,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,eAAe;AAAA,cACjB,CAAC;AACD,oBAAM;AAAA,gBACJ;AAAA,gBACA;AAAA,kBACE,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,mBAAmB;AAAA,kBACnB,WAAW;AAAA,kBACX,cAAc;AAAA,gBAChB;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAED,cAAM,yBAAyB,MAAM,UAAU,kBAAkB,WAAW;AAC5E,YAAI,wBAAwB,wBAAwB,eAAe,WAAW;AAC5E,gBAAM,UAAU,gBAAgB;AAAA,YAC9B,cAAc;AAAA,YACd,MAAM;AAAA,YACN,WAAW;AAAA,YACX,UAAU;AAAA,YACV,UAAU,iBAAiB;AAAA,YAC3B,cAAc;AAAA,YACd,qBAAqB,eAAe;AAAA,YACpC,iBAAiB;AAAA,YACjB,QAAQ,wBAAwB,UAAU;AAAA,YAC1C,YAAY,wBAAwB,cAAc;AAAA,YAClD,eAAe,wBAAwB,iBAAiB;AAAA,UAC1D,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,kDAAkD,WAAW;AAAA,YAC7D;AAAA,YACA,wBAAwB,eAAe,SAAS;AAAA,YAChD,iBAAiB,oBAAoB,cAAc,KAAK;AAAA,YACxD,kDAAkD,WAAW;AAAA,UAC/D,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,IAAI;AAAA,QACd;AAAA,MACF,SAAS,eAAe;AACtB,cAAM,kBACJ,yBAAyB,QAAQ,cAAc,UAAU,OAAO,aAAa;AAC/E,cAAM,UAAU,gBAAgB;AAAA,UAC9B,cAAc;AAAA,UACd,MAAM;AAAA,UACN,WAAW;AAAA,UACX,UAAU;AAAA,UACV,UAAU,iBAAiB;AAAA,UAC3B,cAAc;AAAA,UACd,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,eAAe;AAAA,QACjB,CAAC;AACD,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,YACE,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,cAAc;AAAA,UAChB;AAAA,UACA;AAAA,QACF;AACA,eAAO;AAAA,UACL,MAAM,uCAAuC,eAAe;AAAA,gBAAmB,WAAW;AAAA,UAC1F,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,gBAAgB;AAAA,MAC9B,cAAc;AAAA,MACd,MAAM;AAAA,MACN,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UAAU,iBAAiB;AAAA,MAC3B,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,eAAe;AAAA,IACjB,CAAC;AACD,SAAK;AAAA,MACH,EAAE,MAAM,UAAU,SAAS,IAAI,SAAS,UAAU,IAAI,SAAS;AAAA,MAC/D;AAAA,MACA;AAAA,QACE,mBAAmB,iBAAiB;AAAA,QACpC,eAAe,iBAAiB;AAAA,MAClC;AAAA,IACF,EACG,KAAK,OAAO,WAAW;AACtB,YAAM,UAAU,gBAAgB;AAAA,QAC9B,cAAc;AAAA,QACd,MAAM;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,QACV,UAAU,iBAAiB;AAAA,QAC3B,cAAc;AAAA,QACd,QAAQ,OAAO,UAAU,WAAW;AAAA,QACpC,YAAY,OAAO,UAAU,iBAAiB;AAAA,QAC9C,eAAe,OAAO,UAAU,OAAO,OAAO;AAAA,MAChD,CAAC;AACD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,QAAQ,OAAO,UAAU,WAAW;AAAA,UACpC,WAAW,OAAO,UAAU,iBAAiB;AAAA,UAC7C,cAAc,OAAO,UAAU,OAAO,OAAO;AAAA,QAC/C;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC,EACA,MAAM,OAAO,QAAQ;AACpB,YAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACpE,YAAM,UAAU,gBAAgB;AAAA,QAC9B,cAAc;AAAA,QACd,MAAM;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,QACV,UAAU,iBAAiB;AAAA,QAC3B,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB,CAAC;AACD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,WAAW;AAAA,UACX;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAEH,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,kDAAkD,WAAW;AAAA,QAC7D;AAAA,QACA,kDAAkD,WAAW;AAAA,MAC/D,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,OAAO,cAAc,QAAQ,aAAa;AAC7E,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,cAAcA,YAAW;AAAA,UACzB,WAAW,OAAO;AAAA,UAClB,QAAQ;AAAA,UACR,SAAS,EAAE,eAAe,OAAO,gBAAgBP,UAAS,OAAO,YAAY,EAAE;AAAA,QACjF;AAAA,QACA;AAAA,MACF;AACA,YAAM,UAAU,aAAa;AAAA,QAC3B,WAAW,OAAO;AAAA,QAClB,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,QAAQ,OAAO;AAAA,QACf,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,eAAe,OAAO,cAAc,KAAK,KAAKA,UAAS,OAAO,YAAY;AAChF,UAAI,cAAc;AAChB,cAAM,UAAU,mBAAmB;AAAA,UACjC,eAAe;AAAA,UACf,WAAW,OAAO;AAAA,UAClB,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AACA,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,cAAc,OAAO,QAAQ;AAAA,UAC7B,mBAAmB,OAAO,aAAa,QAAQ,OAAO,EAAE,CAAC;AAAA,UACzD,gBAAgB,OAAO,YAAY;AAAA,QACrC,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,gCAAgC;AACjD,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,iBAAiB;AACnC,UAAM,cAAc,wBAAwB;AAC5C,QAAI;AACF,YAAM,QAAQ,MAAM,yBAAyB,OAAO,qBAAqB;AAAA,QACvE,GAAG,QAAQ;AAAA,QACX;AAAA,MACF,CAAC;AACD,YAAM,2BAA2B,OAAO,gBAAgB;AACxD,YAAM,UAAU,aAAa;AAAA,QAC3B,WAAW,MAAM;AAAA,QACjB,YAAY;AAAA,QACZ,gBAAgB,MAAM;AAAA,QACtB,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,aAAa;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,QAAQ,MAAM;AAAA,QACd,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,UAAU,cAAc;AAAA,QAC5B,UAAU,MAAM;AAAA,QAChB,gBAAgB,MAAM;AAAA,QACtB,UAAU;AAAA,QACV,QAAQ,MAAM;AAAA,QACd,SAAS;AAAA,QACT,QAAQ;AAAA,MACV,CAAC;AACD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,cAAc,YAAY;AAAA,UAC1B,UAAU,YAAY;AAAA,UACtB,gBAAgB,MAAM;AAAA,UACtB,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM;AAAA,UAChB,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM,8BAA8B,KAAK;AAAA,MAC3C;AAAA,IACF,SAAS,KAAK;AACZ,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,cAAc,YAAY;AAAA,UAC1B,UAAU,YAAY;AAAA,UACtB,gBAAgB,OAAO,oBAAoB;AAAA,UAC3C,WAAW,OAAO,oBAAoB;AAAA,UACtC,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,YAAM,UACJ,eAAe,QAAQ,IAAI,UAAU,OAAO,QAAQ,WAAW,MAAM,OAAO,GAAG;AACjF,aAAO;AAAA,QACL,MAAM,UAAU,yBAAyB,OAAO,KAAK;AAAA,QACrD,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,oBAAoB;AAAA,MACxB,iBAAiB,qBAAqB,iBAAiB;AAAA,MACvD,iBAAiB;AAAA,IACnB;AACA,QAAI;AACF,YAAM,cACH,MAAM,UAAU,cAAc,OAAO,cAAc,QAAQ,KAC3D,MAAM,4BAA4B,OAAO,cAAc,UAAU,gBAAgB;AACpF,UAAI,CAAC,aAAa;AAChB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UACE,YAAY,cAAc,YAAY,MACpC,OAAO,cAAc,eAAe,YAAY,KAClD,YAAY,aAAa,OAAO,cAAc,aAC9C,YAAY,aAAa,YAAY,MAAM,OAAO,cAAc,eAAe,YAAY,GAC3F;AACA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAM,cAAcN;AAAA,QAClB,QAAQ,eAAe,UAAU;AAAA,QACjC,OAAO,cAAc;AAAA,MACvB;AACA,UAAI;AACJ,UAAI;AACF,uBAAe,MAAMU,MAAK,WAAW;AAAA,MACvC,QAAQ;AACN,eAAO;AAAA,UACL,MAAM,4DAA4D,WAAW;AAAA,UAC7E,SAAS;AAAA,QACX;AAAA,MACF;AACA,UAAI,CAAC,aAAa,OAAO,GAAG;AAC1B,eAAO;AAAA,UACL,MAAM,mEAAmE,WAAW;AAAA,UACpF,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAM,cAAc,MAAM,WAAW,WAAW;AAChD,UAAI,YAAY,YAAY,MAAM,OAAO,cAAc,eAAe,YAAY,GAAG;AACnF,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAM,YAAY,MAAM,iBAAiB,gBAAgB;AACzD,YAAM,gBAAgBK,qBAAoB,SAAS;AACnD,UACE,cAAc,QAAQ,YAAY,MAAM,OAAO,cAAc,eAAe,YAAY,GACxF;AACA,eAAO;AAAA,UACL,MAAM,oDAAoD,cAAc,OAAO,oCAAoC,OAAO,cAAc,cAAc;AAAA,UACtJ,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAM,kBAAkB,MAAM;AAAA,QAC5B;AAAA,QACA,OAAO,cAAc;AAAA,QACrB;AAAA,MACF;AACA,YAAM,iBAAiB,kBAAkB;AACzC,YAAM,2BAA2B,yBAAyB;AAE1D,UAAI,0BAA0B;AAC5B,cAAM,eAAe,cAAc,SAAS,EAAE;AAE9C,cAAM,eAAe,MAAM;AAAA,UACzB,OAAO,cAAc;AAAA,UACrB,OAAO,cAAc;AAAA,UACrB;AAAA,YACE,GAAG,QAAQ;AAAA,YACX,aAAa;AAAA,YACb,WAAW,CAAC,OAAO,SAAS,aAAa,OAAO,IAAI;AAAA,UACtD;AAAA,QACF;AACA,YAAI,aAAa,WAAW,KAAK;AAC/B,gBAAM,UACJ,aAAa,UAAU,KAAK,KAC5B,qCAAqC,aAAa,MAAM;AAC1D,gBAAM,IAAI,MAAM,OAAO;AAAA,QACzB;AAAA,MACF;AAEA,YAAM,kBAAkB,QAAQ,oBAAoB,aAAa;AACjE,YAAM,iBAAiB,MAAM;AAAA,QAC3B;AAAA,UACE,UAAU,OAAO,cAAc;AAAA,UAC/B,gBAAgB,OAAO,cAAc;AAAA,UACrC,WAAW,OAAO,cAAc;AAAA,UAChC,gBAAgB,OAAO,cAAc;AAAA,UACrC,sBAAsB,YAAY;AAAA,UAClC,SAAS,gBAAgB;AAAA,QAC3B;AAAA,QACA;AAAA,UACE,GAAG,QAAQ;AAAA,UACX;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,MACF;AAEA,YAAM;AAAA,QACJ;AAAA,QACA,gBAAgB,QAAQ;AAAA,QACxB,gBAAgB;AAAA,QAChB;AAAA,MACF;AACA,UAAI,0BAA0B;AAC9B,UACE,gBAAgB,QAAQ,SAAS,eACjC,eAAe,0BAA0B,MACzC;AACA,YAAI;AACF,oCAA0B,MAAM;AAAA,YAC9B;AAAA,cACE,UAAU,eAAe;AAAA,cACzB,gBAAgB,OAAO,cAAc;AAAA,cACrC,YAAY,eAAe;AAAA,cAC3B,iBAAiB;AAAA,YACnB;AAAA,YACA;AAAA,cACE,GAAG,QAAQ;AAAA,cACX,aAAa;AAAA,YACf;AAAA,UACF;AAAA,QACF,SAAS,cAAc;AACrB,gBAAM,UAAU,eAAe,YAAY;AAC3C,gBAAM,iBACJ,0BAA0B,YAAY,KAAK;AAC7C,gBAAM,IAAI;AAAA,YACR,sEAAsE,OAAO,sBAAsB,cAAc,MAAM,cAAc;AAAA,UACvI;AAAA,QACF;AAAA,MACF;AAEA,YAAM,uBAAuB,yBAAyB,kBAAkB,SAAS;AACjF,YAAM,4BACJ,wBAAwB,iBAAiB,YAAY;AACvD,YAAM,mBACJ,OAAO,SAAS,yBAAyB,KAAK,4BAA4B,IACtE,4BACA,YAAY;AAClB,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,UAAU,aAAa;AAAA,QAC3B,WAAW,wBAAwB;AAAA,QACnC,YAAY,wBAAwB;AAAA,QACpC,gBAAgB,wBAAwB;AAAA,QACxC,UAAU,wBAAwB;AAAA,QAClC,UAAU,wBAAwB;AAAA,QAClC,aAAa,wBAAwB;AAAA,QACrC,QAAQ,wBAAwB;AAAA,QAChC,QAAQ,OAAO,cAAc;AAAA,QAC7B,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,UAAU,cAAc;AAAA,QAC5B,UAAU,wBAAwB;AAAA,QAClC,gBAAgB,wBAAwB;AAAA,QACxC,UAAU,wBAAwB,YAAY;AAAA,QAC9C,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACrC,CAAC;AACD,YAAM,UAAU,cAAc;AAAA,QAC5B,SAAS,QAAQ;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB,YAAY,QAAQ;AAAA,QACpB,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,SAAS,QAAQ;AAAA,QACjB,QAAQ;AAAA,MACV,CAAC;AACD,UAAI,OAAO,cAAc,KAAK,GAAG;AAC/B,cAAM,yBAAyB,OAAO,aAAa,KAAK;AACxD,cAAM,UAAU,mBAAmB;AAAA,UACjC,eAAe;AAAA,UACf,WAAW,wBAAwB;AAAA,UACnC,YAAY,wBAAwB;AAAA,UACpC,UAAU,wBAAwB;AAAA,UAClC,gBAAgB,wBAAwB;AAAA,QAC1C,CAAC;AAED,YAAI,uBAAuB;AAC3B,YAAI;AACF,gBAAM,WAAW,MAAM,UAAU,oBAAoB;AAAA,YACnD,eAAe,wBAAwB;AAAA,YACvC,cAAc;AAAA,YACd,QAAQ;AAAA,UACV,CAAC;AACD,iCACE,QAAQ,UAAU,SAAS,KAC3B,UAAU,cAAc,wBAAwB;AAAA,QACpD,QAAQ;AACN,iCAAuB;AAAA,QACzB;AAEA,YAAI,CAAC,sBAAsB;AACzB,gBAAM,UACJ;AACF,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,cACE,cAAc,kBAAkB;AAAA,cAChC,UAAU,kBAAkB;AAAA,cAC5B,gBAAgB,wBAAwB;AAAA,cACxC,WAAW,wBAAwB;AAAA,cACnC,YAAY,wBAAwB;AAAA,cACpC,UAAU,wBAAwB;AAAA,cAClC,eAAe;AAAA,cACf;AAAA,YACF;AAAA,YACA;AAAA,UACF;AACA,cAAI,QAAQ,IAAI,6BAA6B,KAAK;AAChD,kBAAM,IAAI,MAAM,OAAO;AAAA,UACzB;AAAA,QACF;AAEA,YAAI;AACF,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,cACE,eAAe;AAAA,cACf,WAAW,wBAAwB;AAAA,cACnC,YAAY,wBAAwB;AAAA,cACpC,UAAU,wBAAwB;AAAA,cAClC,gBAAgB,wBAAwB;AAAA,cACxC,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,YACrC;AAAA,YACA;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AACA,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,cAAc;AAAA,UACd,UAAU,kBAAkB;AAAA,UAC5B,gBAAgB,wBAAwB;AAAA,UACxC,WAAW,wBAAwB;AAAA,UACnC,YAAY,wBAAwB;AAAA,UACpC,UAAU,wBAAwB;AAAA,UAClC,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,YAAM,+BAA+B,WAAW;AAEhD,aAAO;AAAA,QACL,MAAM,+BAA+B,yBAAyB,QAAQ,MAAM;AAAA,MAC9E;AAAA,IACF,SAAS,OAAO;AACd,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,cAAc,kBAAkB;AAAA,UAChC,UAAU,kBAAkB;AAAA,UAC5B,gBAAgB,OAAO,cAAc;AAAA,UACrC,WAAW,OAAO,cAAc;AAAA,UAChC,UAAU,OAAO,cAAc;AAAA,UAC/B,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,YAAM,qBAAqB,0BAA0B,KAAK;AAC1D,aAAO;AAAA,QACL,MAAM,sBAAsB;AAAA,QAC5B,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,MAAM;AACxB,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,IACF;AACA,QAAI,SAAS,SAAS,CAAC,SAAS,SAAS;AACvC,aAAO,EAAE,MAAM,SAAS,SAAS,0CAA0C,SAAS,KAAK;AAAA,IAC3F;AACA,UAAM,kBAAkB,SAAS;AAEjC,QAAI,SAAS,iBAAiB;AAC5B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,gBAAgB,gBAAgB;AAAA,UAChC,YAAY,gBAAgB;AAAA,UAC5B,SAAS,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,wBAAwB;AAC5C,UAAM,cAAc,YAAY;AAChC,UAAM,cAAc,MAAM,UAAU,sBAAsB,gBAAgB,UAAU;AACpF,UAAM,oBAAoB,aAAa,aAAa;AACpD,UAAM,UAAU,gBAAgB;AAAA,MAC9B,cAAc;AAAA,MACd,MAAM;AAAA,MACN,WAAW;AAAA,MACX,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,eAAe;AAAA,IACjB,CAAC;AACD,QAAI;AACF,YAAM,WAAW,MAAM,iBAAiB,iBAAiB;AAAA,QACvD,GAAG,QAAQ;AAAA,QACX;AAAA,MACF,CAAC;AACD,UAAI,CAAC,SAAS,SAAS;AACrB,cAAM,IAAI,MAAM,WAAW;AAAA,MAC7B;AACA,YAAM,UAAU,gBAAgB;AAAA,QAC9B,cAAc;AAAA,QACd,MAAM;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB,CAAC;AACD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,cAAc;AAAA,UACd,UAAU,YAAY;AAAA,UACtB,gBAAgB,gBAAgB;AAAA,UAChC,YAAY,gBAAgB;AAAA,UAC5B,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,YAAM,SAAS,2BAA2B,UAAU,gBAAgB,UAAU;AAC9E,aAAO;AAAA,QACL,MAAM,SAAS,kBAAkB,GAAG,SAAS,eAAe;AAAA,EAAK,MAAM,KAAK;AAAA,MAC9E;AAAA,IACF,QAAQ;AACN,YAAM,UAAU,gBAAgB;AAAA,QAC9B,cAAc;AAAA,QACd,MAAM;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB,CAAC;AACD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,cAAc;AAAA,UACd,UAAU,YAAY;AAAA,UACtB,gBAAgB,gBAAgB;AAAA,UAChC,YAAY,gBAAgB;AAAA,UAC5B,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,YAAY;AAC9B,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,IACF;AACA,QAAI,SAAS,SAAS,CAAC,SAAS,SAAS;AACvC,aAAO,EAAE,MAAM,SAAS,SAAS,0CAA0C,SAAS,KAAK;AAAA,IAC3F;AACA,UAAM,kBAAkB,SAAS;AAEjC,QAAI,SAAS,iBAAiB;AAC5B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,gBAAgB,gBAAgB;AAAA,UAChC,YAAY,gBAAgB;AAAA,UAC5B,SAAS,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AACA,UAAM,cAAc,YAAY;AAChC,UAAM,cAAc,MAAM,UAAU,sBAAsB,gBAAgB,UAAU;AACpF,UAAM,oBAAoB,aAAa,aAAa;AACpD,UAAM,UAAU,gBAAgB;AAAA,MAC9B,cAAc;AAAA,MACd,MAAM;AAAA,MACN,WAAW;AAAA,MACX,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,eAAe;AAAA,IACjB,CAAC;AACD,QAAI;AACF,YAAM,iBAAiB,MAAM,uBAAuB,iBAAiB;AAAA,QACnE,GAAG,QAAQ;AAAA,QACX;AAAA,MACF,CAAC;AACD,UAAI,CAAC,eAAe,SAAS;AAC3B,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACnC;AACA,YAAM,UAAU,gBAAgB;AAAA,QAC9B,cAAc;AAAA,QACd,MAAM;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB,CAAC;AACD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,cAAc;AAAA,UACd,UAAU,YAAY;AAAA,UACtB,gBAAgB,gBAAgB;AAAA,UAChC,YAAY,gBAAgB;AAAA,UAC5B,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,YAAM,eAAe,QAAQ,gBAAgB,UAAU,kBAAkB,eAAe,SAAS;AACjG,aAAO;AAAA,QACL,MAAM,SAAS,kBACX,GAAG,SAAS,eAAe;AAAA,EAAK,YAAY,KAC5C;AAAA,MACN;AAAA,IACF,QAAQ;AACN,YAAM,UAAU,gBAAgB;AAAA,QAC9B,cAAc;AAAA,QACd,MAAM;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB,CAAC;AACD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,cAAc;AAAA,UACd,UAAU,YAAY;AAAA,UACtB,gBAAgB,gBAAgB;AAAA,UAChC,YAAY,gBAAgB;AAAA,UAC5B,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,IACF;AACA,QAAI,SAAS,SAAS,CAAC,SAAS,SAAS;AACvC,aAAO,EAAE,MAAM,SAAS,SAAS,0CAA0C,SAAS,KAAK;AAAA,IAC3F;AACA,UAAM,kBAAkB,SAAS;AACjC,QAAI,SAAS,iBAAiB;AAC5B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,gBAAgB,gBAAgB;AAAA,UAChC,YAAY,gBAAgB;AAAA,UAC5B,SAAS,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,cAAc,wBAAwB;AAC5C,UAAM,cAAc,YAAY;AAEhC,UAAM,sBAAsB,MAAM,UAAU,sBAAsB,gBAAgB,UAAU;AAC5F,QAAI;AACF,YAAM,eAAe,MAAM,qBAAqB,iBAAiB;AAAA,QAC/D,GAAG,QAAQ;AAAA,QACX;AAAA,MACF,CAAC;AACD,UAAI,CAAC,aAAa,SAAS;AACzB,cAAM,IAAI,MAAM,eAAe;AAAA,MACjC;AAAA,IACF,QAAQ;AACN,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,cAAc;AAAA,UACd,UAAU,YAAY;AAAA,UACtB,gBAAgB,gBAAgB;AAAA,UAChC,YAAY,gBAAgB;AAAA,UAC5B,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AACA,QAAI,YAA6C;AACjD,QAAI,cAAc;AAClB,QAAI;AACF,YAAM,SAAS,MAAM,UAAU,oBAAoB,gBAAgB,UAAU;AAC7E,UAAI,QAAQ;AACV,oBAAY;AAAA,UACV,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO;AAAA,UACjB,WAAW,gBAAgB;AAAA,QAC7B;AAAA,MACF;AACA,UAAI,CAAC,WAAW;AACd,oBAAY,MAAM;AAAA,UAChB,gBAAgB;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AACA,UAAI,WAAW;AACb,cAAM,kBAAkB,MAAM;AAAA,UAC5B,UAAU;AAAA,UACV;AAAA,QACF;AACA,cAAM,gBAAgB,MAAM,UAAU,cAAc,UAAU,MAAM;AACpE,sBAAc,mBAAmB;AAAA,MACnC;AAAA,IACF,QAAQ;AAAA,IAGR;AACA,UAAM,WAAW,WAAW,YAAY,qBAAqB,aAAa;AAC1E,QAAI,UAAU;AACZ,YAAM,iBACJ,qBAAqB,cAAc,WAC/B,sBACA,MAAM,UAAU,eAAe,QAAQ;AAC7C,YAAM,UAAU,aAAa;AAAA,QAC3B,WAAW;AAAA,QACX,YAAY,gBAAgB;AAAA,QAC5B,gBAAgB,gBAAgB,kBAAkB,gBAAgB;AAAA,QAClE,UAAU,gBAAgB,YAAY;AAAA,QACtC,UAAU,gBAAgB,YAAY;AAAA,QACtC,aAAa,gBAAgB,eAAe;AAAA,QAC5C,QAAQ,gBAAgB,YAAY,gBAAgB,UAAU;AAAA,QAC9D,QAAQ,gBAAgB,UAAU;AAAA,QAClC,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,UAAU,YAAY;AAAA,QACtB,gBAAgB,gBAAgB;AAAA,QAChC,YAAY,gBAAgB;AAAA,QAC5B,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AACA,UAAM,aAAa;AAAA,MACjB,gBAAgB;AAAA,MAChB,WAAW,UAAU;AAAA,MACrB;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM,SAAS,kBAAkB,GAAG,SAAS,eAAe;AAAA,EAAK,UAAU,KAAK;AAAA,IAClF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;;;AEjoGA,SAAS,SAAAC,cAAa;AACtB,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAC9B,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,SAAAC,QAAO,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,kBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AAExB,SAAS,gBAAgB,OAAmD;AAC1E,SAAO,OAAO,UAAU,YAAY,sBAAsB,KAAK,MAAM,KAAK,CAAC;AAC7E;AAEA,SAAS,YAAkB;AACzB,UAAQ,IAAI;AAAA,cACA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kDAe6B,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA8B/D;AACD;AAYA,SAAS,UAAU,MAA4B;AAC7C,QAAM,SAAqB;AAAA,IACzB,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,EACnB;AAEA,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAElB,QAAI,CAAC,OAAO,WAAW,CAAC,IAAI,WAAW,GAAG,GAAG;AAC3C,UAAI,QAAQ,WAAW;AACrB,eAAO,UAAU;AAAA,MACnB,WAAW,QAAQ,UAAU;AAC3B,eAAO,UAAU;AAAA,MACnB,WAAW,QAAQ,gBAAgB;AACjC,eAAO,UAAU;AAAA,MACnB,WAAW,QAAQ,UAAU;AAC3B,eAAO,UAAU;AAAA,MACnB,WAAW,QAAQ,SAAS;AAC1B,eAAO,UAAU;AACjB,eAAO,YAAY,KAAK,MAAM,IAAI,CAAC,EAAE,KAAK,GAAG;AAC7C,eAAO;AAAA,MACT,WAAW,QAAQ,SAAS;AAC1B,eAAO,UAAU;AACjB,cAAM,kBAAkB,KAAK,IAAI,CAAC;AAClC,YAAI,mBAAmB,CAAC,gBAAgB,WAAW,GAAG,GAAG;AACvD,iBAAO,kBAAkB;AACzB;AAAA,QACF;AACA;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,eAAe,QAAQ,MAAM;AACvC,aAAO,UAAU;AAAA,IACnB,WAAW,QAAQ,YAAY,QAAQ,MAAM;AAC3C,aAAO,OAAO;AAAA,IAChB,WAAW,OAAO,YAAY,aAAa,QAAQ,aAAa;AAC9D,aAAO,cAAc;AAAA,IACvB,WAAW,OAAO,YAAY,aAAa,QAAQ,cAAc;AAC/D,aAAO,cAAc;AAAA,IACvB,WAAW,QAAQ,YAAY,KAAK,IAAI,CAAC,GAAG;AAC1C,aAAO,OAAO,SAAS,KAAK,IAAI,CAAC,GAAG,EAAE;AACtC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAMC,cAAaL,eAAc,YAAY,GAAG;AAChD,IAAMM,aAAYR,SAAQO,WAAU;AACpC,IAAM,eAAeP,SAAQQ,UAAS;AAEtC,eAAe,UAAU,MAA6B;AACpD,QAAML,OAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACvC;AAOA,eAAe,uBAAsC;AACnD,QAAM,gBAAgBF,MAAK,cAAc,SAAS;AAClD,MAAI,CAAC,WAAW,aAAa,EAAG;AAEhC,QAAM,kBAAkBA,MAAKK,SAAQ,GAAG,aAAa,cAAc,SAAS;AAC5E,QAAM,UAAU,eAAe;AAC/B,QAAM,eAAeL,MAAK,eAAe,cAAc;AACvD,MAAI,WAAW,YAAY,GAAG;AAC5B,UAAM,UAAU,MAAMG,UAAS,YAAY;AAC3C,UAAMC,WAAUJ,MAAK,iBAAiB,cAAc,GAAG,SAAS,EAAE,MAAM,IAAM,CAAC;AAAA,EACjF;AACF;AAEA,SAAS,sBAAwC;AAC/C,SAAO,IAAI,QAAQ,CAACQ,aAAY;AAC9B,UAAM,QAAQV,OAAM,YAAY,CAAC,WAAW,GAAG;AAAA,MAC7C,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AACD,UAAM,GAAG,SAAS,MAAMU,SAAQ,KAAK,CAAC;AACtC,UAAM,GAAG,SAAS,CAAC,SAASA,SAAQ,SAAS,CAAC,CAAC;AAAA,EACjD,CAAC;AACH;AAEA,SAAS,wBAAgC;AACvC,QAAM,WAAW,QAAQ,IAAI,sBAAsBR,MAAKK,SAAQ,GAAG,WAAW;AAC9E,SAAOL,MAAK,UAAU,eAAe;AACvC;AAKA,eAAe,iCAAgD;AAC7D,QAAM,aAAa,sBAAsB;AACzC,MAAI;AACF,UAAM,MAAM,MAAMG,UAAS,YAAY,OAAO;AAC9C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,OAAO,WAAW,OAAO,OAAO,YAAY,UAAU;AACzD,aAAO,UAAU,CAAC;AAAA,IACpB;AACA,UAAM,UAAU,OAAO;AACvB,QAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,GAAG;AACjC,cAAQ,QAAQ,CAAC;AAAA,IACnB;AACA,UAAM,QAAQ,QAAQ;AACtB,QAAI,CAAC,MAAM,SAAS,YAAY,GAAG;AACjC,YAAM,KAAK,YAAY;AACvB,YAAMC,WAAU,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACpE,cAAQ,IAAI,kEAAkE;AAAA,IAChF;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,OAAQ,IAA8B;AAC5C,QAAI,SAAS,SAAU;AACvB,YAAQ,KAAK,gDAAiD,IAAc,OAAO;AAAA,EACrF;AACF;AAMA,eAAe,mCAAkD;AAC/D,QAAM,YAAY,MAAM,oBAAoB;AAC5C,MAAI,WAAW;AACb,YAAQ,IAAI,oDAAoD;AAChE,UAAM,QAAQN,OAAM,YAAY,CAAC,WAAW,WAAW,YAAY,GAAG;AAAA,MACpE,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AACD,UAAM,WAAW,MAAM,IAAI,QAAgB,CAACU,aAAY;AACtD,YAAM,GAAG,SAASA,QAAO;AAAA,IAC3B,CAAC;AACD,QAAI,aAAa,GAAG;AAClB,YAAM,+BAA+B;AAAA,IACvC,OAAO;AACL,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,4BAA2D;AACxE,MAAI;AACF,UAAM,OAAO,MAAML,UAAS,oBAAoB,OAAO,GAAG,KAAK;AAC/D,WAAO,gBAAgB,GAAG,IAAK,MAAwB;AAAA,EACzD,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,sBAAsB,KAAmC;AACtE,QAAM,MAAMJ,SAAQ,WAAW;AAC/B,QAAM,UAAU,GAAG;AACnB,QAAMK,WAAU,aAAa,GAAG,GAAG;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AAC1D;AAEA,eAAe,0BAA4C;AACzD,UAAQ,OAAO;AAAA,IACb,qCAAqC,kBAAkB;AAAA;AAAA,EACzD;AAEA,SAAO,IAAI,QAAiB,CAACI,aAAY;AACvC,YAAQ,MAAM,YAAY,OAAO;AACjC,YAAQ,MAAM,KAAK,QAAQ,CAAC,SAAS;AACnC,YAAM,QAAQ,OAAO,SAAS,WAAW,OAAO,KAAK,SAAS,OAAO;AACrE,YAAM,SAAS,MAAM,KAAK,EAAE,YAAY;AACxC,UAAI,CAAC,UAAU,WAAW,OAAO,WAAW,OAAO;AACjD,QAAAA,SAAQ,IAAI;AAAA,MACd,OAAO;AACL,QAAAA,SAAQ,KAAK;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAM,mBAAmB;AAUzB,SAAS,eAAe,GAAW,GAAmB;AACpD,QAAM,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AACpD,QAAM,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AACpD,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,QAAQ,OAAO,MAAM,GAAG,KAAK;AAC/D,UAAM,KAAK,OAAO,CAAC,KAAK;AACxB,UAAM,KAAK,OAAO,CAAC,KAAK;AACxB,QAAI,KAAK,GAAI,QAAO;AACpB,QAAI,KAAK,GAAI,QAAO;AAAA,EACtB;AACA,SAAO;AACT;AAEA,eAAe,qBAA6C;AAC1D,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,kBAAkB;AAAA,MACxC,SAAS,EAAE,QAAQ,mBAAmB;AAAA,IACxC,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,WAAW;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,iBAAgC;AAC7C,QAAM,SAAS,MAAM,mBAAmB;AACxC,MAAI,CAAC,QAAQ;AACX,YAAQ,IAAI,4DAA4D;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,MAAM,eAAe,SAAS,MAAM;AAC1C,MAAI,MAAM,GAAG;AACX,YAAQ,IAAI,4CAA4C,MAAM,cAAc,OAAO,GAAG;AACtF,YAAQ,IAAI,4BAA4B;AAAA,EAC1C,WAAW,QAAQ,GAAG;AACpB,YAAQ,IAAI,gCAAgC;AAAA,EAC9C,OAAO;AACL,YAAQ,IAAI,4CAA4C,OAAO,eAAe,MAAM,GAAG;AAAA,EACzF;AACF;AAEA,eAAe,YAA2B;AACxC,QAAM,SAAS,MAAM,mBAAmB;AACxC,MAAI,CAAC,QAAQ;AACX,YAAQ,IAAI,4DAA4D;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,MAAM,eAAe,SAAS,MAAM;AAC1C,MAAI,MAAM,GAAG;AACX,YAAQ,IAAI,8BAA8B,OAAO,OAAO,MAAM,KAAK;AACnE,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,QAAI;AACF,eAAS,0BAA0B,MAAM,IAAI,EAAE,OAAO,UAAU,CAAC;AACjE,cAAQ,IAAI,2BAA2B,MAAM,GAAG;AAAA,IAClD,QAAQ;AACN,cAAQ;AAAA,QACN;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,gCAAgC;AAAA,EAC9C;AACF;AAEA,eAAe,WAAW,MAA6C;AACrE,MAAI,SAAS,YAAY;AACvB,UAAM,eAAe,MAAM,0BAA0B;AACrD,QAAI,cAAc;AAChB,YAAM,QAAQ,MAAM,wBAAwB;AAC5C,UAAI,OAAO;AACT,cAAM,sBAAsB,YAAY;AACxC,cAAM,qBAAqB;AAC3B,gBAAQ,IAAI,gEAAgE;AAC5E,gBAAQ;AAAA,UACN;AAAA,QACF;AACA,gBAAQ;AAAA,UACN;AAAA,QACF;AACA,cAAM,iCAAiC;AACvC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,SAAS,OAAO,IAAI,MAAM,2BAA2B;AAE7D,QAAM,qBAAqB;AAE3B,UAAQ,IAAI,gCAAgC;AAC5C,UAAQ,IAAI,uCAAuC,OAAO,EAAE;AAC5D,MAAI,WAAW,OAAO;AACpB,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACA,UAAQ,IAAI,+DAA+D;AAC3E,UAAQ;AAAA,IACN;AAAA,EACF;AACA,QAAM,iCAAiC;AACzC;AAEA,eAAe,YAA2B;AACxC,QAAM,EAAE,SAAS,OAAO,IAAI,MAAM,2BAA2B;AAE7D,UAAQ,IAAI,gCAAgC,OAAO,EAAE;AACrD,UAAQ,IAAI,0BAA0B,WAAW,EAAE;AACnD,MAAI,WAAW,aAAa;AAC1B,YAAQ,IAAI,8CAA8C;AAAA,EAC5D,WAAW,WAAW,SAAS;AAC7B,YAAQ,IAAI,mCAAmC;AAAA,EACjD,OAAO;AACL,YAAQ,IAAI,uDAAuD;AAAA,EACrE;AACF;AAEA,eAAe,SAAS,WAAkC;AACxD,QAAM,WAAW,mBAAmB;AACpC,QAAM,MAA4B;AAAA,IAChC,SAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,MAAM;AAAA,IACN,aAAa,SAAS,SAAS;AAAA,IAC/B,QAAQ,CAAC;AAAA,EACX;AAEA,QAAM,SAAS,MAAM,SAAS,QAAQ,GAAG;AACzC,MAAI,OAAO,MAAM;AACf,YAAQ,IAAI,OAAO,IAAI;AAAA,EACzB;AACA,MAAI,OAAO,SAAS;AAClB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,OAAsB;AACnC,QAAM,OAAO,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC;AAE5C,MAAI,KAAK,SAAS;AAChB,YAAQ,IAAI,OAAO;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,KAAK,MAAM;AACb,cAAU;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,KAAK,YAAY,WAAW;AAC9B,UAAM,OAAO,KAAK,eAAe;AACjC,UAAM,WAAW,IAAI;AACrB;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,gBAAgB;AACnC,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,UAAU;AAC7B,UAAM,UAAU;AAChB;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,UAAU;AAC7B,UAAM,UAAU;AAChB;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,SAAS;AAC5B,UAAM,SAAS,KAAK,aAAa,EAAE;AACnC;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,SAAS;AAC5B,QAAI,KAAK,oBAAoB,SAAS;AACpC,cAAQ,MAAM,iEAAiE;AAC/E,gBAAU;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,EAAE,KAAK,WAAW,SAAS,OAAO,IAAI,MAAM,2BAA2B;AAE7E,MAAI,WAAW,aAAa;AAC1B,YAAQ,IAAI,sCAAsC,OAAO,EAAE;AAAA,EAC7D,WAAW,WAAW,SAAS;AAC7B,YAAQ,IAAI,oCAAoC,OAAO,EAAE;AAAA,EAC3D,OAAO;AACL,YAAQ,IAAI,yDAAyD,OAAO,EAAE;AAAA,EAChF;AAGA,QAAM,QAAQ,MAAM,WAAW;AAAA,IAC7B;AAAA,IACA,MAAM,KAAK;AAAA,IACX,SAAS,CAAC,SAAS;AACjB,cAAQ,IAAI,oDAAoD,IAAI,EAAE;AACtE,cAAQ,IAAI,+CAA+C,IAAI,SAAS;AAAA,IAC1E;AAAA,IACA,SAAS,CAAC,UAAU;AAClB,cAAQ,MAAM,uBAAuB,MAAM,OAAO,EAAE;AAAA,IACtD;AAAA,IACA,cAAc,CAAC,SAAS;AACtB,cAAQ,KAAK,6BAA6B,KAAK,UAAU,WAAW,KAAK,aAAa,EAAE;AAAA,IAC1F;AAAA,IACA,qBAAqB,CAAC,SAAS;AAC7B,cAAQ;AAAA,QACN,6CAA6C,KAAK,UAAU,WAAW,KAAK,WAAW;AAAA,MACzF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,IAAI,eAAe,OAAO;AAC1C,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,aAAa;AAC3C,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,uDAAuD;AACnE,cAAQ,IAAI,gDAAgD,OAAO,EAAE;AAAA,IACvE,WAAW,QAAQ,OAAO;AACxB,cAAQ,IAAI,gCAAgC,QAAQ,UAAU,QAAQ;AAAA,IACxE,OAAO;AACL,cAAQ,IAAI,gCAAgC,QAAQ,UAAU,EAAE;AAAA,IAClE;AAAA,EACF,QAAQ;AACN,YAAQ,IAAI,wBAAwB,OAAO,0BAA0B;AAAA,EACvE;AAEA,UAAQ,IAAI,qCAAqC;AAGjD,QAAM,WAAW,OAAO,WAAmB;AACzC,YAAQ,IAAI;AAAA,wBAA2B,MAAM,oBAAoB;AACjE,QAAI;AACF,YAAM,MAAM,MAAM;AAClB,cAAQ,IAAI,2BAA2B;AACvC,cAAQ,KAAK,CAAC;AAAA,IAChB,SAAS,KAAK;AACZ,cAAQ,MAAM,uCAAuC,GAAG,EAAE;AAC1D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,UAAQ,GAAG,UAAU,MAAM,SAAS,QAAQ,CAAC;AAC7C,UAAQ,GAAG,WAAW,MAAM,SAAS,SAAS,CAAC;AAG/C,QAAM,IAAI,QAAQ,MAAM;AAAA,EAAC,CAAC;AAC5B;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,6BAA6B,IAAI,OAAO,EAAE;AACxD,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["homedir","join","privateKeyToAccount","response","resolve","signTypedData","privateKeyToAccount","BASE_SEPOLIA_CHAIN_ID","encodeBase64Json","signTypedData","privateKeyToAccount","response","paymentHeader","join","join","mkdir","homedir","dirname","join","base","join","homedir","account","privateKeyToAccount","balanceMonitor","baseUrl","responseHeaders","existingWallet","writeFile","readFile","mkdir","join","homedir","privateKeyToAccount","join","homedir","readFile","privateKeyToAccount","mkdir","writeFile","dirname","join","require","createHash","randomUUID","createReadStream","appendFile","mkdir","readFile","readdir","stat","writeFile","homedir","basename","dirname","join","resolve","privateKeyToAccount","randomUUID","mkdir","createRequire","homedir","dirname","join","require","join","homedir","mkdir","dirname","appendFile","readdir","basename","createHash","createReadStream","resolve","stat","readFile","writeFile","randomUUID","parsedRequest","privateKeyToAccount","spawn","dirname","join","fileURLToPath","mkdir","readFile","writeFile","homedir","__filename","__dirname","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/proxy.ts","../src/balance.ts","../src/errors.ts","../src/config.ts","../src/mnemospark-request-sign.ts","../src/nonce.ts","../src/cloud-correlation.ts","../src/cloud-utils.ts","../src/wallet-signature.ts","../src/cloud-price-storage.ts","../src/x402.ts","../src/payment-cache.ts","../src/cloud-storage.ts","../src/cloud-storage-crypto.ts","../src/cloud-jsonl.ts","../src/auth.ts","../src/wallet-key.ts","../src/version.ts","../src/cloud-command.ts","../src/cloud-datastore.ts","../src/cli.ts"],"sourcesContent":["/**\n * Local mnemospark proxy server.\n *\n * This proxy only forwards mnemospark storage endpoints to the backend API and\n * serves health checks. It does not handle chat completions or model routing.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport { PROXY_PORT, MNEMOSPARK_BACKEND_API_BASE_URL } from \"./config.js\";\nimport { createWalletSignatureHeaderValue } from \"./mnemospark-request-sign.js\";\nimport {\n PAYMENT_SETTLE_PROXY_PATH,\n PRICE_STORAGE_PROXY_PATH,\n UPLOAD_PROXY_PATH,\n UPLOAD_CONFIRM_PROXY_PATH,\n forwardPaymentSettleToBackend,\n forwardStorageUploadConfirmToBackend,\n forwardPriceStorageToBackend,\n forwardStorageUploadToBackend,\n parseStorageUploadConfirmRequest,\n parsePriceStorageQuoteRequest,\n parseStorageUploadRequest,\n} from \"./cloud-price-storage.js\";\nimport { createPaymentFetch } from \"./x402.js\";\nimport {\n STORAGE_DELETE_PROXY_PATH,\n STORAGE_DOWNLOAD_PROXY_PATH,\n STORAGE_LS_PROXY_PATH,\n downloadStorageToDisk,\n forwardStorageDeleteToBackend,\n forwardStorageDownloadToBackend,\n forwardStorageLsToBackend,\n parseStorageObjectRequest,\n} from \"./cloud-storage.js\";\nimport { appendJsonlEvent } from \"./cloud-jsonl.js\";\nimport { MNEMOSPARK_OPERATION_ID_HEADER, MNEMOSPARK_TRACE_ID_HEADER } from \"./cloud-correlation.js\";\n\nconst HEALTH_CHECK_TIMEOUT_MS = 2_000; // Timeout for checking existing proxy\nconst PORT_RETRY_ATTEMPTS = 5; // Max attempts to bind port (handles TIME_WAIT)\nconst PORT_RETRY_DELAY_MS = 1_000; // Delay between retry attempts\nconst DEFAULT_DOWNLOAD_OUTPUT_DIR = join(homedir(), \".openclaw\", \"mnemospark\", \"downloads\");\n\nfunction resolveDownloadOutputDir(): string {\n const configuredOutputDir = process.env.MNEMOSPARK_DOWNLOAD_DIR?.trim();\n if (configuredOutputDir && configuredOutputDir.length > 0) {\n return configuredOutputDir;\n }\n return DEFAULT_DOWNLOAD_OUTPUT_DIR;\n}\n\nfunction matchesProxyPath(url: string | undefined, path: string): boolean {\n return url === path || url?.startsWith(`${path}?`) === true;\n}\n\nfunction readHeaderValue(value: string | string[] | undefined): string | undefined {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n if (Array.isArray(value)) {\n for (const candidate of value) {\n const trimmed = candidate.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n }\n return undefined;\n}\n\nasync function readProxyJsonBody(req: IncomingMessage): Promise<unknown> {\n const bodyChunks: Buffer[] = [];\n for await (const chunk of req) {\n bodyChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n const bodyText = Buffer.concat(bodyChunks).toString(\"utf-8\").trim();\n if (bodyText.length === 0) {\n return {};\n }\n\n return JSON.parse(bodyText);\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(body));\n}\n\nfunction logProxyEvent(\n level: \"info\" | \"warn\" | \"error\",\n event: string,\n fields: Record<string, unknown> = {},\n): void {\n const payload = JSON.stringify({ event, ...fields });\n const message = `[mnemospark] ${payload}`;\n if (level === \"error\") {\n console.error(message);\n return;\n }\n if (level === \"warn\") {\n console.warn(message);\n return;\n }\n console.info(message);\n}\n\ntype ProxyEventCorrelation = {\n trace_id: string;\n operation_id: string;\n quote_id?: string;\n wallet_address?: string;\n object_id?: string;\n object_key?: string;\n};\n\nfunction emitProxyEvent(\n eventType: string,\n status: \"start\" | \"result\" | \"success\" | \"failure\" | \"decision\",\n correlation: ProxyEventCorrelation,\n details: Record<string, unknown> = {},\n): void {\n void appendJsonlEvent(\"proxy-events.jsonl\", {\n ts: new Date().toISOString(),\n event_type: eventType,\n status,\n trace_id: correlation.trace_id,\n operation_id: correlation.operation_id,\n quote_id: correlation.quote_id ?? null,\n wallet_address: correlation.wallet_address ?? null,\n object_id: correlation.object_id ?? null,\n object_key: correlation.object_key ?? null,\n details,\n }).catch(() => undefined);\n}\n\nfunction createProxyCorrelation(headers: IncomingMessage[\"headers\"]): ProxyEventCorrelation {\n const traceId =\n readHeaderValue(headers[MNEMOSPARK_TRACE_ID_HEADER.toLowerCase()]) ?? randomUUID();\n const operationId =\n readHeaderValue(\n headers[MNEMOSPARK_OPERATION_ID_HEADER.toLowerCase()] ?? headers[\"idempotency-key\"],\n ) ?? randomUUID();\n return { trace_id: traceId, operation_id: operationId };\n}\n\nfunction emitProxyTerminalFromStatus(\n correlation: ProxyEventCorrelation,\n statusCode: number,\n details: Record<string, unknown> = {},\n): void {\n if (statusCode >= 200 && statusCode < 300) {\n emitProxyEvent(\"terminal.success\", \"success\", correlation, { status: statusCode, ...details });\n return;\n }\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, { status: statusCode, ...details });\n}\n\nfunction isAlreadySettledConflict(status: number, bodyText: string): boolean {\n if (status !== 409) {\n return false;\n }\n try {\n const payload = JSON.parse(bodyText) as Record<string, unknown>;\n const errorCode = String(payload.error_code ?? payload.error ?? \"\").toLowerCase();\n const message = String(payload.message ?? \"\").toLowerCase();\n return errorCode === \"payment_already_settled\" || message.includes(\"already settled\");\n } catch {\n return false;\n }\n}\n\nfunction createBackendForwardHeaders(response: {\n contentType: string;\n paymentRequired?: string;\n paymentResponse?: string;\n}): Record<string, string> {\n const responseHeaders: Record<string, string> = {\n \"Content-Type\": response.contentType,\n };\n\n // Preserve v2 payment headers while also supporting legacy names.\n if (response.paymentRequired) {\n responseHeaders[\"PAYMENT-REQUIRED\"] = response.paymentRequired;\n responseHeaders[\"x-payment-required\"] = response.paymentRequired;\n }\n if (response.paymentResponse) {\n responseHeaders[\"PAYMENT-RESPONSE\"] = response.paymentResponse;\n responseHeaders[\"x-payment-response\"] = response.paymentResponse;\n }\n\n return responseHeaders;\n}\n\ntype BackendAuthFailure = {\n status: number;\n contentType: string;\n bodyText: string;\n};\n\nfunction isLikelyWalletProofFailure(bodyText: string): boolean {\n return /(wallet|signature|proof|nonce|timestamp|expired|authoriz)/i.test(bodyText);\n}\n\nexport function normalizeBackendAuthFailure(\n status: number,\n bodyText: string,\n): BackendAuthFailure | undefined {\n if (status !== 401 && status !== 403) {\n return undefined;\n }\n\n const message = isLikelyWalletProofFailure(bodyText) ? \"wallet proof invalid\" : \"unauthorized\";\n return {\n status,\n contentType: \"application/json\",\n bodyText: createAuthErrorBody(message),\n };\n}\n\nfunction createAuthErrorBody(message: \"unauthorized\" | \"wallet proof invalid\"): string {\n return JSON.stringify({\n error: message.replace(/\\s+/g, \"_\"),\n message,\n });\n}\n\nfunction createWalletRequiredBody(): string {\n return JSON.stringify({\n error: \"wallet_required\",\n message: \"wallet required for storage endpoints\",\n });\n}\n\n/**\n * Get the proxy port from pre-loaded configuration.\n * Port is validated at module load time, this just returns the cached value.\n */\nexport function getProxyPort(): number {\n return PROXY_PORT;\n}\n\n/**\n * Check if a proxy is already running on the given port.\n * Returns the wallet address if running, undefined otherwise.\n */\nasync function checkExistingProxy(port: number): Promise<string | undefined> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), HEALTH_CHECK_TIMEOUT_MS);\n\n try {\n const response = await fetch(`http://127.0.0.1:${port}/health`, {\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n\n if (response.ok) {\n const data = (await response.json()) as { status?: string; wallet?: string };\n if (data.status === \"ok\" && data.wallet) {\n return data.wallet;\n }\n }\n return undefined;\n } catch {\n clearTimeout(timeoutId);\n return undefined;\n }\n}\n\n/** Callback info for low balance warning */\nexport type LowBalanceInfo = {\n balanceUSD: string;\n walletAddress: string;\n};\n\n/** Callback info for insufficient funds error */\nexport type InsufficientFundsInfo = {\n balanceUSD: string;\n requiredUSD: string;\n walletAddress: string;\n};\n\nexport type ProxyOptions = {\n walletKey: string;\n /** Port to listen on (default: 7120) */\n port?: number;\n onReady?: (port: number) => void;\n onError?: (error: Error) => void;\n /** Called when balance drops below $1.00 (warning, request still proceeds) */\n onLowBalance?: (info: LowBalanceInfo) => void;\n /** Called when balance is insufficient for a request (request fails) */\n onInsufficientFunds?: (info: InsufficientFundsInfo) => void;\n};\n\nexport type ProxyHandle = {\n port: number;\n baseUrl: string;\n walletAddress: string;\n balanceMonitor: BalanceMonitor;\n close: () => Promise<void>;\n};\n\n/**\n * Start the local mnemospark backend proxy server.\n *\n * If a proxy is already running on the target port, reuses it instead of failing.\n * Port can be configured via MNEMOSPARK_PROXY_PORT environment variable.\n *\n * Returns a handle with the assigned port, base URL, and a close function.\n */\nexport async function startProxy(options: ProxyOptions): Promise<ProxyHandle> {\n // Determine port: options.port > env var > default\n const listenPort = options.port ?? getProxyPort();\n\n // Check if a proxy is already running on this port\n const existingWallet = await checkExistingProxy(listenPort);\n if (existingWallet) {\n // Proxy already running — reuse it instead of failing with EADDRINUSE\n const account = privateKeyToAccount(options.walletKey as `0x${string}`);\n const balanceMonitor = new BalanceMonitor(account.address);\n const baseUrl = `http://127.0.0.1:${listenPort}`;\n\n // Verify the existing proxy is using the same wallet (or warn if different)\n if (existingWallet !== account.address) {\n console.warn(\n `[mnemospark] Existing proxy on port ${listenPort} uses wallet ${existingWallet}, but current config uses ${account.address}. Reusing existing proxy.`,\n );\n }\n\n options.onReady?.(listenPort);\n\n return {\n port: listenPort,\n baseUrl,\n walletAddress: existingWallet,\n balanceMonitor,\n close: async () => {\n // No-op: we didn't start this proxy, so we shouldn't close it\n },\n };\n }\n\n const walletPrivateKey = options.walletKey.trim() as `0x${string}`;\n const account = privateKeyToAccount(walletPrivateKey);\n const balanceMonitor = new BalanceMonitor(account.address);\n const proxyWalletAddressLower = account.address.toLowerCase();\n\n // Track active connections for graceful cleanup\n const connections = new Set<import(\"net\").Socket>();\n\n const createBackendWalletSignature = async (\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n walletAddress: string,\n ): Promise<string | undefined> => {\n if (walletAddress.toLowerCase() !== proxyWalletAddressLower) {\n return undefined;\n }\n\n try {\n return await createWalletSignatureHeaderValue(method, path, walletAddress, walletPrivateKey);\n } catch (err) {\n console.warn(\n `[mnemospark] Failed to create wallet proof for ${path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return undefined;\n }\n };\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n req.on(\"error\", (err) => {\n console.error(`[mnemospark] Request stream error: ${err.message}`);\n });\n res.on(\"error\", (err) => {\n console.error(`[mnemospark] Response stream error: ${err.message}`);\n });\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud price-storage command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, PRICE_STORAGE_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_price_storage_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: PRICE_STORAGE_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_price_storage_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud price-storage\",\n });\n return;\n }\n\n const requestPayload = parsePriceStorageQuoteRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_price_storage_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message:\n \"Missing required fields: wallet_address, object_id, object_id_hash, gb, provider, region\",\n });\n return;\n }\n\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_id = requestPayload.object_id;\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"price-storage\" });\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/price-storage\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_price_storage_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n const backendResponse = await forwardPriceStorageToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n });\n logProxyEvent(\"info\", \"proxy_price_storage_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_price_storage_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_price_storage_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud price-storage: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark proxy endpoint for payment/settle (forwards to backend POST /payment/settle).\n if (req.method === \"POST\" && matchesProxyPath(req.url, PAYMENT_SETTLE_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_payment_settle_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: PAYMENT_SETTLE_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_payment_settle_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark/payment/settle\",\n });\n return;\n }\n\n const record =\n payload && typeof payload === \"object\" ? (payload as Record<string, unknown>) : null;\n const quoteId = typeof record?.quote_id === \"string\" ? record.quote_id.trim() : \"\";\n const walletAddress =\n typeof record?.wallet_address === \"string\" ? record.wallet_address.trim() : \"\";\n const inlinePayment = record?.payment;\n const inlinePaymentAuthorization = record?.payment_authorization;\n if (!quoteId || !walletAddress) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Missing required fields: quote_id, wallet_address\",\n });\n return;\n }\n if (\n inlinePayment !== undefined &&\n (inlinePayment === null ||\n typeof inlinePayment !== \"object\" ||\n Array.isArray(inlinePayment))\n ) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_invalid_payment_shape\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_payment_shape\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid field: payment must be an object when provided\",\n });\n return;\n }\n if (\n inlinePaymentAuthorization !== undefined &&\n !(\n typeof inlinePaymentAuthorization === \"string\" ||\n (inlinePaymentAuthorization !== null &&\n typeof inlinePaymentAuthorization === \"object\" &&\n !Array.isArray(inlinePaymentAuthorization))\n )\n ) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_invalid_payment_authorization_shape\");\n emitProxyTerminalFromStatus(correlation, 400, {\n reason: \"invalid_payment_authorization_shape\",\n });\n sendJson(res, 400, {\n error: \"Bad request\",\n message:\n \"Invalid field: payment_authorization must be an object or string when provided\",\n });\n return;\n }\n\n if (walletAddress.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_wallet_mismatch\", {\n request_wallet: walletAddress,\n proxy_wallet: account.address,\n });\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/payment/settle\",\n walletAddress,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n correlation.quote_id = quoteId;\n correlation.wallet_address = walletAddress;\n emitProxyEvent(\"payment.settle\", \"start\", correlation);\n\n const paymentFetch = createPaymentFetch(walletPrivateKey).fetch;\n const backendResponse = await forwardPaymentSettleToBackend(quoteId, walletAddress, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n fetchImpl: paymentFetch,\n paymentSignature: readHeaderValue(req.headers[\"payment-signature\"]),\n legacyPayment: readHeaderValue(req.headers[\"x-payment\"]),\n payment:\n inlinePayment && typeof inlinePayment === \"object\" && !Array.isArray(inlinePayment)\n ? (inlinePayment as Record<string, unknown>)\n : undefined,\n paymentAuthorization:\n typeof inlinePaymentAuthorization === \"string\"\n ? inlinePaymentAuthorization.trim() || undefined\n : inlinePaymentAuthorization !== undefined\n ? (inlinePaymentAuthorization as Record<string, unknown>)\n : undefined,\n });\n logProxyEvent(\"info\", \"proxy_payment_settle_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"payment.settle\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_payment_settle_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark/payment/settle: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud upload command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, UPLOAD_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_upload_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: UPLOAD_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_upload_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud upload\",\n });\n return;\n }\n\n const requestPayload = parseStorageUploadRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_upload_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message:\n \"Missing required fields: quote_id, wallet_address, object_id, object_id_hash, quoted_storage_price, payload\",\n });\n return;\n }\n\n correlation.quote_id = requestPayload.quote_id;\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_id = requestPayload.object_id;\n\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_upload_wallet_mismatch\", {\n request_wallet: requestPayload.wallet_address,\n proxy_wallet: account.address,\n });\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/storage/upload\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_upload_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n const requiredMicros = BigInt(\n Math.max(1, Math.ceil(requestPayload.quoted_storage_price * 1_000_000)),\n );\n const uploadBalanceMonitor =\n requestPayload.wallet_address.toLowerCase() === account.address.toLowerCase()\n ? balanceMonitor\n : new BalanceMonitor(requestPayload.wallet_address);\n const sufficiency = await uploadBalanceMonitor.checkSufficient(requiredMicros);\n const requiredUSD = uploadBalanceMonitor.formatUSDC(requiredMicros);\n\n if (!sufficiency.sufficient) {\n logProxyEvent(\"warn\", \"proxy_upload_insufficient_balance\", {\n wallet_address: requestPayload.wallet_address,\n balance_usd: sufficiency.info.balanceUSD,\n required_usd: requiredUSD,\n });\n options.onInsufficientFunds?.({\n balanceUSD: sufficiency.info.balanceUSD,\n requiredUSD,\n walletAddress: requestPayload.wallet_address,\n });\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"insufficient_balance\" });\n sendJson(res, 400, {\n error: \"insufficient_balance\",\n message: `Insufficient USDC balance. Current: ${sufficiency.info.balanceUSD}, Required: ${requiredUSD}`,\n wallet: requestPayload.wallet_address,\n help: `Fund wallet ${requestPayload.wallet_address} on Base before running /mnemospark_cloud upload`,\n });\n return;\n }\n\n if (sufficiency.info.isLow) {\n logProxyEvent(\"warn\", \"proxy_upload_low_balance\", {\n wallet_address: requestPayload.wallet_address,\n balance_usd: sufficiency.info.balanceUSD,\n });\n options.onLowBalance?.({\n balanceUSD: sufficiency.info.balanceUSD,\n walletAddress: requestPayload.wallet_address,\n });\n }\n\n // Settle payment first (with 402 handling); then upload without payment headers.\n const settleWalletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/payment/settle\",\n requestPayload.wallet_address,\n );\n if (!settleWalletSignature) {\n logProxyEvent(\"warn\", \"proxy_upload_settle_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"settle_signature_missing\" });\n return;\n }\n const uploadPaymentFetch = createPaymentFetch(walletPrivateKey).fetch;\n emitProxyEvent(\"payment.settle\", \"start\", correlation, { via: \"upload\" });\n const settleResponse = await forwardPaymentSettleToBackend(\n requestPayload.quote_id,\n requestPayload.wallet_address,\n {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature: settleWalletSignature,\n fetchImpl: uploadPaymentFetch,\n },\n );\n emitProxyEvent(\"payment.settle\", \"result\", correlation, { status: settleResponse.status });\n const settledAlready = isAlreadySettledConflict(\n settleResponse.status,\n settleResponse.bodyText,\n );\n if (settleResponse.status !== 200 && !settledAlready) {\n logProxyEvent(\"warn\", \"proxy_upload_settle_failed\", {\n status: settleResponse.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: settleResponse.contentType,\n paymentRequired: settleResponse.paymentRequired,\n paymentResponse: settleResponse.paymentResponse,\n });\n res.writeHead(settleResponse.status, responseHeaders);\n res.end(settleResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, settleResponse.status, {\n reason: \"settle_failed\",\n });\n return;\n }\n if (settledAlready) {\n emitProxyEvent(\"retry.decision\", \"decision\", correlation, {\n reason: \"payment_already_settled_conflict\",\n status: settleResponse.status,\n });\n logProxyEvent(\"info\", \"proxy_upload_settle_already_confirmed\", {\n status: settleResponse.status,\n });\n }\n\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"storage/upload\" });\n const backendResponse = await forwardStorageUploadToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n idempotencyKey: readHeaderValue(req.headers[\"idempotency-key\"]),\n });\n logProxyEvent(\"info\", \"proxy_upload_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_upload_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_upload_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud upload: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud upload confirm command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, UPLOAD_CONFIRM_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_upload_confirm_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: UPLOAD_CONFIRM_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_upload_confirm_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud upload/confirm\",\n });\n return;\n }\n\n const requestPayload = parseStorageUploadConfirmRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_upload_confirm_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message:\n \"Missing required fields: quote_id, wallet_address, object_key, idempotency_key\",\n });\n return;\n }\n correlation.quote_id = requestPayload.quote_id;\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_key = requestPayload.object_key;\n\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_upload_confirm_wallet_mismatch\", {\n request_wallet: requestPayload.wallet_address,\n proxy_wallet: account.address,\n });\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/storage/upload/confirm\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_upload_confirm_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"storage/upload/confirm\" });\n const backendResponse = await forwardStorageUploadConfirmToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n });\n logProxyEvent(\"info\", \"proxy_upload_confirm_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_upload_confirm_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_upload_confirm_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud upload/confirm: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud ls command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, STORAGE_LS_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_ls_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: STORAGE_LS_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_ls_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud ls\",\n });\n return;\n }\n\n const requestPayload = parseStorageObjectRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_ls_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Missing required fields: wallet_address, object_key\",\n });\n return;\n }\n\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_key = requestPayload.object_key;\n\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_ls_wallet_mismatch\");\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/storage/ls\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_ls_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"storage/ls\" });\n const backendResponse = await forwardStorageLsToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n });\n logProxyEvent(\"info\", \"proxy_ls_backend_response\", { status: backendResponse.status });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_ls_auth_failure\", { status: authFailure.status });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_ls_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud ls: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud download command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, STORAGE_DOWNLOAD_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_download_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, {\n path: STORAGE_DOWNLOAD_PROXY_PATH,\n });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_download_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud download\",\n });\n return;\n }\n\n const requestPayload = parseStorageObjectRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_download_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Missing required fields: wallet_address, object_key\",\n });\n return;\n }\n\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_key = requestPayload.object_key;\n\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_download_wallet_mismatch\");\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/storage/download\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_download_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"storage/download\" });\n const backendResponse = await forwardStorageDownloadToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n });\n logProxyEvent(\"info\", \"proxy_download_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_download_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n // Forward backend failures directly so client gets original status/details.\n if (backendResponse.status < 200 || backendResponse.status >= 300) {\n logProxyEvent(\"warn\", \"proxy_download_backend_non_success\", {\n status: backendResponse.status,\n });\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n return;\n }\n\n const downloadResult = await downloadStorageToDisk(requestPayload, backendResponse, {\n outputDir: resolveDownloadOutputDir(),\n });\n logProxyEvent(\"info\", \"proxy_download_written_to_disk\", {\n key: downloadResult.key,\n file_path: downloadResult.filePath,\n bytes_written: downloadResult.bytesWritten,\n });\n sendJson(res, 200, {\n success: true,\n key: downloadResult.key,\n file_path: downloadResult.filePath,\n bytes_written: downloadResult.bytesWritten,\n });\n emitProxyTerminalFromStatus(correlation, 200);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_download_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud download: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Mnemospark backend proxy endpoint for /mnemospark_cloud delete command.\n if (req.method === \"POST\" && matchesProxyPath(req.url, STORAGE_DELETE_PROXY_PATH)) {\n const correlation = createProxyCorrelation(req.headers);\n logProxyEvent(\"info\", \"proxy_delete_received\");\n emitProxyEvent(\"request.received\", \"start\", correlation, { path: STORAGE_DELETE_PROXY_PATH });\n try {\n let payload: unknown;\n try {\n payload = await readProxyJsonBody(req);\n } catch {\n logProxyEvent(\"warn\", \"proxy_delete_invalid_json\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"invalid_json\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Invalid JSON body for /mnemospark_cloud delete\",\n });\n return;\n }\n\n const requestPayload = parseStorageObjectRequest(payload);\n if (!requestPayload) {\n logProxyEvent(\"warn\", \"proxy_delete_missing_fields\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"missing_fields\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"Missing required fields: wallet_address, object_key\",\n });\n return;\n }\n\n correlation.wallet_address = requestPayload.wallet_address;\n correlation.object_key = requestPayload.object_key;\n\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_delete_wallet_mismatch\");\n emitProxyTerminalFromStatus(correlation, 403, { reason: \"wallet_mismatch\" });\n sendJson(res, 403, {\n error: \"wallet_proof_invalid\",\n message: \"wallet proof invalid\",\n });\n return;\n }\n\n const walletSignature = await createBackendWalletSignature(\n \"POST\",\n \"/storage/delete\",\n requestPayload.wallet_address,\n );\n if (!walletSignature) {\n logProxyEvent(\"warn\", \"proxy_delete_wallet_signature_missing\");\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(createWalletRequiredBody());\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"wallet_signature_missing\" });\n return;\n }\n\n emitProxyEvent(\"storage.call\", \"start\", correlation, { target: \"storage/delete\" });\n const backendResponse = await forwardStorageDeleteToBackend(requestPayload, {\n backendBaseUrl: MNEMOSPARK_BACKEND_API_BASE_URL,\n walletSignature,\n });\n logProxyEvent(\"info\", \"proxy_delete_backend_response\", {\n status: backendResponse.status,\n });\n emitProxyEvent(\"storage.call\", \"result\", correlation, { status: backendResponse.status });\n\n const authFailure = normalizeBackendAuthFailure(\n backendResponse.status,\n backendResponse.bodyText,\n );\n if (authFailure) {\n logProxyEvent(\"warn\", \"proxy_delete_auth_failure\", {\n status: authFailure.status,\n });\n const responseHeaders = createBackendForwardHeaders({\n contentType: authFailure.contentType,\n paymentRequired: backendResponse.paymentRequired,\n paymentResponse: backendResponse.paymentResponse,\n });\n res.writeHead(authFailure.status, responseHeaders);\n res.end(authFailure.bodyText);\n emitProxyTerminalFromStatus(correlation, authFailure.status, { reason: \"auth_failure\" });\n return;\n }\n\n const responseHeaders = createBackendForwardHeaders(backendResponse);\n res.writeHead(backendResponse.status, responseHeaders);\n res.end(backendResponse.bodyText);\n emitProxyTerminalFromStatus(correlation, backendResponse.status);\n } catch (err) {\n emitProxyEvent(\"terminal.failure\", \"failure\", correlation, {\n error: err instanceof Error ? err.message : String(err),\n });\n logProxyEvent(\"error\", \"proxy_delete_forward_failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n sendJson(res, 502, {\n error: \"proxy_error\",\n message: `Failed to forward /mnemospark_cloud delete: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n // Health check with optional balance info\n if (req.url === \"/health\" || req.url?.startsWith(\"/health?\")) {\n const url = new URL(req.url, \"http://localhost\");\n const full = url.searchParams.get(\"full\") === \"true\";\n\n const response: Record<string, unknown> = {\n status: \"ok\",\n wallet: account.address,\n backendConfigured: MNEMOSPARK_BACKEND_API_BASE_URL.trim().length > 0,\n };\n\n if (full) {\n try {\n const balanceInfo = await balanceMonitor.checkBalance();\n response.balance = balanceInfo.balanceUSD;\n response.isLow = balanceInfo.isLow;\n response.isEmpty = balanceInfo.isEmpty;\n } catch {\n response.balanceError = \"Could not fetch balance\";\n }\n }\n\n sendJson(res, 200, response);\n return;\n }\n\n sendJson(res, 404, {\n error: \"Not found\",\n message: \"Supported paths: /health and /mnemospark/* storage endpoints\",\n });\n });\n\n // Listen on configured port with retry logic for TIME_WAIT handling\n // When gateway restarts quickly, the port may still be in TIME_WAIT state.\n // We retry with delay instead of incorrectly assuming a proxy is running.\n const tryListen = (attempt: number): Promise<void> => {\n return new Promise<void>((resolveAttempt, rejectAttempt) => {\n const onError = async (err: NodeJS.ErrnoException) => {\n server.removeListener(\"error\", onError);\n\n if (err.code === \"EADDRINUSE\") {\n // Port is in use - check if a proxy is actually running\n const existingWallet = await checkExistingProxy(listenPort);\n if (existingWallet) {\n // Proxy is actually running - this is fine, reuse it\n console.log(`[mnemospark] Existing proxy detected on port ${listenPort}, reusing`);\n rejectAttempt({ code: \"REUSE_EXISTING\", wallet: existingWallet });\n return;\n }\n\n // Port is in TIME_WAIT (no proxy responding) - retry after delay\n if (attempt < PORT_RETRY_ATTEMPTS) {\n console.log(\n `[mnemospark] Port ${listenPort} in TIME_WAIT, retrying in ${PORT_RETRY_DELAY_MS}ms (attempt ${attempt}/${PORT_RETRY_ATTEMPTS})`,\n );\n rejectAttempt({ code: \"RETRY\", attempt });\n return;\n }\n\n // Max retries exceeded\n console.error(\n `[mnemospark] Port ${listenPort} still in use after ${PORT_RETRY_ATTEMPTS} attempts`,\n );\n rejectAttempt(err);\n return;\n }\n\n rejectAttempt(err);\n };\n\n server.once(\"error\", onError);\n server.listen(listenPort, \"127.0.0.1\", () => {\n server.removeListener(\"error\", onError);\n resolveAttempt();\n });\n });\n };\n\n // Retry loop for port binding\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= PORT_RETRY_ATTEMPTS; attempt++) {\n try {\n await tryListen(attempt);\n break; // Success\n } catch (err: unknown) {\n const error = err as { code?: string; wallet?: string };\n\n if (error.code === \"REUSE_EXISTING\" && error.wallet) {\n // Proxy is running, reuse it\n const baseUrl = `http://127.0.0.1:${listenPort}`;\n options.onReady?.(listenPort);\n return {\n port: listenPort,\n baseUrl,\n walletAddress: error.wallet,\n balanceMonitor,\n close: async () => {\n // No-op: we didn't start this proxy, so we shouldn't close it\n },\n };\n }\n\n if (error.code === \"RETRY\") {\n // Wait before retry\n await new Promise((r) => setTimeout(r, PORT_RETRY_DELAY_MS));\n continue;\n }\n\n // Other error - throw\n lastError = err as Error;\n break;\n }\n }\n\n if (lastError) {\n throw lastError;\n }\n\n // Server is now listening - set up remaining handlers\n const addr = server.address() as AddressInfo;\n const port = addr.port;\n const baseUrl = `http://127.0.0.1:${port}`;\n\n options.onReady?.(port);\n\n // Add runtime error handler AFTER successful listen\n // This handles errors that occur during server operation (not just startup)\n server.on(\"error\", (err) => {\n console.error(`[mnemospark] Server runtime error: ${err.message}`);\n options.onError?.(err);\n });\n\n // Handle client connection errors (bad requests, socket errors)\n server.on(\"clientError\", (err, socket) => {\n console.error(`[mnemospark] Client error: ${err.message}`);\n // Send 400 Bad Request if socket is still writable\n if (socket.writable && !socket.destroyed) {\n socket.end(\"HTTP/1.1 400 Bad Request\\r\\n\\r\\n\");\n }\n });\n\n // Track connections for graceful cleanup\n server.on(\"connection\", (socket) => {\n connections.add(socket);\n\n // Keep alignment with prior behavior for long-running uploads/downloads.\n socket.setTimeout(300_000);\n\n socket.on(\"timeout\", () => {\n console.error(`[mnemospark] Socket timeout, destroying connection`);\n socket.destroy();\n });\n\n socket.on(\"error\", (err) => {\n console.error(`[mnemospark] Socket error: ${err.message}`);\n });\n\n socket.on(\"close\", () => {\n connections.delete(socket);\n });\n });\n\n return {\n port,\n baseUrl,\n walletAddress: account.address,\n balanceMonitor,\n close: () =>\n new Promise<void>((res, rej) => {\n const timeout = setTimeout(() => {\n rej(new Error(\"[mnemospark] Close timeout after 4s\"));\n }, 4000);\n\n // Destroy all active connections before closing server\n for (const socket of connections) {\n socket.destroy();\n }\n connections.clear();\n server.close((err) => {\n clearTimeout(timeout);\n if (err) {\n rej(err);\n } else {\n res();\n }\n });\n }),\n };\n}\n","/**\n * USDC balance monitor for mnemospark\n *\n * Monitors USDC balance on Base network with intelligent caching.\n * Provides pre-request balance checks to prevent failed payments.\n *\n * Caching Strategy:\n * - TTL: 30 seconds (balance is cached to avoid excessive RPC calls)\n * - Optimistic deduction: after successful payment, subtract estimated cost from cache\n * - Invalidation: on payment failure, immediately refresh from RPC\n */\n\nimport { createPublicClient, http, erc20Abi } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { RpcError } from \"./errors.js\";\n\n/** USDC contract address on Base mainnet */\nconst USDC_BASE = \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\" as const;\n\n/** Cache TTL in milliseconds (30 seconds) */\nconst CACHE_TTL_MS = 30_000;\n\n/** Balance thresholds in USDC smallest unit (6 decimals) */\nexport const BALANCE_THRESHOLDS = {\n /** Low balance warning threshold: $1.00 */\n LOW_BALANCE_MICROS: 1_000_000n,\n /** Effectively zero threshold: $0.0001 (covers dust/rounding) */\n ZERO_THRESHOLD: 100n,\n} as const;\n\n/** Balance information returned by checkBalance() */\nexport type BalanceInfo = {\n /** Raw balance in USDC smallest unit (6 decimals) */\n balance: bigint;\n /** Formatted balance as \"$X.XX\" */\n balanceUSD: string;\n /** True if balance < $1.00 */\n isLow: boolean;\n /** True if balance < $0.0001 (effectively zero) */\n isEmpty: boolean;\n /** Wallet address for funding instructions */\n walletAddress: string;\n};\n\n/** Result from checkSufficient() */\nexport type SufficiencyResult = {\n /** True if balance >= estimated cost */\n sufficient: boolean;\n /** Current balance info */\n info: BalanceInfo;\n /** If insufficient, the shortfall as \"$X.XX\" */\n shortfall?: string;\n};\n\n/**\n * Monitors USDC balance on Base network.\n *\n * Usage:\n * const monitor = new BalanceMonitor(\"0x...\");\n * const info = await monitor.checkBalance();\n * if (info.isLow) console.warn(\"Low balance!\");\n */\nexport class BalanceMonitor {\n private readonly client;\n private readonly walletAddress: `0x${string}`;\n\n /** Cached balance (null = not yet fetched) */\n private cachedBalance: bigint | null = null;\n /** Timestamp when cache was last updated */\n private cachedAt = 0;\n\n constructor(walletAddress: string) {\n this.walletAddress = walletAddress as `0x${string}`;\n this.client = createPublicClient({\n chain: base,\n transport: http(undefined, {\n timeout: 10_000, // 10 second timeout to prevent hanging on slow RPC\n }),\n });\n }\n\n /**\n * Check current USDC balance.\n * Uses cache if valid, otherwise fetches from RPC.\n */\n async checkBalance(): Promise<BalanceInfo> {\n const now = Date.now();\n\n // Use cache if valid\n if (this.cachedBalance !== null && now - this.cachedAt < CACHE_TTL_MS) {\n return this.buildInfo(this.cachedBalance);\n }\n\n // Fetch from RPC\n const balance = await this.fetchBalance();\n this.cachedBalance = balance;\n this.cachedAt = now;\n\n return this.buildInfo(balance);\n }\n\n /**\n * Check if balance is sufficient for an estimated cost.\n *\n * @param estimatedCostMicros - Estimated cost in USDC smallest unit (6 decimals)\n */\n async checkSufficient(estimatedCostMicros: bigint): Promise<SufficiencyResult> {\n const info = await this.checkBalance();\n\n if (info.balance >= estimatedCostMicros) {\n return { sufficient: true, info };\n }\n\n const shortfall = estimatedCostMicros - info.balance;\n return {\n sufficient: false,\n info,\n shortfall: this.formatUSDC(shortfall),\n };\n }\n\n /**\n * Optimistically deduct estimated cost from cached balance.\n * Call this after a successful payment to keep cache accurate.\n *\n * @param amountMicros - Amount to deduct in USDC smallest unit\n */\n deductEstimated(amountMicros: bigint): void {\n if (this.cachedBalance !== null && this.cachedBalance >= amountMicros) {\n this.cachedBalance -= amountMicros;\n }\n }\n\n /**\n * Invalidate cache, forcing next checkBalance() to fetch from RPC.\n * Call this after a payment failure to get accurate balance.\n */\n invalidate(): void {\n this.cachedBalance = null;\n this.cachedAt = 0;\n }\n\n /**\n * Force refresh balance from RPC (ignores cache).\n */\n async refresh(): Promise<BalanceInfo> {\n this.invalidate();\n return this.checkBalance();\n }\n\n /**\n * Format USDC amount (in micros) as \"$X.XX\".\n */\n formatUSDC(amountMicros: bigint): string {\n // USDC has 6 decimals\n const dollars = Number(amountMicros) / 1_000_000;\n return `$${dollars.toFixed(2)}`;\n }\n\n /**\n * Get the wallet address being monitored.\n */\n getWalletAddress(): string {\n return this.walletAddress;\n }\n\n /** Fetch balance from RPC */\n private async fetchBalance(): Promise<bigint> {\n try {\n const balance = await this.client.readContract({\n address: USDC_BASE,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [this.walletAddress],\n });\n return balance;\n } catch (error) {\n // Throw typed error instead of silently returning 0\n // This allows callers to distinguish \"node down\" from \"wallet empty\"\n throw new RpcError(error instanceof Error ? error.message : \"Unknown error\", error);\n }\n }\n\n /** Build BalanceInfo from raw balance */\n private buildInfo(balance: bigint): BalanceInfo {\n return {\n balance,\n balanceUSD: this.formatUSDC(balance),\n isLow: balance < BALANCE_THRESHOLDS.LOW_BALANCE_MICROS,\n isEmpty: balance < BALANCE_THRESHOLDS.ZERO_THRESHOLD,\n walletAddress: this.walletAddress,\n };\n }\n}\n","/**\n * Typed Error Classes for mnemospark\n *\n * Provides structured errors for balance-related failures with\n * all necessary information for user-friendly error messages.\n */\n\n/**\n * Thrown when wallet has insufficient USDC balance for a request.\n */\nexport class InsufficientFundsError extends Error {\n readonly code = \"INSUFFICIENT_FUNDS\" as const;\n readonly currentBalanceUSD: string;\n readonly requiredUSD: string;\n readonly walletAddress: string;\n\n constructor(opts: { currentBalanceUSD: string; requiredUSD: string; walletAddress: string }) {\n const msg = [\n `Insufficient balance. Current: ${opts.currentBalanceUSD}, Required: ${opts.requiredUSD}`,\n `Options:`,\n ` 1. Fund wallet: ${opts.walletAddress}`,\n ` 2. Use free model: /model free`,\n ].join(\"\\n\");\n super(msg);\n this.name = \"InsufficientFundsError\";\n this.currentBalanceUSD = opts.currentBalanceUSD;\n this.requiredUSD = opts.requiredUSD;\n this.walletAddress = opts.walletAddress;\n }\n}\n\n/**\n * Thrown when wallet has no USDC balance (or effectively zero).\n */\nexport class EmptyWalletError extends Error {\n readonly code = \"EMPTY_WALLET\" as const;\n readonly walletAddress: string;\n\n constructor(walletAddress: string) {\n const msg = [\n `No USDC balance.`,\n `Options:`,\n ` 1. Fund wallet: ${walletAddress}`,\n ` 2. Use free model: /model free`,\n ` 3. Uninstall: bash ~/.openclaw/extensions/mnemospark/scripts/uninstall.sh`,\n ].join(\"\\n\");\n super(msg);\n this.name = \"EmptyWalletError\";\n this.walletAddress = walletAddress;\n }\n}\n\n/**\n * Type guard to check if an error is InsufficientFundsError.\n */\nexport function isInsufficientFundsError(error: unknown): error is InsufficientFundsError {\n return error instanceof Error && (error as InsufficientFundsError).code === \"INSUFFICIENT_FUNDS\";\n}\n\n/**\n * Type guard to check if an error is EmptyWalletError.\n */\nexport function isEmptyWalletError(error: unknown): error is EmptyWalletError {\n return error instanceof Error && (error as EmptyWalletError).code === \"EMPTY_WALLET\";\n}\n\n/**\n * Type guard to check if an error is a balance-related error.\n */\nexport function isBalanceError(error: unknown): error is InsufficientFundsError | EmptyWalletError {\n return isInsufficientFundsError(error) || isEmptyWalletError(error);\n}\n\n/**\n * Thrown when RPC call fails (network error, node down, etc).\n * Distinguishes infrastructure failures from actual empty wallets.\n */\nexport class RpcError extends Error {\n readonly code = \"RPC_ERROR\" as const;\n readonly originalError: unknown;\n\n constructor(message: string, originalError?: unknown) {\n super(`RPC error: ${message}. Check network connectivity.`);\n this.name = \"RpcError\";\n this.originalError = originalError;\n }\n}\n\n/**\n * Type guard to check if an error is RpcError.\n */\nexport function isRpcError(error: unknown): error is RpcError {\n return error instanceof Error && (error as RpcError).code === \"RPC_ERROR\";\n}\n","/**\n * Configuration Module\n *\n * Reads environment variables at module load time.\n * Separated from network code to avoid security scanner false positives.\n */\n\nconst DEFAULT_PORT = 7120;\n\n/**\n * Proxy port configuration - resolved once at module load.\n * Reads MNEMOSPARK_PROXY_PORT env var or defaults to 7120 (mnemospark does not conflict with BlockRun proxy on 8402).\n */\nexport const PROXY_PORT = (() => {\n const envPort = process.env.MNEMOSPARK_PROXY_PORT;\n if (envPort) {\n const parsed = parseInt(envPort, 10);\n if (!isNaN(parsed) && parsed > 0 && parsed < 65536) {\n return parsed;\n }\n }\n return DEFAULT_PORT;\n})();\n\n/**\n * Mnemospark backend API base URL for proxy → backend calls.\n * Example: https://{api-id}.execute-api.{region}.amazonaws.com/{stage}\n */\nexport const MNEMOSPARK_BACKEND_API_BASE_URL = (\n process.env.MNEMOSPARK_BACKEND_API_BASE_URL ?? \"\"\n).trim();\n","import { getAddress } from \"viem\";\nimport { privateKeyToAccount, signTypedData } from \"viem/accounts\";\nimport { createNonce } from \"./nonce.js\";\n\nexport const MNEMOSPARK_DOMAIN_NAME = \"Mnemospark\";\nexport const MNEMOSPARK_DOMAIN_VERSION = \"1\";\nexport const MNEMOSPARK_VERIFYING_CONTRACT = \"0x0000000000000000000000000000000000000001\" as const;\n\nexport const BASE_MAINNET_CHAIN_ID = 8453;\nexport const BASE_SEPOLIA_CHAIN_ID = 84532;\n\nexport type MnemosparkChainId = typeof BASE_MAINNET_CHAIN_ID | typeof BASE_SEPOLIA_CHAIN_ID;\n\nexport type MnemosparkRequestPayload = {\n method: string;\n path: string;\n walletAddress: `0x${string}`;\n nonce: `0x${string}`;\n timestamp: string;\n};\n\nexport type WalletSignatureHeaderEnvelope = {\n payloadB64: string;\n signature: string;\n address: `0x${string}`;\n};\n\n/** EIP-712 struct types: bytes32/uint256 align with Solidity and Permit-style (OpenZeppelin EIP712). */\nexport const MNEMOSPARK_REQUEST_TYPES = {\n MnemosparkRequest: [\n { name: \"method\", type: \"string\" },\n { name: \"path\", type: \"string\" },\n { name: \"walletAddress\", type: \"address\" },\n { name: \"nonce\", type: \"bytes32\" },\n { name: \"timestamp\", type: \"uint256\" },\n ],\n} as const;\n\ntype BuildPayloadOptions = {\n nonce?: `0x${string}`;\n timestamp?: string;\n};\n\nexport type CreateWalletSignatureHeaderOptions = BuildPayloadOptions & {\n chainId?: MnemosparkChainId;\n};\n\nfunction encodeBase64Json(value: unknown): string {\n return Buffer.from(JSON.stringify(value), \"utf8\").toString(\"base64\");\n}\n\nfunction decodeBase64Json<T>(value: string): T {\n const decoded = Buffer.from(value, \"base64\").toString(\"utf8\");\n return JSON.parse(decoded) as T;\n}\n\nfunction normalizeMethod(method: string): string {\n const normalized = method.trim().toUpperCase();\n if (!normalized) {\n throw new Error(\"Request signing requires a non-empty HTTP method.\");\n }\n return normalized;\n}\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n if (!trimmed) {\n throw new Error(\"Request signing requires a non-empty path.\");\n }\n\n let parsedPath: string;\n if (/^https?:\\/\\//i.test(trimmed)) {\n parsedPath = new URL(trimmed).pathname;\n } else {\n parsedPath = trimmed.split(\"?\")[0]?.split(\"#\")[0] ?? \"\";\n }\n\n if (!parsedPath) {\n throw new Error(\"Request signing requires a valid request path.\");\n }\n\n const prefixed = parsedPath.startsWith(\"/\") ? parsedPath : `/${parsedPath}`;\n const deduplicated = prefixed.replace(/\\/{2,}/g, \"/\");\n return deduplicated.length > 1 && deduplicated.endsWith(\"/\")\n ? deduplicated.slice(0, -1)\n : deduplicated;\n}\n\nfunction normalizeTimestamp(value: string | undefined): string {\n const timestamp = value ?? Math.floor(Date.now() / 1000).toString();\n if (!/^\\d+$/.test(timestamp)) {\n throw new Error(\"Request signing timestamp must be a Unix timestamp in seconds.\");\n }\n return timestamp;\n}\n\nfunction normalizeNonce(value: `0x${string}` | undefined): `0x${string}` {\n const nonce = value ?? createNonce();\n if (!/^0x[0-9a-fA-F]{64}$/.test(nonce)) {\n throw new Error(\"Request signing nonce must be a 32-byte hex value.\");\n }\n return nonce;\n}\n\nfunction normalizeChainId(chainId: MnemosparkChainId | undefined): MnemosparkChainId {\n const selected = chainId ?? BASE_MAINNET_CHAIN_ID;\n if (selected !== BASE_MAINNET_CHAIN_ID && selected !== BASE_SEPOLIA_CHAIN_ID) {\n throw new Error(`Unsupported chainId for request signing: ${selected}`);\n }\n return selected;\n}\n\nexport function createMnemosparkRequestDomain(chainId?: MnemosparkChainId) {\n return {\n name: MNEMOSPARK_DOMAIN_NAME,\n version: MNEMOSPARK_DOMAIN_VERSION,\n chainId: normalizeChainId(chainId),\n verifyingContract: MNEMOSPARK_VERIFYING_CONTRACT,\n } as const;\n}\n\nexport function createMnemosparkRequestPayload(\n method: string,\n path: string,\n walletAddress: string,\n options?: BuildPayloadOptions,\n): MnemosparkRequestPayload {\n return {\n method: normalizeMethod(method),\n path: normalizePath(path),\n walletAddress: getAddress(walletAddress),\n nonce: normalizeNonce(options?.nonce),\n timestamp: normalizeTimestamp(options?.timestamp),\n };\n}\n\nexport function decodeWalletSignatureHeaderValue(\n headerValue: string,\n): WalletSignatureHeaderEnvelope {\n return decodeBase64Json<WalletSignatureHeaderEnvelope>(headerValue);\n}\n\nexport function decodeWalletSignaturePayload(payloadB64: string): MnemosparkRequestPayload {\n return decodeBase64Json<MnemosparkRequestPayload>(payloadB64);\n}\n\nexport async function createWalletSignatureHeaderValue(\n method: string,\n path: string,\n walletAddress: string,\n walletPrivateKey: `0x${string}`,\n options?: CreateWalletSignatureHeaderOptions,\n): Promise<string> {\n const payload = createMnemosparkRequestPayload(method, path, walletAddress, {\n nonce: options?.nonce,\n timestamp: options?.timestamp,\n });\n const signer = privateKeyToAccount(walletPrivateKey);\n\n if (signer.address.toLowerCase() !== payload.walletAddress.toLowerCase()) {\n throw new Error(\n `Wallet address ${payload.walletAddress} does not match signer address ${signer.address}.`,\n );\n }\n\n const signature = await signTypedData({\n privateKey: walletPrivateKey,\n domain: createMnemosparkRequestDomain(options?.chainId),\n types: MNEMOSPARK_REQUEST_TYPES,\n primaryType: \"MnemosparkRequest\",\n message: {\n method: payload.method,\n path: payload.path,\n walletAddress: payload.walletAddress,\n nonce: payload.nonce as `0x${string}`,\n timestamp: BigInt(payload.timestamp),\n },\n });\n\n const headerEnvelope: WalletSignatureHeaderEnvelope = {\n payloadB64: encodeBase64Json(payload),\n signature,\n address: signer.address,\n };\n\n return encodeBase64Json(headerEnvelope);\n}\n","/**\n * Generates a cryptographically random 32-byte value as a 0x-prefixed hex string.\n * Used for request signing nonces and payment transfer nonces.\n */\nexport function createNonce(): `0x${string}` {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return `0x${Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")}` as `0x${string}`;\n}\n","export const MNEMOSPARK_TRACE_ID_HEADER = \"X-Mnemospark-Trace-Id\";\nexport const MNEMOSPARK_OPERATION_ID_HEADER = \"X-Mnemospark-Operation-Id\";\n\nexport type RequestCorrelation = {\n traceId?: string;\n operationId?: string;\n};\n\nexport function applyCorrelationHeaders(\n headers: Record<string, string>,\n correlation?: RequestCorrelation,\n): Record<string, string> {\n const traceId = correlation?.traceId?.trim();\n if (traceId) {\n headers[MNEMOSPARK_TRACE_ID_HEADER] = traceId;\n }\n\n const operationId = correlation?.operationId?.trim();\n if (operationId) {\n headers[MNEMOSPARK_OPERATION_ID_HEADER] = operationId;\n }\n\n return headers;\n}\n","export function normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nexport function asNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number.parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return null;\n}\n\nexport function asNonEmptyString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nexport function normalizePaymentRequired(headers: Headers): string | undefined {\n return headers.get(\"PAYMENT-REQUIRED\") ?? headers.get(\"x-payment-required\") ?? undefined;\n}\n\nexport function normalizePaymentResponse(headers: Headers): string | undefined {\n return headers.get(\"PAYMENT-RESPONSE\") ?? headers.get(\"x-payment-response\") ?? undefined;\n}\n","export function normalizeWalletSignature(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n","import { PROXY_PORT } from \"./config.js\";\nimport { applyCorrelationHeaders, type RequestCorrelation } from \"./cloud-correlation.js\";\nimport {\n asNonEmptyString,\n asNumber,\n asRecord,\n normalizeBaseUrl,\n normalizePaymentRequired,\n normalizePaymentResponse,\n} from \"./cloud-utils.js\";\nimport { normalizeWalletSignature } from \"./wallet-signature.js\";\n\nexport const PRICE_STORAGE_PROXY_PATH = \"/mnemospark/price-storage\";\nexport const PAYMENT_SETTLE_PROXY_PATH = \"/mnemospark/payment/settle\";\nexport const UPLOAD_PROXY_PATH = \"/mnemospark/upload\";\nexport const UPLOAD_CONFIRM_PROXY_PATH = \"/mnemospark/upload/confirm\";\n\nexport type PriceStorageQuoteRequest = {\n wallet_address: string;\n object_id: string;\n object_id_hash: string;\n gb: number;\n provider: string;\n region: string;\n};\n\nexport type PriceStorageQuoteResponse = {\n timestamp: string;\n quote_id: string;\n storage_price: number;\n addr: string;\n object_id: string;\n object_id_hash: string;\n object_size_gb: number;\n provider: string;\n location: string;\n};\n\nexport type UploadPayload = {\n mode: \"inline\" | \"presigned\";\n content_base64?: string;\n content_sha256: string;\n content_length_bytes: number;\n wrapped_dek: string;\n encryption_algorithm: \"AES-256-GCM\";\n bucket_name_hint: string;\n key_store_path_hint: string;\n};\n\nexport type StorageUploadRequest = {\n quote_id: string;\n wallet_address: string;\n object_id: string;\n object_id_hash: string;\n quoted_storage_price: number;\n payload: UploadPayload;\n};\n\nexport type StorageUploadConfirmRequest = {\n quote_id: string;\n wallet_address: string;\n object_key: string;\n idempotency_key: string;\n};\n\nexport type StorageUploadResponse = {\n quote_id: string;\n addr: string;\n addr_hash?: string;\n trans_id?: string;\n storage_price?: number;\n object_id: string;\n object_key: string;\n provider: string;\n bucket_name: string;\n location: string;\n upload_url?: string;\n upload_headers?: Record<string, string>;\n confirmation_required?: boolean;\n};\n\ntype FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\ntype ProxyQuoteOptions = {\n proxyBaseUrl?: string;\n fetchImpl?: FetchLike;\n correlation?: RequestCorrelation;\n};\n\ntype ProxyUploadOptions = {\n proxyBaseUrl?: string;\n fetchImpl?: FetchLike;\n idempotencyKey?: string;\n maxRetries?: number;\n correlation?: RequestCorrelation;\n};\n\ntype ProxyUploadConfirmOptions = {\n proxyBaseUrl?: string;\n fetchImpl?: FetchLike;\n correlation?: RequestCorrelation;\n};\n\n/**\n * Options for forwarding price-storage to the backend directly.\n * When backendBaseUrl is set, walletSignature is required (backend requires X-Wallet-Signature).\n * Use the proxy for price-storage if you do not have a wallet signature, or pass walletSignature.\n */\ntype BackendQuoteOptions = {\n backendBaseUrl?: string;\n /** Required when calling the backend directly. Omit only when using the proxy. */\n walletSignature?: string;\n fetchImpl?: FetchLike;\n};\n\ntype BackendUploadOptions = {\n backendBaseUrl?: string;\n walletSignature?: string;\n fetchImpl?: FetchLike;\n idempotencyKey?: string;\n};\n\ntype BackendUploadConfirmOptions = {\n backendBaseUrl?: string;\n walletSignature?: string;\n fetchImpl?: FetchLike;\n};\n\n/** Request body for POST /payment/settle. */\nexport type PaymentSettleRequest = {\n quote_id: string;\n wallet_address: string;\n payment?: Record<string, unknown>;\n payment_authorization?: Record<string, unknown> | string;\n};\n/** Options for forwarding payment/settle to the backend. */\nexport type BackendSettleOptions = {\n backendBaseUrl?: string;\n walletSignature?: string;\n fetchImpl?: FetchLike;\n /** Optional payment authorization (PAYMENT-SIGNATURE / x-payment) for 402 retry. */\n paymentSignature?: string;\n legacyPayment?: string;\n /** Optional inline payment authorization payload. */\n payment?: Record<string, unknown>;\n /** Optional alternate inline payment authorization envelope. */\n paymentAuthorization?: Record<string, unknown> | string;\n};\n\n/** Options for requesting payment/settle via the proxy. */\nexport type ProxySettleOptions = {\n proxyBaseUrl?: string;\n fetchImpl?: FetchLike;\n correlation?: RequestCorrelation;\n /** Optional inline payment authorization payload. */\n payment?: Record<string, unknown>;\n /** Optional alternate inline payment authorization envelope. */\n paymentAuthorization?: Record<string, unknown> | string;\n};\n\n/** Result from forwarding payment/settle to the backend (or proxy). */\nexport type BackendSettleForwardResult = {\n status: number;\n bodyText: string;\n contentType: string;\n paymentRequired?: string;\n paymentResponse?: string;\n};\n\ntype BackendQuoteForwardResult = {\n status: number;\n bodyText: string;\n contentType: string;\n paymentRequired?: string;\n paymentResponse?: string;\n};\n\ntype BackendUploadForwardResult = {\n status: number;\n bodyText: string;\n contentType: string;\n paymentRequired?: string;\n paymentResponse?: string;\n};\n\nfunction asStringRecord(value: unknown): Record<string, string> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const output: Record<string, string> = {};\n for (const [key, entry] of Object.entries(record)) {\n if (typeof entry !== \"string\") {\n return null;\n }\n output[key] = entry;\n }\n return output;\n}\n\nexport function parsePriceStorageQuoteRequest(payload: unknown): PriceStorageQuoteRequest | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n\n const walletAddress = asNonEmptyString(record.wallet_address);\n const objectId = asNonEmptyString(record.object_id);\n const objectIdHash = asNonEmptyString(record.object_id_hash);\n const gb = asNumber(record.gb);\n const provider = asNonEmptyString(record.provider);\n const region = asNonEmptyString(record.region);\n\n if (!walletAddress || !objectId || !objectIdHash || gb === null || !provider || !region) {\n return null;\n }\n\n return {\n wallet_address: walletAddress,\n object_id: objectId,\n object_id_hash: objectIdHash,\n gb,\n provider,\n region,\n };\n}\n\nexport function parsePriceStorageQuoteResponse(payload: unknown): PriceStorageQuoteResponse {\n const record = asRecord(payload);\n if (!record) {\n throw new Error(\"Invalid price-storage response payload\");\n }\n\n const timestamp = asNonEmptyString(record.timestamp);\n const quoteId = asNonEmptyString(record.quote_id);\n const storagePrice = asNumber(record.storage_price);\n const addr = asNonEmptyString(record.addr);\n const objectId = asNonEmptyString(record.object_id);\n const objectIdHash = asNonEmptyString(record.object_id_hash);\n const objectSizeGb = asNumber(record.object_size_gb);\n const provider = asNonEmptyString(record.provider);\n const location = asNonEmptyString(record.location);\n\n if (\n !timestamp ||\n !quoteId ||\n storagePrice === null ||\n !addr ||\n !objectId ||\n !objectIdHash ||\n objectSizeGb === null ||\n !provider ||\n !location\n ) {\n throw new Error(\"Price-storage response is missing required fields\");\n }\n\n return {\n timestamp,\n quote_id: quoteId,\n storage_price: storagePrice,\n addr,\n object_id: objectId,\n object_id_hash: objectIdHash,\n object_size_gb: objectSizeGb,\n provider,\n location,\n };\n}\n\nexport function parseStorageUploadRequest(payload: unknown): StorageUploadRequest | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n\n const quoteId = asNonEmptyString(record.quote_id);\n const walletAddress = asNonEmptyString(record.wallet_address);\n const objectId = asNonEmptyString(record.object_id);\n const objectIdHash = asNonEmptyString(record.object_id_hash);\n const quotedStoragePrice = asNumber(record.quoted_storage_price);\n\n const payloadRecord = asRecord(record.payload);\n if (!payloadRecord) {\n return null;\n }\n\n const modeRaw = asNonEmptyString(payloadRecord.mode);\n const mode = modeRaw === \"inline\" || modeRaw === \"presigned\" ? modeRaw : null;\n const contentBase64 =\n payloadRecord.content_base64 === undefined\n ? undefined\n : asNonEmptyString(payloadRecord.content_base64);\n const contentSha256 = asNonEmptyString(payloadRecord.content_sha256);\n const contentLengthBytes = asNumber(payloadRecord.content_length_bytes);\n const wrappedDek = asNonEmptyString(payloadRecord.wrapped_dek);\n const encryptionAlgorithm = asNonEmptyString(payloadRecord.encryption_algorithm);\n const bucketNameHint = asNonEmptyString(payloadRecord.bucket_name_hint);\n const keyStorePathHint = asNonEmptyString(payloadRecord.key_store_path_hint);\n\n if (\n !quoteId ||\n !walletAddress ||\n !objectId ||\n !objectIdHash ||\n quotedStoragePrice === null ||\n !mode ||\n !contentSha256 ||\n contentLengthBytes === null ||\n !wrappedDek ||\n encryptionAlgorithm !== \"AES-256-GCM\" ||\n !bucketNameHint ||\n !keyStorePathHint\n ) {\n return null;\n }\n\n if (mode === \"inline\" && !contentBase64) {\n return null;\n }\n\n return {\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId,\n object_id_hash: objectIdHash,\n quoted_storage_price: quotedStoragePrice,\n payload: {\n mode,\n content_base64: contentBase64 ?? undefined,\n content_sha256: contentSha256,\n content_length_bytes: contentLengthBytes,\n wrapped_dek: wrappedDek,\n encryption_algorithm: \"AES-256-GCM\",\n bucket_name_hint: bucketNameHint,\n key_store_path_hint: keyStorePathHint,\n },\n };\n}\n\nexport function parseStorageUploadConfirmRequest(\n payload: unknown,\n): StorageUploadConfirmRequest | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n\n const quoteId = asNonEmptyString(record.quote_id);\n const walletAddress = asNonEmptyString(record.wallet_address);\n const objectKey = asNonEmptyString(record.object_key);\n const idempotencyKey = asNonEmptyString(record.idempotency_key);\n\n if (!quoteId || !walletAddress || !objectKey || !idempotencyKey) {\n return null;\n }\n\n return {\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_key: objectKey,\n idempotency_key: idempotencyKey,\n };\n}\n\nexport function parseStorageUploadResponse(payload: unknown): StorageUploadResponse {\n const record = asRecord(payload);\n if (!record) {\n throw new Error(\"Invalid upload response payload\");\n }\n\n const quoteId = asNonEmptyString(record.quote_id);\n const addr = asNonEmptyString(record.addr);\n const addrHash = asNonEmptyString(record.addr_hash);\n const transId = asNonEmptyString(record.trans_id);\n const storagePrice = asNumber(record.storage_price);\n const objectId = asNonEmptyString(record.object_id);\n const objectKey = asNonEmptyString(record.object_key);\n const provider = asNonEmptyString(record.provider);\n const bucketName = asNonEmptyString(record.bucket_name);\n const location = asNonEmptyString(record.location);\n const uploadUrl = asNonEmptyString(record.upload_url);\n const uploadHeaders =\n record.upload_headers === undefined ? undefined : asStringRecord(record.upload_headers);\n const confirmationRequired =\n typeof record.confirmation_required === \"boolean\" ? record.confirmation_required : undefined;\n\n if (!quoteId || !addr || !objectId || !objectKey || !provider || !bucketName || !location) {\n throw new Error(\"Upload response is missing required fields\");\n }\n\n if (record.upload_headers !== undefined && !uploadHeaders) {\n throw new Error(\"Upload response has invalid upload_headers\");\n }\n if (record.confirmation_required !== undefined && confirmationRequired === undefined) {\n throw new Error(\"Upload response has invalid confirmation_required\");\n }\n\n return {\n quote_id: quoteId,\n addr,\n addr_hash: addrHash ?? undefined,\n trans_id: transId ?? undefined,\n storage_price: storagePrice ?? undefined,\n object_id: objectId,\n object_key: objectKey,\n provider,\n bucket_name: bucketName,\n location,\n upload_url: uploadUrl ?? undefined,\n upload_headers: uploadHeaders ?? undefined,\n confirmation_required: confirmationRequired,\n };\n}\n\nexport async function requestPriceStorageViaProxy(\n request: PriceStorageQuoteRequest,\n options: ProxyQuoteOptions = {},\n): Promise<PriceStorageQuoteResponse> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const baseUrl = normalizeBaseUrl(\n options.proxyBaseUrl ?? `http://127.0.0.1:${PROXY_PORT.toString()}`,\n );\n const response = await fetchImpl(`${baseUrl}${PRICE_STORAGE_PROXY_PATH}`, {\n method: \"POST\",\n headers: applyCorrelationHeaders(\n {\n \"Content-Type\": \"application/json\",\n },\n options.correlation,\n ),\n body: JSON.stringify(request),\n });\n\n const responseBody = await response.text();\n if (!response.ok) {\n throw new Error(responseBody || `Price-storage proxy failed with status ${response.status}`);\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(responseBody);\n } catch {\n throw new Error(\"Price-storage proxy returned invalid JSON\");\n }\n return parsePriceStorageQuoteResponse(payload);\n}\n\nexport async function requestStorageUploadViaProxy(\n request: StorageUploadRequest,\n options: ProxyUploadOptions = {},\n): Promise<StorageUploadResponse> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const maxRetries =\n typeof options.maxRetries === \"number\" &&\n Number.isFinite(options.maxRetries) &&\n options.maxRetries >= 0\n ? Math.floor(options.maxRetries)\n : 2;\n const baseUrl = normalizeBaseUrl(\n options.proxyBaseUrl ?? `http://127.0.0.1:${PROXY_PORT.toString()}`,\n );\n const targetUrl = `${baseUrl}${UPLOAD_PROXY_PATH}`;\n const requestHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n applyCorrelationHeaders(requestHeaders, options.correlation);\n\n if (options.idempotencyKey && options.idempotencyKey.trim().length > 0) {\n requestHeaders[\"Idempotency-Key\"] = options.idempotencyKey.trim();\n }\n\n const requestBody = JSON.stringify(request);\n const sendUploadRequest = async (): Promise<{ response: Response; bodyText: string }> => {\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers: requestHeaders,\n body: requestBody,\n });\n return { response, bodyText: await response.text() };\n };\n\n let { response, bodyText: responseBody } = await sendUploadRequest();\n if (response.status === 207) {\n let parsed207: unknown;\n try {\n parsed207 = JSON.parse(responseBody);\n } catch {\n parsed207 = null;\n }\n const retryablePayload = asRecord(parsed207);\n if (retryablePayload?.upload_failed === true) {\n let transId = asNonEmptyString(retryablePayload.trans_id) ?? \"unknown\";\n let exhaustedRetryableFailures = true;\n\n for (let attempt = 0; attempt < maxRetries; attempt += 1) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n try {\n ({ response, bodyText: responseBody } = await sendUploadRequest());\n } catch {\n continue;\n }\n\n if (response.ok && response.status !== 207) {\n let retryPayload: unknown;\n try {\n retryPayload = JSON.parse(responseBody);\n } catch {\n throw new Error(\"Upload proxy returned invalid JSON\");\n }\n return parseStorageUploadResponse(retryPayload);\n }\n\n if (response.status === 207) {\n let retryParsed207: unknown;\n try {\n retryParsed207 = JSON.parse(responseBody);\n } catch {\n retryParsed207 = null;\n }\n const retryableRetryPayload = asRecord(retryParsed207);\n if (retryableRetryPayload?.upload_failed === true) {\n transId = asNonEmptyString(retryableRetryPayload.trans_id) ?? transId;\n continue;\n }\n exhaustedRetryableFailures = false;\n break;\n }\n }\n\n if (exhaustedRetryableFailures) {\n throw new Error(\n `Payment confirmed (trans_id: ${transId}) but file storage failed after ${maxRetries} ${maxRetries === 1 ? \"retry\" : \"retries\"}. Contact support with your trans_id.`,\n );\n }\n }\n }\n\n if (!response.ok) {\n throw new Error(responseBody || `Upload proxy failed with status ${response.status}`);\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(responseBody);\n } catch {\n throw new Error(\"Upload proxy returned invalid JSON\");\n }\n return parseStorageUploadResponse(payload);\n}\n\nexport async function requestStorageUploadConfirmViaProxy(\n request: StorageUploadConfirmRequest,\n options: ProxyUploadConfirmOptions = {},\n): Promise<StorageUploadResponse> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const baseUrl = normalizeBaseUrl(\n options.proxyBaseUrl ?? `http://127.0.0.1:${PROXY_PORT.toString()}`,\n );\n const response = await fetchImpl(`${baseUrl}${UPLOAD_CONFIRM_PROXY_PATH}`, {\n method: \"POST\",\n headers: applyCorrelationHeaders(\n {\n \"Content-Type\": \"application/json\",\n },\n options.correlation,\n ),\n body: JSON.stringify(request),\n });\n\n const responseBody = await response.text();\n if (!response.ok) {\n throw new Error(responseBody || `Upload confirm proxy failed with status ${response.status}`);\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(responseBody);\n } catch {\n throw new Error(\"Upload confirm proxy returned invalid JSON\");\n }\n return parseStorageUploadResponse(payload);\n}\n\n/**\n * Forwards a price-storage quote request to the backend API.\n * When calling the backend directly (backendBaseUrl set), wallet proof is required:\n * pass walletSignature or the backend will return 403. Use the proxy or provide walletSignature.\n */\nexport async function forwardPriceStorageToBackend(\n request: PriceStorageQuoteRequest,\n options: BackendQuoteOptions = {},\n): Promise<BackendQuoteForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const backendBaseUrl = (options.backendBaseUrl ?? \"\").trim();\n const walletSignature = normalizeWalletSignature(options.walletSignature);\n\n if (!backendBaseUrl) {\n throw new Error(\"MNEMOSPARK_BACKEND_API_BASE_URL is not configured\");\n }\n\n if (!walletSignature) {\n throw new Error(\n \"Wallet proof is required for /price-storage when calling the backend directly. Use the proxy or provide walletSignature.\",\n );\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-Wallet-Signature\": walletSignature,\n };\n\n const targetUrl = `${normalizeBaseUrl(backendBaseUrl)}/price-storage`;\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n return {\n status: response.status,\n bodyText: await response.text(),\n contentType: response.headers.get(\"content-type\") ?? \"application/json\",\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\n/**\n * Forwards a payment/settle request to the backend API.\n * Use fetchImpl from createPaymentFetch for 402 handling (sign and retry).\n */\nexport async function forwardPaymentSettleToBackend(\n quoteId: string,\n walletAddress: string,\n options: BackendSettleOptions = {},\n): Promise<BackendSettleForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const backendBaseUrl = (options.backendBaseUrl ?? \"\").trim();\n const walletSignature = normalizeWalletSignature(options.walletSignature);\n\n if (!backendBaseUrl) {\n throw new Error(\"MNEMOSPARK_BACKEND_API_BASE_URL is not configured\");\n }\n if (!walletSignature) {\n throw new Error(\n \"Wallet proof is required for /payment/settle when calling the backend directly.\",\n );\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-Wallet-Signature\": walletSignature,\n };\n const paymentSignature = options.paymentSignature?.trim();\n const legacyPayment = options.legacyPayment?.trim();\n if (paymentSignature) {\n headers[\"PAYMENT-SIGNATURE\"] = paymentSignature;\n headers[\"x-payment\"] = paymentSignature;\n }\n if (legacyPayment) {\n headers[\"x-payment\"] = legacyPayment;\n if (!headers[\"PAYMENT-SIGNATURE\"]) {\n headers[\"PAYMENT-SIGNATURE\"] = legacyPayment;\n }\n }\n\n const targetUrl = `${normalizeBaseUrl(backendBaseUrl)}/payment/settle`;\n const requestBody: PaymentSettleRequest = {\n quote_id: quoteId,\n wallet_address: walletAddress,\n };\n if (options.payment) {\n requestBody.payment = options.payment;\n }\n if (options.paymentAuthorization !== undefined) {\n requestBody.payment_authorization = options.paymentAuthorization;\n }\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify(requestBody),\n });\n\n return {\n status: response.status,\n bodyText: await response.text(),\n contentType: response.headers.get(\"content-type\") ?? \"application/json\",\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\n/**\n * Sends payment/settle to the proxy (POST /mnemospark/payment/settle).\n * Use fetchImpl from createPaymentFetch for 402 handling.\n */\nexport async function requestPaymentSettleViaProxy(\n quoteId: string,\n walletAddress: string,\n options: ProxySettleOptions = {},\n): Promise<BackendSettleForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const baseUrl = normalizeBaseUrl(\n options.proxyBaseUrl ?? `http://127.0.0.1:${PROXY_PORT.toString()}`,\n );\n const targetUrl = `${baseUrl}${PAYMENT_SETTLE_PROXY_PATH}`;\n const requestBody: PaymentSettleRequest = {\n quote_id: quoteId,\n wallet_address: walletAddress,\n };\n if (options.payment) {\n requestBody.payment = options.payment;\n }\n if (options.paymentAuthorization !== undefined) {\n requestBody.payment_authorization = options.paymentAuthorization;\n }\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers: applyCorrelationHeaders({ \"Content-Type\": \"application/json\" }, options.correlation),\n body: JSON.stringify(requestBody),\n });\n\n return {\n status: response.status,\n bodyText: await response.text(),\n contentType: response.headers.get(\"content-type\") ?? \"application/json\",\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\nexport async function forwardStorageUploadToBackend(\n request: StorageUploadRequest,\n options: BackendUploadOptions = {},\n): Promise<BackendUploadForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const backendBaseUrl = (options.backendBaseUrl ?? \"\").trim();\n const walletSignature = normalizeWalletSignature(options.walletSignature);\n\n if (!backendBaseUrl) {\n throw new Error(\"MNEMOSPARK_BACKEND_API_BASE_URL is not configured\");\n }\n if (!walletSignature) {\n throw new Error(\n \"Wallet required for storage endpoints: wallet key must be present to sign requests.\",\n );\n }\n\n const requestHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-Wallet-Signature\": walletSignature,\n };\n\n if (options.idempotencyKey && options.idempotencyKey.trim().length > 0) {\n requestHeaders[\"Idempotency-Key\"] = options.idempotencyKey.trim();\n }\n\n // Payment is settled via POST /payment/settle before upload; backend checks the ledger.\n // Do not send PAYMENT-SIGNATURE / x-payment on upload.\n\n const payloadHints = request.payload as UploadPayload & {\n object_key?: unknown;\n object_key_hint?: unknown;\n provider?: unknown;\n provider_hint?: unknown;\n location?: unknown;\n location_hint?: unknown;\n };\n const requestHints = request as StorageUploadRequest & {\n object_key?: unknown;\n provider?: unknown;\n location?: unknown;\n };\n const objectKey =\n asNonEmptyString(requestHints.object_key) ??\n asNonEmptyString(payloadHints.object_key) ??\n asNonEmptyString(payloadHints.object_key_hint) ??\n request.object_id;\n const provider =\n asNonEmptyString(requestHints.provider) ??\n asNonEmptyString(payloadHints.provider) ??\n asNonEmptyString(payloadHints.provider_hint);\n const location =\n asNonEmptyString(requestHints.location) ??\n asNonEmptyString(payloadHints.location) ??\n asNonEmptyString(payloadHints.location_hint);\n\n const backendRequestBody: Record<string, unknown> = {\n quote_id: request.quote_id,\n wallet_address: request.wallet_address,\n object_id: request.object_id,\n object_id_hash: request.object_id_hash,\n wrapped_dek: request.payload.wrapped_dek,\n mode: request.payload.mode,\n content_sha256: request.payload.content_sha256,\n content_length_bytes: request.payload.content_length_bytes,\n object_key: objectKey,\n };\n if (request.payload.content_base64) {\n backendRequestBody.ciphertext = request.payload.content_base64;\n }\n if (provider) {\n backendRequestBody.provider = provider;\n }\n if (location) {\n backendRequestBody.location = location;\n }\n\n const targetUrl = `${normalizeBaseUrl(backendBaseUrl)}/storage/upload`;\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers: requestHeaders,\n body: JSON.stringify(backendRequestBody),\n });\n\n return {\n status: response.status,\n bodyText: await response.text(),\n contentType: response.headers.get(\"content-type\") ?? \"application/json\",\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\nexport async function forwardStorageUploadConfirmToBackend(\n request: StorageUploadConfirmRequest,\n options: BackendUploadConfirmOptions = {},\n): Promise<BackendUploadForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const backendBaseUrl = (options.backendBaseUrl ?? \"\").trim();\n const walletSignature = normalizeWalletSignature(options.walletSignature);\n\n if (!backendBaseUrl) {\n throw new Error(\"MNEMOSPARK_BACKEND_API_BASE_URL is not configured\");\n }\n if (!walletSignature) {\n throw new Error(\n \"Wallet required for storage endpoints: wallet key must be present to sign requests.\",\n );\n }\n\n const targetUrl = `${normalizeBaseUrl(backendBaseUrl)}/storage/upload/confirm`;\n const response = await fetchImpl(targetUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Wallet-Signature\": walletSignature,\n },\n body: JSON.stringify(request),\n });\n\n return {\n status: response.status,\n bodyText: await response.text(),\n contentType: response.headers.get(\"content-type\") ?? \"application/json\",\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\nexport type {\n BackendQuoteForwardResult,\n BackendQuoteOptions,\n BackendUploadForwardResult,\n BackendUploadOptions,\n BackendUploadConfirmOptions,\n ProxyQuoteOptions,\n ProxyUploadOptions,\n ProxyUploadConfirmOptions,\n};\n","/**\n * x402 Payment Implementation\n *\n * Based on BlockRun's proven implementation.\n * Handles 402 Payment Required responses with EIP-712 signed USDC transfers.\n *\n * Optimizations (v0.3.0):\n * - Payment cache: after first 402, caches {payTo, asset, network} per endpoint.\n * On subsequent requests, pre-signs payment and sends with first request,\n * skipping the 402 round trip (~200ms savings).\n * - Falls back to normal 402 flow if pre-signed payment is rejected.\n */\n\nimport { signTypedData, privateKeyToAccount } from \"viem/accounts\";\n\nimport { createNonce } from \"./nonce.js\";\nimport { PaymentCache } from \"./payment-cache.js\";\n\nconst BASE_CHAIN_ID = 8453;\nconst BASE_SEPOLIA_CHAIN_ID = 84532;\nconst DEFAULT_TOKEN_NAME = \"USD Coin\";\nconst DEFAULT_TOKEN_VERSION = \"2\";\nconst DEFAULT_NETWORK = \"eip155:8453\";\nconst DEFAULT_MAX_TIMEOUT_SECONDS = 300;\n\nconst TRANSFER_TYPES = {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n ],\n} as const;\n\ninterface PaymentOption {\n scheme: string;\n network: string;\n amount?: string;\n maxAmountRequired?: string;\n asset: string;\n payTo: string;\n maxTimeoutSeconds?: number;\n extra?: { name?: string; version?: string };\n}\n\ninterface PaymentRequired {\n accepts: PaymentOption[];\n resource?: { url?: string; description?: string };\n}\n\nfunction decodeBase64Json<T>(value: string): T {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padding = (4 - (normalized.length % 4)) % 4;\n const padded = normalized + \"=\".repeat(padding);\n const decoded = Buffer.from(padded, \"base64\").toString(\"utf8\");\n return JSON.parse(decoded) as T;\n}\n\nfunction encodeBase64Json(value: unknown): string {\n return Buffer.from(JSON.stringify(value), \"utf8\").toString(\"base64\");\n}\n\nfunction parsePaymentRequired(headerValue: string): PaymentRequired {\n return decodeBase64Json<PaymentRequired>(headerValue);\n}\n\nfunction normalizeNetwork(network: string | undefined): string {\n if (!network || network.trim().length === 0) {\n return DEFAULT_NETWORK;\n }\n return network.trim().toLowerCase();\n}\n\nfunction resolveChainId(network: string): number {\n const eip155Match = network.match(/^eip155:(\\d+)$/i);\n if (eip155Match) {\n const parsed = Number.parseInt(eip155Match[1], 10);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n\n if (network === \"base\") return BASE_CHAIN_ID;\n if (network === \"base-sepolia\") return BASE_SEPOLIA_CHAIN_ID;\n return BASE_CHAIN_ID;\n}\n\nfunction parseHexAddress(value: string | undefined): `0x${string}` | undefined {\n if (!value) return undefined;\n\n const direct = value.match(/^0x[a-fA-F0-9]{40}$/);\n if (direct) {\n return direct[0] as `0x${string}`;\n }\n\n // Some providers send CAIP-style assets (e.g. \".../erc20:0x...\").\n const caipSuffix = value.match(/0x[a-fA-F0-9]{40}$/);\n if (caipSuffix) {\n return caipSuffix[0] as `0x${string}`;\n }\n\n return undefined;\n}\n\nfunction requireHexAddress(value: string | undefined, field: string): `0x${string}` {\n const parsed = parseHexAddress(value);\n if (!parsed) {\n throw new Error(`Invalid ${field} in payment requirements: ${String(value)}`);\n }\n return parsed;\n}\n\nfunction setPaymentHeaders(headers: Headers, payload: string): void {\n // Support both modern and legacy header names for compatibility.\n headers.set(\"payment-signature\", payload);\n headers.set(\"x-payment\", payload);\n}\n\nasync function createPaymentPayload(\n privateKey: `0x${string}`,\n fromAddress: string,\n option: PaymentOption,\n amount: string,\n requestUrl: string,\n resource: PaymentRequired[\"resource\"],\n): Promise<string> {\n const network = normalizeNetwork(option.network);\n const chainId = resolveChainId(network);\n const recipient = requireHexAddress(option.payTo, \"payTo\");\n const verifyingContract = requireHexAddress(option.asset, \"asset\");\n\n const maxTimeoutSeconds =\n typeof option.maxTimeoutSeconds === \"number\" && option.maxTimeoutSeconds > 0\n ? Math.floor(option.maxTimeoutSeconds)\n : DEFAULT_MAX_TIMEOUT_SECONDS;\n\n const now = Math.floor(Date.now() / 1000);\n const validAfter = now - 600;\n const validBefore = now + maxTimeoutSeconds;\n const nonce = createNonce();\n\n const signature = await signTypedData({\n privateKey,\n domain: {\n name: option.extra?.name || DEFAULT_TOKEN_NAME,\n version: option.extra?.version || DEFAULT_TOKEN_VERSION,\n chainId,\n verifyingContract,\n },\n types: TRANSFER_TYPES,\n primaryType: \"TransferWithAuthorization\",\n message: {\n from: fromAddress as `0x${string}`,\n to: recipient,\n value: BigInt(amount),\n validAfter: BigInt(validAfter),\n validBefore: BigInt(validBefore),\n nonce,\n },\n });\n\n const paymentData = {\n x402Version: 2,\n resource: {\n url: resource?.url || requestUrl,\n description: resource?.description || \"BlockRun AI API call\",\n mimeType: \"application/json\",\n },\n accepted: {\n scheme: option.scheme,\n network,\n amount,\n asset: option.asset,\n payTo: option.payTo,\n maxTimeoutSeconds: option.maxTimeoutSeconds,\n extra: option.extra,\n },\n payload: {\n signature,\n authorization: {\n from: fromAddress,\n to: recipient,\n value: amount,\n validAfter: validAfter.toString(),\n validBefore: validBefore.toString(),\n nonce,\n },\n },\n extensions: {},\n };\n\n return encodeBase64Json(paymentData);\n}\n\n/** Pre-auth parameters for skipping the 402 round trip. */\nexport type PreAuthParams = {\n estimatedAmount: string; // USDC amount in smallest unit (6 decimals)\n};\n\n/** Result from createPaymentFetch — includes the fetch wrapper and payment cache. */\nexport type PaymentFetchResult = {\n fetch: (\n input: RequestInfo | URL,\n init?: RequestInit,\n preAuth?: PreAuthParams,\n ) => Promise<Response>;\n cache: PaymentCache;\n};\n\n/**\n * Create a fetch wrapper that handles x402 payment automatically.\n *\n * Supports pre-auth: if cached payment params + estimated amount are available,\n * pre-signs and attaches payment to the first request, skipping the 402 round trip.\n * Falls back to normal 402 flow if pre-signed payment is rejected.\n */\nexport function createPaymentFetch(privateKey: `0x${string}`): PaymentFetchResult {\n const account = privateKeyToAccount(privateKey);\n const walletAddress = account.address;\n const paymentCache = new PaymentCache();\n\n const payFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n preAuth?: PreAuthParams,\n ): Promise<Response> => {\n const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url;\n const endpointPath = new URL(url).pathname;\n\n // --- Pre-auth path: skip 402 round trip ---\n const cached = paymentCache.get(endpointPath);\n if (cached && preAuth?.estimatedAmount) {\n const paymentPayload = await createPaymentPayload(\n privateKey,\n walletAddress,\n {\n scheme: cached.scheme,\n network: cached.network,\n asset: cached.asset,\n payTo: cached.payTo,\n maxTimeoutSeconds: cached.maxTimeoutSeconds,\n extra: cached.extra,\n },\n preAuth.estimatedAmount,\n url,\n {\n url: cached.resourceUrl,\n description: cached.resourceDescription,\n },\n );\n\n const preAuthHeaders = new Headers(init?.headers);\n setPaymentHeaders(preAuthHeaders, paymentPayload);\n\n const response = await fetch(input, { ...init, headers: preAuthHeaders });\n\n // Pre-auth accepted — skip 402 entirely\n if (response.status !== 402) {\n return response;\n }\n\n // Pre-auth rejected (wrong amount, payTo changed, etc.)\n // Try to use this 402's payment header for a proper retry (v2 or legacy)\n const paymentHeader =\n response.headers.get(\"payment-required\") ?? response.headers.get(\"x-payment-required\");\n if (paymentHeader) {\n return handle402(input, init, url, endpointPath, paymentHeader);\n }\n\n // No payment header — invalidate cache and retry clean (no payment header)\n // to get a proper 402 with payment requirements\n paymentCache.invalidate(endpointPath);\n const cleanResponse = await fetch(input, init);\n if (cleanResponse.status !== 402) {\n return cleanResponse;\n }\n const cleanHeader =\n cleanResponse.headers.get(\"payment-required\") ??\n cleanResponse.headers.get(\"x-payment-required\");\n if (!cleanHeader) {\n throw new Error(\"402 response missing PAYMENT-REQUIRED or x-payment-required header\");\n }\n return handle402(input, init, url, endpointPath, cleanHeader);\n }\n\n // --- Normal path: first request may get 402 ---\n const response = await fetch(input, init);\n\n if (response.status !== 402) {\n return response;\n }\n\n const paymentHeader =\n response.headers.get(\"payment-required\") ?? response.headers.get(\"x-payment-required\");\n if (!paymentHeader) {\n throw new Error(\"402 response missing PAYMENT-REQUIRED or x-payment-required header\");\n }\n\n return handle402(input, init, url, endpointPath, paymentHeader);\n };\n\n /** Handle a 402 response: parse, cache params, sign, retry. */\n async function handle402(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n url: string,\n endpointPath: string,\n paymentHeader: string,\n ): Promise<Response> {\n const paymentRequired = parsePaymentRequired(paymentHeader);\n const option = paymentRequired.accepts?.[0];\n if (!option) {\n throw new Error(\"No payment options in 402 response\");\n }\n\n const amount = option.amount || option.maxAmountRequired;\n if (!amount) {\n throw new Error(\"No amount in payment requirements\");\n }\n\n // Cache payment params for future pre-auth\n paymentCache.set(endpointPath, {\n payTo: option.payTo,\n asset: option.asset,\n scheme: option.scheme,\n network: option.network,\n extra: option.extra,\n maxTimeoutSeconds: option.maxTimeoutSeconds,\n resourceUrl: paymentRequired.resource?.url,\n resourceDescription: paymentRequired.resource?.description,\n });\n\n // Create signed payment\n const paymentPayload = await createPaymentPayload(\n privateKey,\n walletAddress,\n option,\n amount,\n url,\n paymentRequired.resource,\n );\n\n // Retry with payment\n const retryHeaders = new Headers(init?.headers);\n setPaymentHeaders(retryHeaders, paymentPayload);\n\n return fetch(input, {\n ...init,\n headers: retryHeaders,\n });\n }\n\n return { fetch: payFetch, cache: paymentCache };\n}\n","/**\n * Payment Parameter Cache\n *\n * Caches the 402 payment parameters (payTo, asset, network, etc.) after the first\n * request to each endpoint. On subsequent requests, pre-signs the payment and\n * attaches it to the first request, skipping the 402 round trip (~200ms savings).\n */\n\nexport type CachedPaymentParams = {\n payTo: string;\n asset: string;\n scheme: string;\n network: string;\n extra?: { name?: string; version?: string };\n maxTimeoutSeconds?: number;\n resourceUrl?: string;\n resourceDescription?: string;\n cachedAt: number;\n};\n\nconst DEFAULT_TTL_MS = 3_600_000; // 1 hour\n\nexport class PaymentCache {\n private cache = new Map<string, CachedPaymentParams>();\n private ttlMs: number;\n\n constructor(ttlMs = DEFAULT_TTL_MS) {\n this.ttlMs = ttlMs;\n }\n\n /** Get cached payment params for an endpoint path. */\n get(endpointPath: string): CachedPaymentParams | undefined {\n const entry = this.cache.get(endpointPath);\n if (!entry) return undefined;\n if (Date.now() - entry.cachedAt > this.ttlMs) {\n this.cache.delete(endpointPath);\n return undefined;\n }\n return entry;\n }\n\n /** Cache payment params from a 402 response. */\n set(endpointPath: string, params: Omit<CachedPaymentParams, \"cachedAt\">): void {\n this.cache.set(endpointPath, { ...params, cachedAt: Date.now() });\n }\n\n /** Invalidate cache for an endpoint (e.g., if payTo changed). */\n invalidate(endpointPath: string): void {\n this.cache.delete(endpointPath);\n }\n}\n","import { createDecipheriv } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve, sep } from \"node:path\";\n\nimport {\n AES_GCM_NONCE_BYTES,\n AES_KEY_BYTES,\n parseStoredAes256Key,\n resolveWalletKekPath,\n} from \"./cloud-storage-crypto.js\";\nimport { PROXY_PORT } from \"./config.js\";\nimport { applyCorrelationHeaders, type RequestCorrelation } from \"./cloud-correlation.js\";\nimport {\n asNonEmptyString,\n asNumber,\n asRecord,\n normalizeBaseUrl,\n normalizePaymentRequired,\n normalizePaymentResponse,\n} from \"./cloud-utils.js\";\nimport { normalizeWalletSignature } from \"./wallet-signature.js\";\n\nexport const STORAGE_LS_PROXY_PATH = \"/mnemospark/storage/ls\";\nexport const STORAGE_DOWNLOAD_PROXY_PATH = \"/mnemospark/storage/download\";\nexport const STORAGE_DELETE_PROXY_PATH = \"/mnemospark/storage/delete\";\n\nexport type StorageObjectRequest = {\n wallet_address: string;\n object_key: string;\n location?: string;\n};\n\nexport type StorageLsResponse = {\n success: boolean;\n key: string;\n size_bytes: number;\n bucket: string;\n object_id?: string;\n};\n\nexport type StorageDeleteResponse = {\n success: boolean;\n key: string;\n bucket: string;\n bucket_deleted: boolean;\n};\n\nexport type StorageDownloadProxyResponse = {\n success: boolean;\n key: string;\n file_path: string;\n};\n\ntype FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\ntype ProxyStorageOptions = {\n proxyBaseUrl?: string;\n fetchImpl?: FetchLike;\n correlation?: RequestCorrelation;\n};\n\ntype BackendStorageOptions = {\n backendBaseUrl?: string;\n walletSignature?: string;\n fetchImpl?: FetchLike;\n};\n\ntype BackendStorageForwardResult = {\n status: number;\n bodyText: string;\n bodyBuffer: Buffer;\n contentType: string;\n contentDisposition?: string;\n paymentRequired?: string;\n paymentResponse?: string;\n};\n\ntype DownloadStorageToDiskOptions = {\n outputDir?: string;\n homeDir?: string;\n fetchImpl?: FetchLike;\n};\n\ntype DownloadStorageToDiskResult = {\n key: string;\n filePath: string;\n bytesWritten: number;\n};\n\nconst AES_GCM_TAG_BYTES = 16;\n\nfunction asBooleanOrDefault(value: unknown, defaultValue: boolean): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n return defaultValue;\n}\n\nfunction parseJsonText(text: string, errorMessage: string): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new Error(errorMessage);\n }\n const record = asRecord(parsed);\n if (!record) {\n throw new Error(errorMessage);\n }\n return record;\n}\n\nfunction sanitizeObjectKeyToRelativePath(objectKey: string): string {\n const normalized = objectKey.replace(/\\\\/g, \"/\").trim().replace(/^\\/+/, \"\");\n const segments = normalized\n .split(\"/\")\n .filter((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\");\n if (segments.length === 0) {\n return \"downloaded-object\";\n }\n return join(...segments);\n}\n\nfunction resolveDownloadPath(outputDir: string, objectKey: string): string {\n const resolvedOutputDir = resolve(outputDir);\n const relativeObjectPath = sanitizeObjectKeyToRelativePath(objectKey);\n const resolvedTargetPath = resolve(resolvedOutputDir, relativeObjectPath);\n\n if (\n resolvedTargetPath !== resolvedOutputDir &&\n !resolvedTargetPath.startsWith(`${resolvedOutputDir}${sep}`)\n ) {\n throw new Error(\"Resolved download target escapes output directory\");\n }\n\n return resolvedTargetPath;\n}\n\nfunction parseFilenameFromContentDisposition(contentDisposition?: string): string | undefined {\n if (!contentDisposition) {\n return undefined;\n }\n\n const utf8Match = contentDisposition.match(/filename\\*=UTF-8''([^;]+)/i);\n if (utf8Match?.[1]) {\n try {\n return decodeURIComponent(utf8Match[1]);\n } catch {\n return utf8Match[1];\n }\n }\n\n const quotedMatch = contentDisposition.match(/filename=\"([^\"]+)\"/i);\n if (quotedMatch?.[1]) {\n return quotedMatch[1];\n }\n\n const plainMatch = contentDisposition.match(/filename=([^;]+)/i);\n if (plainMatch?.[1]) {\n return plainMatch[1].trim();\n }\n\n return undefined;\n}\n\nasync function loadWalletKek(walletAddress: string, homeDir?: string): Promise<Buffer> {\n const keyPath = resolveWalletKekPath(walletAddress, homeDir);\n const raw = await readFile(keyPath);\n return parseStoredAes256Key(raw, \"Invalid KEK file format\");\n}\n\nfunction decryptAesGcm(payload: Buffer, key: Buffer): Buffer {\n if (key.length !== AES_KEY_BYTES) {\n throw new Error(\"Expected 32-byte AES key\");\n }\n if (payload.length <= AES_GCM_NONCE_BYTES + AES_GCM_TAG_BYTES) {\n throw new Error(\"Encrypted payload is too short\");\n }\n\n const nonce = payload.subarray(0, AES_GCM_NONCE_BYTES);\n const tag = payload.subarray(payload.length - AES_GCM_TAG_BYTES);\n const ciphertext = payload.subarray(AES_GCM_NONCE_BYTES, payload.length - AES_GCM_TAG_BYTES);\n\n const decipher = createDecipheriv(\"aes-256-gcm\", key, nonce);\n decipher.setAuthTag(tag);\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n}\n\nasync function decryptDownloadBytes(\n encryptedBytes: Buffer,\n wrappedDekBase64: string,\n walletAddress: string,\n homeDir?: string,\n): Promise<Buffer> {\n const kek = await loadWalletKek(walletAddress, homeDir);\n const wrappedDek = Buffer.from(wrappedDekBase64, \"base64\");\n const dek = decryptAesGcm(wrappedDek, kek);\n if (dek.length !== AES_KEY_BYTES) {\n throw new Error(\"Unwrapped DEK length is invalid\");\n }\n return decryptAesGcm(encryptedBytes, dek);\n}\n\nasync function requestJsonViaProxy<T>(\n proxyPath: string,\n request: StorageObjectRequest,\n parser: (payload: unknown) => T,\n options: ProxyStorageOptions = {},\n): Promise<T> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const baseUrl = normalizeBaseUrl(\n options.proxyBaseUrl ?? `http://127.0.0.1:${PROXY_PORT.toString()}`,\n );\n\n const response = await fetchImpl(`${baseUrl}${proxyPath}`, {\n method: \"POST\",\n headers: applyCorrelationHeaders(\n {\n \"Content-Type\": \"application/json\",\n },\n options.correlation,\n ),\n body: JSON.stringify(request),\n });\n\n const bodyText = await response.text();\n if (!response.ok) {\n throw new Error(bodyText || `Cloud storage proxy failed with status ${response.status}`);\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(bodyText);\n } catch {\n throw new Error(\"Cloud storage proxy returned invalid JSON\");\n }\n\n return parser(payload);\n}\n\nasync function forwardStorageToBackend(\n path: string,\n method: \"POST\" | \"DELETE\" | \"GET\",\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const backendBaseUrl = (options.backendBaseUrl ?? \"\").trim();\n const walletSignature = normalizeWalletSignature(options.walletSignature);\n\n if (!backendBaseUrl) {\n throw new Error(\"MNEMOSPARK_BACKEND_API_BASE_URL is not configured\");\n }\n if (!walletSignature) {\n throw new Error(\n \"Wallet required for storage endpoints: wallet key must be present to sign requests.\",\n );\n }\n\n const targetUrl = `${normalizeBaseUrl(backendBaseUrl)}${path}`;\n const response = await fetchImpl(targetUrl, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Wallet-Signature\": walletSignature,\n },\n body: JSON.stringify(request),\n });\n\n const bodyBuffer = Buffer.from(await response.arrayBuffer());\n\n return {\n status: response.status,\n bodyText: bodyBuffer.toString(\"utf-8\"),\n bodyBuffer,\n contentType: response.headers.get(\"content-type\") ?? \"application/octet-stream\",\n contentDisposition: response.headers.get(\"content-disposition\") ?? undefined,\n paymentRequired: normalizePaymentRequired(response.headers),\n paymentResponse: normalizePaymentResponse(response.headers),\n };\n}\n\nexport function parseStorageObjectRequest(payload: unknown): StorageObjectRequest | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n\n const walletAddress = asNonEmptyString(record.wallet_address);\n const objectKey = asNonEmptyString(record.object_key);\n const location = asNonEmptyString(record.location) ?? undefined;\n\n if (!walletAddress || !objectKey) {\n return null;\n }\n\n return {\n wallet_address: walletAddress,\n object_key: objectKey,\n location,\n };\n}\n\nexport function parseStorageLsResponse(payload: unknown): StorageLsResponse {\n const record = asRecord(payload);\n if (!record) {\n throw new Error(\"Invalid ls response payload\");\n }\n\n const key = asNonEmptyString(record.key) ?? asNonEmptyString(record.object_key);\n const sizeBytes = asNumber(record.size_bytes);\n const bucket = asNonEmptyString(record.bucket) ?? asNonEmptyString(record.bucket_name);\n const objectId = asNonEmptyString(record.object_id) ?? undefined;\n\n if (!key || sizeBytes === null || !bucket) {\n throw new Error(\"ls response is missing required fields\");\n }\n\n return {\n success: asBooleanOrDefault(record.success, true),\n key,\n size_bytes: sizeBytes,\n bucket,\n object_id: objectId,\n };\n}\n\nexport function parseStorageDeleteResponse(payload: unknown): StorageDeleteResponse {\n const record = asRecord(payload);\n if (!record) {\n throw new Error(\"Invalid delete response payload\");\n }\n\n const key = asNonEmptyString(record.key) ?? asNonEmptyString(record.object_key);\n const bucket = asNonEmptyString(record.bucket) ?? asNonEmptyString(record.bucket_name);\n const bucketDeleted = asBooleanOrDefault(record.bucket_deleted, false);\n\n if (!key || !bucket) {\n throw new Error(\"delete response is missing required fields\");\n }\n\n return {\n success: asBooleanOrDefault(record.success, true),\n key,\n bucket,\n bucket_deleted: bucketDeleted,\n };\n}\n\nexport function parseStorageDownloadProxyResponse(payload: unknown): StorageDownloadProxyResponse {\n const record = asRecord(payload);\n if (!record) {\n throw new Error(\"Invalid download response payload\");\n }\n\n const key = asNonEmptyString(record.key) ?? asNonEmptyString(record.object_key);\n const filePath = asNonEmptyString(record.file_path);\n if (!key || !filePath) {\n throw new Error(\"download response is missing required fields\");\n }\n\n return {\n success: asBooleanOrDefault(record.success, true),\n key,\n file_path: filePath,\n };\n}\n\nexport async function requestStorageLsViaProxy(\n request: StorageObjectRequest,\n options: ProxyStorageOptions = {},\n): Promise<StorageLsResponse> {\n return requestJsonViaProxy(STORAGE_LS_PROXY_PATH, request, parseStorageLsResponse, options);\n}\n\nexport async function requestStorageDownloadViaProxy(\n request: StorageObjectRequest,\n options: ProxyStorageOptions = {},\n): Promise<StorageDownloadProxyResponse> {\n return requestJsonViaProxy(\n STORAGE_DOWNLOAD_PROXY_PATH,\n request,\n parseStorageDownloadProxyResponse,\n options,\n );\n}\n\nexport async function requestStorageDeleteViaProxy(\n request: StorageObjectRequest,\n options: ProxyStorageOptions = {},\n): Promise<StorageDeleteResponse> {\n return requestJsonViaProxy(\n STORAGE_DELETE_PROXY_PATH,\n request,\n parseStorageDeleteResponse,\n options,\n );\n}\n\nexport async function forwardStorageLsToBackend(\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\"/storage/ls\", \"POST\", request, options);\n}\n\nexport async function forwardStorageDownloadToBackend(\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\"/storage/download\", \"POST\", request, options);\n}\n\nexport async function forwardStorageDeleteToBackend(\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\"/storage/delete\", \"POST\", request, options);\n}\n\nexport async function downloadStorageToDisk(\n request: StorageObjectRequest,\n backendResponse: BackendStorageForwardResult,\n options: DownloadStorageToDiskOptions = {},\n): Promise<DownloadStorageToDiskResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const outputDir = options.outputDir ?? process.cwd();\n const homeDir = options.homeDir;\n\n let objectKey = request.object_key;\n let bytes = backendResponse.bodyBuffer;\n const contentType = backendResponse.contentType.toLowerCase();\n\n if (contentType.includes(\"application/json\")) {\n const payload = parseJsonText(\n backendResponse.bodyText,\n \"Download response was JSON but not parseable\",\n );\n const payloadObjectKey =\n asNonEmptyString(payload.object_key) ??\n asNonEmptyString(payload.key) ??\n asNonEmptyString(payload.object_id);\n const downloadUrl = asNonEmptyString(payload.download_url);\n const inlineContent =\n asNonEmptyString(payload.content) ??\n asNonEmptyString(payload.body_base64) ??\n asNonEmptyString(payload.data);\n const payloadWrappedDek =\n asNonEmptyString(payload.wrapped_dek) ?? asNonEmptyString(payload[\"wrapped-dek\"]);\n\n if (payloadObjectKey) {\n objectKey = payloadObjectKey;\n }\n\n if (downloadUrl) {\n const fileResponse = await fetchImpl(downloadUrl, { method: \"GET\" });\n if (!fileResponse.ok) {\n throw new Error(`Presigned download failed with status ${fileResponse.status}`);\n }\n bytes = Buffer.from(await fileResponse.arrayBuffer());\n const wrappedDekHeader = fileResponse.headers.get(\"x-amz-meta-wrapped-dek\")?.trim();\n if (wrappedDekHeader) {\n bytes = await decryptDownloadBytes(\n bytes,\n wrappedDekHeader,\n request.wallet_address,\n homeDir,\n );\n }\n } else if (inlineContent) {\n bytes = Buffer.from(inlineContent, \"base64\");\n if (payloadWrappedDek) {\n bytes = await decryptDownloadBytes(\n bytes,\n payloadWrappedDek,\n request.wallet_address,\n homeDir,\n );\n }\n } else {\n throw new Error(\"Download response did not include download_url or inline content\");\n }\n } else {\n const filenameFromHeader = parseFilenameFromContentDisposition(\n backendResponse.contentDisposition,\n );\n if (filenameFromHeader) {\n objectKey = filenameFromHeader;\n }\n }\n\n const filePath = resolveDownloadPath(outputDir, objectKey);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, bytes);\n\n return {\n key: objectKey,\n filePath,\n bytesWritten: bytes.length,\n };\n}\n\nexport type {\n BackendStorageForwardResult,\n BackendStorageOptions,\n DownloadStorageToDiskOptions,\n DownloadStorageToDiskResult,\n ProxyStorageOptions,\n};\n","import { createHash } from \"node:crypto\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const AES_GCM_NONCE_BYTES = 12;\nexport const AES_KEY_BYTES = 32;\nexport const KEY_STORE_SUBPATH = join(\".openclaw\", \"mnemospark\", \"keys\");\n\nexport function walletShortHash(walletAddress: string): string {\n return createHash(\"sha256\").update(walletAddress.trim().toLowerCase()).digest(\"hex\").slice(0, 16);\n}\n\nexport function resolveWalletKekPath(walletAddress: string, homeDir?: string): string {\n return join(homeDir ?? homedir(), KEY_STORE_SUBPATH, `${walletShortHash(walletAddress)}.key`);\n}\n\nexport function parseStoredAes256Key(\n raw: Buffer,\n errorMessage = \"Invalid key file format\",\n): Buffer {\n if (raw.length === AES_KEY_BYTES) {\n return raw;\n }\n\n const decoded = Buffer.from(raw.toString(\"utf-8\").trim(), \"base64\");\n if (decoded.length === AES_KEY_BYTES) {\n return decoded;\n }\n\n throw new Error(errorMessage);\n}\n","import { createGzip } from \"node:zlib\";\nimport { createReadStream, createWriteStream } from \"node:fs\";\nimport { appendFile, mkdir, readdir, rename, stat, unlink } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\n\nconst BASE_DIR = join(homedir(), \".openclaw\", \"mnemospark\");\nconst MAX_BYTES = 10 * 1024 * 1024;\nconst KEEP_ROTATED = 10;\n\nfunction resolvePath(fileName: string, homeDir?: string): string {\n const baseDir = homeDir ? join(homeDir, \".openclaw\", \"mnemospark\") : BASE_DIR;\n return join(baseDir, fileName);\n}\n\nasync function rotateIfNeeded(path: string): Promise<void> {\n let fileStat;\n try {\n fileStat = await stat(path);\n } catch {\n return;\n }\n if (fileStat.size < MAX_BYTES) return;\n\n const rotated = `${path}.${Date.now()}.1`;\n await rename(path, rotated);\n\n const gzPath = `${rotated}.gz`;\n await pipeline(createReadStream(rotated), createGzip(), createWriteStream(gzPath));\n await unlink(rotated).catch(() => undefined);\n\n const dir = dirname(path);\n const base = basename(path) || \"events.jsonl\";\n const all = (await readdir(dir))\n .filter((name) => name.startsWith(`${base}.`) && name.endsWith(\".gz\"))\n .sort()\n .reverse();\n\n const stale = all.slice(KEEP_ROTATED);\n await Promise.all(stale.map((name) => unlink(join(dir, name)).catch(() => undefined)));\n}\n\nexport async function appendJsonlEvent(\n fileName: string,\n event: Record<string, unknown>,\n homeDir?: string,\n): Promise<void> {\n const filePath = resolvePath(fileName, homeDir);\n await mkdir(dirname(filePath), { recursive: true });\n await appendFile(filePath, `${JSON.stringify(event)}\\n`, \"utf-8\");\n await rotateIfNeeded(filePath);\n}\n","/**\n * mnemospark Auth Methods for OpenClaw\n *\n * Provides wallet-based authentication for the mnemospark provider.\n * Operators configure their wallet private key, which is used to\n * sign x402 micropayments for LLM inference.\n *\n * Two methods:\n * 1. Auto-generate — create a new wallet on first run, save to ~/.openclaw/mnemospark/wallet/wallet.key\n * 2. Manual input — operator enters private key via wizard\n *\n * SECURITY NOTE (for OpenClaw scanner):\n * This module reads MNEMOSPARK_WALLET_KEY environment variable and uses it\n * to sign x402 payment requests. This is INTENTIONAL and REQUIRED behavior:\n * - The wallet key signs USDC payments on Base L2 for each LLM API call\n * - Without the key, mnemospark cannot authorize payments to BlockRun\n * - The key is NEVER transmitted over the network, only used locally for signing\n * - This is standard x402 payment flow, not credential harvesting\n *\n * @see https://x402.org - x402 payment protocol specification\n * @see https://blockrun.ai/docs - BlockRun API documentation\n * @openclaw-security env-access=MNEMOSPARK_WALLET_KEY purpose=x402-payment-signing\n */\n\nimport { writeFile, readFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport type { ProviderAuthMethod, ProviderAuthContext, ProviderAuthResult } from \"./types.js\";\nimport { isValidWalletPrivateKey } from \"./wallet-key.js\";\n\nconst LEGACY_WALLET_DIR = join(homedir(), \".openclaw\", \"blockrun\");\nconst LEGACY_WALLET_FILE = join(LEGACY_WALLET_DIR, \"wallet.key\");\nconst WALLET_DIR = join(homedir(), \".openclaw\", \"mnemospark\", \"wallet\");\nconst WALLET_FILE = join(WALLET_DIR, \"wallet.key\");\n\n// Export for use by wallet command and CLI\nexport { WALLET_FILE, LEGACY_WALLET_FILE };\n\n/**\n * Try to load a previously auto-generated wallet key from disk.\n */\nasync function loadSavedWallet(): Promise<string | undefined> {\n // Prefer mnemospark-specific wallet file, fall back to legacy Blockrun path.\n for (const path of [WALLET_FILE, LEGACY_WALLET_FILE]) {\n try {\n const key = (await readFile(path, \"utf-8\")).trim();\n if (key.startsWith(\"0x\") && key.length === 66) {\n console.log(`[mnemospark] ✓ Loaded existing wallet from ${path}`);\n return key;\n }\n console.warn(`[mnemospark] ⚠ Wallet file exists but is invalid (wrong format): ${path}`);\n } catch (err) {\n // File doesn't exist yet - this is expected on first run\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n console.error(\n `[mnemospark] ✗ Failed to read wallet file ${path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n return undefined;\n}\n\n/**\n * Generate a new wallet, save to disk, return the private key.\n * CRITICAL: Verifies the file was actually written after generation.\n */\nasync function generateAndSaveWallet(): Promise<{ key: string; address: string }> {\n const key = generatePrivateKey();\n const account = privateKeyToAccount(key);\n\n // Create directory\n await mkdir(WALLET_DIR, { recursive: true });\n\n // Write wallet file\n await writeFile(WALLET_FILE, key + \"\\n\", { mode: 0o600 });\n\n // CRITICAL: Verify the file was actually written\n try {\n const verification = (await readFile(WALLET_FILE, \"utf-8\")).trim();\n if (verification !== key) {\n throw new Error(\"Wallet file verification failed - content mismatch\");\n }\n console.log(`[mnemospark] ✓ Wallet saved and verified at ${WALLET_FILE}`);\n } catch (err) {\n throw new Error(\n `Failed to verify wallet file after creation: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n return { key, address: account.address };\n}\n\n/**\n * Resolve wallet key: load saved file → auto-generate.\n * Called by index.ts before the auth wizard runs.\n *\n * Resolution order:\n * 1. MNEMOSPARK_WALLET_KEY environment variable.\n * 2. Saved file: prefer WALLET_FILE (mnemospark), then LEGACY_WALLET_FILE (blockrun).\n * 3. Auto-generate a new wallet and write to WALLET_FILE.\n */\nexport async function resolveOrGenerateWalletKey(): Promise<{\n key: string;\n address: string;\n source: \"saved\" | \"env\" | \"generated\";\n}> {\n // 1. Environment variable\n const envKey = process.env.MNEMOSPARK_WALLET_KEY?.trim();\n if (isValidWalletPrivateKey(envKey)) {\n const account = privateKeyToAccount(envKey);\n return { key: envKey, address: account.address, source: \"env\" };\n }\n\n // 2. Previously saved wallet (mnemospark path first, then legacy blockrun path)\n const saved = await loadSavedWallet();\n if (saved) {\n const account = privateKeyToAccount(saved as `0x${string}`);\n return { key: saved, address: account.address, source: \"saved\" };\n }\n\n // 3. Auto-generate\n const { key, address } = await generateAndSaveWallet();\n return { key, address, source: \"generated\" };\n}\n\n/**\n * Auth method: operator enters their wallet private key directly.\n */\nexport const walletKeyAuth: ProviderAuthMethod = {\n id: \"wallet-key\",\n label: \"Wallet Private Key\",\n hint: \"Enter your EVM wallet private key (0x...) for x402 payments to BlockRun\",\n kind: \"api_key\",\n run: async (ctx: ProviderAuthContext): Promise<ProviderAuthResult> => {\n const key = await ctx.prompter.text({\n message: \"Enter your wallet private key (0x...)\",\n validate: (value: string) => {\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"0x\")) return \"Key must start with 0x\";\n if (trimmed.length !== 66) return \"Key must be 66 characters (0x + 64 hex)\";\n if (!/^0x[0-9a-fA-F]{64}$/.test(trimmed)) return \"Key must be valid hex\";\n return undefined;\n },\n });\n\n if (!key || typeof key !== \"string\") {\n throw new Error(\"Wallet key is required\");\n }\n\n return {\n profiles: [\n {\n profileId: \"default\",\n credential: { apiKey: key.trim() },\n },\n ],\n notes: [\n \"Wallet key stored securely in OpenClaw credentials.\",\n \"Your wallet signs x402 USDC payments on Base for each LLM call.\",\n \"Fund your wallet with USDC on Base to start using BlockRun models.\",\n ],\n };\n },\n};\n\n/**\n * Auth method: read wallet key from MNEMOSPARK_WALLET_KEY environment variable.\n */\nexport const envKeyAuth: ProviderAuthMethod = {\n id: \"env-key\",\n label: \"Environment Variable\",\n hint: \"Use MNEMOSPARK_WALLET_KEY environment variable\",\n kind: \"api_key\",\n run: async (): Promise<ProviderAuthResult> => {\n const key = process.env.MNEMOSPARK_WALLET_KEY;\n\n if (!key) {\n throw new Error(\n \"MNEMOSPARK_WALLET_KEY environment variable is not set. \" +\n \"Set it to your EVM wallet private key (0x...).\",\n );\n }\n\n return {\n profiles: [\n {\n profileId: \"default\",\n credential: { apiKey: key.trim() },\n },\n ],\n notes: [\"Using wallet key from MNEMOSPARK_WALLET_KEY environment variable.\"],\n };\n },\n};\n","export function isValidWalletPrivateKey(value: string | undefined): value is `0x${string}` {\n return typeof value === \"string\" && /^0x[0-9a-fA-F]{64}$/.test(value.trim());\n}\n","/**\n * Single source of truth for version.\n * Reads from package.json at build time via tsup's define.\n */\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\n// Read package.json at runtime\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// In dist/, go up one level to find package.json\nconst require = createRequire(import.meta.url);\nconst pkg = require(join(__dirname, \"..\", \"package.json\")) as { version: string };\n\nexport const VERSION = pkg.version;\nexport const USER_AGENT = `mnemospark/${VERSION}`;\n","import { spawn } from \"node:child_process\";\nimport {\n createCipheriv,\n createHash,\n randomBytes as randomBytesNode,\n randomUUID,\n} from \"node:crypto\";\nimport { createReadStream, statfsSync } from \"node:fs\";\nimport { appendFile, lstat, mkdir, readFile, readdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nimport {\n requestPaymentSettleViaProxy,\n requestStorageUploadConfirmViaProxy,\n requestStorageUploadViaProxy,\n parsePriceStorageQuoteRequest,\n requestPriceStorageViaProxy,\n type StorageUploadConfirmRequest,\n type StorageUploadRequest,\n type StorageUploadResponse,\n type UploadPayload,\n type PriceStorageQuoteRequest,\n type PriceStorageQuoteResponse,\n type ProxyUploadConfirmOptions,\n type ProxyQuoteOptions,\n type ProxyUploadOptions,\n} from \"./cloud-price-storage.js\";\nimport {\n parseStorageObjectRequest,\n requestStorageDeleteViaProxy,\n requestStorageDownloadViaProxy,\n requestStorageLsViaProxy,\n type ProxyStorageOptions,\n type StorageDeleteResponse,\n type StorageDownloadProxyResponse,\n type StorageLsResponse,\n type StorageObjectRequest,\n} from \"./cloud-storage.js\";\nimport {\n AES_GCM_NONCE_BYTES,\n parseStoredAes256Key,\n resolveWalletKekPath,\n walletShortHash,\n} from \"./cloud-storage-crypto.js\";\nimport type { OpenClawPluginCommandDefinition } from \"./types.js\";\nimport { createPaymentFetch, type PaymentFetchResult } from \"./x402.js\";\nimport { isValidWalletPrivateKey } from \"./wallet-key.js\";\nimport { createCloudDatastore } from \"./cloud-datastore.js\";\nimport { appendJsonlEvent } from \"./cloud-jsonl.js\";\nimport type { RequestCorrelation } from \"./cloud-correlation.js\";\n\nconst SUPPORTED_BACKUP_PLATFORMS = new Set<NodeJS.Platform>([\"darwin\", \"linux\"]);\nconst BACKUP_DIR_SUBPATH = join(\".openclaw\", \"mnemospark\", \"backup\");\nconst DEFAULT_BACKUP_DIR = join(homedir(), BACKUP_DIR_SUBPATH);\nconst OBJECT_LOG_SUBPATH = join(\".openclaw\", \"mnemospark\", \"object.log\");\nconst CRON_TABLE_SUBPATH = join(\".openclaw\", \"mnemospark\", \"crontab.txt\");\nconst BLOCKRUN_WALLET_KEY_SUBPATH = join(\".openclaw\", \"blockrun\", \"wallet.key\");\nconst MNEMOSPARK_WALLET_KEY_SUBPATH = join(\".openclaw\", \"mnemospark\", \"wallet\", \"wallet.key\");\nconst INLINE_UPLOAD_MAX_BYTES = 4_500_000;\nconst PAYMENT_REMINDER_INTERVAL_DAYS = 30;\nconst PAYMENT_DELETE_DEADLINE_DAYS = 32;\n// Standard cron cannot express \"every 30 days\" from an arbitrary date. */30 in day-of-month\n// means days 1 and 31, so in 31-day months it fires twice one day apart (e.g. Jan 31, Feb 1).\n// Use 1st of each month so the job runs once per month.\nconst PAYMENT_CRON_SCHEDULE = \"0 0 1 * *\";\nconst CRON_LOG_ROW_PREFIX = \"cron\";\nconst TAR_OVERHEAD_BYTES = 10 * 1024 * 1024; // Conservative headroom for tar metadata.\n\nconst REQUIRED_PRICE_STORAGE =\n \"--wallet-address, --object-id, --object-id-hash, --gb, --provider, --region\";\nconst REQUIRED_UPLOAD = \"--quote-id, --wallet-address, --object-id, --object-id-hash\";\nconst REQUIRED_STORAGE_OBJECT =\n \"--wallet-address and one of (--object-key | --name [--latest|--at])\";\nconst BOOLEAN_SELECTOR_FLAGS = new Set([\"latest\"]);\nconst BOOLEAN_ASYNC_FLAGS = new Set([\"async\"]);\nconst BOOLEAN_OP_STATUS_FLAGS = new Set([\"cancel\"]);\nconst BOOLEAN_SELECTOR_AND_ASYNC_FLAGS = new Set([\"latest\", \"async\"]);\nconst ORCHESTRATOR_MODES = new Set([\"inline\", \"subagent\"]);\n\n/**\n * Expands a leading ~ to the current user's home directory.\n * Does not expand ~user (other users' homes).\n */\nexport function expandTilde(path: string): string {\n const trimmed = path.trim();\n if (trimmed === \"~\") {\n return homedir();\n }\n if (trimmed.startsWith(\"~/\") || trimmed.startsWith(\"~\\\\\")) {\n return join(homedir(), trimmed.slice(2));\n }\n return path;\n}\n\nconst CLOUD_HELP_TEXT = [\n \"☁️ **mnemospark Cloud Commands**\",\n \"\",\n \"• `/mnemospark_cloud` or `/mnemospark_cloud help` — show this message\",\n \"\",\n \"• `/mnemospark_cloud backup <file|directory> [--name <friendly-name>] [--async] [--orchestrator <inline|subagent>] [--timeout-seconds <n>]`\",\n \" Purpose: create a local tar+gzip backup object and index it for later upload.\",\n \" Required: <file|directory>\",\n \"\",\n \"• `/mnemospark_cloud price-storage --wallet-address <addr> --object-id <id> --object-id-hash <hash> --gb <gb> --provider <provider> --region <region>`\",\n \" Purpose: request a storage quote before upload.\",\n \" Required: \" + REQUIRED_PRICE_STORAGE,\n \"\",\n \"• `/mnemospark_cloud upload --quote-id <quote-id> --wallet-address <addr> --object-id <id> --object-id-hash <hash> [--name <friendly-name>] [--async] [--orchestrator <inline|subagent>] [--timeout-seconds <n>]`\",\n \" Purpose: upload an encrypted object using a valid quote-id.\",\n \" Required: \" + REQUIRED_UPLOAD,\n \"\",\n \"• `/mnemospark_cloud ls --wallet-address <addr> [--object-key <object-key> | --name <friendly-name>] [--latest|--at <timestamp>]`\",\n \" Purpose: look up remote object metadata.\",\n \" Required: \" + REQUIRED_STORAGE_OBJECT,\n \"\",\n \"• `/mnemospark_cloud download --wallet-address <addr> [--object-key <object-key> | --name <friendly-name>] [--latest|--at <timestamp>] [--async] [--orchestrator <inline|subagent>] [--timeout-seconds <n>]`\",\n \" Purpose: fetch an object to local disk.\",\n \" Required: \" + REQUIRED_STORAGE_OBJECT,\n \"\",\n \"• `/mnemospark_cloud delete --wallet-address <addr> [--object-key <object-key> | --name <friendly-name>] [--latest|--at <timestamp>]`\",\n \" Purpose: remove a remote object and local cron tracking when present.\",\n \" Required: \" + REQUIRED_STORAGE_OBJECT,\n \"\",\n \"• `/mnemospark_cloud op-status --operation-id <id> [--cancel]`\",\n \" Purpose: inspect async operation status, or request cancellation for subagent runs.\",\n \" Required: --operation-id\",\n \"\",\n \"Async orchestration flags (`backup`, `upload`, `download` only):\",\n \"• `--async`\",\n \" Start operation in background and return quickly with operation-id.\",\n \"• `--orchestrator <inline|subagent>`\",\n \" Choose async engine. Default when omitted is `inline`.\",\n \" Use `subagent` for explicit subagent session tracking and cancellation.\",\n \"• `--timeout-seconds <n>`\",\n \" Optional per-operation timeout. Valid only with `--async --orchestrator subagent`.\",\n \" `n` must be a positive integer (seconds).\",\n \"• `op-status --cancel`\",\n \" Cancel a subagent-orchestrated operation by operation-id (idempotent).\",\n \"\",\n \"Examples:\",\n \"• `/mnemospark_cloud upload ... --async --orchestrator subagent`\",\n \"• `/mnemospark_cloud download ... --async --orchestrator subagent --timeout-seconds 900`\",\n \"• `/mnemospark_cloud op-status --operation-id <id>`\",\n \"• `/mnemospark_cloud op-status --operation-id <id> --cancel`\",\n \"\",\n \"Backup creates a tar+gzip object in ~/.openclaw/mnemospark/backup and appends object metadata to ~/.openclaw/mnemospark/object.log. Upload appends storage rows and cron-tracking rows to object.log, and keeps job entries in ~/.openclaw/mnemospark/crontab.txt. All storage commands (price-storage, upload, ls, download, delete) require --wallet-address.\",\n].join(\"\\n\");\n\ntype FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\ntype UploadCommandRequest = {\n quote_id: string;\n wallet_address: string;\n object_id: string;\n object_id_hash: string;\n};\n\ntype BackupObjectOptions = {\n platform?: NodeJS.Platform;\n tmpDir?: string;\n homeDir?: string;\n now?: () => number;\n randomBytes?: (size: number) => Buffer;\n availableDiskBytes?: number;\n};\n\ntype BackupObjectResult = {\n objectId: string;\n objectIdHash: string;\n objectSizeGb: string;\n archivePath: string;\n objectLogPath: string;\n};\n\ntype NameSelector = { name: string; latest?: boolean; at?: string };\ntype StorageObjectRequestInput = Omit<StorageObjectRequest, \"object_key\"> & {\n object_key?: string;\n};\ntype OrchestratorMode = \"inline\" | \"subagent\";\ntype AsyncOperationArgs = {\n async?: boolean;\n orchestrator?: OrchestratorMode;\n timeoutSeconds?: number;\n};\n\ntype MnemosparkSubagentTaskV1 = {\n schema: \"mnemospark.subagent-task.v1\";\n operationId: string;\n traceId: string;\n command: \"upload\" | \"download\" | \"backup\";\n args: string;\n timeoutSeconds?: number;\n requestedBy: {\n pluginCommand: \"mnemospark_cloud\";\n chatId?: string;\n senderId?: string;\n };\n};\n\ntype MnemosparkSubagentDispatchHooks = {\n onRunning?: (sessionId: string) => Promise<void> | void;\n onProgress?: (sessionId: string, message: string) => Promise<void> | void;\n onCompleted?: (\n sessionId: string,\n result: { text: string; isError?: boolean },\n ) => Promise<void> | void;\n onFailed?: (\n sessionId: string,\n details: { code: string; message: string },\n ) => Promise<void> | void;\n onCancelled?: (sessionId: string, reason?: string) => Promise<void> | void;\n onTimedOut?: (sessionId: string) => Promise<void> | void;\n};\n\ntype MnemosparkSubagentDispatchInput = {\n task: MnemosparkSubagentTaskV1;\n timeoutSeconds?: number;\n runTask: () => Promise<{ text: string; isError?: boolean }>;\n hooks?: MnemosparkSubagentDispatchHooks;\n};\n\ntype MnemosparkSubagentDispatchResult = {\n sessionId: string;\n};\n\ntype MnemosparkSubagentCancelResult = {\n accepted: boolean;\n alreadyTerminal?: boolean;\n};\n\ntype MnemosparkSubagentOrchestrator = {\n dispatch: (input: MnemosparkSubagentDispatchInput) => Promise<MnemosparkSubagentDispatchResult>;\n cancel: (sessionId: string, reason?: string) => Promise<MnemosparkSubagentCancelResult>;\n};\n\ntype ParsedCloudArgs =\n | { mode: \"help\" }\n | ({ mode: \"backup\"; backupTarget: string; friendlyName?: string } & AsyncOperationArgs)\n | { mode: \"backup-invalid\" }\n | { mode: \"backup-invalid-async\" }\n | { mode: \"price-storage\"; priceStorageRequest: PriceStorageQuoteRequest }\n | { mode: \"price-storage-invalid\" }\n | ({\n mode: \"upload\";\n uploadRequest: UploadCommandRequest;\n friendlyName?: string;\n } & AsyncOperationArgs)\n | { mode: \"upload-invalid\" }\n | { mode: \"upload-invalid-async\" }\n | { mode: \"ls\"; storageObjectRequest: StorageObjectRequestInput; nameSelector?: NameSelector }\n | { mode: \"ls-invalid\" }\n | ({\n mode: \"download\";\n storageObjectRequest: StorageObjectRequestInput;\n nameSelector?: NameSelector;\n } & AsyncOperationArgs)\n | { mode: \"download-invalid\" }\n | { mode: \"download-invalid-async\" }\n | { mode: \"delete\"; storageObjectRequest: StorageObjectRequestInput; nameSelector?: NameSelector }\n | { mode: \"delete-invalid\" }\n | { mode: \"op-status\"; operationId: string; cancel?: boolean }\n | { mode: \"op-status-invalid\" }\n | { mode: \"unknown\" };\n\ntype CreateCloudCommandOptions = {\n backupOptions?: BackupObjectOptions;\n buildBackupObjectFn?: (\n targetPath: string,\n options?: BackupObjectOptions,\n ) => Promise<BackupObjectResult>;\n requestPriceStorageQuoteFn?: (\n request: PriceStorageQuoteRequest,\n options?: ProxyQuoteOptions,\n ) => Promise<PriceStorageQuoteResponse>;\n requestStorageUploadFn?: (\n request: StorageUploadRequest,\n options?: ProxyUploadOptions,\n ) => Promise<StorageUploadResponse>;\n requestStorageUploadConfirmFn?: (\n request: StorageUploadConfirmRequest,\n options?: ProxyUploadConfirmOptions,\n ) => Promise<StorageUploadResponse>;\n resolveWalletPrivateKeyFn?: (homeDir?: string) => Promise<`0x${string}`>;\n createPaymentFetchFn?: (privateKey: `0x${string}`) => PaymentFetchResult;\n fetchImpl?: FetchLike;\n nowDateFn?: () => Date;\n idempotencyKeyFn?: () => string;\n proxyQuoteOptions?: ProxyQuoteOptions;\n proxyUploadOptions?: ProxyUploadOptions;\n proxyUploadConfirmOptions?: ProxyUploadConfirmOptions;\n requestStorageLsFn?: (\n request: StorageObjectRequest,\n options?: ProxyStorageOptions,\n ) => Promise<StorageLsResponse>;\n requestStorageDownloadFn?: (\n request: StorageObjectRequest,\n options?: ProxyStorageOptions,\n ) => Promise<StorageDownloadProxyResponse>;\n requestStorageDeleteFn?: (\n request: StorageObjectRequest,\n options?: ProxyStorageOptions,\n ) => Promise<StorageDeleteResponse>;\n subagentOrchestrator?: MnemosparkSubagentOrchestrator;\n proxyStorageOptions?: ProxyStorageOptions;\n objectLogHomeDir?: string;\n};\n\nclass UnsupportedBackupPlatformError extends Error {\n constructor(platform: NodeJS.Platform) {\n super(`Unsupported platform for backup: ${platform}`);\n this.name = \"UnsupportedBackupPlatformError\";\n }\n}\n\nfunction toGbString(bytes: number): string {\n const gb = bytes / 1_000_000_000;\n const fixed = gb.toFixed(9).replace(/\\.?0+$/, \"\");\n if (!fixed) return \"0\";\n return fixed.includes(\".\") ? fixed : `${fixed}.0`;\n}\n\nfunction stripWrappingQuotes(input: string): string {\n const trimmed = input.trim();\n if (trimmed.length < 2) return trimmed;\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\nfunction tokenizeArgsRaw(input: string): string[] {\n const tokens = input.match(/\"[^\"]*\"|'[^']*'|\\S+/g);\n if (!tokens) {\n return [];\n }\n return tokens;\n}\n\nfunction tokenizeArgs(input: string): string[] {\n return tokenizeArgsRaw(input).map((token) => stripWrappingQuotes(token));\n}\n\nfunction parseNamedFlagsTokens(\n tokens: string[],\n booleanFlags: ReadonlySet<string> = new Set(),\n): Record<string, string> | null {\n if (tokens.length === 0) {\n return null;\n }\n\n const parsed: Record<string, string> = {};\n for (let i = 0; i < tokens.length; i += 1) {\n const keyToken = tokens[i];\n if (!keyToken.startsWith(\"--\")) {\n return null;\n }\n const key = keyToken.slice(2).toLowerCase().replace(/_/g, \"-\");\n const value = tokens[i + 1];\n if (!value || value.startsWith(\"--\")) {\n if (booleanFlags.has(key)) {\n parsed[key] = \"true\";\n continue;\n }\n return null;\n }\n parsed[key] = value;\n i += 1;\n }\n return parsed;\n}\n\nfunction parseNamedFlags(\n input: string,\n booleanFlags: ReadonlySet<string> = new Set(),\n): Record<string, string> | null {\n const tokens = tokenizeArgs(input);\n return parseNamedFlagsTokens(tokens, booleanFlags);\n}\n\nfunction parseObjectSelector(\n flags: Record<string, string>,\n): { objectKey?: string; nameSelector?: NameSelector } | null {\n const objectKey = flags[\"object-key\"]?.trim();\n const name = flags.name?.trim();\n const latest = flags.latest === \"true\";\n const at = flags.at?.trim();\n\n if (objectKey && name) return null;\n if (!objectKey && !name) return null;\n if (latest && at) return null;\n\n if (objectKey) return { objectKey };\n return { nameSelector: { name: name!, latest, at } };\n}\n\nfunction parseStorageObjectRequestInput(\n flags: Record<string, string>,\n selector: { objectKey?: string; nameSelector?: NameSelector },\n): StorageObjectRequestInput | null {\n const walletAddress = flags[\"wallet-address\"]?.trim();\n if (!walletAddress) {\n return null;\n }\n const location = flags.location?.trim() || flags.region?.trim() || undefined;\n if (!selector.objectKey) {\n return {\n wallet_address: walletAddress,\n location,\n };\n }\n return parseStorageObjectRequest({\n wallet_address: walletAddress,\n object_key: selector.objectKey,\n location,\n });\n}\n\nfunction parseOrchestratorMode(value?: string): OrchestratorMode | undefined | null {\n if (!value) {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if (!normalized) {\n return null;\n }\n if (!ORCHESTRATOR_MODES.has(normalized)) {\n return null;\n }\n return normalized as OrchestratorMode;\n}\n\nfunction parseTimeoutSeconds(value?: string): number | undefined | null {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n if (!/^\\d+$/.test(trimmed)) {\n return null;\n }\n const parsed = Number.parseInt(trimmed, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return null;\n }\n return parsed;\n}\n\nfunction parseAsyncOperationArgs(flags: Record<string, string>): AsyncOperationArgs | null {\n const asyncRequested = flags.async === \"true\";\n const hasOrchestratorFlag = typeof flags.orchestrator === \"string\";\n const hasTimeoutFlag = typeof flags[\"timeout-seconds\"] === \"string\";\n\n if (!asyncRequested && (hasOrchestratorFlag || hasTimeoutFlag)) {\n return null;\n }\n\n const parsedOrchestrator = parseOrchestratorMode(flags.orchestrator);\n if (parsedOrchestrator === null) {\n return null;\n }\n const parsedTimeoutSeconds = parseTimeoutSeconds(flags[\"timeout-seconds\"]);\n if (parsedTimeoutSeconds === null) {\n return null;\n }\n if (typeof parsedTimeoutSeconds === \"number\" && (parsedOrchestrator ?? \"inline\") !== \"subagent\") {\n return null;\n }\n\n return {\n async: asyncRequested,\n orchestrator: parsedOrchestrator === undefined ? undefined : parsedOrchestrator,\n timeoutSeconds: parsedTimeoutSeconds === undefined ? undefined : parsedTimeoutSeconds,\n };\n}\n\nconst INVALID_ASYNC_FLAGS_MESSAGE =\n \"invalid async flags. `--orchestrator`/`--timeout-seconds` require `--async`, and `--timeout-seconds` is only valid with `--orchestrator subagent`.\";\n\nfunction stripAsyncControlFlags(args?: string): string {\n const tokens = tokenizeArgsRaw(args ?? \"\");\n const filtered: string[] = [];\n for (let idx = 0; idx < tokens.length; idx += 1) {\n const token = tokens[idx];\n const lowerToken = token.toLowerCase();\n if (lowerToken === \"--async\") {\n continue;\n }\n if (lowerToken === \"--orchestrator\" || lowerToken === \"--timeout-seconds\") {\n idx += 1;\n continue;\n }\n filtered.push(token);\n }\n return filtered.join(\" \");\n}\n\nfunction parseCloudArgs(args?: string): ParsedCloudArgs {\n const trimmed = args?.trim() ?? \"\";\n if (!trimmed) {\n return { mode: \"help\" };\n }\n\n const spaceIdx = trimmed.indexOf(\" \");\n const subcommand = (spaceIdx === -1 ? trimmed : trimmed.slice(0, spaceIdx)).toLowerCase();\n const rest = spaceIdx === -1 ? \"\" : trimmed.slice(spaceIdx + 1);\n\n if (subcommand === \"help\") {\n return { mode: \"help\" };\n }\n\n if (subcommand === \"backup\") {\n const tokens = tokenizeArgs(rest);\n if (tokens.length === 0) {\n return { mode: \"unknown\" };\n }\n const backupTarget = tokens[0] ?? \"\";\n if (!backupTarget) {\n return { mode: \"unknown\" };\n }\n const remainingTokens = tokens.slice(1);\n const flags =\n remainingTokens.length === 0\n ? ({} as Record<string, string>)\n : parseNamedFlagsTokens(remainingTokens, BOOLEAN_ASYNC_FLAGS);\n if (!flags) {\n return { mode: \"backup-invalid\" };\n }\n const asyncArgs = parseAsyncOperationArgs(flags);\n if (!asyncArgs) {\n return { mode: \"backup-invalid-async\" };\n }\n return {\n mode: \"backup\",\n backupTarget,\n friendlyName: flags.name?.trim() || undefined,\n ...asyncArgs,\n };\n }\n\n if (subcommand === \"price-storage\") {\n const flags = parseNamedFlags(rest);\n if (!flags) {\n return { mode: \"price-storage-invalid\" };\n }\n const gb = Number.parseFloat(flags.gb ?? \"\");\n const request = parsePriceStorageQuoteRequest({\n wallet_address: flags[\"wallet-address\"],\n object_id: flags[\"object-id\"],\n object_id_hash: flags[\"object-id-hash\"],\n gb,\n provider: flags.provider,\n region: flags.region,\n });\n if (!request) {\n return { mode: \"price-storage-invalid\" };\n }\n return { mode: \"price-storage\", priceStorageRequest: request };\n }\n\n if (subcommand === \"upload\") {\n const flags = parseNamedFlags(rest, BOOLEAN_ASYNC_FLAGS);\n if (!flags) {\n return { mode: \"upload-invalid\" };\n }\n const asyncArgs = parseAsyncOperationArgs(flags);\n if (!asyncArgs) {\n return { mode: \"upload-invalid-async\" };\n }\n\n const quoteId = flags[\"quote-id\"]?.trim();\n const walletAddress = flags[\"wallet-address\"]?.trim();\n const objectId = flags[\"object-id\"]?.trim();\n const objectIdHash = flags[\"object-id-hash\"]?.trim();\n\n if (!quoteId || !walletAddress || !objectId || !objectIdHash) {\n return { mode: \"upload-invalid\" };\n }\n\n return {\n mode: \"upload\",\n friendlyName: flags.name?.trim() || undefined,\n ...asyncArgs,\n uploadRequest: {\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId,\n object_id_hash: objectIdHash,\n },\n };\n }\n\n if (subcommand === \"ls\") {\n const flags = parseNamedFlags(rest, BOOLEAN_SELECTOR_FLAGS);\n if (!flags) {\n return { mode: \"ls-invalid\" };\n }\n const selector = parseObjectSelector(flags);\n if (!selector) {\n return { mode: \"ls-invalid\" };\n }\n const request = parseStorageObjectRequestInput(flags, selector);\n if (!request) {\n return { mode: \"ls-invalid\" };\n }\n return { mode: \"ls\", storageObjectRequest: request, nameSelector: selector.nameSelector };\n }\n\n if (subcommand === \"download\") {\n const flags = parseNamedFlags(rest, BOOLEAN_SELECTOR_AND_ASYNC_FLAGS);\n if (!flags) {\n return { mode: \"download-invalid\" };\n }\n const asyncArgs = parseAsyncOperationArgs(flags);\n if (!asyncArgs) {\n return { mode: \"download-invalid-async\" };\n }\n const selector = parseObjectSelector(flags);\n if (!selector) {\n return { mode: \"download-invalid\" };\n }\n const request = parseStorageObjectRequestInput(flags, selector);\n if (!request) {\n return { mode: \"download-invalid\" };\n }\n return {\n mode: \"download\",\n storageObjectRequest: request,\n nameSelector: selector.nameSelector,\n ...asyncArgs,\n };\n }\n\n if (subcommand === \"delete\") {\n const flags = parseNamedFlags(rest, BOOLEAN_SELECTOR_FLAGS);\n if (!flags) {\n return { mode: \"delete-invalid\" };\n }\n const selector = parseObjectSelector(flags);\n if (!selector) {\n return { mode: \"delete-invalid\" };\n }\n const request = parseStorageObjectRequestInput(flags, selector);\n if (!request) {\n return { mode: \"delete-invalid\" };\n }\n return { mode: \"delete\", storageObjectRequest: request, nameSelector: selector.nameSelector };\n }\n\n if (subcommand === \"op-status\") {\n const flags = parseNamedFlags(rest, BOOLEAN_OP_STATUS_FLAGS);\n const operationId = flags?.[\"operation-id\"]?.trim();\n if (!operationId) {\n return { mode: \"op-status-invalid\" };\n }\n return { mode: \"op-status\", operationId, cancel: flags?.cancel === \"true\" };\n }\n\n return { mode: \"unknown\" };\n}\n\nfunction resolveObjectLogPath(homeDir?: string): string {\n return join(homeDir ?? homedir(), OBJECT_LOG_SUBPATH);\n}\n\nfunction resolveCronTablePath(homeDir?: string): string {\n return join(homeDir ?? homedir(), CRON_TABLE_SUBPATH);\n}\n\nasync function appendObjectLogLine(line: string, homeDir?: string): Promise<string> {\n const objectLogPath = resolveObjectLogPath(homeDir);\n await mkdir(dirname(objectLogPath), { recursive: true });\n await appendFile(objectLogPath, `${line}\\n`, \"utf-8\");\n return objectLogPath;\n}\n\nasync function calculateInputSizeBytes(targetPath: string): Promise<number> {\n const targetStats = await lstat(targetPath);\n if (targetStats.isFile() || targetStats.isSymbolicLink()) {\n return targetStats.size;\n }\n\n if (!targetStats.isDirectory()) {\n throw new Error(\"Backup target must be a file or directory\");\n }\n\n let total = 0;\n const entries = await readdir(targetPath, { withFileTypes: true });\n for (const entry of entries) {\n total += await calculateInputSizeBytes(join(targetPath, entry.name));\n }\n return total;\n}\n\nfunction getAvailableDiskBytes(tmpDir: string, options: BackupObjectOptions): number {\n if (typeof options.availableDiskBytes === \"number\") {\n return options.availableDiskBytes;\n }\n const stats = statfsSync(tmpDir);\n return stats.bavail * stats.bsize;\n}\n\nasync function runTarGzip(archivePath: string, sourcePath: string): Promise<void> {\n const sourceDir = dirname(sourcePath);\n const sourceName = basename(sourcePath);\n\n await new Promise<void>((resolvePromise, rejectPromise) => {\n let stderr = \"\";\n const child = spawn(\"tar\", [\"-czf\", archivePath, \"-C\", sourceDir, sourceName], {\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n });\n\n child.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", rejectPromise);\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolvePromise();\n return;\n }\n rejectPromise(new Error(stderr.trim() || `tar exited with code ${code ?? \"unknown\"}`));\n });\n });\n}\n\nasync function sha256File(filePath: string): Promise<string> {\n const hash = createHash(\"sha256\");\n await new Promise<void>((resolvePromise, rejectPromise) => {\n const stream = createReadStream(filePath);\n stream.on(\"data\", (chunk) => hash.update(chunk));\n stream.on(\"error\", rejectPromise);\n stream.on(\"end\", () => resolvePromise());\n });\n return hash.digest(\"hex\");\n}\n\nfunction createObjectId(options: BackupObjectOptions): string {\n const nowFn = options.now ?? Date.now;\n const randomFn = options.randomBytes ?? randomBytesNode;\n return `${nowFn()}-${randomFn(8).toString(\"hex\")}`;\n}\n\nexport async function buildBackupObject(\n targetPathArg: string,\n options: BackupObjectOptions = {},\n): Promise<BackupObjectResult> {\n const platform = options.platform ?? process.platform;\n if (!SUPPORTED_BACKUP_PLATFORMS.has(platform)) {\n throw new UnsupportedBackupPlatformError(platform);\n }\n\n const targetPath = resolve(expandTilde(targetPathArg));\n const targetStats = await lstat(targetPath);\n if (!targetStats.isFile() && !targetStats.isDirectory()) {\n throw new Error(\"Backup target must be a file or directory\");\n }\n\n const tmpDir = options.tmpDir ?? DEFAULT_BACKUP_DIR;\n let tmpStats;\n try {\n tmpStats = await stat(tmpDir);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n await mkdir(tmpDir, { recursive: true });\n tmpStats = await stat(tmpDir);\n } else {\n throw error;\n }\n }\n if (!tmpStats.isDirectory()) {\n throw new Error(\"Backup path is not a directory\");\n }\n\n const inputSizeBytes = await calculateInputSizeBytes(targetPath);\n const availableDiskBytes = getAvailableDiskBytes(tmpDir, options);\n const requiredDiskBytes = inputSizeBytes + TAR_OVERHEAD_BYTES;\n if (availableDiskBytes < requiredDiskBytes) {\n throw new Error(\"Insufficient disk space for backup object\");\n }\n\n const objectId = createObjectId(options);\n const archivePath = join(tmpDir, objectId);\n\n try {\n await runTarGzip(archivePath, targetPath);\n const archiveStats = await stat(archivePath);\n const objectIdHash = await sha256File(archivePath);\n const objectSizeGb = toGbString(archiveStats.size);\n\n const objectLogPath = await appendObjectLogLine(\n `${objectId},${objectIdHash},${objectSizeGb}`,\n options.homeDir,\n );\n\n return {\n objectId,\n objectIdHash,\n objectSizeGb,\n archivePath,\n objectLogPath,\n };\n } catch (error) {\n await rm(archivePath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nasync function appendPriceStorageQuoteLog(\n quote: PriceStorageQuoteResponse,\n homeDir?: string,\n): Promise<string> {\n return appendObjectLogLine(\n [\n quote.timestamp,\n quote.quote_id,\n quote.storage_price.toString(),\n quote.addr,\n quote.object_id,\n quote.object_id_hash,\n quote.object_size_gb.toString(),\n quote.provider,\n quote.location,\n ].join(\",\"),\n homeDir,\n );\n}\n\ntype LoggedPriceStorageQuote = {\n quoteId: string;\n storagePrice: number;\n walletAddress: string;\n objectId: string;\n objectIdHash: string;\n provider: string;\n location: string;\n};\n\ntype StoragePaymentCronJob = {\n cronId: string;\n createdAt: string;\n schedule: string;\n command: string;\n quoteId: string;\n storagePrice: number;\n walletAddress: string;\n objectId: string;\n objectKey: string;\n provider: string;\n bucketName: string;\n location: string;\n};\n\ntype LoggedStoragePaymentCron = {\n cronId: string;\n objectId: string;\n objectKey: string;\n};\n\nfunction formatTimestamp(date: Date): string {\n const pad = (value: number): string => value.toString().padStart(2, \"0\");\n return [\n date.getFullYear().toString(),\n \"-\",\n pad(date.getMonth() + 1),\n \"-\",\n pad(date.getDate()),\n \" \",\n pad(date.getHours()),\n \":\",\n pad(date.getMinutes()),\n \":\",\n pad(date.getSeconds()),\n ].join(\"\");\n}\n\nfunction parseLoggedPriceStorageQuote(line: string): LoggedPriceStorageQuote | null {\n const parts = line.split(\",\");\n if (parts.length < 9) {\n return null;\n }\n\n const quoteId = parts[1]?.trim() ?? \"\";\n const storagePriceRaw = parts[2]?.trim() ?? \"\";\n const walletAddress = parts[3]?.trim() ?? \"\";\n const objectId = parts[4]?.trim() ?? \"\";\n const objectIdHash = parts[5]?.trim() ?? \"\";\n const provider = parts[7]?.trim() ?? \"\";\n const location = parts[8]?.trim() ?? \"\";\n const storagePrice = Number.parseFloat(storagePriceRaw);\n\n if (!quoteId || !walletAddress || !objectId || !objectIdHash || !provider || !location) {\n return null;\n }\n if (!Number.isFinite(storagePrice) || storagePrice <= 0) {\n return null;\n }\n\n return {\n quoteId,\n storagePrice,\n walletAddress,\n objectId,\n objectIdHash,\n provider,\n location,\n };\n}\n\nfunction parseLoggedStoragePaymentCron(line: string): LoggedStoragePaymentCron | null {\n const parts = line.split(\",\");\n if (parts.length < 5) {\n return null;\n }\n if ((parts[0]?.trim() ?? \"\").toLowerCase() !== CRON_LOG_ROW_PREFIX) {\n return null;\n }\n\n const cronId = parts[2]?.trim() ?? \"\";\n const objectId = parts[3]?.trim() ?? \"\";\n const objectKey = parts[4]?.trim() ?? \"\";\n if (!cronId || !objectId || !objectKey) {\n return null;\n }\n\n return {\n cronId,\n objectId,\n objectKey,\n };\n}\n\nfunction parseStoragePaymentCronJobLine(line: string): StoragePaymentCronJob | null {\n const trimmed = line.trim();\n if (!trimmed) {\n return null;\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(trimmed);\n } catch {\n return null;\n }\n\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n const record = payload as Record<string, unknown>;\n\n const cronId = typeof record.cronId === \"string\" ? record.cronId.trim() : \"\";\n const createdAt = typeof record.createdAt === \"string\" ? record.createdAt.trim() : \"\";\n const schedule = typeof record.schedule === \"string\" ? record.schedule.trim() : \"\";\n const command = typeof record.command === \"string\" ? record.command.trim() : \"\";\n const quoteId = typeof record.quoteId === \"string\" ? record.quoteId.trim() : \"\";\n const storagePrice = typeof record.storagePrice === \"number\" ? record.storagePrice : Number.NaN;\n const walletAddress = typeof record.walletAddress === \"string\" ? record.walletAddress.trim() : \"\";\n const objectId = typeof record.objectId === \"string\" ? record.objectId.trim() : \"\";\n const objectKey = typeof record.objectKey === \"string\" ? record.objectKey.trim() : \"\";\n const provider = typeof record.provider === \"string\" ? record.provider.trim() : \"\";\n const bucketName = typeof record.bucketName === \"string\" ? record.bucketName.trim() : \"\";\n const location = typeof record.location === \"string\" ? record.location.trim() : \"\";\n\n if (\n !cronId ||\n !createdAt ||\n !schedule ||\n !command ||\n !quoteId ||\n !Number.isFinite(storagePrice) ||\n storagePrice <= 0 ||\n !walletAddress ||\n !objectId ||\n !objectKey ||\n !provider ||\n !bucketName ||\n !location\n ) {\n return null;\n }\n\n return {\n cronId,\n createdAt,\n schedule,\n command,\n quoteId,\n storagePrice,\n walletAddress,\n objectId,\n objectKey,\n provider,\n bucketName,\n location,\n };\n}\n\nasync function findLoggedPriceStorageQuote(\n quoteId: string,\n homeDir?: string,\n): Promise<LoggedPriceStorageQuote | null> {\n const objectLogPath = resolveObjectLogPath(homeDir);\n\n let content: string;\n try {\n content = await readFile(objectLogPath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n for (let idx = lines.length - 1; idx >= 0; idx -= 1) {\n const parsed = parseLoggedPriceStorageQuote(lines[idx]);\n if (parsed && parsed.quoteId === quoteId) {\n return parsed;\n }\n }\n return null;\n}\n\nasync function findLoggedStoragePaymentCronByObjectKey(\n objectKey: string,\n homeDir?: string,\n): Promise<LoggedStoragePaymentCron | null> {\n const objectLogPath = resolveObjectLogPath(homeDir);\n\n let content: string;\n try {\n content = await readFile(objectLogPath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n for (let idx = lines.length - 1; idx >= 0; idx -= 1) {\n const parsed = parseLoggedStoragePaymentCron(lines[idx]);\n if (parsed && parsed.objectKey === objectKey) {\n return parsed;\n }\n }\n return null;\n}\n\nfunction quoteCronArgument(value: string | number): string {\n return JSON.stringify(String(value));\n}\n\nfunction buildStoragePaymentCronCommand(job: {\n quoteId: string;\n walletAddress: string;\n objectId: string;\n objectKey: string;\n storagePrice: number;\n}): string {\n return [\n \"mnemospark-pay-storage\",\n \"--quote-id\",\n quoteCronArgument(job.quoteId),\n \"--wallet-address\",\n quoteCronArgument(job.walletAddress),\n \"--object-id\",\n quoteCronArgument(job.objectId),\n \"--object-key\",\n quoteCronArgument(job.objectKey),\n \"--storage-price\",\n quoteCronArgument(job.storagePrice),\n ].join(\" \");\n}\n\nasync function appendStoragePaymentCronLog(\n cronJob: StoragePaymentCronJob,\n homeDir?: string,\n): Promise<string> {\n return appendObjectLogLine(\n [\n CRON_LOG_ROW_PREFIX,\n cronJob.createdAt,\n cronJob.cronId,\n cronJob.objectId,\n cronJob.objectKey,\n cronJob.quoteId,\n cronJob.storagePrice.toString(),\n ].join(\",\"),\n homeDir,\n );\n}\n\nasync function appendStoragePaymentCronJob(\n cronJob: StoragePaymentCronJob,\n homeDir?: string,\n): Promise<string> {\n const cronTablePath = resolveCronTablePath(homeDir);\n await mkdir(dirname(cronTablePath), { recursive: true });\n await appendFile(cronTablePath, `${JSON.stringify(cronJob)}\\n`, \"utf-8\");\n return cronTablePath;\n}\n\nasync function removeStoragePaymentCronJob(cronId: string, homeDir?: string): Promise<boolean> {\n const cronTablePath = resolveCronTablePath(homeDir);\n\n let content: string;\n try {\n content = await readFile(cronTablePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n\n const lines = content.split(/\\r?\\n/);\n let removed = false;\n const keptLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n const parsed = parseStoragePaymentCronJobLine(trimmed);\n if (parsed && parsed.cronId === cronId) {\n removed = true;\n continue;\n }\n keptLines.push(trimmed);\n }\n\n if (!removed) {\n return false;\n }\n\n await mkdir(dirname(cronTablePath), { recursive: true });\n const nextContent = keptLines.length > 0 ? `${keptLines.join(\"\\n\")}\\n` : \"\";\n await writeFile(cronTablePath, nextContent, \"utf-8\");\n return true;\n}\n\nasync function createStoragePaymentCronJob(\n upload: StorageUploadResponse,\n storagePrice: number,\n homeDir?: string,\n nowDateFn: () => Date = () => new Date(),\n): Promise<StoragePaymentCronJob> {\n const cronId = randomUUID();\n const createdAt = formatTimestamp(nowDateFn());\n const cronJob: StoragePaymentCronJob = {\n cronId,\n createdAt,\n schedule: PAYMENT_CRON_SCHEDULE,\n command: buildStoragePaymentCronCommand({\n quoteId: upload.quote_id,\n walletAddress: upload.addr,\n objectId: upload.object_id,\n objectKey: upload.object_key,\n storagePrice,\n }),\n quoteId: upload.quote_id,\n storagePrice,\n walletAddress: upload.addr,\n objectId: upload.object_id,\n objectKey: upload.object_key,\n provider: upload.provider,\n bucketName: upload.bucket_name,\n location: upload.location,\n };\n\n await appendStoragePaymentCronJob(cronJob, homeDir);\n await appendStoragePaymentCronLog(cronJob, homeDir);\n return cronJob;\n}\n\nasync function readWalletKeyIfPresent(walletPath: string): Promise<`0x${string}` | null> {\n try {\n const key = (await readFile(walletPath, \"utf-8\")).trim();\n return isValidWalletPrivateKey(key) ? key : null;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function resolveWalletPrivateKey(homeDir?: string): Promise<`0x${string}`> {\n const envKey = process.env.MNEMOSPARK_WALLET_KEY?.trim();\n if (isValidWalletPrivateKey(envKey)) {\n return envKey;\n }\n\n const baseHome = homeDir ?? homedir();\n const primaryWalletPath = join(baseHome, MNEMOSPARK_WALLET_KEY_SUBPATH);\n const fallbackWalletPath = join(baseHome, BLOCKRUN_WALLET_KEY_SUBPATH);\n\n const fromPrimary = await readWalletKeyIfPresent(primaryWalletPath);\n if (fromPrimary) {\n return fromPrimary;\n }\n\n const fromFallback = await readWalletKeyIfPresent(fallbackWalletPath);\n if (fromFallback) {\n return fromFallback;\n }\n\n throw new Error(\n \"No mnemospark wallet found. Run `openclaw plugins install mnemospark` or set MNEMOSPARK_WALLET_KEY.\",\n );\n}\n\nfunction sha256Buffer(content: Buffer): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction bucketNameForWallet(walletAddress: string): string {\n return `mnemospark-${walletShortHash(walletAddress)}`;\n}\n\nfunction encryptAesGcm(\n plaintext: Buffer,\n key: Buffer,\n randomFn: (size: number) => Buffer = randomBytesNode,\n): Buffer {\n if (key.length !== 32) {\n throw new Error(\"Expected 32-byte AES key\");\n }\n const nonce = randomFn(AES_GCM_NONCE_BYTES);\n const cipher = createCipheriv(\"aes-256-gcm\", key, nonce);\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n return Buffer.concat([nonce, ciphertext, tag]);\n}\n\nasync function loadOrCreateKek(\n walletAddress: string,\n homeDir?: string,\n): Promise<{ kek: Buffer; keyPath: string }> {\n const keyPath = resolveWalletKekPath(walletAddress, homeDir);\n await mkdir(dirname(keyPath), { recursive: true });\n\n try {\n const existing = await readFile(keyPath);\n return { kek: parseStoredAes256Key(existing), keyPath };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const generated = randomBytesNode(32);\n await writeFile(keyPath, generated, { mode: 0o600 });\n return { kek: generated, keyPath };\n}\n\ntype PreparedUploadPayload = {\n payload: UploadPayload;\n encryptedContent: Buffer;\n};\n\nasync function prepareUploadPayload(\n archivePath: string,\n walletAddress: string,\n homeDir?: string,\n): Promise<PreparedUploadPayload> {\n const plaintext = await readFile(archivePath);\n const { kek, keyPath } = await loadOrCreateKek(walletAddress, homeDir);\n\n const dek = randomBytesNode(32);\n const encryptedContent = encryptAesGcm(plaintext, dek);\n const wrappedDek = encryptAesGcm(dek, kek);\n const payloadHash = sha256Buffer(encryptedContent);\n\n const payload: UploadPayload = {\n mode: encryptedContent.length <= INLINE_UPLOAD_MAX_BYTES ? \"inline\" : \"presigned\",\n content_base64:\n encryptedContent.length <= INLINE_UPLOAD_MAX_BYTES\n ? encryptedContent.toString(\"base64\")\n : undefined,\n content_sha256: payloadHash,\n content_length_bytes: encryptedContent.length,\n wrapped_dek: wrappedDek.toString(\"base64\"),\n encryption_algorithm: \"AES-256-GCM\",\n bucket_name_hint: bucketNameForWallet(walletAddress),\n key_store_path_hint: keyPath,\n };\n\n return {\n payload,\n encryptedContent,\n };\n}\n\nasync function uploadPresignedObjectIfNeeded(\n uploadResponse: StorageUploadResponse,\n uploadMode: UploadPayload[\"mode\"],\n encryptedContent: Buffer,\n fetchImpl: FetchLike = fetch,\n): Promise<void> {\n if (!uploadResponse.upload_url) {\n if (uploadMode === \"presigned\") {\n throw new Error(\"Cannot upload storage object: missing presigned upload URL.\");\n }\n return;\n }\n\n const headers = new Headers(uploadResponse.upload_headers ?? {});\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/octet-stream\");\n }\n\n const putBody = new Uint8Array(encryptedContent);\n const firstAttempt = await fetchImpl(uploadResponse.upload_url, {\n method: \"PUT\",\n headers,\n body: putBody,\n redirect: \"manual\",\n });\n\n if (firstAttempt.ok) {\n return;\n }\n\n // Some S3 presigned PUT URLs can return a temporary redirect (307/308)\n // when the request is sent to a non-regional endpoint. Retry once against\n // the Location target with the same signed query parameters.\n if (\n (firstAttempt.status === 307 || firstAttempt.status === 308) &&\n firstAttempt.headers.has(\"location\")\n ) {\n const location = firstAttempt.headers.get(\"location\")?.trim();\n if (location) {\n const redirectedAttempt = await fetchImpl(location, {\n method: \"PUT\",\n headers,\n body: putBody,\n });\n if (redirectedAttempt.ok) {\n return;\n }\n const redirectedDetails = (await redirectedAttempt.text()).trim();\n throw new Error(\n `Presigned upload failed after redirect with status ${redirectedAttempt.status}${redirectedDetails ? `: ${redirectedDetails}` : \"\"}`,\n );\n }\n }\n\n const details = (await firstAttempt.text()).trim();\n throw new Error(\n `Presigned upload failed with status ${firstAttempt.status}${details ? `: ${details}` : \"\"}`,\n );\n}\n\nasync function appendStorageUploadLog(\n upload: StorageUploadResponse,\n homeDir?: string,\n nowDateFn: () => Date = () => new Date(),\n): Promise<string> {\n return appendObjectLogLine(\n [\n formatTimestamp(nowDateFn()),\n upload.quote_id,\n upload.addr,\n upload.addr_hash ?? \"\",\n upload.trans_id ?? \"\",\n upload.storage_price?.toString() ?? \"\",\n upload.object_id,\n upload.object_key,\n upload.provider,\n upload.bucket_name,\n upload.location,\n ].join(\",\"),\n homeDir,\n );\n}\n\nasync function maybeCleanupLocalBackupArchive(archivePath: string): Promise<void> {\n const flag = process.env.MNEMOSPARK_DELETE_BACKUP_AFTER_UPLOAD;\n if (!flag) {\n return;\n }\n const normalized = flag.trim().toLowerCase();\n if (normalized !== \"1\" && normalized !== \"true\" && normalized !== \"yes\" && normalized !== \"y\") {\n return;\n }\n try {\n await rm(archivePath, { force: true });\n } catch {\n // Best-effort cleanup; ignore failures.\n }\n}\n\nfunction formatStorageUploadUserMessage(upload: StorageUploadResponse, cronJobId: string): string {\n return [\n `Your file \\`${upload.object_id}\\` with key \\`${upload.object_key}\\` has been stored using \\`${upload.provider}\\` in \\`${upload.bucket_name}\\` \\`${upload.location}\\``,\n `A cron job \\`${cronJobId}\\` has been configured to send payment monthly (on the 1st) for storage services. If payment is not sent, your \\`${upload.object_id}\\` will be deleted after the **${PAYMENT_DELETE_DEADLINE_DAYS}-day deadline** (${PAYMENT_REMINDER_INTERVAL_DAYS}-day billing interval + 2-day grace period).`,\n \"Thank you for using mnemospark!\",\n ].join(\"\\n\");\n}\n\nfunction formatStorageDeleteUserMessage(\n objectKey: string,\n cronId: string | null,\n cronDeleted: boolean,\n): string {\n const statusLine = cronId\n ? cronDeleted\n ? `File \\`${objectKey}\\` has been deleted from the cloud and the cron job \\`${cronId}\\` has been removed from local mnemospark cron tracking.`\n : `File \\`${objectKey}\\` has been deleted from the cloud and the cron job \\`${cronId}\\` was not found in local mnemospark cron tracking.`\n : `File \\`${objectKey}\\` has been deleted from the cloud and no matching cron job was found in local mnemospark cron tracking.`;\n\n return [statusLine, \"Thank you for using mnemospark!\"].join(\"\\n\");\n}\n\nfunction extractUploadErrorMessage(error: unknown): string | null {\n if (!(error instanceof Error)) {\n return null;\n }\n const message = error.message.trim();\n if (!message) {\n return null;\n }\n\n try {\n const payload = JSON.parse(message) as {\n message?: string;\n error?: { message?: string } | string;\n };\n if (typeof payload.message === \"string\" && payload.message.trim().length > 0) {\n return payload.message.trim();\n }\n if (typeof payload.error === \"string\" && payload.error.trim().length > 0) {\n return payload.error.trim();\n }\n if (\n payload.error &&\n typeof payload.error === \"object\" &&\n typeof payload.error.message === \"string\" &&\n payload.error.message.trim().length > 0\n ) {\n return payload.error.message.trim();\n }\n } catch {\n // Not JSON. Fall back to raw message.\n }\n\n return message;\n}\n\nfunction formatPriceStorageUserMessage(quote: PriceStorageQuoteResponse): string {\n return [\n `Your storage quote \\`${quote.quote_id}\\` is valid for 1 hour, the storage price is \\`${quote.storage_price}\\` for \\`${quote.object_id}\\` with file size of \\`${quote.object_size_gb}\\` in \\`${quote.provider}\\` \\`${quote.location}\\``,\n `If you accept this quote run the command /mnemospark_cloud upload --quote-id \\`${quote.quote_id}\\` --wallet-address \\`${quote.addr}\\` --object-id \\`${quote.object_id}\\` --object-id-hash \\`${quote.object_id_hash}\\``,\n ].join(\"\\n\");\n}\n\nfunction formatStorageLsUserMessage(result: StorageLsResponse, requestedObjectKey: string): string {\n const objectId = result.object_id ?? result.key;\n return `${objectId} with ${requestedObjectKey} is ${result.size_bytes} in ${result.bucket}`;\n}\n\nfunction createInProcessSubagentOrchestrator(): MnemosparkSubagentOrchestrator {\n type SessionState = {\n terminal: boolean;\n cancelRequested: boolean;\n timeoutHandle?: NodeJS.Timeout;\n hooks?: MnemosparkSubagentDispatchHooks;\n };\n\n const sessions = new Map<string, SessionState>();\n\n const completeSession = async (\n sessionId: string,\n handler: (hooks?: MnemosparkSubagentDispatchHooks) => Promise<void> | void,\n ): Promise<boolean> => {\n const session = sessions.get(sessionId);\n if (!session || session.terminal) {\n return false;\n }\n session.terminal = true;\n if (session.timeoutHandle) {\n clearTimeout(session.timeoutHandle);\n }\n sessions.delete(sessionId);\n await handler(session.hooks);\n return true;\n };\n\n return {\n dispatch: async (input) => {\n const sessionId = `agent:mnemospark:subagent:${randomUUID()}`;\n const state: SessionState = {\n terminal: false,\n cancelRequested: false,\n hooks: input.hooks,\n };\n sessions.set(sessionId, state);\n\n if (typeof input.timeoutSeconds === \"number\" && input.timeoutSeconds > 0) {\n state.timeoutHandle = setTimeout(() => {\n void completeSession(sessionId, async (hooks) => {\n await hooks?.onTimedOut?.(sessionId);\n });\n }, input.timeoutSeconds * 1000);\n }\n\n setTimeout(() => {\n void (async () => {\n try {\n await input.hooks?.onRunning?.(sessionId);\n await input.hooks?.onProgress?.(sessionId, \"subagent execution started\");\n const result = await input.runTask();\n const session = sessions.get(sessionId);\n if (!session || session.terminal) {\n return;\n }\n if (session.cancelRequested) {\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onCancelled?.(sessionId, \"cancel requested\");\n });\n return;\n }\n if (result.isError) {\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onFailed?.(sessionId, {\n code: \"ASYNC_FAILED\",\n message: result.text,\n });\n });\n return;\n }\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onCompleted?.(sessionId, result);\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const session = sessions.get(sessionId);\n if (!session || session.terminal) {\n return;\n }\n if (session.cancelRequested) {\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onCancelled?.(sessionId, \"cancel requested\");\n });\n return;\n }\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onFailed?.(sessionId, {\n code: \"ASYNC_EXCEPTION\",\n message,\n });\n });\n }\n })();\n }, 0);\n\n return { sessionId };\n },\n cancel: async (sessionId, reason) => {\n const session = sessions.get(sessionId);\n if (!session) {\n return { accepted: false };\n }\n if (session.terminal) {\n return { accepted: false, alreadyTerminal: true };\n }\n session.cancelRequested = true;\n await completeSession(sessionId, async (hooks) => {\n await hooks?.onCancelled?.(sessionId, reason ?? \"cancel requested\");\n });\n return { accepted: true };\n },\n };\n}\n\nexport function createCloudCommand(\n options: CreateCloudCommandOptions = {},\n): OpenClawPluginCommandDefinition {\n const subagentOrchestrator =\n options.subagentOrchestrator ?? createInProcessSubagentOrchestrator();\n return {\n name: \"mnemospark_cloud\",\n nativeNames: {\n default: \"mnemospark_cloud\",\n },\n description: \"Manage mnemospark cloud storage workflow commands\",\n acceptsArgs: true,\n requireAuth: true,\n handler: async (ctx) => {\n try {\n return await runCloudCommandHandler(ctx, {\n buildBackupObjectFn: options.buildBackupObjectFn ?? buildBackupObject,\n requestPriceStorageQuoteFn:\n options.requestPriceStorageQuoteFn ?? requestPriceStorageViaProxy,\n requestStorageUploadFn: options.requestStorageUploadFn ?? requestStorageUploadViaProxy,\n requestStorageUploadConfirmFn:\n options.requestStorageUploadConfirmFn ?? requestStorageUploadConfirmViaProxy,\n resolveWalletKeyFn: options.resolveWalletPrivateKeyFn ?? resolveWalletPrivateKey,\n createPaymentFetchFn: options.createPaymentFetchFn ?? createPaymentFetch,\n fetchImpl: options.fetchImpl ?? fetch,\n nowDateFn: options.nowDateFn ?? (() => new Date()),\n idempotencyKeyFn: options.idempotencyKeyFn ?? randomUUID,\n requestStorageLsFn: options.requestStorageLsFn ?? requestStorageLsViaProxy,\n requestStorageDownloadFn:\n options.requestStorageDownloadFn ?? requestStorageDownloadViaProxy,\n requestStorageDeleteFn: options.requestStorageDeleteFn ?? requestStorageDeleteViaProxy,\n objectLogHomeDir: options.objectLogHomeDir ?? options.backupOptions?.homeDir,\n backupOptions: options.backupOptions,\n proxyQuoteOptions: options.proxyQuoteOptions,\n proxyUploadOptions: options.proxyUploadOptions,\n proxyUploadConfirmOptions: options.proxyUploadConfirmOptions,\n subagentOrchestrator,\n proxyStorageOptions: options.proxyStorageOptions,\n });\n } catch (outerError) {\n const message =\n outerError instanceof Error\n ? outerError.message\n : typeof outerError === \"string\"\n ? outerError\n : \"An unexpected error occurred\";\n return { text: message.trim() || \"An unexpected error occurred\", isError: true };\n }\n },\n };\n}\n\ntype RunCloudCommandHandlerOptions = {\n buildBackupObjectFn: NonNullable<CreateCloudCommandOptions[\"buildBackupObjectFn\"]>;\n requestPriceStorageQuoteFn: NonNullable<CreateCloudCommandOptions[\"requestPriceStorageQuoteFn\"]>;\n requestStorageUploadFn: NonNullable<CreateCloudCommandOptions[\"requestStorageUploadFn\"]>;\n requestStorageUploadConfirmFn: NonNullable<\n CreateCloudCommandOptions[\"requestStorageUploadConfirmFn\"]\n >;\n resolveWalletKeyFn: NonNullable<CreateCloudCommandOptions[\"resolveWalletPrivateKeyFn\"]>;\n createPaymentFetchFn: NonNullable<CreateCloudCommandOptions[\"createPaymentFetchFn\"]>;\n fetchImpl: NonNullable<CreateCloudCommandOptions[\"fetchImpl\"]>;\n nowDateFn: NonNullable<CreateCloudCommandOptions[\"nowDateFn\"]>;\n idempotencyKeyFn: NonNullable<CreateCloudCommandOptions[\"idempotencyKeyFn\"]>;\n requestStorageLsFn: NonNullable<CreateCloudCommandOptions[\"requestStorageLsFn\"]>;\n requestStorageDownloadFn: NonNullable<CreateCloudCommandOptions[\"requestStorageDownloadFn\"]>;\n requestStorageDeleteFn: NonNullable<CreateCloudCommandOptions[\"requestStorageDeleteFn\"]>;\n objectLogHomeDir: string | undefined;\n backupOptions: CreateCloudCommandOptions[\"backupOptions\"];\n proxyQuoteOptions: CreateCloudCommandOptions[\"proxyQuoteOptions\"];\n proxyUploadOptions: CreateCloudCommandOptions[\"proxyUploadOptions\"];\n proxyUploadConfirmOptions: CreateCloudCommandOptions[\"proxyUploadConfirmOptions\"];\n subagentOrchestrator: MnemosparkSubagentOrchestrator;\n proxyStorageOptions: CreateCloudCommandOptions[\"proxyStorageOptions\"];\n};\n\ntype RunCloudCommandExecutionContext = {\n forcedOperationId?: string;\n forcedTraceId?: string;\n};\n\nasync function resolveFriendlyNameFromManifest(\n params: {\n walletAddress: string;\n friendlyName: string;\n latest?: boolean;\n at?: string;\n },\n homeDir?: string,\n): Promise<{ objectKey: string | null; matchCount: number }> {\n const manifestPath = join(homeDir ?? homedir(), \".openclaw\", \"mnemospark\", \"manifest.jsonl\");\n\n let manifestRaw: string;\n try {\n manifestRaw = await readFile(manifestPath, \"utf-8\");\n } catch {\n return { objectKey: null, matchCount: 0 };\n }\n\n const wallet = params.walletAddress.trim().toLowerCase();\n const name = params.friendlyName.trim();\n const atMs = params.at ? Date.parse(params.at) : Number.NaN;\n const hasAt = Number.isFinite(atMs);\n\n const rows = manifestRaw\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n try {\n return JSON.parse(line) as {\n friendly_name?: string;\n wallet_address?: string;\n object_key?: string;\n created_at?: string;\n };\n } catch {\n return null;\n }\n })\n .filter((row): row is NonNullable<typeof row> => Boolean(row))\n .filter((row) => {\n if (!row.object_key || !row.friendly_name || !row.wallet_address || !row.created_at)\n return false;\n if (row.friendly_name !== name) return false;\n if (row.wallet_address.trim().toLowerCase() !== wallet) return false;\n if (params.latest || !hasAt) return true;\n const createdAtMs = Date.parse(row.created_at);\n return Number.isFinite(createdAtMs) && createdAtMs <= atMs;\n })\n .sort((a, b) => Date.parse(b.created_at ?? \"\") - Date.parse(a.created_at ?? \"\"));\n\n if (rows.length === 0) {\n return { objectKey: null, matchCount: 0 };\n }\n\n if (!params.latest && !hasAt && rows.length > 1) {\n return { objectKey: null, matchCount: rows.length };\n }\n\n return { objectKey: rows[0].object_key ?? null, matchCount: rows.length };\n}\n\nasync function resolveNameSelectorIfNeeded(\n datastore: Awaited<ReturnType<typeof createCloudDatastore>>,\n request: StorageObjectRequestInput,\n selector?: NameSelector,\n homeDir?: string,\n): Promise<{ request?: StorageObjectRequest; error?: string; degradedWarning?: string }> {\n if (!selector) {\n const parsedRequest = parseStorageObjectRequest(request);\n if (!parsedRequest) {\n return { error: \"Cannot resolve storage object request.\" };\n }\n return { request: parsedRequest };\n }\n let sqliteUnavailable = false;\n try {\n await datastore.ensureReady();\n } catch {\n sqliteUnavailable = true;\n }\n const matches = await datastore.countFriendlyNameMatches(request.wallet_address, selector.name);\n if (matches > 1 && !selector.latest && !selector.at) {\n return {\n error: `Multiple objects match --name ${selector.name}. Add --latest or --at <timestamp>.`,\n };\n }\n\n const resolved = await datastore.resolveFriendlyName({\n walletAddress: request.wallet_address,\n friendlyName: selector.name,\n latest: selector.latest,\n at: selector.at,\n });\n\n let resolvedObjectKey = resolved?.objectKey ?? null;\n let degradedWarning: string | undefined;\n if (!resolvedObjectKey && sqliteUnavailable) {\n const manifestResolved = await resolveFriendlyNameFromManifest(\n {\n walletAddress: request.wallet_address,\n friendlyName: selector.name,\n latest: selector.latest,\n at: selector.at,\n },\n homeDir,\n );\n if (manifestResolved.matchCount > 1 && !selector.latest && !selector.at) {\n return {\n error: `Multiple objects match --name ${selector.name}. Add --latest or --at <timestamp>.`,\n };\n }\n resolvedObjectKey = manifestResolved.objectKey;\n if (resolvedObjectKey) {\n degradedWarning =\n \"SQLite friendly-name index unavailable; resolved --name via manifest.jsonl fallback.\";\n }\n }\n\n if (!resolvedObjectKey) {\n return { error: `No object found for --name ${selector.name}.` };\n }\n\n const parsedRequest = parseStorageObjectRequest({\n ...request,\n object_key: resolvedObjectKey,\n });\n if (!parsedRequest) {\n return { error: \"Cannot resolve storage object request.\" };\n }\n return {\n request: parsedRequest,\n degradedWarning,\n };\n}\n\nasync function emitCloudEvent(\n eventType: string,\n details: Record<string, unknown>,\n homeDir?: string,\n): Promise<void> {\n await appendJsonlEvent(\n \"events.jsonl\",\n {\n ...details,\n ts: new Date().toISOString(),\n event_type: eventType,\n },\n homeDir,\n );\n}\n\nasync function emitCloudEventBestEffort(\n eventType: string,\n details: Record<string, unknown>,\n homeDir?: string,\n): Promise<void> {\n try {\n await emitCloudEvent(eventType, details, homeDir);\n } catch {\n // Event logging is non-critical and must not affect command results.\n }\n}\n\ntype OperationEventContext = {\n operationId: string;\n traceId: string;\n status: string;\n walletAddress?: string | null;\n objectId?: string | null;\n objectKey?: string | null;\n quoteId?: string | null;\n orchestrator?: OrchestratorMode | null;\n subagentSessionId?: string | null;\n timeoutSeconds?: number | null;\n errorCode?: string | null;\n errorMessage?: string | null;\n progressMessage?: string | null;\n};\n\nfunction toOperationEventPayload(\n eventType: string,\n context: OperationEventContext,\n): Record<string, unknown> {\n return {\n operation_id: context.operationId,\n trace_id: context.traceId,\n event_type: eventType,\n status: context.status,\n ts: new Date().toISOString(),\n wallet_address: context.walletAddress ?? undefined,\n object_id: context.objectId ?? undefined,\n object_key: context.objectKey ?? undefined,\n quote_id: context.quoteId ?? undefined,\n orchestrator: context.orchestrator ?? undefined,\n \"subagent-session-id\": context.subagentSessionId ?? undefined,\n \"timeout-seconds\": context.timeoutSeconds ?? undefined,\n \"error-code\": context.errorCode ?? undefined,\n \"error-message\": context.errorMessage ?? undefined,\n progress: context.progressMessage ?? undefined,\n };\n}\n\nasync function emitOperationEvent(\n eventType: string,\n context: OperationEventContext,\n homeDir?: string,\n): Promise<void> {\n const payload = toOperationEventPayload(eventType, context);\n await Promise.all([\n appendJsonlEvent(\"events.jsonl\", payload, homeDir),\n appendJsonlEvent(\"proxy-events.jsonl\", payload, homeDir),\n ]);\n}\n\nasync function emitOperationEventBestEffort(\n eventType: string,\n context: OperationEventContext,\n homeDir?: string,\n): Promise<void> {\n try {\n await emitOperationEvent(eventType, context, homeDir);\n } catch {\n // Operation event logging is best-effort only.\n }\n}\n\nfunction buildRequestCorrelation(\n forcedOperationId?: string,\n forcedTraceId?: string,\n): Required<RequestCorrelation> {\n const operationId = forcedOperationId?.trim() || randomUUID();\n const traceId = forcedTraceId?.trim() || randomUUID();\n return { operationId, traceId };\n}\n\nasync function runCloudCommandHandler(\n ctx: { args?: string; channel?: string; senderId?: string },\n options: RunCloudCommandHandlerOptions,\n executionContext: RunCloudCommandExecutionContext = {},\n): Promise<{ text: string; isError?: boolean }> {\n const parsed = parseCloudArgs(ctx.args);\n const objectLogHomeDir = options.objectLogHomeDir;\n const backupBuilder = options.buildBackupObjectFn;\n const requestPriceStorageQuote = options.requestPriceStorageQuoteFn;\n const requestStorageUpload = options.requestStorageUploadFn;\n const requestStorageUploadConfirm = options.requestStorageUploadConfirmFn;\n const resolveWalletKey = options.resolveWalletKeyFn;\n const createPayment = options.createPaymentFetchFn;\n const fetchImpl = options.fetchImpl;\n const nowDateFn = options.nowDateFn;\n const idempotencyKeyFn = options.idempotencyKeyFn;\n const requestStorageLs = options.requestStorageLsFn;\n const requestStorageDownload = options.requestStorageDownloadFn;\n const requestStorageDelete = options.requestStorageDeleteFn;\n const subagentOrchestrator = options.subagentOrchestrator;\n\n if (parsed.mode === \"help\" || parsed.mode === \"unknown\") {\n return {\n text: CLOUD_HELP_TEXT,\n isError: parsed.mode === \"unknown\",\n };\n }\n\n if (parsed.mode === \"price-storage-invalid\") {\n return {\n text: `Cannot price storage: required arguments are ${REQUIRED_PRICE_STORAGE}.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"backup-invalid\") {\n return {\n text: \"Cannot build storage object\",\n isError: true,\n };\n }\n\n if (parsed.mode === \"backup-invalid-async\") {\n return {\n text: `Cannot build storage object: ${INVALID_ASYNC_FLAGS_MESSAGE}`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"upload-invalid\") {\n return {\n text: `Cannot upload storage object: required arguments are ${REQUIRED_UPLOAD}.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"upload-invalid-async\") {\n return {\n text: `Cannot upload storage object: ${INVALID_ASYNC_FLAGS_MESSAGE}`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"ls-invalid\") {\n return {\n text: `Cannot list storage object: required arguments are ${REQUIRED_STORAGE_OBJECT}.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"download-invalid\") {\n return {\n text: `Cannot download file: required arguments are ${REQUIRED_STORAGE_OBJECT}.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"download-invalid-async\") {\n return {\n text: `Cannot download file: ${INVALID_ASYNC_FLAGS_MESSAGE}`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"delete-invalid\") {\n return {\n text: `Cannot delete file: required arguments are ${REQUIRED_STORAGE_OBJECT}.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"op-status-invalid\") {\n return {\n text: \"Cannot get operation status: required arguments are --operation-id.\",\n isError: true,\n };\n }\n\n const datastore = await createCloudDatastore(objectLogHomeDir);\n const terminalOperationStatuses = new Set([\"succeeded\", \"failed\", \"cancelled\", \"timed_out\"]);\n const isTerminalOperationStatus = (status: string): boolean =>\n terminalOperationStatuses.has(status);\n const formatOperationStatus = (operation: {\n operation_id: string;\n type: string;\n status: string;\n started_at: string | null;\n finished_at: string | null;\n orchestrator: string | null;\n subagent_session_id: string | null;\n timeout_seconds: number | null;\n error_code: string | null;\n error_message: string | null;\n }): { text: string; isError: boolean } => ({\n text: [\n `operation-id: ${operation.operation_id}`,\n `type: ${operation.type}`,\n `status: ${operation.status}`,\n `started-at: ${operation.started_at ?? \"n/a\"}`,\n `finished-at: ${operation.finished_at ?? \"n/a\"}`,\n operation.orchestrator ? `orchestrator: ${operation.orchestrator}` : null,\n operation.subagent_session_id\n ? `subagent-session-id: ${operation.subagent_session_id}`\n : null,\n operation.timeout_seconds ? `timeout-seconds: ${operation.timeout_seconds}` : null,\n operation.error_code ? `error-code: ${operation.error_code}` : null,\n operation.error_message ? `error-message: ${operation.error_message}` : null,\n ]\n .filter((v): v is string => Boolean(v))\n .join(\"\\n\"),\n isError:\n operation.status === \"failed\" ||\n operation.status === \"cancelled\" ||\n operation.status === \"timed_out\",\n });\n\n if (parsed.mode === \"op-status\") {\n let operation = await datastore.findOperationById(parsed.operationId);\n if (!operation) {\n return {\n text: `Operation not found: ${parsed.operationId}`,\n isError: true,\n };\n }\n\n if (parsed.cancel) {\n if (operation.orchestrator !== \"subagent\" || !operation.subagent_session_id) {\n return {\n text: \"Cancellation is only supported for subagent-orchestrated operations.\",\n isError: true,\n };\n }\n if (!isTerminalOperationStatus(operation.status)) {\n const traceId = operation.trace_id ?? randomUUID();\n const cancelRequestedAt = new Date().toISOString();\n await datastore.upsertOperation({\n operation_id: operation.operation_id,\n type: operation.type,\n object_id: operation.object_id,\n quote_id: operation.quote_id,\n trace_id: traceId,\n orchestrator: \"subagent\",\n subagent_session_id: operation.subagent_session_id,\n timeout_seconds: operation.timeout_seconds,\n cancel_requested_at: cancelRequestedAt,\n status: \"running\",\n error_code: null,\n error_message: null,\n });\n await emitOperationEventBestEffort(\n \"operation.cancel.requested\",\n {\n operationId: operation.operation_id,\n traceId,\n status: \"running\",\n objectId: operation.object_id,\n quoteId: operation.quote_id,\n orchestrator: \"subagent\",\n subagentSessionId: operation.subagent_session_id,\n timeoutSeconds: operation.timeout_seconds,\n },\n objectLogHomeDir,\n );\n\n const cancelResult = await subagentOrchestrator.cancel(\n operation.subagent_session_id,\n \"cancel requested by op-status\",\n );\n if (cancelResult.accepted || cancelResult.alreadyTerminal) {\n const afterCancel = await datastore.findOperationById(parsed.operationId);\n if (afterCancel && !isTerminalOperationStatus(afterCancel.status)) {\n await datastore.upsertOperation({\n operation_id: operation.operation_id,\n type: operation.type,\n object_id: operation.object_id,\n quote_id: operation.quote_id,\n trace_id: traceId,\n orchestrator: \"subagent\",\n subagent_session_id: operation.subagent_session_id,\n timeout_seconds: operation.timeout_seconds,\n cancel_requested_at: cancelRequestedAt,\n status: \"cancelled\",\n error_code: \"ASYNC_CANCELLED\",\n error_message: \"Operation cancelled by user request.\",\n });\n await emitOperationEventBestEffort(\n \"operation.cancelled\",\n {\n operationId: operation.operation_id,\n traceId,\n status: \"cancelled\",\n objectId: operation.object_id,\n quoteId: operation.quote_id,\n orchestrator: \"subagent\",\n subagentSessionId: operation.subagent_session_id,\n timeoutSeconds: operation.timeout_seconds,\n errorCode: \"ASYNC_CANCELLED\",\n errorMessage: \"Operation cancelled by user request.\",\n },\n objectLogHomeDir,\n );\n }\n }\n }\n operation = await datastore.findOperationById(parsed.operationId);\n if (!operation) {\n return {\n text: `Operation not found: ${parsed.operationId}`,\n isError: true,\n };\n }\n }\n return formatOperationStatus(operation);\n }\n\n if (\n (parsed.mode === \"backup\" || parsed.mode === \"upload\" || parsed.mode === \"download\") &&\n parsed.async\n ) {\n const asyncCorrelation = buildRequestCorrelation();\n const operationId = asyncCorrelation.operationId;\n const opType = parsed.mode;\n const opObject = parsed.mode === \"upload\" ? parsed.uploadRequest.object_id : null;\n const opQuote = parsed.mode === \"upload\" ? parsed.uploadRequest.quote_id : null;\n const orchestratorMode = parsed.orchestrator ?? \"inline\";\n const timeoutSeconds = orchestratorMode === \"subagent\" ? (parsed.timeoutSeconds ?? null) : null;\n const eventContextBase: Omit<OperationEventContext, \"status\"> = {\n operationId,\n traceId: asyncCorrelation.traceId,\n walletAddress:\n parsed.mode === \"upload\"\n ? parsed.uploadRequest.wallet_address\n : parsed.mode === \"download\"\n ? parsed.storageObjectRequest.wallet_address\n : null,\n objectId: opObject,\n objectKey:\n parsed.mode === \"download\" ? (parsed.storageObjectRequest.object_key ?? null) : null,\n quoteId: opQuote,\n orchestrator: orchestratorMode,\n timeoutSeconds,\n };\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: orchestratorMode,\n timeout_seconds: timeoutSeconds,\n status: \"started\",\n error_code: null,\n error_message: null,\n });\n\n await emitOperationEventBestEffort(\n \"operation.dispatched\",\n { ...eventContextBase, status: \"started\" },\n objectLogHomeDir,\n );\n\n const syncArgs = stripAsyncControlFlags(ctx.args);\n if (orchestratorMode === \"subagent\") {\n const subagentTask: MnemosparkSubagentTaskV1 = {\n schema: \"mnemospark.subagent-task.v1\",\n operationId,\n traceId: asyncCorrelation.traceId,\n command: parsed.mode,\n args: syncArgs,\n timeoutSeconds: parsed.timeoutSeconds,\n requestedBy: {\n pluginCommand: \"mnemospark_cloud\",\n chatId: ctx.channel,\n senderId: ctx.senderId,\n },\n };\n try {\n const dispatchResult = await subagentOrchestrator.dispatch({\n task: subagentTask,\n timeoutSeconds: parsed.timeoutSeconds,\n runTask: async () =>\n runCloudCommandHandler(\n { args: syncArgs, channel: ctx.channel, senderId: ctx.senderId },\n options,\n {\n forcedOperationId: asyncCorrelation.operationId,\n forcedTraceId: asyncCorrelation.traceId,\n },\n ),\n hooks: {\n onRunning: async (sessionId) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n status: \"running\",\n error_code: null,\n error_message: null,\n });\n await emitOperationEventBestEffort(\n \"operation.progress\",\n {\n ...eventContextBase,\n status: \"running\",\n subagentSessionId: sessionId,\n progressMessage: \"subagent running\",\n },\n objectLogHomeDir,\n );\n },\n onProgress: async (sessionId, message) => {\n await emitOperationEventBestEffort(\n \"operation.progress\",\n {\n ...eventContextBase,\n status: \"running\",\n subagentSessionId: sessionId,\n progressMessage: message,\n },\n objectLogHomeDir,\n );\n },\n onCompleted: async (sessionId) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n status: \"succeeded\",\n error_code: null,\n error_message: null,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: \"succeeded\",\n subagentSessionId: sessionId,\n },\n objectLogHomeDir,\n );\n },\n onFailed: async (sessionId, details) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n status: \"failed\",\n error_code: details.code,\n error_message: details.message,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: \"failed\",\n subagentSessionId: sessionId,\n errorCode: details.code,\n errorMessage: details.message,\n },\n objectLogHomeDir,\n );\n },\n onCancelled: async (sessionId, reason) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n cancel_requested_at: new Date().toISOString(),\n status: \"cancelled\",\n error_code: \"ASYNC_CANCELLED\",\n error_message: reason ?? \"Operation cancelled.\",\n });\n await emitOperationEventBestEffort(\n \"operation.cancelled\",\n {\n ...eventContextBase,\n status: \"cancelled\",\n subagentSessionId: sessionId,\n errorCode: \"ASYNC_CANCELLED\",\n errorMessage: reason ?? \"Operation cancelled.\",\n },\n objectLogHomeDir,\n );\n },\n onTimedOut: async (sessionId) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n status: \"timed_out\",\n error_code: \"ASYNC_TIMEOUT\",\n error_message: \"Operation timed out.\",\n });\n await emitOperationEventBestEffort(\n \"operation.timed_out\",\n {\n ...eventContextBase,\n status: \"timed_out\",\n subagentSessionId: sessionId,\n errorCode: \"ASYNC_TIMEOUT\",\n errorMessage: \"Operation timed out.\",\n },\n objectLogHomeDir,\n );\n },\n },\n });\n\n const operationAfterDispatch = await datastore.findOperationById(operationId);\n if (operationAfterDispatch?.subagent_session_id !== dispatchResult.sessionId) {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n subagent_session_id: dispatchResult.sessionId,\n timeout_seconds: timeoutSeconds,\n status: operationAfterDispatch?.status ?? \"started\",\n error_code: operationAfterDispatch?.error_code ?? null,\n error_message: operationAfterDispatch?.error_message ?? null,\n });\n }\n\n return {\n text: [\n `Operation started in background. operation-id: ${operationId}`,\n `orchestrator: subagent`,\n `subagent-session-id: ${dispatchResult.sessionId}`,\n timeoutSeconds ? `timeout-seconds: ${timeoutSeconds}` : null,\n `Use /mnemospark_cloud op-status --operation-id ${operationId}`,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n } catch (dispatchError) {\n const dispatchMessage =\n dispatchError instanceof Error ? dispatchError.message : String(dispatchError);\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"subagent\",\n timeout_seconds: timeoutSeconds,\n status: \"failed\",\n error_code: \"ASYNC_DISPATCH_FAILED\",\n error_message: dispatchMessage,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: \"failed\",\n errorCode: \"ASYNC_DISPATCH_FAILED\",\n errorMessage: dispatchMessage,\n },\n objectLogHomeDir,\n );\n return {\n text: `Cannot dispatch subagent operation: ${dispatchMessage}\\noperation-id: ${operationId}`,\n isError: true,\n };\n }\n }\n\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"inline\",\n status: \"running\",\n error_code: null,\n error_message: null,\n });\n void runCloudCommandHandler(\n { args: syncArgs, channel: ctx.channel, senderId: ctx.senderId },\n options,\n {\n forcedOperationId: asyncCorrelation.operationId,\n forcedTraceId: asyncCorrelation.traceId,\n },\n )\n .then(async (result) => {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"inline\",\n status: result.isError ? \"failed\" : \"succeeded\",\n error_code: result.isError ? \"ASYNC_FAILED\" : null,\n error_message: result.isError ? result.text : null,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: result.isError ? \"failed\" : \"succeeded\",\n errorCode: result.isError ? \"ASYNC_FAILED\" : null,\n errorMessage: result.isError ? result.text : null,\n },\n objectLogHomeDir,\n );\n })\n .catch(async (err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n await datastore.upsertOperation({\n operation_id: operationId,\n type: opType,\n object_id: opObject,\n quote_id: opQuote,\n trace_id: asyncCorrelation.traceId,\n orchestrator: \"inline\",\n status: \"failed\",\n error_code: \"ASYNC_EXCEPTION\",\n error_message: errorMessage,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: \"failed\",\n errorCode: \"ASYNC_EXCEPTION\",\n errorMessage,\n },\n objectLogHomeDir,\n );\n });\n\n return {\n text: [\n `Operation started in background. operation-id: ${operationId}`,\n `orchestrator: inline`,\n `Use /mnemospark_cloud op-status --operation-id ${operationId}`,\n ].join(\"\\n\"),\n };\n }\n\n if (parsed.mode === \"backup\") {\n try {\n const result = await backupBuilder(parsed.backupTarget, options.backupOptions);\n await emitCloudEventBestEffort(\n \"backup.completed\",\n {\n operation_id: randomUUID(),\n object_id: result.objectId,\n status: \"succeeded\",\n details: { friendly_name: parsed.friendlyName ?? basename(parsed.backupTarget) },\n },\n objectLogHomeDir,\n );\n await datastore.upsertObject({\n object_id: result.objectId,\n object_key: null,\n wallet_address: \"unknown\",\n quote_id: null,\n provider: null,\n bucket_name: null,\n region: null,\n sha256: result.objectIdHash,\n status: \"backed_up\",\n });\n const friendlyName = parsed.friendlyName?.trim() || basename(parsed.backupTarget);\n if (friendlyName) {\n await datastore.upsertFriendlyName({\n friendly_name: friendlyName,\n object_id: result.objectId,\n object_key: null,\n quote_id: null,\n wallet_address: \"unknown\",\n });\n }\n return {\n text: [\n `object-id: ${result.objectId}`,\n `object-id-hash: ${result.objectIdHash.replace(/\\s/g, \"\")}`,\n `object-size: ${result.objectSizeGb}`,\n ].join(\"\\n\"),\n };\n } catch (err) {\n if (err instanceof UnsupportedBackupPlatformError) {\n return {\n text: \"Cloud backup is only supported on macOS and Linux.\",\n isError: true,\n };\n }\n return {\n text: \"Cannot build storage object\",\n isError: true,\n };\n }\n }\n\n if (parsed.mode === \"price-storage\") {\n const correlation = buildRequestCorrelation();\n try {\n const quote = await requestPriceStorageQuote(parsed.priceStorageRequest, {\n ...options.proxyQuoteOptions,\n correlation,\n });\n await appendPriceStorageQuoteLog(quote, objectLogHomeDir);\n await datastore.upsertObject({\n object_id: quote.object_id,\n object_key: null,\n wallet_address: quote.addr,\n quote_id: quote.quote_id,\n provider: quote.provider,\n bucket_name: null,\n region: quote.location,\n sha256: quote.object_id_hash,\n status: \"quoted\",\n });\n await datastore.upsertPayment({\n quote_id: quote.quote_id,\n wallet_address: quote.addr,\n trans_id: null,\n amount: quote.storage_price,\n network: null,\n status: \"quoted\",\n });\n await emitCloudEventBestEffort(\n \"price-storage.completed\",\n {\n operation_id: correlation.operationId,\n trace_id: correlation.traceId,\n wallet_address: quote.addr,\n object_id: quote.object_id,\n quote_id: quote.quote_id,\n status: \"succeeded\",\n },\n objectLogHomeDir,\n );\n return {\n text: formatPriceStorageUserMessage(quote),\n };\n } catch (err) {\n await emitCloudEventBestEffort(\n \"price-storage.completed\",\n {\n operation_id: correlation.operationId,\n trace_id: correlation.traceId,\n wallet_address: parsed.priceStorageRequest.wallet_address,\n object_id: parsed.priceStorageRequest.object_id,\n status: \"failed\",\n },\n objectLogHomeDir,\n );\n const message =\n err instanceof Error ? err.message : typeof err === \"string\" ? err : String(err);\n return {\n text: message ? `Cannot price storage: ${message}` : \"Cannot price storage\",\n isError: true,\n };\n }\n }\n\n if (parsed.mode === \"upload\") {\n const uploadCorrelation = buildRequestCorrelation(\n executionContext.forcedOperationId ?? idempotencyKeyFn(),\n executionContext.forcedTraceId,\n );\n try {\n const loggedQuote =\n (await datastore.findQuoteById(parsed.uploadRequest.quote_id)) ??\n (await findLoggedPriceStorageQuote(parsed.uploadRequest.quote_id, objectLogHomeDir));\n if (!loggedQuote) {\n return {\n text: \"Cannot upload storage object: quote-id not found in object.log. Run /mnemospark_cloud price-storage first.\",\n isError: true,\n };\n }\n\n if (\n loggedQuote.walletAddress.toLowerCase() !==\n parsed.uploadRequest.wallet_address.toLowerCase() ||\n loggedQuote.objectId !== parsed.uploadRequest.object_id ||\n loggedQuote.objectIdHash.toLowerCase() !== parsed.uploadRequest.object_id_hash.toLowerCase()\n ) {\n return {\n text: \"Cannot upload storage object: quote details do not match wallet/object arguments.\",\n isError: true,\n };\n }\n\n const archivePath = join(\n options.backupOptions?.tmpDir ?? DEFAULT_BACKUP_DIR,\n parsed.uploadRequest.object_id,\n );\n let archiveStats;\n try {\n archiveStats = await stat(archivePath);\n } catch {\n return {\n text: `Cannot upload storage object: local archive not found at ${archivePath}. Run /mnemospark_cloud backup first.`,\n isError: true,\n };\n }\n if (!archiveStats.isFile()) {\n return {\n text: `Cannot upload storage object: local archive path is not a file (${archivePath}).`,\n isError: true,\n };\n }\n\n const archiveHash = await sha256File(archivePath);\n if (archiveHash.toLowerCase() !== parsed.uploadRequest.object_id_hash.toLowerCase()) {\n return {\n text: \"Cannot upload storage object: object-id-hash does not match local archive.\",\n isError: true,\n };\n }\n\n const walletKey = await resolveWalletKey(objectLogHomeDir);\n const walletAccount = privateKeyToAccount(walletKey);\n if (\n walletAccount.address.toLowerCase() !== parsed.uploadRequest.wallet_address.toLowerCase()\n ) {\n return {\n text: `Cannot upload storage object: wallet key address ${walletAccount.address} does not match --wallet-address ${parsed.uploadRequest.wallet_address}.`,\n isError: true,\n };\n }\n\n const preparedPayload = await prepareUploadPayload(\n archivePath,\n parsed.uploadRequest.wallet_address,\n objectLogHomeDir,\n );\n const idempotencyKey = uploadCorrelation.operationId;\n const shouldSettleBeforeUpload = requestStorageUpload !== requestStorageUploadViaProxy;\n\n if (shouldSettleBeforeUpload) {\n const paymentFetch = createPayment(walletKey).fetch;\n // Settle payment first (with 402 handling) when upload transport does not settle itself.\n const settleResult = await requestPaymentSettleViaProxy(\n parsed.uploadRequest.quote_id,\n parsed.uploadRequest.wallet_address,\n {\n ...options.proxyUploadOptions,\n correlation: uploadCorrelation,\n fetchImpl: (input, init) => paymentFetch(input, init),\n },\n );\n if (settleResult.status !== 200) {\n const message =\n settleResult.bodyText?.trim() ||\n `Payment settle failed with status ${settleResult.status}`;\n throw new Error(message);\n }\n }\n\n const uploadFetchImpl = options.proxyUploadOptions?.fetchImpl ?? fetchImpl;\n const uploadResponse = await requestStorageUpload(\n {\n quote_id: parsed.uploadRequest.quote_id,\n wallet_address: parsed.uploadRequest.wallet_address,\n object_id: parsed.uploadRequest.object_id,\n object_id_hash: parsed.uploadRequest.object_id_hash,\n quoted_storage_price: loggedQuote.storagePrice,\n payload: preparedPayload.payload,\n },\n {\n ...options.proxyUploadOptions,\n idempotencyKey,\n correlation: uploadCorrelation,\n fetchImpl: uploadFetchImpl,\n },\n );\n\n await uploadPresignedObjectIfNeeded(\n uploadResponse,\n preparedPayload.payload.mode,\n preparedPayload.encryptedContent,\n fetchImpl,\n );\n let finalizedUploadResponse = uploadResponse;\n if (\n preparedPayload.payload.mode === \"presigned\" &&\n uploadResponse.confirmation_required === true\n ) {\n try {\n finalizedUploadResponse = await requestStorageUploadConfirm(\n {\n quote_id: uploadResponse.quote_id,\n wallet_address: parsed.uploadRequest.wallet_address,\n object_key: uploadResponse.object_key,\n idempotency_key: idempotencyKey,\n },\n {\n ...options.proxyUploadConfirmOptions,\n correlation: uploadCorrelation,\n },\n );\n } catch (confirmError) {\n const transId = uploadResponse.trans_id ?? \"unknown\";\n const confirmMessage =\n extractUploadErrorMessage(confirmError) ?? \"Upload confirmation request failed\";\n throw new Error(\n `Upload to S3 succeeded, but backend confirmation failed (trans_id: ${transId}, idempotency_key: ${idempotencyKey}). ${confirmMessage}`,\n );\n }\n }\n\n await appendStorageUploadLog(finalizedUploadResponse, objectLogHomeDir, nowDateFn);\n const cronStoragePriceCandidate =\n finalizedUploadResponse.storage_price ?? loggedQuote.storagePrice;\n const cronStoragePrice =\n Number.isFinite(cronStoragePriceCandidate) && cronStoragePriceCandidate > 0\n ? cronStoragePriceCandidate\n : loggedQuote.storagePrice;\n const cronJob = await createStoragePaymentCronJob(\n finalizedUploadResponse,\n cronStoragePrice,\n objectLogHomeDir,\n nowDateFn,\n );\n await datastore.upsertObject({\n object_id: finalizedUploadResponse.object_id,\n object_key: finalizedUploadResponse.object_key,\n wallet_address: finalizedUploadResponse.addr,\n quote_id: finalizedUploadResponse.quote_id,\n provider: finalizedUploadResponse.provider,\n bucket_name: finalizedUploadResponse.bucket_name,\n region: finalizedUploadResponse.location,\n sha256: parsed.uploadRequest.object_id_hash,\n status: \"uploaded\",\n });\n await datastore.upsertPayment({\n quote_id: finalizedUploadResponse.quote_id,\n wallet_address: finalizedUploadResponse.addr,\n trans_id: finalizedUploadResponse.trans_id ?? null,\n amount: cronStoragePrice,\n network: null,\n status: \"settled\",\n settled_at: new Date().toISOString(),\n });\n await datastore.upsertCronJob({\n cron_id: cronJob.cronId,\n object_id: cronJob.objectId,\n object_key: cronJob.objectKey,\n quote_id: cronJob.quoteId,\n schedule: cronJob.schedule,\n command: cronJob.command,\n status: \"active\",\n });\n if (parsed.friendlyName?.trim()) {\n const normalizedFriendlyName = parsed.friendlyName.trim();\n await datastore.upsertFriendlyName({\n friendly_name: normalizedFriendlyName,\n object_id: finalizedUploadResponse.object_id,\n object_key: finalizedUploadResponse.object_key,\n quote_id: finalizedUploadResponse.quote_id,\n wallet_address: finalizedUploadResponse.addr,\n });\n\n let friendlyNameVerified = false;\n try {\n const readBack = await datastore.resolveFriendlyName({\n walletAddress: finalizedUploadResponse.addr,\n friendlyName: normalizedFriendlyName,\n latest: true,\n });\n friendlyNameVerified =\n Boolean(readBack?.objectKey) &&\n readBack?.objectKey === finalizedUploadResponse.object_key;\n } catch {\n friendlyNameVerified = false;\n }\n\n if (!friendlyNameVerified) {\n const warning =\n \"SQLite friendly-name write verification failed; manifest fallback may be required for --name lookups.\";\n await emitCloudEventBestEffort(\n \"friendly_name.write_verification_failed\",\n {\n operation_id: uploadCorrelation.operationId,\n trace_id: uploadCorrelation.traceId,\n wallet_address: finalizedUploadResponse.addr,\n object_id: finalizedUploadResponse.object_id,\n object_key: finalizedUploadResponse.object_key,\n quote_id: finalizedUploadResponse.quote_id,\n friendly_name: normalizedFriendlyName,\n warning,\n },\n objectLogHomeDir,\n );\n if (process.env.MNEMOSPARK_SQLITE_STRICT === \"1\") {\n throw new Error(warning);\n }\n }\n\n try {\n await appendJsonlEvent(\n \"manifest.jsonl\",\n {\n friendly_name: normalizedFriendlyName,\n object_id: finalizedUploadResponse.object_id,\n object_key: finalizedUploadResponse.object_key,\n quote_id: finalizedUploadResponse.quote_id,\n wallet_address: finalizedUploadResponse.addr,\n created_at: new Date().toISOString(),\n },\n objectLogHomeDir,\n );\n } catch {\n // Manifest logging is non-critical and must not affect command results.\n }\n }\n await emitCloudEventBestEffort(\n \"upload.completed\",\n {\n operation_id: idempotencyKey,\n trace_id: uploadCorrelation.traceId,\n wallet_address: finalizedUploadResponse.addr,\n object_id: finalizedUploadResponse.object_id,\n object_key: finalizedUploadResponse.object_key,\n quote_id: finalizedUploadResponse.quote_id,\n status: \"succeeded\",\n },\n objectLogHomeDir,\n );\n await maybeCleanupLocalBackupArchive(archivePath);\n\n return {\n text: formatStorageUploadUserMessage(finalizedUploadResponse, cronJob.cronId),\n };\n } catch (error) {\n await emitCloudEventBestEffort(\n \"upload.completed\",\n {\n operation_id: uploadCorrelation.operationId,\n trace_id: uploadCorrelation.traceId,\n wallet_address: parsed.uploadRequest.wallet_address,\n object_id: parsed.uploadRequest.object_id,\n quote_id: parsed.uploadRequest.quote_id,\n status: \"failed\",\n },\n objectLogHomeDir,\n );\n const uploadErrorMessage = extractUploadErrorMessage(error);\n return {\n text: uploadErrorMessage ?? \"Cannot upload storage object\",\n isError: true,\n };\n }\n }\n\n if (parsed.mode === \"ls\") {\n const resolved = await resolveNameSelectorIfNeeded(\n datastore,\n parsed.storageObjectRequest,\n parsed.nameSelector,\n objectLogHomeDir,\n );\n if (resolved.error || !resolved.request) {\n return { text: resolved.error ?? \"Cannot resolve storage object request.\", isError: true };\n }\n const resolvedRequest = resolved.request;\n\n if (resolved.degradedWarning) {\n await emitCloudEventBestEffort(\n \"name_resolution.degraded\",\n {\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n warning: resolved.degradedWarning,\n },\n objectLogHomeDir,\n );\n }\n\n const correlation = buildRequestCorrelation();\n const operationId = correlation.operationId;\n const knownObject = await datastore.findObjectByObjectKey(resolvedRequest.object_key);\n const operationObjectId = knownObject?.object_id ?? null;\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"ls\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"started\",\n error_code: null,\n error_message: null,\n });\n try {\n const lsResult = await requestStorageLs(resolvedRequest, {\n ...options.proxyStorageOptions,\n correlation,\n });\n if (!lsResult.success) {\n throw new Error(\"ls failed\");\n }\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"ls\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"succeeded\",\n error_code: null,\n error_message: null,\n });\n await emitCloudEventBestEffort(\n \"ls.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"succeeded\",\n },\n objectLogHomeDir,\n );\n const lsText = formatStorageLsUserMessage(lsResult, resolvedRequest.object_key);\n return {\n text: resolved.degradedWarning ? `${resolved.degradedWarning}\\n${lsText}` : lsText,\n };\n } catch {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"ls\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"failed\",\n error_code: \"LS_FAILED\",\n error_message: \"Cannot list storage object\",\n });\n await emitCloudEventBestEffort(\n \"ls.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"failed\",\n },\n objectLogHomeDir,\n );\n return {\n text: \"Cannot list storage object\",\n isError: true,\n };\n }\n }\n\n if (parsed.mode === \"download\") {\n const resolved = await resolveNameSelectorIfNeeded(\n datastore,\n parsed.storageObjectRequest,\n parsed.nameSelector,\n objectLogHomeDir,\n );\n if (resolved.error || !resolved.request) {\n return { text: resolved.error ?? \"Cannot resolve storage object request.\", isError: true };\n }\n const resolvedRequest = resolved.request;\n\n if (resolved.degradedWarning) {\n await emitCloudEventBestEffort(\n \"name_resolution.degraded\",\n {\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n warning: resolved.degradedWarning,\n },\n objectLogHomeDir,\n );\n }\n\n const correlation = buildRequestCorrelation(\n executionContext.forcedOperationId,\n executionContext.forcedTraceId,\n );\n const operationId = correlation.operationId;\n const knownObject = await datastore.findObjectByObjectKey(resolvedRequest.object_key);\n const operationObjectId = knownObject?.object_id ?? null;\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"download\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"started\",\n error_code: null,\n error_message: null,\n });\n try {\n const downloadResult = await requestStorageDownload(resolvedRequest, {\n ...options.proxyStorageOptions,\n correlation,\n });\n if (!downloadResult.success) {\n throw new Error(\"download failed\");\n }\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"download\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"succeeded\",\n error_code: null,\n error_message: null,\n });\n await emitCloudEventBestEffort(\n \"download.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"succeeded\",\n },\n objectLogHomeDir,\n );\n const downloadText = `File ${resolvedRequest.object_key} downloaded to ${downloadResult.file_path}`;\n return {\n text: resolved.degradedWarning\n ? `${resolved.degradedWarning}\\n${downloadText}`\n : downloadText,\n };\n } catch {\n await datastore.upsertOperation({\n operation_id: operationId,\n type: \"download\",\n object_id: operationObjectId,\n quote_id: null,\n status: \"failed\",\n error_code: \"DOWNLOAD_FAILED\",\n error_message: \"Cannot download file\",\n });\n await emitCloudEventBestEffort(\n \"download.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"failed\",\n },\n objectLogHomeDir,\n );\n return {\n text: \"Cannot download file\",\n isError: true,\n };\n }\n }\n\n if (parsed.mode === \"delete\") {\n const resolved = await resolveNameSelectorIfNeeded(\n datastore,\n parsed.storageObjectRequest,\n parsed.nameSelector,\n objectLogHomeDir,\n );\n if (resolved.error || !resolved.request) {\n return { text: resolved.error ?? \"Cannot resolve storage object request.\", isError: true };\n }\n const resolvedRequest = resolved.request;\n if (resolved.degradedWarning) {\n await emitCloudEventBestEffort(\n \"name_resolution.degraded\",\n {\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n warning: resolved.degradedWarning,\n },\n objectLogHomeDir,\n );\n }\n const correlation = buildRequestCorrelation();\n const operationId = correlation.operationId;\n\n const existingObjectByKey = await datastore.findObjectByObjectKey(resolvedRequest.object_key);\n try {\n const deleteResult = await requestStorageDelete(resolvedRequest, {\n ...options.proxyStorageOptions,\n correlation,\n });\n if (!deleteResult.success) {\n throw new Error(\"delete failed\");\n }\n } catch {\n await emitCloudEventBestEffort(\n \"delete.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"failed\",\n },\n objectLogHomeDir,\n );\n return {\n text: \"Cannot delete file\",\n isError: true,\n };\n }\n let cronEntry: LoggedStoragePaymentCron | null = null;\n let cronDeleted = false;\n try {\n const dbCron = await datastore.findCronByObjectKey(resolvedRequest.object_key);\n if (dbCron) {\n cronEntry = {\n cronId: dbCron.cronId,\n objectId: dbCron.objectId,\n objectKey: resolvedRequest.object_key,\n };\n }\n if (!cronEntry) {\n cronEntry = await findLoggedStoragePaymentCronByObjectKey(\n resolvedRequest.object_key,\n objectLogHomeDir,\n );\n }\n if (cronEntry) {\n const fileCronDeleted = await removeStoragePaymentCronJob(\n cronEntry.cronId,\n objectLogHomeDir,\n );\n const dbCronDeleted = await datastore.removeCronJob(cronEntry.cronId);\n cronDeleted = fileCronDeleted || dbCronDeleted;\n }\n } catch {\n // Cloud delete already succeeded; cron lookup/removal is best-effort.\n // Report success without implying the delete failed.\n }\n const objectId = cronEntry?.objectId ?? existingObjectByKey?.object_id ?? null;\n if (objectId) {\n const existingObject =\n existingObjectByKey?.object_id === objectId\n ? existingObjectByKey\n : await datastore.findObjectById(objectId);\n await datastore.upsertObject({\n object_id: objectId,\n object_key: resolvedRequest.object_key,\n wallet_address: existingObject?.wallet_address ?? resolvedRequest.wallet_address,\n quote_id: existingObject?.quote_id ?? null,\n provider: existingObject?.provider ?? null,\n bucket_name: existingObject?.bucket_name ?? null,\n region: resolvedRequest.location ?? existingObject?.region ?? null,\n sha256: existingObject?.sha256 ?? null,\n status: \"deleted\",\n });\n }\n await emitCloudEventBestEffort(\n \"delete.completed\",\n {\n operation_id: operationId,\n trace_id: correlation.traceId,\n wallet_address: resolvedRequest.wallet_address,\n object_key: resolvedRequest.object_key,\n status: \"succeeded\",\n },\n objectLogHomeDir,\n );\n const deleteText = formatStorageDeleteUserMessage(\n resolvedRequest.object_key,\n cronEntry?.cronId ?? null,\n cronDeleted,\n );\n return {\n text: resolved.degradedWarning ? `${resolved.degradedWarning}\\n${deleteText}` : deleteText,\n };\n }\n\n return {\n text: CLOUD_HELP_TEXT,\n isError: true,\n };\n}\n\nexport type {\n BackupObjectOptions,\n BackupObjectResult,\n CreateCloudCommandOptions,\n MnemosparkSubagentTaskV1,\n ParsedCloudArgs,\n};\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nconst DB_SUBPATH = join(\".openclaw\", \"mnemospark\", \"state.db\");\nconst SCHEMA_VERSION = 3;\nconst require = createRequire(import.meta.url);\n\nexport type StorageObjectRow = {\n object_id: string;\n object_key: string | null;\n wallet_address: string;\n quote_id: string | null;\n provider: string | null;\n bucket_name: string | null;\n region: string | null;\n sha256: string | null;\n status: string;\n};\n\nexport type PaymentRow = {\n quote_id: string;\n wallet_address: string;\n trans_id: string | null;\n amount: number;\n network: string | null;\n status: string;\n settled_at?: string | null;\n};\n\nexport type CronJobRow = {\n cron_id: string;\n object_id: string;\n object_key: string;\n quote_id: string;\n schedule: string;\n command: string;\n status: string;\n};\n\nexport type OperationRow = {\n operation_id: string;\n type: string;\n object_id: string | null;\n quote_id: string | null;\n trace_id?: string | null;\n orchestrator?: string | null;\n subagent_session_id?: string | null;\n timeout_seconds?: number | null;\n cancel_requested_at?: string | null;\n status: string;\n error_code: string | null;\n error_message: string | null;\n};\n\nexport type QuoteLookup = {\n quoteId: string;\n storagePrice: number;\n walletAddress: string;\n objectId: string;\n objectIdHash: string;\n provider: string;\n location: string;\n};\n\nexport type FriendlyNameRow = {\n friendly_name: string;\n object_id: string;\n object_key: string | null;\n quote_id: string | null;\n wallet_address: string;\n is_active?: number;\n};\n\nexport type FriendlyNameLookup = {\n friendlyNameId: string;\n friendlyName: string;\n objectId: string;\n objectKey: string | null;\n quoteId: string | null;\n walletAddress: string;\n createdAt: string;\n};\n\nexport type CloudDatastore = {\n dbPath: string;\n ensureReady: () => Promise<void>;\n upsertObject: (row: StorageObjectRow) => Promise<void>;\n findObjectByObjectKey: (objectKey: string) => Promise<StorageObjectRow | null>;\n findObjectById: (objectId: string) => Promise<StorageObjectRow | null>;\n upsertPayment: (row: PaymentRow) => Promise<void>;\n upsertCronJob: (row: CronJobRow) => Promise<void>;\n removeCronJob: (cronId: string) => Promise<boolean>;\n findCronByObjectKey: (objectKey: string) => Promise<{ cronId: string; objectId: string } | null>;\n upsertOperation: (row: OperationRow) => Promise<void>;\n findOperationById: (operationId: string) => Promise<{\n operation_id: string;\n type: string;\n object_id: string | null;\n quote_id: string | null;\n trace_id: string | null;\n orchestrator: string | null;\n subagent_session_id: string | null;\n timeout_seconds: number | null;\n cancel_requested_at: string | null;\n status: string;\n error_code: string | null;\n error_message: string | null;\n started_at: string | null;\n finished_at: string | null;\n updated_at: string;\n } | null>;\n findQuoteById: (quoteId: string) => Promise<QuoteLookup | null>;\n upsertFriendlyName: (row: FriendlyNameRow) => Promise<void>;\n resolveFriendlyName: (params: {\n walletAddress: string;\n friendlyName: string;\n latest?: boolean;\n at?: string;\n }) => Promise<FriendlyNameLookup | null>;\n countFriendlyNameMatches: (walletAddress: string, friendlyName: string) => Promise<number>;\n};\n\nfunction resolveDbPath(homeDir?: string): string {\n return join(homeDir ?? homedir(), DB_SUBPATH);\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction normalizeWalletAddress(value: string): string {\n return value.trim().toLowerCase();\n}\n\nexport async function createCloudDatastore(homeDir?: string): Promise<CloudDatastore> {\n const dbPath = resolveDbPath(homeDir);\n type DbLike = {\n exec: (sql: string) => void;\n prepare: (sql: string) => {\n run: (...args: unknown[]) => { changes?: number };\n get: (...args: unknown[]) => unknown;\n };\n };\n\n let db: DbLike | null = null;\n\n const ensureReady = async (): Promise<void> => {\n if (db) return;\n if (process.env.MNEMOSPARK_DISABLE_SQLITE === \"1\") {\n throw new Error(\"SQLite disabled by MNEMOSPARK_DISABLE_SQLITE=1\");\n }\n\n await mkdir(dirname(dbPath), { recursive: true });\n\n // Use runtime require(\"node:sqlite\") to prevent bundlers from rewriting\n // the built-in specifier to \"sqlite\" in dist output.\n const sqliteMod = require(\"node:sqlite\") as {\n DatabaseSync?: new (path: string) => DbLike;\n };\n const DatabaseSyncCtor = sqliteMod.DatabaseSync;\n if (!DatabaseSyncCtor) {\n throw new Error(\"node:sqlite DatabaseSync is unavailable\");\n }\n\n const nextDb = new DatabaseSyncCtor(dbPath);\n nextDb.exec(\"PRAGMA journal_mode=WAL;\");\n nextDb.exec(\"PRAGMA foreign_keys=ON;\");\n\n nextDb.exec(`\n CREATE TABLE IF NOT EXISTS schema_migrations (\n version INTEGER PRIMARY KEY,\n applied_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS objects (\n object_id TEXT PRIMARY KEY,\n object_key TEXT,\n wallet_address TEXT NOT NULL,\n quote_id TEXT,\n provider TEXT,\n bucket_name TEXT,\n region TEXT,\n sha256 TEXT,\n status TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_objects_wallet ON objects(wallet_address);\n CREATE INDEX IF NOT EXISTS idx_objects_quote ON objects(quote_id);\n CREATE INDEX IF NOT EXISTS idx_objects_object_key ON objects(object_key);\n\n CREATE TABLE IF NOT EXISTS payments (\n quote_id TEXT PRIMARY KEY,\n wallet_address TEXT NOT NULL,\n trans_id TEXT,\n amount REAL NOT NULL,\n network TEXT,\n status TEXT NOT NULL,\n settled_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_payments_wallet ON payments(wallet_address);\n\n CREATE TABLE IF NOT EXISTS cron_jobs (\n cron_id TEXT PRIMARY KEY,\n object_id TEXT NOT NULL,\n object_key TEXT NOT NULL,\n quote_id TEXT NOT NULL,\n schedule TEXT NOT NULL,\n command TEXT NOT NULL,\n status TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_cron_jobs_object_key ON cron_jobs(object_key);\n\n CREATE TABLE IF NOT EXISTS operations (\n operation_id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n object_id TEXT,\n quote_id TEXT,\n status TEXT NOT NULL,\n error_code TEXT,\n error_message TEXT,\n started_at TEXT,\n finished_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_operations_type ON operations(type);\n CREATE INDEX IF NOT EXISTS idx_operations_object_id ON operations(object_id);\n CREATE INDEX IF NOT EXISTS idx_operations_quote_id ON operations(quote_id);\n\n CREATE TABLE IF NOT EXISTS friendly_names (\n friendly_name_id TEXT PRIMARY KEY,\n friendly_name TEXT NOT NULL,\n object_id TEXT NOT NULL,\n object_key TEXT,\n quote_id TEXT,\n wallet_address TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n is_active INTEGER NOT NULL DEFAULT 1\n );\n CREATE INDEX IF NOT EXISTS idx_friendly_names_name ON friendly_names(friendly_name);\n CREATE INDEX IF NOT EXISTS idx_friendly_names_object_id ON friendly_names(object_id);\n CREATE INDEX IF NOT EXISTS idx_friendly_names_wallet ON friendly_names(wallet_address);\n CREATE INDEX IF NOT EXISTS idx_friendly_names_created_at ON friendly_names(created_at);\n `);\n\n // Keep wallet_address canonical across tables for reliable matching/indexing.\n nextDb.exec(`\n UPDATE objects\n SET wallet_address = lower(trim(wallet_address))\n WHERE wallet_address <> lower(trim(wallet_address));\n\n UPDATE payments\n SET wallet_address = lower(trim(wallet_address))\n WHERE wallet_address <> lower(trim(wallet_address));\n\n UPDATE friendly_names\n SET wallet_address = lower(trim(wallet_address))\n WHERE wallet_address <> lower(trim(wallet_address));\n `);\n\n const addOperationsColumn = (columnName: string, sqlType: string): void => {\n try {\n nextDb.exec(`ALTER TABLE operations ADD COLUMN ${columnName} ${sqlType}`);\n } catch (error) {\n const message = error instanceof Error ? error.message.toLowerCase() : String(error);\n if (!message.includes(\"duplicate column name\")) {\n throw error;\n }\n }\n };\n addOperationsColumn(\"trace_id\", \"TEXT\");\n addOperationsColumn(\"orchestrator\", \"TEXT\");\n addOperationsColumn(\"subagent_session_id\", \"TEXT\");\n addOperationsColumn(\"timeout_seconds\", \"INTEGER\");\n addOperationsColumn(\"cancel_requested_at\", \"TEXT\");\n\n nextDb\n .prepare(\n `INSERT INTO schema_migrations(version, applied_at)\n VALUES(?, ?)\n ON CONFLICT(version) DO NOTHING`,\n )\n .run(SCHEMA_VERSION, nowIso());\n db = nextDb;\n };\n\n const safe = async <T>(fn: () => T, fallback: T): Promise<T> => {\n try {\n await ensureReady();\n return fn();\n } catch (error) {\n if (process.env.MNEMOSPARK_SQLITE_STRICT === \"1\") {\n throw error;\n }\n return fallback;\n }\n };\n\n return {\n dbPath,\n ensureReady,\n upsertObject: async (row) => {\n await safe(() => {\n const normalizedWalletAddress = normalizeWalletAddress(row.wallet_address);\n const ts = nowIso();\n db!\n .prepare(\n `INSERT INTO objects(object_id, object_key, wallet_address, quote_id, provider, bucket_name, region, sha256, status, created_at, updated_at)\n VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(object_id) DO UPDATE SET\n object_key=excluded.object_key,\n wallet_address=excluded.wallet_address,\n quote_id=excluded.quote_id,\n provider=excluded.provider,\n bucket_name=excluded.bucket_name,\n region=excluded.region,\n sha256=excluded.sha256,\n status=excluded.status,\n updated_at=excluded.updated_at`,\n )\n .run(\n row.object_id,\n row.object_key,\n normalizedWalletAddress,\n row.quote_id,\n row.provider,\n row.bucket_name,\n row.region,\n row.sha256,\n row.status,\n ts,\n ts,\n );\n }, undefined);\n },\n findObjectByObjectKey: async (objectKey) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT object_id, object_key, wallet_address, quote_id, provider, bucket_name, region, sha256, status\n FROM objects\n WHERE object_key = ?\n ORDER BY updated_at DESC\n LIMIT 1`,\n )\n .get(objectKey) as StorageObjectRow | undefined;\n return row ?? null;\n }, null),\n findObjectById: async (objectId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT object_id, object_key, wallet_address, quote_id, provider, bucket_name, region, sha256, status\n FROM objects\n WHERE object_id = ?\n LIMIT 1`,\n )\n .get(objectId) as StorageObjectRow | undefined;\n return row ?? null;\n }, null),\n upsertPayment: async (row) => {\n await safe(() => {\n const normalizedWalletAddress = normalizeWalletAddress(row.wallet_address);\n const ts = nowIso();\n db!\n .prepare(\n `INSERT INTO payments(quote_id, wallet_address, trans_id, amount, network, status, settled_at, created_at, updated_at)\n VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(quote_id) DO UPDATE SET\n wallet_address=excluded.wallet_address,\n trans_id=excluded.trans_id,\n amount=excluded.amount,\n network=excluded.network,\n status=excluded.status,\n settled_at=excluded.settled_at,\n updated_at=excluded.updated_at`,\n )\n .run(\n row.quote_id,\n normalizedWalletAddress,\n row.trans_id,\n row.amount,\n row.network,\n row.status,\n row.settled_at ?? null,\n ts,\n ts,\n );\n }, undefined);\n },\n upsertCronJob: async (row) => {\n await safe(() => {\n const ts = nowIso();\n db!\n .prepare(\n `INSERT INTO cron_jobs(cron_id, object_id, object_key, quote_id, schedule, command, status, created_at, updated_at)\n VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(cron_id) DO UPDATE SET\n object_id=excluded.object_id,\n object_key=excluded.object_key,\n quote_id=excluded.quote_id,\n schedule=excluded.schedule,\n command=excluded.command,\n status=excluded.status,\n updated_at=excluded.updated_at`,\n )\n .run(\n row.cron_id,\n row.object_id,\n row.object_key,\n row.quote_id,\n row.schedule,\n row.command,\n row.status,\n ts,\n ts,\n );\n }, undefined);\n },\n removeCronJob: async (cronId) =>\n safe(() => {\n const res = db!.prepare(`DELETE FROM cron_jobs WHERE cron_id = ?`).run(cronId);\n return Number(res.changes ?? 0) > 0;\n }, false),\n findCronByObjectKey: async (objectKey) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT cron_id, object_id FROM cron_jobs WHERE object_key = ? ORDER BY updated_at DESC LIMIT 1`,\n )\n .get(objectKey) as { cron_id: string; object_id: string } | undefined;\n if (!row) return null;\n return { cronId: row.cron_id, objectId: row.object_id };\n }, null),\n upsertOperation: async (row) => {\n await safe(() => {\n const ts = nowIso();\n const terminalStatuses = new Set([\"succeeded\", \"failed\", \"cancelled\", \"timed_out\"]);\n db!\n .prepare(\n `INSERT INTO operations(operation_id, type, object_id, quote_id, trace_id, orchestrator, subagent_session_id, timeout_seconds, cancel_requested_at, status, error_code, error_message, started_at, finished_at, created_at, updated_at)\n VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(operation_id) DO UPDATE SET\n type=excluded.type,\n object_id=COALESCE(excluded.object_id, operations.object_id),\n quote_id=COALESCE(excluded.quote_id, operations.quote_id),\n trace_id=COALESCE(excluded.trace_id, operations.trace_id),\n orchestrator=COALESCE(excluded.orchestrator, operations.orchestrator),\n subagent_session_id=COALESCE(excluded.subagent_session_id, operations.subagent_session_id),\n timeout_seconds=COALESCE(excluded.timeout_seconds, operations.timeout_seconds),\n cancel_requested_at=COALESCE(excluded.cancel_requested_at, operations.cancel_requested_at),\n status=excluded.status,\n error_code=excluded.error_code,\n error_message=excluded.error_message,\n started_at=COALESCE(excluded.started_at, operations.started_at),\n finished_at=COALESCE(excluded.finished_at, operations.finished_at),\n updated_at=excluded.updated_at`,\n )\n .run(\n row.operation_id,\n row.type,\n row.object_id,\n row.quote_id,\n row.trace_id ?? null,\n row.orchestrator ?? null,\n row.subagent_session_id ?? null,\n row.timeout_seconds ?? null,\n row.cancel_requested_at ?? null,\n row.status,\n row.error_code,\n row.error_message,\n row.status === \"started\" ? ts : null,\n terminalStatuses.has(row.status) ? ts : null,\n ts,\n ts,\n );\n }, undefined);\n },\n findOperationById: async (operationId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT operation_id, type, object_id, quote_id, trace_id, orchestrator, subagent_session_id, timeout_seconds, cancel_requested_at, status, error_code, error_message, started_at, finished_at, updated_at\n FROM operations\n WHERE operation_id = ?\n LIMIT 1`,\n )\n .get(operationId) as\n | {\n operation_id: string;\n type: string;\n object_id: string | null;\n quote_id: string | null;\n trace_id: string | null;\n orchestrator: string | null;\n subagent_session_id: string | null;\n timeout_seconds: number | null;\n cancel_requested_at: string | null;\n status: string;\n error_code: string | null;\n error_message: string | null;\n started_at: string | null;\n finished_at: string | null;\n updated_at: string;\n }\n | undefined;\n return row ?? null;\n }, null),\n findQuoteById: async (quoteId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT quote_id, amount, wallet_address FROM payments WHERE quote_id = ? ORDER BY updated_at DESC LIMIT 1`,\n )\n .get(quoteId) as { quote_id: string; amount: number; wallet_address: string } | undefined;\n const object = db!\n .prepare(\n `SELECT object_id, sha256, provider, region FROM objects WHERE quote_id = ? ORDER BY updated_at DESC LIMIT 1`,\n )\n .get(quoteId) as\n | {\n object_id: string;\n sha256: string | null;\n provider: string | null;\n region: string | null;\n }\n | undefined;\n if (!row || !object) return null;\n if (object.sha256 === null || object.provider === null || object.region === null)\n return null;\n return {\n quoteId,\n storagePrice: Number(row.amount),\n walletAddress: row.wallet_address,\n objectId: object.object_id,\n objectIdHash: object.sha256,\n provider: object.provider,\n location: object.region,\n };\n }, null),\n upsertFriendlyName: async (row) => {\n await safe(() => {\n const normalizedWalletAddress = normalizeWalletAddress(row.wallet_address);\n const ts = nowIso();\n db!\n .prepare(\n `INSERT INTO friendly_names(friendly_name_id, friendly_name, object_id, object_key, quote_id, wallet_address, created_at, updated_at, is_active)\n VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n randomUUID(),\n row.friendly_name,\n row.object_id,\n row.object_key,\n row.quote_id,\n normalizedWalletAddress,\n ts,\n ts,\n row.is_active ?? 1,\n );\n }, undefined);\n },\n resolveFriendlyName: async (params) =>\n safe(() => {\n const normalizedWalletAddress = normalizeWalletAddress(params.walletAddress);\n const atIso = params.at ? new Date(params.at).toISOString() : null;\n const row =\n params.latest || !atIso\n ? (db!\n .prepare(\n `SELECT friendly_name_id, friendly_name, object_id, object_key, quote_id, wallet_address, created_at\n FROM friendly_names\n WHERE wallet_address = ? AND friendly_name = ? AND is_active = 1\n ORDER BY created_at DESC\n LIMIT 1`,\n )\n .get(normalizedWalletAddress, params.friendlyName) as\n | {\n friendly_name_id: string;\n friendly_name: string;\n object_id: string;\n object_key: string | null;\n quote_id: string | null;\n wallet_address: string;\n created_at: string;\n }\n | undefined)\n : (db!\n .prepare(\n `SELECT friendly_name_id, friendly_name, object_id, object_key, quote_id, wallet_address, created_at\n FROM friendly_names\n WHERE wallet_address = ? AND friendly_name = ? AND is_active = 1 AND created_at <= ?\n ORDER BY created_at DESC\n LIMIT 1`,\n )\n .get(normalizedWalletAddress, params.friendlyName, atIso) as\n | {\n friendly_name_id: string;\n friendly_name: string;\n object_id: string;\n object_key: string | null;\n quote_id: string | null;\n wallet_address: string;\n created_at: string;\n }\n | undefined);\n\n if (!row) return null;\n return {\n friendlyNameId: row.friendly_name_id,\n friendlyName: row.friendly_name,\n objectId: row.object_id,\n objectKey: row.object_key,\n quoteId: row.quote_id,\n walletAddress: row.wallet_address,\n createdAt: row.created_at,\n };\n }, null),\n countFriendlyNameMatches: async (walletAddress, friendlyName) =>\n safe(() => {\n const normalizedWalletAddress = normalizeWalletAddress(walletAddress);\n const row = db!\n .prepare(\n `SELECT COUNT(1) AS cnt\n FROM friendly_names\n WHERE wallet_address = ? AND friendly_name = ? AND is_active = 1`,\n )\n .get(normalizedWalletAddress, friendlyName) as { cnt: number } | undefined;\n return Number(row?.cnt ?? 0);\n }, 0),\n };\n}\n\nexport { DB_SUBPATH, SCHEMA_VERSION, resolveDbPath as resolveCloudDatastorePath };\n","#!/usr/bin/env node\n/**\n * mnemospark CLI\n *\n * Standalone proxy for deployed setups where the proxy needs to survive gateway restarts.\n *\n * Usage:\n * npx mnemospark # Start standalone proxy\n * npx mnemospark --version # Show version\n * npx mnemospark check-update # Check if a new version is available\n * npx mnemospark update # Update to latest version\n * npx mnemospark --port 7120 # Custom port\n *\n * For production deployments, use with PM2:\n * pm2 start \"npx mnemospark\" --name mnemospark\n */\n\nimport { startProxy, getProxyPort } from \"./proxy.js\";\nimport { resolveOrGenerateWalletKey, LEGACY_WALLET_FILE, WALLET_FILE } from \"./auth.js\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport { VERSION } from \"./version.js\";\nimport { createCloudCommand } from \"./cloud-command.js\";\nimport type { PluginCommandContext } from \"./types.js\";\nimport { spawn } from \"node:child_process\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\n\nfunction isHexPrivateKey(value: string | undefined): value is `0x${string}` {\n return typeof value === \"string\" && /^0x[0-9a-fA-F]{64}$/.test(value.trim());\n}\n\nfunction printHelp(): void {\n console.log(`\nmnemospark v${VERSION} - Storage proxy and wallet tools\n\nUsage:\n mnemospark [options]\n mnemospark install --default\n mnemospark install --standard\n mnemospark wallet Show wallet info\n mnemospark cloud <subcommand> Cloud storage commands\n mnemospark proxy start Start the mnemospark proxy\n mnemospark check-update Check if a new version is available\n mnemospark update Update to latest version\n\nOptions:\n --version, -v Show version number\n --help, -h Show this help message\n --port <number> Port to listen on (default: ${getProxyPort()})\n\nExamples:\n # Start standalone proxy (survives gateway restarts)\n npx mnemospark proxy start\n\n # Start on custom port\n npx mnemospark --port 9000\n\n # Install mnemospark wallet with default behavior (create new wallet)\n npx mnemospark install --default\n\n # Install mnemospark wallet with standard behavior (reuse Blockrun wallet if present)\n npx mnemospark install --standard\n\n # Show wallet address and info\n npx mnemospark wallet\n\n # Cloud storage commands\n npx mnemospark cloud help\n npx mnemospark cloud backup <file>\n\n # Production deployment with PM2\n pm2 start \"npx mnemospark proxy start\" --name mnemospark\n\nEnvironment Variables:\n MNEMOSPARK_WALLET_KEY Private key for x402 storage payments (auto-generated if not set)\n MNEMOSPARK_PROXY_PORT Default proxy port (default: 7120)\n\nFor more info: https://github.com/pawlsclick/mnemospark\n`);\n}\n\ntype ParsedArgs = {\n version: boolean;\n help: boolean;\n port?: number;\n command?: \"install\" | \"update\" | \"check-update\" | \"wallet\" | \"cloud\" | \"proxy\";\n installMode?: \"default\" | \"standard\";\n cloudArgs?: string;\n proxySubcommand?: string;\n};\n\nfunction parseArgs(args: string[]): ParsedArgs {\n const result: ParsedArgs = {\n version: false,\n help: false,\n port: undefined,\n command: undefined,\n installMode: undefined,\n cloudArgs: undefined,\n proxySubcommand: undefined,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (!result.command && !arg.startsWith(\"-\")) {\n if (arg === \"install\") {\n result.command = \"install\";\n } else if (arg === \"update\") {\n result.command = \"update\";\n } else if (arg === \"check-update\") {\n result.command = \"check-update\";\n } else if (arg === \"wallet\") {\n result.command = \"wallet\";\n } else if (arg === \"cloud\") {\n result.command = \"cloud\";\n result.cloudArgs = args.slice(i + 1).join(\" \");\n return result;\n } else if (arg === \"proxy\") {\n result.command = \"proxy\";\n const maybeSubcommand = args[i + 1];\n if (maybeSubcommand && !maybeSubcommand.startsWith(\"-\")) {\n result.proxySubcommand = maybeSubcommand;\n i++;\n }\n continue;\n }\n continue;\n }\n\n if (arg === \"--version\" || arg === \"-v\") {\n result.version = true;\n } else if (arg === \"--help\" || arg === \"-h\") {\n result.help = true;\n } else if (result.command === \"install\" && arg === \"--default\") {\n result.installMode = \"default\";\n } else if (result.command === \"install\" && arg === \"--standard\") {\n result.installMode = \"standard\";\n } else if (arg === \"--port\" && args[i + 1]) {\n result.port = parseInt(args[i + 1], 10);\n i++;\n }\n }\n\n return result;\n}\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst PACKAGE_ROOT = dirname(__dirname);\n\nasync function ensureDir(path: string): Promise<void> {\n await mkdir(path, { recursive: true });\n}\n\n/**\n * Deploy support files only (e.g. uninstall script) to ~/.openclaw/mnemospark.\n * Does NOT write to ~/.openclaw/extensions/mnemospark; plugin registration\n * is handled exclusively by `openclaw plugins install mnemospark`.\n */\nasync function deployExtensionFiles(): Promise<void> {\n const scriptsSource = join(PACKAGE_ROOT, \"scripts\");\n if (!existsSync(scriptsSource)) return;\n\n const mnemoScriptsDir = join(homedir(), \".openclaw\", \"mnemospark\", \"scripts\");\n await ensureDir(mnemoScriptsDir);\n const uninstallSrc = join(scriptsSource, \"uninstall.sh\");\n if (existsSync(uninstallSrc)) {\n const content = await readFile(uninstallSrc);\n await writeFile(join(mnemoScriptsDir, \"uninstall.sh\"), content, { mode: 0o755 });\n }\n}\n\nfunction isOpenClawAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn(\"openclaw\", [\"--version\"], {\n stdio: \"ignore\",\n shell: true,\n });\n child.on(\"error\", () => resolve(false));\n child.on(\"close\", (code) => resolve(code === 0));\n });\n}\n\nfunction getOpenClawConfigPath(): string {\n const stateDir = process.env.OPENCLAW_STATE_DIR ?? join(homedir(), \".openclaw\");\n return join(stateDir, \"openclaw.json\");\n}\n\n/**\n * Ensure plugins.allow in openclaw.json includes \"mnemospark\". Idempotent; safe if file missing or invalid.\n */\nasync function ensureMnemosparkInPluginsAllow(): Promise<void> {\n const configPath = getOpenClawConfigPath();\n try {\n const raw = await readFile(configPath, \"utf-8\");\n const config = JSON.parse(raw) as Record<string, unknown>;\n if (!config.plugins || typeof config.plugins !== \"object\") {\n config.plugins = {};\n }\n const plugins = config.plugins as Record<string, unknown>;\n if (!Array.isArray(plugins.allow)) {\n plugins.allow = [];\n }\n const allow = plugins.allow as string[];\n if (!allow.includes(\"mnemospark\")) {\n allow.push(\"mnemospark\");\n await writeFile(configPath, JSON.stringify(config, null, 2), \"utf-8\");\n console.log(\"[mnemospark] Added mnemospark to plugins.allow in openclaw.json.\");\n }\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") return;\n console.warn(\"[mnemospark] Could not update plugins.allow:\", (err as Error).message);\n }\n}\n\n/**\n * If OpenClaw is on PATH, run `openclaw plugins install mnemospark` and ensure plugins.allow includes mnemospark.\n * Otherwise print instructions.\n */\nasync function promptOrRunOpenClawPluginInstall(): Promise<void> {\n const available = await isOpenClawAvailable();\n if (available) {\n console.log(\"\\n[mnemospark] Registering plugin with OpenClaw...\");\n const child = spawn(\"openclaw\", [\"plugins\", \"install\", \"mnemospark\"], {\n stdio: \"inherit\",\n shell: true,\n });\n const exitCode = await new Promise<number>((resolve) => {\n child.on(\"close\", resolve);\n });\n if (exitCode === 0) {\n await ensureMnemosparkInPluginsAllow();\n } else {\n console.log(\n \"\\n[mnemospark] OpenClaw plugin install did not succeed. Run manually: openclaw plugins install mnemospark\",\n );\n }\n } else {\n console.log(\n \"\\n[mnemospark] To use mnemospark inside OpenClaw, install the plugin: openclaw plugins install mnemospark\",\n );\n }\n}\n\nasync function readLegacyWalletIfPresent(): Promise<`0x${string}` | null> {\n try {\n const key = (await readFile(LEGACY_WALLET_FILE, \"utf-8\")).trim();\n return isHexPrivateKey(key) ? (key as `0x${string}`) : null;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function writeMnemosparkWallet(key: `0x${string}`): Promise<void> {\n const dir = dirname(WALLET_FILE);\n await ensureDir(dir);\n await writeFile(WALLET_FILE, `${key}\\n`, { mode: 0o600 });\n}\n\nasync function promptReuseLegacyWallet(): Promise<boolean> {\n process.stdout.write(\n `Found existing Blockrun wallet at ${LEGACY_WALLET_FILE}.\\nReuse this wallet for mnemospark? [Y/n]: `,\n );\n\n return new Promise<boolean>((resolve) => {\n process.stdin.setEncoding(\"utf-8\");\n process.stdin.once(\"data\", (data) => {\n const input = typeof data === \"string\" ? data : data.toString(\"utf-8\");\n const answer = input.trim().toLowerCase();\n if (!answer || answer === \"y\" || answer === \"yes\") {\n resolve(true);\n } else {\n resolve(false);\n }\n });\n });\n}\n\nconst NPM_REGISTRY_URL = \"https://registry.npmjs.org/mnemospark/latest\";\n\ninterface NpmLatestResponse {\n version?: string;\n}\n\n/**\n * Compare two semver strings (e.g. \"1.2.3\"). Returns -1 if a < b, 0 if equal, 1 if a > b.\n * Only compares major.minor.patch; ignores prerelease suffixes.\n */\nfunction compareVersion(a: string, b: string): number {\n const partsA = a.split(\"-\")[0].split(\".\").map(Number);\n const partsB = b.split(\"-\")[0].split(\".\").map(Number);\n for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {\n const na = partsA[i] ?? 0;\n const nb = partsB[i] ?? 0;\n if (na < nb) return -1;\n if (na > nb) return 1;\n }\n return 0;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(NPM_REGISTRY_URL, {\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) return null;\n const data = (await res.json()) as NpmLatestResponse;\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nasync function runCheckUpdate(): Promise<void> {\n const latest = await fetchLatestVersion();\n if (!latest) {\n console.log(\"[mnemospark] Could not fetch latest version from registry.\");\n process.exit(1);\n }\n const cmp = compareVersion(VERSION, latest);\n if (cmp < 0) {\n console.log(`[mnemospark] A new version is available: ${latest} (current: ${VERSION})`);\n console.log(\"Run: npx mnemospark update\");\n } else if (cmp === 0) {\n console.log(\"You are on the latest version.\");\n } else {\n console.log(`You are on the latest version. (current: ${VERSION}, registry: ${latest})`);\n }\n}\n\nasync function runUpdate(): Promise<void> {\n const latest = await fetchLatestVersion();\n if (!latest) {\n console.log(\"[mnemospark] Could not fetch latest version from registry.\");\n process.exit(1);\n }\n const cmp = compareVersion(VERSION, latest);\n if (cmp < 0) {\n console.log(`[mnemospark] Updating from ${VERSION} to ${latest}...`);\n const { execSync } = await import(\"node:child_process\");\n try {\n execSync(`npm install mnemospark@${latest}`, { stdio: \"inherit\" });\n console.log(`[mnemospark] Updated to ${latest}.`);\n } catch {\n console.log(\n \"[mnemospark] npm install failed. You can update manually: npm install mnemospark@latest\",\n );\n process.exit(1);\n }\n } else {\n console.log(\"You are on the latest version.\");\n }\n}\n\nasync function runInstall(mode: \"default\" | \"standard\"): Promise<void> {\n if (mode === \"standard\") {\n const legacyWallet = await readLegacyWalletIfPresent();\n if (legacyWallet) {\n const reuse = await promptReuseLegacyWallet();\n if (reuse) {\n await writeMnemosparkWallet(legacyWallet);\n await deployExtensionFiles();\n console.log(\"\\n[mnemospark] Reused existing Blockrun wallet for mnemospark.\");\n console.log(\n \"[mnemospark] Wallet file: ~/.openclaw/mnemospark/wallet/wallet.key (chmod 600 expected).\",\n );\n console.log(\n \"[mnemospark] Your wallet will be used for mnemospark storage payments on Base.\",\n );\n await promptOrRunOpenClawPluginInstall();\n return;\n }\n }\n }\n\n const { address, source } = await resolveOrGenerateWalletKey();\n\n await deployExtensionFiles();\n\n console.log(\"[mnemospark] Install complete.\");\n console.log(`Your new Base blockchain wallet is: ${address}`);\n if (source === \"env\") {\n console.log(\n \"Wallet key loaded from MNEMOSPARK_WALLET_KEY. Save it to ~/.openclaw/mnemospark/wallet/wallet.key (chmod 600) if you want file-based persistence.\",\n );\n } else {\n console.log(\n \"Wallet key stored under ~/.openclaw/mnemospark/wallet/wallet.key (permissions should be chmod 600).\",\n );\n }\n console.log(\"Add USDC on the Base network to start using mnemospark today.\");\n console.log(\n \"You can acquire USDC on Base from providers like Coinbase and Moonpay. Fund the wallet before running mnemospark.\",\n );\n await promptOrRunOpenClawPluginInstall();\n}\n\nasync function runWallet(): Promise<void> {\n const { address, source } = await resolveOrGenerateWalletKey();\n\n console.log(`[mnemospark] Wallet address: ${address}`);\n console.log(`[mnemospark] Key file: ${WALLET_FILE}`);\n if (source === \"generated\") {\n console.log(\"[mnemospark] New wallet generated and saved.\");\n } else if (source === \"saved\") {\n console.log(\"[mnemospark] Loaded saved wallet.\");\n } else {\n console.log(\"[mnemospark] Using wallet from MNEMOSPARK_WALLET_KEY.\");\n }\n}\n\nasync function runCloud(cloudArgs: string): Promise<void> {\n const cloudCmd = createCloudCommand();\n const ctx: PluginCommandContext = {\n channel: \"cli\",\n isAuthorizedSender: true,\n args: cloudArgs,\n commandBody: `cloud ${cloudArgs}`,\n config: {},\n };\n\n const result = await cloudCmd.handler(ctx);\n if (result.text) {\n console.log(result.text);\n }\n if (result.isError) {\n process.exit(1);\n }\n}\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n\n if (args.version) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (args.help) {\n printHelp();\n process.exit(0);\n }\n\n if (args.command === \"install\") {\n const mode = args.installMode ?? \"standard\";\n await runInstall(mode);\n return;\n }\n\n if (args.command === \"check-update\") {\n await runCheckUpdate();\n return;\n }\n\n if (args.command === \"update\") {\n await runUpdate();\n return;\n }\n\n if (args.command === \"wallet\") {\n await runWallet();\n return;\n }\n\n if (args.command === \"cloud\") {\n await runCloud(args.cloudArgs ?? \"\");\n return;\n }\n\n if (args.command === \"proxy\") {\n if (args.proxySubcommand !== \"start\") {\n console.error(\"[mnemospark] Invalid proxy command. Use: mnemospark proxy start\");\n printHelp();\n process.exit(1);\n }\n }\n\n // Resolve wallet key\n const { key: walletKey, address, source } = await resolveOrGenerateWalletKey();\n\n if (source === \"generated\") {\n console.log(`[mnemospark] Generated new wallet: ${address}`);\n } else if (source === \"saved\") {\n console.log(`[mnemospark] Using saved wallet: ${address}`);\n } else {\n console.log(`[mnemospark] Using wallet from MNEMOSPARK_WALLET_KEY: ${address}`);\n }\n\n // Start the proxy\n const proxy = await startProxy({\n walletKey,\n port: args.port,\n onReady: (port) => {\n console.log(`[mnemospark] Proxy listening on http://127.0.0.1:${port}`);\n console.log(`[mnemospark] Health check: http://127.0.0.1:${port}/health`);\n },\n onError: (error) => {\n console.error(`[mnemospark] Error: ${error.message}`);\n },\n onLowBalance: (info) => {\n console.warn(`[mnemospark] Low balance: ${info.balanceUSD}. Fund: ${info.walletAddress}`);\n },\n onInsufficientFunds: (info) => {\n console.error(\n `[mnemospark] Insufficient funds. Balance: ${info.balanceUSD}, Need: ${info.requiredUSD}`,\n );\n },\n });\n\n // Check balance\n const monitor = new BalanceMonitor(address);\n try {\n const balance = await monitor.checkBalance();\n if (balance.isEmpty) {\n console.log(`[mnemospark] Wallet balance: $0.00 (using FREE model)`);\n console.log(`[mnemospark] Fund wallet for premium models: ${address}`);\n } else if (balance.isLow) {\n console.log(`[mnemospark] Wallet balance: ${balance.balanceUSD} (low)`);\n } else {\n console.log(`[mnemospark] Wallet balance: ${balance.balanceUSD}`);\n }\n } catch {\n console.log(`[mnemospark] Wallet: ${address} (balance check pending)`);\n }\n\n console.log(`[mnemospark] Ready - Ctrl+C to stop`);\n\n // Handle graceful shutdown\n const shutdown = async (signal: string) => {\n console.log(`\\n[mnemospark] Received ${signal}, shutting down...`);\n try {\n await proxy.close();\n console.log(`[mnemospark] Proxy closed`);\n process.exit(0);\n } catch (err) {\n console.error(`[mnemospark] Error during shutdown: ${err}`);\n process.exit(1);\n }\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n\n // Keep process alive\n await new Promise(() => {});\n}\n\nmain().catch((err) => {\n console.error(`[mnemospark] Fatal error: ${err.message}`);\n process.exit(1);\n});\n"],"mappings":"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","names":["homedir","join","privateKeyToAccount","response","resolve","signTypedData","privateKeyToAccount","BASE_SEPOLIA_CHAIN_ID","encodeBase64Json","signTypedData","privateKeyToAccount","response","paymentHeader","join","join","mkdir","homedir","dirname","join","base","join","homedir","account","privateKeyToAccount","balanceMonitor","baseUrl","responseHeaders","existingWallet","writeFile","readFile","mkdir","join","homedir","privateKeyToAccount","join","homedir","readFile","privateKeyToAccount","mkdir","writeFile","dirname","join","require","createHash","randomUUID","createReadStream","appendFile","mkdir","readFile","readdir","stat","writeFile","homedir","basename","dirname","join","resolve","privateKeyToAccount","randomUUID","mkdir","createRequire","homedir","dirname","join","require","join","homedir","mkdir","dirname","appendFile","readdir","basename","createHash","createReadStream","resolve","stat","readFile","writeFile","randomUUID","parsedRequest","privateKeyToAccount","spawn","dirname","join","fileURLToPath","mkdir","readFile","writeFile","homedir","__filename","__dirname","resolve"]}
|