mnemospark 1.2.2 → 1.4.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/README.md +32 -20
- package/dist/cli.js +286 -107
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +20 -6
- package/dist/index.js +259 -86
- package/dist/index.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/skills/mnemospark/references/commands.md +1 -0
package/dist/index.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/mnemospark-handler.ts","../src/cloud-help-onboarding.ts","../src/cloud-command.ts","../src/cloud-ls-format.ts","../src/cloud-datastore.ts","../src/args/normalize.ts","../src/args/suggest.ts","../src/args/parser.ts","../src/mnemospark-route.ts","../src/arg-schemas.ts","../src/retry.ts","../src/index.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 {\n PROXY_PORT,\n MNEMOSPARK_BACKEND_API_BASE_URL,\n MNEMOSPARK_PROXY_VERBOSE_404,\n} 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 parseStorageLsRequestPayload,\n parseProxyStorageDownloadPayload,\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 createJsonResponseHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n \"X-Content-Type-Options\": \"nosniff\",\n \"Cache-Control\": \"no-store\",\n };\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, createJsonResponseHeaders());\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(\"events.jsonl\", {\n ts: new Date().toISOString(),\n event_type: eventType,\n status,\n source: \"proxy\",\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 \"X-Content-Type-Options\": \"nosniff\",\n \"Cache-Control\": \"no-store\",\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\nfunction sendWalletRequired(res: ServerResponse): void {\n res.writeHead(400, createJsonResponseHeaders());\n res.end(createWalletRequiredBody());\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\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_price_storage_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 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 sendWalletRequired(res);\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 walletAddress =\n typeof record?.wallet_address === \"string\" ? record.wallet_address.trim() : \"\";\n const isRenewal = record?.renewal === true;\n const objectKey = typeof record?.object_key === \"string\" ? record.object_key.trim() : \"\";\n let quoteId = typeof record?.quote_id === \"string\" ? record.quote_id.trim() : \"\";\n const inlinePayment = record?.payment;\n const inlinePaymentAuthorization = record?.payment_authorization;\n if (!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 field: wallet_address\",\n });\n return;\n }\n if (isRenewal) {\n if (quoteId) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_renewal_with_quote_id\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"renewal_with_quote_id\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"renewal requests must not include quote_id\",\n });\n return;\n }\n if (!objectKey) {\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 field: object_key (renewal mode)\",\n });\n return;\n }\n quoteId = `renewal:${objectKey}`;\n } else if (!quoteId) {\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 field: quote_id (or use renewal: true with object_key)\",\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 sendWalletRequired(res);\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 renewal: isRenewal,\n objectKey: isRenewal ? objectKey : 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 sendWalletRequired(res);\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 sendWalletRequired(res);\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 sendWalletRequired(res);\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 = parseStorageLsRequestPayload(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 field: wallet_address\",\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 sendWalletRequired(res);\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 parsedDownload = parseProxyStorageDownloadPayload(payload);\n if (!parsedDownload) {\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 const requestPayload = parsedDownload.request;\n const downloadLocalBasename = parsedDownload.localBasename;\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 sendWalletRequired(res);\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 ...(downloadLocalBasename?.trim()\n ? { localOutputBasename: downloadLocalBasename.trim() }\n : {}),\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 sendWalletRequired(res);\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 if (MNEMOSPARK_PROXY_VERBOSE_404) {\n sendJson(res, 404, {\n error: \"Not found\",\n message: \"Supported paths: /health and /mnemospark/* storage endpoints\",\n });\n } else {\n sendJson(res, 404, { error: \"Not found\" });\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\n/**\n * When true, unknown HTTP paths return a 404 JSON body that includes a `message`\n * listing supported routes. Default is a generic `{ \"error\": \"Not found\" }` only.\n */\nexport const MNEMOSPARK_PROXY_VERBOSE_404 = (() => {\n const v = process.env.MNEMOSPARK_PROXY_VERBOSE_404?.trim().toLowerCase();\n return v === \"1\" || v === \"true\" || v === \"yes\";\n})();\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\nconst BYTE_SI_UNITS = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"] as const;\nconst BYTE_SI_BASE = 1000;\n\n/**\n * Human-readable size using decimal (SI) prefixes: 1 KB = 1_000 B.\n * At most one fractional digit for KB+; prefer integers when within 1% of a whole unit.\n */\nexport function formatBytesForDisplay(bytes: number): string {\n if (!Number.isInteger(bytes) || bytes < 0 || !Number.isFinite(bytes)) {\n throw new Error(\"formatBytesForDisplay expects a non-negative integer\");\n }\n if (bytes === 0) {\n return \"0 B\";\n }\n let value = bytes;\n let unitIndex = 0;\n while (value >= BYTE_SI_BASE && unitIndex < BYTE_SI_UNITS.length - 1) {\n value /= BYTE_SI_BASE;\n unitIndex += 1;\n }\n if (unitIndex === 0) {\n return `${bytes} B`;\n }\n const nearestInt = Math.round(value);\n const pickInt = nearestInt > 0 && Math.abs(value - nearestInt) / Math.max(value, 1e-9) <= 0.01;\n let rounded = pickInt ? nearestInt : Math.round(value * 10) / 10;\n if (rounded >= BYTE_SI_BASE && unitIndex < BYTE_SI_UNITS.length - 1) {\n rounded = Math.round((rounded / BYTE_SI_BASE) * 10) / 10;\n unitIndex += 1;\n }\n const text = Number.isInteger(rounded) ? String(rounded) : String(rounded).replace(/\\.0$/, \"\");\n return `${text} ${BYTE_SI_UNITS[unitIndex]}`;\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 wallet_address: string;\n quote_id?: string;\n renewal?: boolean;\n object_key?: 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 /** Monthly renewal path: JSON uses renewal + object_key (no quote_id). */\n renewal?: boolean;\n objectKey?: 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 renewal?: boolean;\n objectKey?: 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 wallet_address: walletAddress,\n };\n if (options.renewal === true && options.objectKey?.trim()) {\n requestBody.renewal = true;\n requestBody.object_key = options.objectKey.trim();\n } else {\n requestBody.quote_id = quoteId;\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 wallet_address: walletAddress,\n };\n if (options.renewal === true && options.objectKey?.trim()) {\n requestBody.renewal = true;\n requestBody.object_key = options.objectKey.trim();\n } else {\n requestBody.quote_id = quoteId;\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\n/** POST /storage/ls body: wallet required; omit object_key for S3 list mode. */\nexport type StorageLsRequest = {\n wallet_address: string;\n object_key?: string;\n location?: string;\n continuation_token?: string;\n max_keys?: number;\n prefix?: string;\n};\n\nexport type StorageLsStatResponse = {\n mode: \"stat\";\n success: boolean;\n key: string;\n size_bytes: number;\n bucket: string;\n object_id?: string;\n};\n\nexport type StorageLsListObject = {\n key: string;\n size_bytes: number;\n last_modified?: string;\n};\n\nexport type StorageLsListResponse = {\n mode: \"list\";\n success: boolean;\n list_mode: true;\n bucket: string;\n objects: StorageLsListObject[];\n is_truncated: boolean;\n next_continuation_token: string | null;\n};\n\nexport type StorageLsResponse = StorageLsStatResponse | StorageLsListResponse;\n\nexport function isStorageLsListResponse(r: StorageLsResponse): r is StorageLsListResponse {\n return r.mode === \"list\";\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 /** Proxy-only: preferred on-disk basename under the download directory (not sent to the backend). */\n downloadLocalBasename?: string;\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 /** When set, used as the relative path key for resolveDownloadPath instead of object_key. */\n localOutputBasename?: string;\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\nconst MAX_LOCAL_FRIENDLY_BASENAME_LEN = 200;\n\n/**\n * Maps a user-supplied friendly name to a single safe filename segment for local backup/download paths.\n * Throws if the result would be empty or invalid.\n */\nexport function sanitizeFriendlyNameForLocalBasename(raw: string): string {\n const normalized = raw.replace(/\\\\/g, \"/\").trim();\n if (!normalized) {\n throw new Error(\"Friendly name is empty\");\n }\n const segments = normalized\n .split(\"/\")\n .filter((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\");\n const segment = segments[segments.length - 1] ?? \"\";\n if (!segment || segment === \".\" || segment === \"..\") {\n throw new Error(\"Invalid friendly name for local file path\");\n }\n // eslint-disable-next-line no-control-regex -- intentional strip of C0 control chars for filenames\n const noCtrl = segment.replace(/[\\x00-\\x1f]/g, \"\").trim();\n if (!noCtrl || noCtrl === \".\" || noCtrl === \"..\") {\n throw new Error(\"Invalid friendly name for local file path\");\n }\n return noCtrl.length > MAX_LOCAL_FRIENDLY_BASENAME_LEN\n ? noCtrl.slice(0, MAX_LOCAL_FRIENDLY_BASENAME_LEN)\n : noCtrl;\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 jsonBody: Record<string, unknown>,\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(jsonBody),\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 jsonBody: Record<string, unknown>,\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(jsonBody),\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\n/** Proxy POST body for download: backend fields plus optional local filename hint (stripped before backend forward). */\nexport function parseProxyStorageDownloadPayload(payload: unknown): {\n request: StorageObjectRequest;\n localBasename?: string;\n} | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n const walletAddress = asNonEmptyString(record.wallet_address);\n const objectKey = asNonEmptyString(record.object_key);\n const location = asNonEmptyString(record.location) ?? undefined;\n if (!walletAddress || !objectKey) {\n return null;\n }\n const localRaw = asNonEmptyString(record.mnemospark_local_filename) ?? undefined;\n return {\n request: {\n wallet_address: walletAddress,\n object_key: objectKey,\n ...(location ? { location } : {}),\n },\n ...(localRaw ? { localBasename: localRaw } : {}),\n };\n}\n\nfunction jsonBodyForObjectRequest(request: StorageObjectRequest): Record<string, unknown> {\n const o: Record<string, unknown> = {\n wallet_address: request.wallet_address,\n object_key: request.object_key,\n };\n if (request.location) {\n o.location = request.location;\n }\n return o;\n}\n\nfunction jsonBodyForProxyDownloadRequest(\n request: StorageObjectRequest,\n downloadLocalBasename?: string,\n): Record<string, unknown> {\n const body = jsonBodyForObjectRequest(request);\n const trimmed = downloadLocalBasename?.trim();\n if (trimmed) {\n body.mnemospark_local_filename = trimmed;\n }\n return body;\n}\n\nexport function jsonBodyForLsRequest(request: StorageLsRequest): Record<string, unknown> {\n const o: Record<string, unknown> = { wallet_address: request.wallet_address };\n if (request.object_key) {\n o.object_key = request.object_key;\n }\n if (request.location) {\n o.location = request.location;\n }\n if (request.continuation_token) {\n o.continuation_token = request.continuation_token;\n }\n if (typeof request.max_keys === \"number\") {\n o.max_keys = request.max_keys;\n }\n if (request.prefix) {\n o.prefix = request.prefix;\n }\n return o;\n}\n\n/** Proxy / local CLI: parse JSON body for /storage/ls (object_key optional). */\nexport function parseStorageLsRequestPayload(payload: unknown): StorageLsRequest | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n const walletAddress = asNonEmptyString(record.wallet_address);\n if (!walletAddress) {\n return null;\n }\n const objectKey = asNonEmptyString(record.object_key) ?? undefined;\n const location = asNonEmptyString(record.location) ?? undefined;\n const continuation_token = asNonEmptyString(record.continuation_token) ?? undefined;\n const maxRaw = asNumber(record.max_keys);\n const max_keys = maxRaw !== null && Number.isInteger(maxRaw) && maxRaw >= 1 ? maxRaw : undefined;\n const prefix = asNonEmptyString(record.prefix) ?? undefined;\n return {\n wallet_address: walletAddress,\n ...(objectKey ? { object_key: objectKey } : {}),\n ...(location ? { location } : {}),\n ...(continuation_token ? { continuation_token } : {}),\n ...(typeof max_keys === \"number\" ? { max_keys } : {}),\n ...(prefix ? { prefix } : {}),\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 if (record.list_mode === true) {\n const bucket = asNonEmptyString(record.bucket) ?? asNonEmptyString(record.bucket_name);\n const rawObjects = record.objects;\n if (!bucket || !Array.isArray(rawObjects)) {\n throw new Error(\"ls list response is missing required fields\");\n }\n const objects: StorageLsListObject[] = [];\n for (const item of rawObjects) {\n const row = asRecord(item);\n if (!row) {\n continue;\n }\n const key = asNonEmptyString(row.key);\n const sizeBytes = asNumber(row.size_bytes);\n if (!key || sizeBytes === null || !Number.isInteger(sizeBytes) || sizeBytes < 0) {\n continue;\n }\n const last_modified = asNonEmptyString(row.last_modified) ?? undefined;\n objects.push({ key, size_bytes: sizeBytes, last_modified });\n }\n const is_truncated = asBooleanOrDefault(record.is_truncated, false);\n const nextRaw = record.next_continuation_token;\n const next_continuation_token =\n nextRaw === undefined || nextRaw === null ? null : String(nextRaw);\n return {\n mode: \"list\",\n success: asBooleanOrDefault(record.success, true),\n list_mode: true,\n bucket,\n objects,\n is_truncated,\n next_continuation_token,\n };\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 if (!Number.isInteger(sizeBytes) || sizeBytes < 0) {\n throw new Error(\"ls response has invalid size_bytes; expected non-negative integer\");\n }\n\n return {\n mode: \"stat\",\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: StorageLsRequest,\n options: ProxyStorageOptions = {},\n): Promise<StorageLsResponse> {\n return requestJsonViaProxy(\n STORAGE_LS_PROXY_PATH,\n jsonBodyForLsRequest(request),\n parseStorageLsResponse,\n options,\n );\n}\n\nexport async function requestStorageDownloadViaProxy(\n request: StorageObjectRequest,\n options: ProxyStorageOptions = {},\n): Promise<StorageDownloadProxyResponse> {\n return requestJsonViaProxy(\n STORAGE_DOWNLOAD_PROXY_PATH,\n jsonBodyForProxyDownloadRequest(request, options.downloadLocalBasename),\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 jsonBodyForObjectRequest(request),\n parseStorageDeleteResponse,\n options,\n );\n}\n\nexport async function forwardStorageLsToBackend(\n request: StorageLsRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\"/storage/ls\", \"POST\", jsonBodyForLsRequest(request), options);\n}\n\nexport async function forwardStorageDownloadToBackend(\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\n \"/storage/download\",\n \"POST\",\n jsonBodyForObjectRequest(request),\n options,\n );\n}\n\nexport async function forwardStorageDeleteToBackend(\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\n \"/storage/delete\",\n \"POST\",\n jsonBodyForObjectRequest(request),\n options,\n );\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 pathKey =\n options.localOutputBasename?.trim() && options.localOutputBasename.trim().length > 0\n ? options.localOutputBasename.trim()\n : objectKey;\n const filePath = resolveDownloadPath(outputDir, pathKey);\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\");\n/** Higher ceiling now that proxy + command share events.jsonl. */\nconst MAX_BYTES = 15 * 1024 * 1024;\nconst KEEP_ROTATED = 12;\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 { existsSync, readFileSync } from \"node:fs\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport { WALLET_FILE } from \"./auth.js\";\nimport { CLOUD_ONBOARDING_BLOCK_LINES } from \"./cloud-help-onboarding.js\";\nimport { createCloudCommand } from \"./cloud-command.js\";\nimport { firstTokenAndRest, parseVerboseToken, routeMnemosparkArgs } from \"./mnemospark-route.js\";\nimport type { PluginCommandContext, PluginCommandHandler, PluginCommandResult } from \"./types.js\";\n\nexport const MNEMOSPARK_ROOT_HELP_TEXT = [\n \"☁️ **mnemospark - Wallet and go.** 💙\",\n ...CLOUD_ONBOARDING_BLOCK_LINES,\n \"To view the full help menu use these commands:\",\n \"\",\n \"**Cloud storage**\",\n \"• `/mnemospark cloud help`\",\n \"\",\n \"**Wallet status and funding link:**\",\n \"• `/mnemospark wallet`\",\n \"• `/mnemospark wallet help`\",\n \"\",\n \"**Let your agent run mnemospark for you:**\",\n \"\",\n \"mnemospark installs as an OpenClaw extension under `~/.openclaw/extensions/mnemospark/`. Point your agent at the bundled skill:\",\n \"\",\n \"Install the mnemospark skill available at `~/.openclaw/extensions/mnemospark/skills/mnemospark/SKILL.md`\",\n].join(\"\\n\");\n\nexport const MNEMOSPARK_WALLET_HELP_TEXT = (address: string) =>\n [\n \"☁️ **mnemospark Wallet**\",\n \"\",\n \"**Commands:**\",\n \"• `/mnemospark wallet` — Show address, balance, and key file path\",\n \"• `/mnemospark wallet help` — This message\",\n \"• `/mnemospark wallet export` — Export private key for backup (sensitive)\",\n \"\",\n `**Fund with USDC on Base:** https://basescan.org/address/${address}`,\n ].join(\"\\n\");\n\nexport type RunMnemosparkSlashHandlerOptions = {\n cloudCommandHandler?: PluginCommandHandler;\n};\n\nlet defaultCloudCommandHandler: PluginCommandHandler | undefined;\n\nfunction getDefaultCloudCommandHandler(): PluginCommandHandler {\n defaultCloudCommandHandler ??= createCloudCommand().handler;\n return defaultCloudCommandHandler;\n}\n\nconst NO_WALLET_FOUND_TEXT =\n \"No mnemospark wallet found. Run `openclaw plugins install mnemospark`.\";\n\nfunction resolveWalletFileSync(): { walletKey: string; address: string } | null {\n try {\n if (!existsSync(WALLET_FILE)) {\n return null;\n }\n const walletKey = readFileSync(WALLET_FILE, \"utf-8\").trim();\n if (!walletKey.startsWith(\"0x\") || walletKey.length !== 66) {\n return null;\n }\n const account = privateKeyToAccount(walletKey as `0x${string}`);\n const address = account.address.replace(/\\s/g, \"\");\n if (!address) {\n return null;\n }\n return { walletKey, address };\n } catch {\n return null;\n }\n}\n\n/**\n * OpenClaw + CLI: same handler for `/mnemospark` (args = everything after the command name).\n */\nexport async function runMnemosparkSlashHandler(\n ctx: PluginCommandContext,\n options?: RunMnemosparkSlashHandlerOptions,\n): Promise<PluginCommandResult> {\n const route = routeMnemosparkArgs(ctx.args);\n\n if (route.kind === \"root-help\") {\n return { text: MNEMOSPARK_ROOT_HELP_TEXT };\n }\n\n if (route.kind === \"error\") {\n return { text: route.message, isError: true };\n }\n\n if (route.kind === \"cloud\") {\n const cloudCommandHandler = options?.cloudCommandHandler ?? getDefaultCloudCommandHandler();\n return cloudCommandHandler({ ...ctx, args: route.rest });\n }\n\n return handleWalletSlash(route.rest);\n}\n\nasync function handleWalletSlash(rest: string): Promise<PluginCommandResult> {\n const trimmed = rest.trim();\n if (!trimmed) {\n return buildWalletStatusResponse();\n }\n\n const { first, rest: afterFirst } = firstTokenAndRest(trimmed);\n const parsed = parseVerboseToken(first);\n if (!parsed.ok) {\n return {\n text: `Invalid token \"${first}\". Use name:true only with value true.`,\n isError: true,\n };\n }\n\n if (parsed.name === \"help\") {\n if (afterFirst.trim()) {\n return {\n text: \"Unexpected extra arguments after `help`. Use `/mnemospark wallet help` alone.\",\n isError: true,\n };\n }\n return buildWalletHelpResponse();\n }\n\n if (parsed.name === \"export\") {\n if (afterFirst.trim()) {\n return {\n text: \"Unexpected extra arguments after `export`. Use `/mnemospark wallet export` alone.\",\n isError: true,\n };\n }\n return buildWalletExportResponse();\n }\n\n if (parsed.name === \"status\") {\n return buildWalletStatusResponse();\n }\n\n return {\n text: `Unknown wallet command \"${parsed.name}\". Try \\`/mnemospark wallet help\\`.`,\n isError: true,\n };\n}\n\nasync function buildWalletStatusResponse(): Promise<PluginCommandResult> {\n const wallet = resolveWalletFileSync();\n if (!wallet) {\n return {\n text: NO_WALLET_FOUND_TEXT,\n isError: true,\n };\n }\n const { address } = wallet;\n\n let balanceText = \"Balance: (checking...)\";\n try {\n const monitor = new BalanceMonitor(address);\n const balance = await monitor.checkBalance();\n balanceText = `Balance: ${balance.balanceUSD}`;\n } catch {\n balanceText = \"Balance: (could not check)\";\n }\n\n return {\n text: [\n \"☁️ **mnemospark Wallet**\",\n \"\",\n `**Address:** \\`${address}\\``,\n `**${balanceText}**`,\n `**Key File:** \\`${WALLET_FILE}\\``,\n \"\",\n \"**Commands:**\",\n \"• `/mnemospark wallet` — Show this status\",\n \"• `/mnemospark wallet help` — Commands and funding link\",\n \"• `/mnemospark wallet export` — Export private key for backup\",\n \"\",\n `**Fund with USDC on Base:** https://basescan.org/address/${address}`,\n ].join(\"\\n\"),\n };\n}\n\nasync function buildWalletHelpResponse(): Promise<PluginCommandResult> {\n const wallet = resolveWalletFileSync();\n if (!wallet) {\n return {\n text: NO_WALLET_FOUND_TEXT,\n isError: true,\n };\n }\n const { address } = wallet;\n\n return { text: MNEMOSPARK_WALLET_HELP_TEXT(address) };\n}\n\nasync function buildWalletExportResponse(): Promise<PluginCommandResult> {\n const wallet = resolveWalletFileSync();\n if (!wallet) {\n return {\n text: NO_WALLET_FOUND_TEXT,\n isError: true,\n };\n }\n const { walletKey, address } = wallet;\n\n const addressDisplay = address.replace(/\\s/g, \"\");\n const keyDisplay = walletKey.replace(/\\s/g, \"\");\n return {\n text: [\n \"☁️ **mnemospark Wallet Export**\",\n \"\",\n \"⚠️ **SECURITY WARNING**: Your private key controls your wallet funds.\",\n \"Never share this key. Anyone with this key can spend your USDC.\",\n \"\",\n `**Address:** \\`${addressDisplay}\\``,\n \"\",\n \"**Private Key:**\",\n `\\`${keyDisplay}\\``,\n \"\",\n \"**To restore on a new machine:**\",\n \"1. Set the environment variable before running OpenClaw:\",\n ` \\`export MNEMOSPARK_WALLET_KEY=${keyDisplay}\\``,\n \"2. Or save to file:\",\n ` \\`mkdir -p ~/.openclaw/mnemospark/wallet && echo \"${keyDisplay}\" > ~/.openclaw/mnemospark/wallet/wallet.key && chmod 600 ~/.openclaw/mnemospark/wallet/wallet.key\\``,\n ].join(\"\\n\"),\n };\n}\n","export const CLOUD_ONBOARDING_BLOCK_LINES = [\n \"\",\n \"Start here to securely upload a file and we'll guide you along the way. Copy the line below and replace <file|directory> with the file or directory you'd like to save to the cloud and replace <friendly-name> with an easy to remember name.\",\n \"\",\n \"`/mnemospark cloud backup <file|directory> name:<friendly-name> async:true`\",\n \"\",\n];\n","import { spawn } from \"node:child_process\";\nimport {\n createCipheriv,\n createHash,\n randomBytes as randomBytesNode,\n randomUUID,\n} from \"node:crypto\";\nimport { createReadStream, createWriteStream, statfsSync } from \"node:fs\";\nimport { lstat, mkdir, readFile, readdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { finished } from \"node:stream/promises\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nimport {\n requestPaymentSettleViaProxy,\n requestStorageUploadConfirmViaProxy,\n requestStorageUploadViaProxy,\n parsePriceStorageQuoteRequest,\n requestPriceStorageViaProxy,\n type BackendSettleForwardResult,\n type StorageUploadConfirmRequest,\n type StorageUploadRequest,\n type StorageUploadResponse,\n type UploadPayload,\n type PriceStorageQuoteRequest,\n type PriceStorageQuoteResponse,\n type ProxySettleOptions,\n type ProxyUploadConfirmOptions,\n type ProxyQuoteOptions,\n type ProxyUploadOptions,\n} from \"./cloud-price-storage.js\";\nimport { buildMnemosparkLsMessage } from \"./cloud-ls-format.js\";\nimport {\n parseStorageObjectRequest,\n requestStorageDeleteViaProxy,\n requestStorageDownloadViaProxy,\n requestStorageLsViaProxy,\n sanitizeFriendlyNameForLocalBasename,\n type ProxyStorageOptions,\n type StorageDeleteResponse,\n type StorageDownloadProxyResponse,\n type StorageLsRequest,\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 {\n createCloudDatastore,\n type CloudDatastore,\n type CronJobRow,\n type QuoteLookup,\n} from \"./cloud-datastore.js\";\nimport { appendJsonlEvent } from \"./cloud-jsonl.js\";\nimport type { RequestCorrelation } from \"./cloud-correlation.js\";\nimport { normalizeInputForParsing } from \"./args/normalize.js\";\nimport { parseCommandArgs, valuesToStringRecord } from \"./args/parser.js\";\nimport { parseVerboseToken } from \"./mnemospark-route.js\";\nimport {\n backupFlagsSchema,\n deleteSchema,\n downloadSchema,\n lsSchema,\n opStatusSchema,\n paymentSettleSchema,\n priceStorageSchema,\n uploadSchema,\n} from \"./arg-schemas.js\";\nimport { CLOUD_ONBOARDING_BLOCK_LINES } from \"./cloud-help-onboarding.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 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;\n/** Node `fs.readFile` rejects files larger than this (ERR_FS_FILE_TOO_LARGE). */\nconst NODE_FS_MAX_READFILE_BYTES = 2147483648;\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 TAR_OVERHEAD_BYTES = 10 * 1024 * 1024; // Conservative headroom for tar metadata.\n\nconst QUOTE_VALIDITY_USER_NOTE =\n \"Quotes are valid for one hour. Please run price-storage again if you need a new quote.\";\nconst MNEMOSPARK_SUPPORT_EMAIL = \"pluggedin@mnemospark.ai\";\n\nconst CLOUD_HELP_FOOTER_STATE =\n \"Local state: mnemospark records quotes, objects, payments, cron jobs, friendly names, and operation metadata in ~/.openclaw/mnemospark/state.db (SQLite). For troubleshooting and correlation, commands and the HTTP proxy append structured JSON lines to ~/.openclaw/mnemospark/events.jsonl. Monthly storage billing jobs are listed in ~/.openclaw/cron/jobs.json for OpenClaw scheduling.\";\n\nconst REQUIRED_PRICE_STORAGE =\n \"wallet-address:, object-id:, gb:, provider:, region: (object-id-hash: optional if the object exists in local SQLite after backup)\";\nconst REQUIRED_UPLOAD = \"quote-id:, wallet-address:, object-id:, object-id-hash:\";\nconst REQUIRED_BACKUP = \"<file|directory> and name:<friendly-name>\";\nconst REQUIRED_PAYMENT_SETTLE = \"wallet-address: and (quote-id: | renewal:true with object-key:)\";\nconst REQUIRED_STORAGE_OBJECT =\n \"wallet-address: and one of (object-key: | name: [latest:true|at:<timestamp>])\";\nconst REQUIRED_LS =\n \"wallet-address: (for one object add object-key: or name: [latest:true|at:<timestamp>]; omit both to list the bucket)\";\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 - Wallet and go.** 💙\",\n ...CLOUD_ONBOARDING_BLOCK_LINES,\n \"**Syntax:** use `/mnemospark cloud …`. Prefer `key:value` for arguments; `key=value` and `--key value` are also accepted. Optional verbose markers: `cloud:true`, `price-storage:true`, etc. Aliases: `wallet:` → wallet-address, `object:` → object-id, `quote:` → quote-id, `hash:` → object-id-hash.\",\n \"\",\n \"**Cloud Commands**\",\n \"\",\n \"• `/mnemospark cloud` or `/mnemospark cloud help` — show this message (equivalent: `/mnemospark cloud:true help:true`)\",\n \"\",\n \"• `/mnemospark cloud backup <file|directory> name:<friendly-name> [async:true] [orchestrator:<inline|subagent>] [timeout-seconds:<n>]`\",\n \" Purpose: create a local tar+gzip archive under ~/.openclaw/mnemospark/backup (filename from sanitized friendly name) and record metadata in SQLite for later price-storage and upload.\",\n \" Required: \" + REQUIRED_BACKUP,\n \"\",\n \"• `/mnemospark cloud price-storage wallet-address:<addr> object-id:<id> [object-id-hash:<hash>] gb:<gb> provider:aws region:us-east-1`\",\n \" Purpose: request a storage quote before upload (defaults shown; override `provider:` / `region:` for other regions). Omit `object-id-hash:` when the object is already in local SQLite (e.g. after backup); mnemospark reads sha256 from ~/.openclaw/mnemospark/state.db.\",\n \" Required: \" + REQUIRED_PRICE_STORAGE,\n \" Shorter: `wallet:… object:… [hash:…] gb:… provider:… region:…`\",\n \"\",\n \"• `/mnemospark cloud upload quote-id:<quote-id> wallet-address:<addr> object-id:<id> object-id-hash:<hash> [name:<friendly-name>] [async:true] [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 payment-settle (quote-id:<quote-id> | renewal:true object-key:<key>) wallet-address:<addr> [object-id:<id>] [storage-price:<n>]`\",\n \" Purpose: settle storage payment before upload (quote) or on the monthly cron (renewal, no new quote). Uses the same proxy + x402 path as upload pre-settlement.\",\n \" Required: \" + REQUIRED_PAYMENT_SETTLE + \" (wallet private key must match the address).\",\n \"\",\n \"• `/mnemospark cloud ls wallet-address:<addr> [object-key:<key> | name:<friendly-name> | omit both to list bucket] [latest:true|at:<timestamp>]`\",\n \" Purpose: stat one object or list all keys in the wallet bucket (S3).\",\n \" Required: \" + REQUIRED_LS,\n \"\",\n \"• `/mnemospark cloud download wallet-address:<addr> [object-key:<object-key> | name:<friendly-name>] [latest:true|at:<timestamp>] [async:true] [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:true|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:true]`\",\n \" Purpose: inspect async operation status, or request cancellation for subagent runs.\",\n \" Required: operation-id:<id>\",\n \"\",\n \"Async orchestration flags (`backup`, `upload`, `download` only):\",\n \"• `async:true`\",\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:true` and `orchestrator:subagent`.\",\n \" `n` must be a positive integer (seconds).\",\n \"• `op-status` with `cancel:true`\",\n \" Cancel a subagent-orchestrated operation by operation-id (idempotent).\",\n \"\",\n \"Examples:\",\n \"• `/mnemospark cloud upload ... async:true orchestrator:subagent`\",\n \"• `/mnemospark cloud download ... async:true orchestrator:subagent timeout-seconds:900`\",\n \"• `/mnemospark cloud op-status operation-id:<id>`\",\n \"• `/mnemospark cloud op-status operation-id:<id> cancel:true`\",\n \"\",\n CLOUD_HELP_FOOTER_STATE,\n \"\",\n \"Backup uses your configured mnemospark wallet key (no `wallet-address:` argument). Commands price-storage, upload, ls, download, delete, and payment-settle require `wallet-address:<addr>` (or `wallet:<addr>`) on the command line (must match that wallet).\",\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 PaymentSettleCommandRequest = {\n wallet_address: string;\n renewal?: boolean;\n quote_id?: string;\n object_id?: string;\n object_key?: string;\n storage_price?: number;\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 /** Sanitized basename for the archive file under tmpDir (production backup). */\n archiveBasename?: string;\n};\n\ntype BackupObjectResult = {\n objectId: string;\n objectIdHash: string;\n objectSizeGb: string;\n archivePath: 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\";\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-async\" }\n | { mode: \"backup-invalid-name\" }\n | { mode: \"price-storage\"; priceStorageRequest: PriceStorageQuoteRequest }\n | {\n mode: \"price-storage-resolve-hash\";\n priceStoragePartial: {\n wallet_address: string;\n object_id: string;\n gb: number;\n provider: string;\n region: string;\n };\n }\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: \"payment-settle\"; paymentSettleRequest: PaymentSettleCommandRequest }\n | { mode: \"payment-settle-invalid\" }\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 | { mode: \"arg-parse-failure\"; errors: string[]; warnings: string[] };\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 proxySettleOptions?: ProxySettleOptions;\n proxyUploadConfirmOptions?: ProxyUploadConfirmOptions;\n requestPaymentSettleViaProxyFn?: (\n quoteId: string,\n walletAddress: string,\n options?: ProxySettleOptions,\n ) => Promise<BackendSettleForwardResult>;\n requestStorageLsFn?: (\n request: StorageLsRequest,\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 openClawCronAdapter?: OpenClawCronAdapter;\n subagentOrchestrator?: MnemosparkSubagentOrchestrator;\n proxyStorageOptions?: ProxyStorageOptions;\n mnemosparkHomeDir?: 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 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\n/** Like parseObjectSelector but allows wallet-only list mode (no key, no --name). */\nfunction parseLsObjectSelector(\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 (latest && at) return null;\n if (!objectKey && !name && (latest || at)) return null;\n\n if (objectKey) return { objectKey };\n if (name) return { nameSelector: { name, latest, at } };\n return {};\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:` and `timeout-seconds:` require `async:true`, 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 const isAsyncControlKey = (rawKey: string): boolean => {\n const canonical = rawKey.trim().toLowerCase().replace(/_/g, \"-\");\n return canonical === \"async\" || canonical === \"orchestrator\" || canonical === \"timeout-seconds\";\n };\n const isBareBooleanFlag = (rawToken: string): boolean => {\n const canonical = rawToken.trim().toLowerCase().replace(/^--/, \"\").replace(/_/g, \"-\");\n return canonical === \"async\" || canonical === \"latest\";\n };\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 const previousToken = tokens[idx - 1];\n if (previousToken && previousToken.startsWith(\"--\") && !isBareBooleanFlag(previousToken)) {\n filtered.push(token);\n continue;\n }\n const unwrapped = stripWrappingQuotes(token);\n const colonIdx = unwrapped.indexOf(\":\");\n const equalsIdx = unwrapped.indexOf(\"=\");\n const splitIdx =\n colonIdx > 0 && equalsIdx > 0 ? Math.min(colonIdx, equalsIdx) : Math.max(colonIdx, equalsIdx);\n if (splitIdx > 0) {\n const candidateKey = unwrapped.slice(0, splitIdx);\n if (/^[A-Za-z_][A-Za-z0-9_-]*$/.test(candidateKey) && isAsyncControlKey(candidateKey)) {\n continue;\n }\n }\n filtered.push(token);\n }\n return filtered.join(\" \");\n}\n\nfunction mergeArgParseWarnings(a: string[], b: string[]): string[] {\n return [...a, ...b];\n}\n\nasync function resolvePriceStorageHashFromDatastore(\n datastore: CloudDatastore,\n partial: {\n wallet_address: string;\n object_id: string;\n gb: number;\n provider: string;\n region: string;\n },\n): Promise<{ ok: true; request: PriceStorageQuoteRequest } | { ok: false; message: string }> {\n await datastore.ensureReady();\n const row = await datastore.findObjectById(partial.object_id.trim());\n const wallet = partial.wallet_address.trim().toLowerCase();\n if (!row) {\n return {\n ok: false,\n message:\n \"Cannot resolve object-id-hash: no object found in local SQLite for this object-id. Run backup first, or pass --object-id-hash explicitly.\",\n };\n }\n if (row.wallet_address.trim().toLowerCase() !== wallet) {\n return {\n ok: false,\n message:\n \"Cannot resolve object-id-hash: wallet-address does not match the object record in ~/.openclaw/mnemospark/state.db.\",\n };\n }\n const sha = row.sha256?.trim();\n if (!sha) {\n return {\n ok: false,\n message:\n \"Cannot resolve object-id-hash: local object record has no sha256 yet. Run backup first, or pass --object-id-hash explicitly.\",\n };\n }\n return {\n ok: true,\n request: {\n wallet_address: partial.wallet_address.trim(),\n object_id: partial.object_id.trim(),\n object_id_hash: sha.replace(/\\s/g, \"\"),\n gb: partial.gb,\n provider: partial.provider.trim(),\n region: partial.region.trim(),\n },\n };\n}\n\n/** Exported for unit tests (`parseCommandArgs` integration across subcommands). */\nexport function parseCloudArgs(args?: string): ParsedCloudArgs {\n const trimmed = args?.trim() ?? \"\";\n if (!trimmed) {\n return { mode: \"help\" };\n }\n\n const norm = normalizeInputForParsing(trimmed);\n const text = norm.text;\n const normWarnings = norm.warnings;\n\n const spaceIdx = text.search(/\\s/);\n const rawFirst = spaceIdx === -1 ? text : text.slice(0, spaceIdx);\n const rest = spaceIdx === -1 ? \"\" : text.slice(spaceIdx + 1).trim();\n\n const subParsed = parseVerboseToken(rawFirst);\n if (!subParsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: [`Invalid subcommand token \"${rawFirst}\". Use name:true only with value true.`],\n warnings: normWarnings,\n };\n }\n\n const subcommand = subParsed.name;\n\n if (subcommand === \"help\") {\n return { mode: \"help\" };\n }\n\n if (subcommand === \"backup\") {\n const tokens = tokenizeArgsRaw(rest);\n if (tokens.length === 0) {\n return { mode: \"unknown\" };\n }\n const backupTarget = stripWrappingQuotes(tokens[0] ?? \"\");\n if (!backupTarget) {\n return { mode: \"unknown\" };\n }\n const remainingTokens = tokens.slice(1);\n const flagsPart = remainingTokens.join(\" \");\n const parsed = parseCommandArgs(flagsPart, backupFlagsSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\n const asyncArgs = parseAsyncOperationArgs(flags);\n if (!asyncArgs) {\n return { mode: \"backup-invalid-async\" };\n }\n const friendlyName = flags.name?.trim();\n if (!friendlyName) {\n return { mode: \"backup-invalid-name\" };\n }\n return {\n mode: \"backup\",\n backupTarget,\n friendlyName,\n ...asyncArgs,\n };\n }\n\n if (subcommand === \"price-storage\") {\n const parsed = parseCommandArgs(rest, priceStorageSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\n const gb = Number.parseFloat(flags.gb ?? \"\");\n const hashRaw = flags[\"object-id-hash\"]?.trim();\n const walletAddress = flags[\"wallet-address\"]?.trim();\n const objectId = flags[\"object-id\"]?.trim();\n const provider = flags.provider?.trim();\n const region = flags.region?.trim();\n\n if (!walletAddress || !objectId || !provider || !region || !Number.isFinite(gb)) {\n return { mode: \"price-storage-invalid\" };\n }\n\n if (hashRaw) {\n const request = parsePriceStorageQuoteRequest({\n wallet_address: walletAddress,\n object_id: objectId,\n object_id_hash: hashRaw,\n gb,\n provider,\n region,\n });\n if (!request) {\n return { mode: \"price-storage-invalid\" };\n }\n return { mode: \"price-storage\", priceStorageRequest: request };\n }\n\n return {\n mode: \"price-storage-resolve-hash\",\n priceStoragePartial: {\n wallet_address: walletAddress,\n object_id: objectId,\n gb,\n provider,\n region,\n },\n };\n }\n\n if (subcommand === \"upload\") {\n const parsed = parseCommandArgs(rest, uploadSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\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 === \"payment-settle\") {\n const parsed = parseCommandArgs(rest, paymentSettleSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\n const walletAddress = flags[\"wallet-address\"]?.trim();\n if (!walletAddress) {\n return { mode: \"payment-settle-invalid\" };\n }\n const isRenewal = flags.renewal === \"true\";\n const quoteId = flags[\"quote-id\"]?.trim();\n const objectKey = flags[\"object-key\"]?.trim();\n if (isRenewal) {\n if (quoteId) {\n return { mode: \"payment-settle-invalid\" };\n }\n if (!objectKey) {\n return { mode: \"payment-settle-invalid\" };\n }\n } else if (!quoteId) {\n return { mode: \"payment-settle-invalid\" };\n }\n let storagePrice: number | undefined;\n if (flags[\"storage-price\"] !== undefined && flags[\"storage-price\"] !== \"\") {\n const raw = flags[\"storage-price\"]?.trim() ?? \"\";\n const n = Number.parseFloat(raw);\n if (!Number.isFinite(n) || n < 0) {\n return { mode: \"payment-settle-invalid\" };\n }\n storagePrice = n;\n }\n return {\n mode: \"payment-settle\",\n paymentSettleRequest: {\n wallet_address: walletAddress,\n renewal: isRenewal || undefined,\n quote_id: quoteId || undefined,\n object_id: flags[\"object-id\"]?.trim() || undefined,\n object_key: objectKey || undefined,\n storage_price: storagePrice,\n },\n };\n }\n\n if (subcommand === \"ls\") {\n const parsed = parseCommandArgs(rest, lsSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\n const walletAddress = flags[\"wallet-address\"]?.trim() ?? \"\";\n if (!walletAddress) {\n return { mode: \"ls-invalid\" };\n }\n const selector = parseLsObjectSelector(flags);\n if (!selector) {\n return { mode: \"ls-invalid\" };\n }\n const location = flags.location?.trim() || flags.region?.trim() || undefined;\n if (selector.nameSelector) {\n return {\n mode: \"ls\",\n storageObjectRequest: { wallet_address: walletAddress, location },\n nameSelector: selector.nameSelector,\n };\n }\n if (selector.objectKey) {\n return {\n mode: \"ls\",\n storageObjectRequest: {\n wallet_address: walletAddress,\n object_key: selector.objectKey,\n location,\n },\n };\n }\n return {\n mode: \"ls\",\n storageObjectRequest: { wallet_address: walletAddress, location },\n };\n }\n\n if (subcommand === \"download\") {\n const parsed = parseCommandArgs(rest, downloadSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\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 parsed = parseCommandArgs(rest, deleteSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\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 parsed = parseCommandArgs(rest, opStatusSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\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\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\nasync function resolveLocalUploadArchivePath(\n backupDir: string,\n objectId: string,\n friendlyName: string,\n): Promise<{ ok: true; archivePath: string } | { ok: false; message: string }> {\n if (friendlyName?.trim()) {\n try {\n const sanitized = sanitizeFriendlyNameForLocalBasename(friendlyName);\n const candidate = join(backupDir, sanitized);\n try {\n const st = await stat(candidate);\n if (st.isFile()) {\n return { ok: true, archivePath: candidate };\n }\n } catch {\n // Missing friendly-name path; try legacy.\n }\n } catch {\n // Invalid friendly name for path; try legacy.\n }\n }\n\n const legacyPath = join(backupDir, objectId);\n try {\n const legacyStats = await stat(legacyPath);\n if (!legacyStats.isFile()) {\n return {\n ok: false,\n message: `Cannot upload storage object: local archive path is not a file (${legacyPath}).`,\n };\n }\n return { ok: true, archivePath: legacyPath };\n } catch {\n return {\n ok: false,\n message: `Cannot upload storage object: local archive not found. Run /mnemospark cloud backup with name:<friendly-name> (canonical layout) or restore the legacy file at ${legacyPath}.`,\n };\n }\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 archiveBaseSegment = options.archiveBasename?.trim() || objectId;\n const archivePath = join(tmpDir, archiveBaseSegment);\n\n if (options.archiveBasename?.trim()) {\n try {\n const existing = await stat(archivePath);\n if (existing.isFile() || existing.isDirectory()) {\n throw new Error(\n `Backup archive path already exists: ${archivePath}. Choose a different --name.`,\n );\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"already exists\")) {\n throw err;\n }\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw err;\n }\n }\n }\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 return {\n objectId,\n objectIdHash,\n objectSizeGb,\n archivePath,\n };\n } catch (error) {\n await rm(archivePath, { force: true }).catch(() => undefined);\n throw error;\n }\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 OpenClawCronSchedule = {\n kind: \"cron\";\n expr: string;\n tz: string;\n};\n\ntype OpenClawCronPayload = {\n kind: \"agentTurn\";\n message: string;\n};\n\ntype OpenClawCronDelivery = {\n mode: \"announce\";\n text: string;\n};\n\ntype OpenClawCronJobEntry = {\n jobId: string;\n name: string;\n schedule: OpenClawCronSchedule;\n payload: OpenClawCronPayload;\n sessionTarget: \"isolated\";\n delivery: OpenClawCronDelivery;\n};\n\ntype OpenClawCronJobForLookup = {\n jobId: string;\n message: string;\n};\n\ntype OpenClawCronAdapter = {\n add: (job: OpenClawCronJobEntry) => Promise<{ jobId: string }>;\n remove: (jobId: string) => Promise<boolean>;\n list: () => Promise<OpenClawCronJobForLookup[]>;\n};\n\nfunction normalizeOpenClawCronJobForLookup(value: unknown): OpenClawCronJobForLookup | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n const record = value as Record<string, unknown>;\n const jobIdRaw = typeof record.jobId === \"string\" ? record.jobId : record.id;\n const jobId = typeof jobIdRaw === \"string\" ? jobIdRaw.trim() : \"\";\n const payloadRaw = record.payload;\n if (!jobId || !payloadRaw || typeof payloadRaw !== \"object\") {\n return null;\n }\n const payloadRecord = payloadRaw as Record<string, unknown>;\n const payloadKind = payloadRecord.kind;\n const payloadMessage =\n typeof payloadRecord.message === \"string\" ? payloadRecord.message.trim() : \"\";\n if (payloadKind !== \"agentTurn\" || !payloadMessage) {\n return null;\n }\n\n return {\n jobId,\n message: payloadMessage,\n };\n}\n\ntype OpenClawCliResult = { stdout: string; stderr: string };\n\nasync function runOpenClawCli(args: string[], homeDir?: string): Promise<OpenClawCliResult> {\n return await new Promise<OpenClawCliResult>((resolvePromise, rejectPromise) => {\n let stdout = \"\";\n let stderr = \"\";\n const child = spawn(\"openclaw\", args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: {\n ...process.env,\n HOME: homeDir ?? process.env.HOME,\n },\n });\n child.stdout.on(\"data\", (chunk) => {\n stdout += chunk.toString();\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({ stdout, stderr });\n return;\n }\n rejectPromise(\n new Error(\n stderr.trim() ||\n stdout.trim() ||\n `openclaw ${args.join(\" \")} exited with code ${code ?? \"unknown\"}`,\n ),\n );\n });\n });\n}\n\nfunction parseOpenClawCliJson<T>(stdout: string, commandLabel: string): T {\n const trimmed = stdout.trim();\n if (!trimmed) {\n throw new Error(`openclaw ${commandLabel} returned empty JSON output`);\n }\n try {\n return JSON.parse(trimmed) as T;\n } catch {\n throw new Error(`openclaw ${commandLabel} returned invalid JSON output`);\n }\n}\n\nfunction createOpenClawCliCronAdapter(homeDir?: string): OpenClawCronAdapter {\n return {\n add: async (job) => {\n const { stdout } = await runOpenClawCli(\n [\n \"cron\",\n \"add\",\n \"--name\",\n job.name,\n \"--cron\",\n job.schedule.expr,\n \"--tz\",\n job.schedule.tz,\n \"--session\",\n job.sessionTarget,\n \"--message\",\n job.payload.message,\n \"--announce\",\n \"--description\",\n job.delivery.text,\n \"--json\",\n ],\n homeDir,\n );\n const payload = parseOpenClawCliJson<Record<string, unknown>>(stdout, \"cron add\");\n const createdIdRaw = typeof payload.id === \"string\" ? payload.id : payload.jobId;\n const createdId = typeof createdIdRaw === \"string\" ? createdIdRaw.trim() : \"\";\n if (!createdId) {\n throw new Error(\"openclaw cron add did not return a job id\");\n }\n return { jobId: createdId };\n },\n remove: async (jobId) => {\n const { stdout } = await runOpenClawCli([\"cron\", \"rm\", jobId, \"--json\"], homeDir);\n const payload = parseOpenClawCliJson<Record<string, unknown>>(stdout, \"cron rm\");\n if (typeof payload.removed === \"boolean\") {\n return payload.removed;\n }\n return true;\n },\n list: async () => {\n const { stdout } = await runOpenClawCli([\"cron\", \"list\", \"--all\", \"--json\"], homeDir);\n const payload = parseOpenClawCliJson<Record<string, unknown>>(stdout, \"cron list\");\n const jobsRaw = Array.isArray(payload.jobs) ? payload.jobs : [];\n return jobsRaw\n .map((entry) => normalizeOpenClawCronJobForLookup(entry))\n .filter((entry): entry is OpenClawCronJobForLookup => entry !== null);\n },\n };\n}\n\n/** Latest matching OpenClaw cron job in jobs.json for an object key (scan from end of file). */\nasync function findCronJobInOpenClawCronJobsByObjectKey(\n objectKey: string,\n adapter: OpenClawCronAdapter,\n): Promise<{ cronId: string; objectId: string; objectKey: string } | null> {\n const cronJobs = await adapter.list();\n for (let idx = cronJobs.length - 1; idx >= 0; idx -= 1) {\n const cronJob = cronJobs[idx];\n const parsed = parseStoragePaymentCronCommand(cronJob.message);\n if (parsed && parsed.objectKey === objectKey) {\n return {\n cronId: cronJob.jobId,\n objectId: parsed.objectId,\n objectKey: parsed.objectKey,\n };\n }\n }\n return null;\n}\n\nfunction quoteCronArgument(value: string | number): string {\n return JSON.stringify(String(value));\n}\n\ntype StoragePaymentRenewalJobFields = {\n walletAddress: string;\n objectId: string;\n objectKey: string;\n storagePrice: number;\n};\n\n/** Args after `cloud` for `node …/cli.js cloud …` (same shape as `/mnemospark cloud` args after the command name). */\nfunction buildStoragePaymentRenewalArgs(job: StoragePaymentRenewalJobFields): string {\n return [\n \"payment-settle\",\n \"--renewal\",\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\nfunction buildStoragePaymentCronCommand(job: StoragePaymentRenewalJobFields): string {\n return `/mnemospark cloud ${buildStoragePaymentRenewalArgs(job)}`;\n}\n\nfunction buildOpenClawRenewalAgentMessage(openClawHome: string, renewalArgs: string): string {\n const cliPath = join(openClawHome, \".openclaw/extensions/mnemospark/dist/cli.js\");\n return `Execute: node ${cliPath} cloud ${renewalArgs}`;\n}\n\nfunction parseStoragePaymentCronCommand(\n command: string,\n): { objectId: string; objectKey: string } | null {\n const objectIdMatch = command.match(/--object-id\\s+(\"([^\"\\\\]|\\\\.)*\"|'([^'\\\\]|\\\\.)*'|\\S+)/);\n const objectKeyMatch = command.match(/--object-key\\s+(\"([^\"\\\\]|\\\\.)*\"|'([^'\\\\]|\\\\.)*'|\\S+)/);\n if (!objectIdMatch || !objectKeyMatch) {\n return null;\n }\n\n const parseToken = (token: string): string | null => {\n const trimmed = token.trim();\n if (!trimmed) {\n return null;\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n try {\n return JSON.parse(trimmed);\n } catch {\n return trimmed.slice(1, -1);\n }\n }\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n };\n\n const objectId = parseToken(objectIdMatch[1] ?? \"\");\n const objectKey = parseToken(objectKeyMatch[1] ?? \"\");\n if (!objectId || !objectKey) {\n return null;\n }\n\n return { objectId, objectKey };\n}\n\nasync function appendStoragePaymentCronJob(\n cronJob: StoragePaymentCronJob,\n adapter: OpenClawCronAdapter,\n payloadMessage: string,\n): Promise<{ jobId: string }> {\n const openClawJob: OpenClawCronJobEntry = {\n jobId: cronJob.cronId,\n name: \"Mnemospark Monthly Renewal\",\n schedule: {\n kind: \"cron\",\n expr: PAYMENT_CRON_SCHEDULE,\n tz: \"UTC\",\n },\n payload: {\n kind: \"agentTurn\",\n message: payloadMessage,\n },\n sessionTarget: \"isolated\",\n delivery: {\n mode: \"announce\",\n text: \"Thank you for using mnemospark cloud storage. Your renewal has been processed.\",\n },\n };\n return adapter.add(openClawJob);\n}\n\nasync function removeStoragePaymentCronJob(\n cronId: string,\n adapter: OpenClawCronAdapter,\n): Promise<boolean> {\n return adapter.remove(cronId);\n}\n\nasync function createStoragePaymentCronJob(\n upload: StorageUploadResponse,\n storagePrice: number,\n openClawCronAdapter: OpenClawCronAdapter,\n openClawHomeDir: string,\n nowDateFn: () => Date = () => new Date(),\n): Promise<StoragePaymentCronJob> {\n const renewalFields: StoragePaymentRenewalJobFields = {\n walletAddress: upload.addr,\n objectId: upload.object_id,\n objectKey: upload.object_key,\n storagePrice,\n };\n const renewalArgs = buildStoragePaymentRenewalArgs(renewalFields);\n const provisionalCronId = randomUUID();\n const cronJob: StoragePaymentCronJob = {\n cronId: provisionalCronId,\n createdAt: nowDateFn().toISOString(),\n schedule: PAYMENT_CRON_SCHEDULE,\n command: buildStoragePaymentCronCommand(renewalFields),\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 const payloadMessage = buildOpenClawRenewalAgentMessage(openClawHomeDir, renewalArgs);\n const created = await appendStoragePaymentCronJob(cronJob, openClawCronAdapter, payloadMessage);\n // Use the actual OpenClaw job id so datastore and delete cleanup stay in sync.\n if (created.jobId?.trim()) {\n cronJob.cronId = created.jobId.trim();\n }\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\nexport function 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\n/**\n * Stream plaintext from disk through AES-256-GCM and write `nonce || ciphertext || tag`\n * to `outPath`. Same wire format as {@link encryptAesGcm}.\n */\nexport async function encryptPlaintextFileToAesGcmPath(\n plaintextPath: string,\n dek: Buffer,\n outPath: string,\n randomFn: (size: number) => Buffer = randomBytesNode,\n): Promise<void> {\n if (dek.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\", dek, nonce);\n const writeStream = createWriteStream(outPath, { flags: \"w\" });\n writeStream.write(nonce);\n try {\n for await (const chunk of createReadStream(plaintextPath)) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n const out = cipher.update(buf);\n if (out.length) {\n await new Promise<void>((resolve, reject) => {\n writeStream.write(out, (err) => (err ? reject(err) : resolve()));\n });\n }\n }\n const final = cipher.final();\n const tag = cipher.getAuthTag();\n await new Promise<void>((resolve, reject) => {\n writeStream.write(final, (err) => (err ? reject(err) : resolve()));\n });\n await new Promise<void>((resolve, reject) => {\n writeStream.write(tag, (err) => (err ? reject(err) : resolve()));\n });\n writeStream.end();\n await finished(writeStream);\n } catch (err) {\n writeStream.destroy();\n throw err;\n }\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 /** Set when the archive was small enough to buffer; null when using {@link encryptedTempPath}. */\n encryptedContent: Buffer | null;\n /** Encrypted ciphertext file (presigned path); remove after upload completes. */\n encryptedTempPath?: string;\n};\n\nasync function prepareUploadPayload(\n archivePath: string,\n walletAddress: string,\n homeDir?: string,\n): Promise<PreparedUploadPayload> {\n const archiveStat = await stat(archivePath);\n if (!archiveStat.isFile()) {\n throw new Error(`Cannot read backup archive: not a file (${archivePath}).`);\n }\n\n const { kek, keyPath } = await loadOrCreateKek(walletAddress, homeDir);\n const dek = randomBytesNode(32);\n const wrappedDek = encryptAesGcm(dek, kek);\n\n if (archiveStat.size >= NODE_FS_MAX_READFILE_BYTES) {\n const encryptedTempPath = join(tmpdir(), `mnemospark-upload-${randomUUID()}.enc`);\n try {\n await encryptPlaintextFileToAesGcmPath(archivePath, dek, encryptedTempPath);\n const encStat = await stat(encryptedTempPath);\n const payloadHash = await sha256File(encryptedTempPath);\n\n const payload: UploadPayload = {\n mode: \"presigned\",\n content_base64: undefined,\n content_sha256: payloadHash,\n content_length_bytes: encStat.size,\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: null,\n encryptedTempPath,\n };\n } catch (err) {\n await rm(encryptedTempPath, { force: true }).catch(() => {});\n throw err;\n }\n }\n\n const plaintext = await readFile(archivePath);\n const encryptedContent = encryptAesGcm(plaintext, dek);\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\ntype PresignedPutFetchInit = RequestInit & { duplex?: \"half\" };\n\nfunction presignedPutBodyInit(\n encryptedContent: Buffer | null,\n encryptedTempPath: string | undefined,\n): { body: BodyInit; duplex?: \"half\" } {\n if (encryptedTempPath?.trim()) {\n const body = Readable.toWeb(createReadStream(encryptedTempPath)) as unknown as BodyInit;\n return { body, duplex: \"half\" };\n }\n if (encryptedContent) {\n return { body: new Uint8Array(encryptedContent) };\n }\n throw new Error(\"Cannot upload storage object: missing encrypted payload body.\");\n}\n\nasync function uploadPresignedObjectIfNeeded(\n uploadResponse: StorageUploadResponse,\n uploadMode: UploadPayload[\"mode\"],\n encryptedContent: Buffer | null,\n encryptedTempPath: string | undefined,\n fetchImpl: FetchLike = fetch,\n /** Required for stream PUTs: S3 rejects chunked bodies (Transfer-Encoding) unless length is fixed. */\n presignedStreamContentLengthBytes?: number,\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 if (encryptedTempPath?.trim()) {\n const len = presignedStreamContentLengthBytes ?? (await stat(encryptedTempPath.trim())).size;\n if (!headers.has(\"content-length\")) {\n headers.set(\"content-length\", String(len));\n }\n }\n\n const { body, duplex } = presignedPutBodyInit(encryptedContent, encryptedTempPath);\n const firstInit: PresignedPutFetchInit = {\n method: \"PUT\",\n headers,\n body,\n redirect: \"manual\",\n };\n if (duplex) {\n firstInit.duplex = duplex;\n }\n const firstAttempt = await fetchImpl(uploadResponse.upload_url, firstInit);\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 retryBody = presignedPutBodyInit(encryptedContent, encryptedTempPath);\n const retryInit: PresignedPutFetchInit = {\n method: \"PUT\",\n headers,\n body: retryBody.body,\n };\n if (retryBody.duplex) {\n retryInit.duplex = retryBody.duplex;\n }\n const redirectedAttempt = await fetchImpl(location, retryInit);\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\nfunction envMeansExplicitRemoveOrKeep(value: string | undefined): boolean | null {\n if (value === undefined) {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const n = trimmed.toLowerCase();\n if (n === \"0\" || n === \"false\" || n === \"no\" || n === \"n\") {\n return false;\n }\n if (n === \"1\" || n === \"true\" || n === \"yes\" || n === \"y\") {\n return true;\n }\n return null;\n}\n\nfunction shouldRemoveLocalBackupAfterUpload(): boolean {\n const parsed = envMeansExplicitRemoveOrKeep(process.env.MNEMOSPARK_REMOVE_BACKUP_FILE);\n if (parsed !== null) {\n return parsed;\n }\n return true;\n}\n\nasync function maybeCleanupLocalBackupArchive(archivePath: string): Promise<void> {\n if (!shouldRemoveLocalBackupAfterUpload()) {\n return;\n }\n try {\n await rm(archivePath, { force: true });\n } catch {\n // Best-effort cleanup; ignore failures.\n }\n}\n\n/** Markdown fenced block for a single copy-paste command line (matches cloud ls table style). */\nfunction formatMnemosparkCommandCopyBlock(commandLine: string): string {\n return [\"```\", commandLine, \"```\"].join(\"\\n\");\n}\n\nfunction formatStorageUploadUserMessage(upload: StorageUploadResponse, cronJobId: string): string {\n const lsCommand = `/mnemospark cloud ls wallet-address:${upload.addr}`;\n return [\n `Your file \\`${upload.object_id}\\` with key \\`${upload.object_key}\\` has been stored using \\`${upload.provider}\\` in folder \\`${upload.bucket_name}\\` in region \\`${upload.location}\\``,\n \"\",\n `A cron job \\`${cronJobId}\\` has been configured to send renewal payment monthly (1st of the month, UTC), matching backend calendar billing. The object is skipped for deletion in its first UTC calendar month after upload; after that, if renewal is missing for a month, housekeeping may remove the object shortly after the 3rd (UTC).`,\n \"\",\n \"To view your cloud storage run the command:\",\n \"\",\n formatMnemosparkCommandCopyBlock(lsCommand),\n \"\",\n \"Thank you for using mnemospark!\",\n `Reach out if you need anything: ${MNEMOSPARK_SUPPORT_EMAIL}`,\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 extractLsErrorMessage(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 if (\n message.startsWith(\"ls response\") ||\n message.startsWith(\"ls list response\") ||\n message.startsWith(\"Invalid ls response payload\")\n ) {\n return `Cannot list storage object: ${message}`;\n }\n if (message === \"formatBytesForDisplay expects a non-negative integer\") {\n return \"Cannot list storage object: ls response has invalid size_bytes; expected non-negative integer\";\n }\n return null;\n}\n\nfunction formatPriceStorageUserMessage(\n quote: PriceStorageQuoteResponse,\n localArchiveHint?: string | null,\n): string {\n const uploadCommand = `/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 const lines = [\n `Your storage quote \\`${quote.quote_id}\\`: storage price \\`$${quote.storage_price}\\` for file \\`${quote.object_id}\\` with file size \\`${quote.object_size_gb}\\` in \\`${quote.provider}\\` \\`${quote.location}\\`.`,\n \"\",\n \"If you accept this quote, run:\",\n \"\",\n formatMnemosparkCommandCopyBlock(uploadCommand),\n \"\",\n ];\n if (localArchiveHint?.trim()) {\n lines.push(\n `Local backup archive uses friendly name \\`${localArchiveHint.trim()}\\` (on-disk basename is sanitized).`,\n \"\",\n );\n }\n lines.push(QUOTE_VALIDITY_USER_NOTE);\n return lines.join(\"\\n\");\n}\n\nfunction quoteLookupMatchesPriceStorageResponse(\n lookup: QuoteLookup,\n quote: PriceStorageQuoteResponse,\n): boolean {\n return (\n lookup.quoteId === quote.quote_id &&\n lookup.walletAddress.trim().toLowerCase() === quote.addr.trim().toLowerCase() &&\n lookup.objectId === quote.object_id &&\n lookup.objectIdHash.toLowerCase() === quote.object_id_hash.toLowerCase() &&\n lookup.storagePrice === quote.storage_price &&\n lookup.provider === quote.provider &&\n lookup.location === quote.location\n );\n}\n\n/** Default provider/region for the copy-paste `price-storage` line after backup (single source of truth for docs/tests). */\nexport const DEFAULT_BACKUP_QUOTE_PROVIDER = \"aws\";\nexport const DEFAULT_BACKUP_QUOTE_REGION = \"us-east-1\";\n\nfunction formatBackupSuccessUserMessage(\n result: BackupObjectResult,\n walletAddress: string,\n friendlyName: string,\n): string {\n const hash = result.objectIdHash.replace(/\\s/g, \"\");\n const priceStorageCommand = `/mnemospark cloud price-storage wallet-address:${walletAddress} object-id:${result.objectId} object-id-hash:${hash} gb:${result.objectSizeGb} provider:${DEFAULT_BACKUP_QUOTE_PROVIDER} region:${DEFAULT_BACKUP_QUOTE_REGION}`;\n return [\n `Backup archive: \\`${result.archivePath}\\``,\n \"\",\n `friendly-name: ${friendlyName}`,\n `object-id: ${result.objectId}`,\n `object-id-hash: ${hash}`,\n `object-size: ${result.objectSizeGb}`,\n \"\",\n \"Next, request a storage quote.\",\n \"\",\n formatMnemosparkCommandCopyBlock(priceStorageCommand),\n \"\",\n `The default region is ${DEFAULT_BACKUP_QUOTE_REGION}. Change the command parameters to switch regions (not required).`,\n \"\",\n \"Region examples (merge into the command above):\",\n \"North America: `provider:aws region:us-east-1`\",\n \"Europe: `provider:aws region:eu-north-1`\",\n \"South America: `provider:aws region:sa-east-1`\",\n \"Asia Pacific: `provider:aws region:ap-northeast-1`\",\n ].join(\"\\n\");\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\",\n nativeNames: {\n default: \"mnemospark\",\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 requestPaymentSettleViaProxyFn:\n options.requestPaymentSettleViaProxyFn ?? requestPaymentSettleViaProxy,\n mnemosparkHomeDir: options.mnemosparkHomeDir ?? options.backupOptions?.homeDir,\n openClawCronAdapter:\n options.openClawCronAdapter ??\n createOpenClawCliCronAdapter(\n options.mnemosparkHomeDir ?? options.backupOptions?.homeDir,\n ),\n backupOptions: options.backupOptions,\n proxyQuoteOptions: options.proxyQuoteOptions,\n proxyUploadOptions: options.proxyUploadOptions,\n proxySettleOptions: options.proxySettleOptions,\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 requestPaymentSettleViaProxyFn: NonNullable<\n CreateCloudCommandOptions[\"requestPaymentSettleViaProxyFn\"]\n >;\n openClawCronAdapter: NonNullable<CreateCloudCommandOptions[\"openClawCronAdapter\"]>;\n mnemosparkHomeDir: string | undefined;\n backupOptions: CreateCloudCommandOptions[\"backupOptions\"];\n proxyQuoteOptions: CreateCloudCommandOptions[\"proxyQuoteOptions\"];\n proxyUploadOptions: CreateCloudCommandOptions[\"proxyUploadOptions\"];\n proxySettleOptions: CreateCloudCommandOptions[\"proxySettleOptions\"];\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 resolveNameSelectorIfNeeded(\n datastore: Awaited<ReturnType<typeof createCloudDatastore>>,\n request: StorageObjectRequestInput,\n selector?: NameSelector,\n): Promise<{\n request?: StorageObjectRequest | StorageLsRequest;\n error?: string;\n}> {\n if (!selector) {\n const walletAddress = request.wallet_address?.trim();\n if (!walletAddress) {\n return { error: \"Cannot resolve storage object request.\" };\n }\n const objectKey = request.object_key?.trim();\n if (!objectKey) {\n const listRequest: StorageLsRequest = { wallet_address: walletAddress };\n if (request.location) {\n listRequest.location = request.location;\n }\n return { request: listRequest };\n }\n const parsedRequest = parseStorageObjectRequest({\n wallet_address: walletAddress,\n object_key: objectKey,\n location: request.location,\n });\n if (!parsedRequest) {\n return { error: \"Cannot resolve storage object request.\" };\n }\n return { request: parsedRequest };\n }\n try {\n await datastore.ensureReady();\n } catch {\n return {\n error:\n \"Cannot resolve --name: local SQLite (~/.openclaw/mnemospark/state.db) is unavailable. Use --object-key or restore SQLite access.\",\n };\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 const resolvedObjectKey = resolved?.objectKey ?? null;\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 { request: parsedRequest };\n}\n\nfunction toStorageObjectRequestOrError(\n request: StorageObjectRequest | StorageLsRequest,\n missingKeyMessage: string,\n): { ok: true; request: StorageObjectRequest } | { ok: false; error: string } {\n const key = request.object_key?.trim();\n if (!key) {\n return { ok: false, error: missingKeyMessage };\n }\n const parsed = parseStorageObjectRequest({\n wallet_address: request.wallet_address,\n object_key: key,\n location: request.location,\n });\n if (!parsed) {\n return { ok: false, error: \"Cannot resolve storage object request.\" };\n }\n return { ok: true, request: parsed };\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 source: \"command\",\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 source: \"command\",\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 appendJsonlEvent(\"events.jsonl\", payload, homeDir);\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\nfunction parseTransIdFromPaymentSettleBody(bodyText: string): string | null {\n const trimmed = bodyText.trim();\n if (!trimmed.startsWith(\"{\")) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as { trans_id?: unknown };\n const tid = parsed.trans_id;\n return typeof tid === \"string\" && tid.trim() ? tid.trim() : null;\n } catch {\n return null;\n }\n}\n\nfunction parseQuoteIdFromPaymentSettleBody(bodyText: string): string | null {\n const trimmed = bodyText.trim();\n if (!trimmed.startsWith(\"{\")) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as { quote_id?: unknown };\n const q = parsed.quote_id;\n return typeof q === \"string\" && q.trim() ? q.trim() : null;\n } catch {\n return null;\n }\n}\n\nasync function resolveAmountForPaymentSettle(\n quoteId: string | undefined,\n storagePriceFromFlag: number | undefined,\n datastore: Awaited<ReturnType<typeof createCloudDatastore>>,\n): Promise<number> {\n if (storagePriceFromFlag !== undefined && Number.isFinite(storagePriceFromFlag)) {\n return storagePriceFromFlag;\n }\n if (!quoteId) {\n return 0;\n }\n const quoteLookup = await datastore.findQuoteById(quoteId);\n if (quoteLookup && Number.isFinite(quoteLookup.storagePrice)) {\n return quoteLookup.storagePrice;\n }\n const payment = await datastore.findPaymentByQuoteId(quoteId);\n if (payment && Number.isFinite(payment.amount)) {\n return payment.amount;\n }\n return 0;\n}\n\nasync function resolveCronRowForPaymentSettle(\n req: PaymentSettleCommandRequest,\n datastore: Awaited<ReturnType<typeof createCloudDatastore>>,\n): Promise<CronJobRow | null> {\n if (req.renewal) {\n const key = req.object_key?.trim();\n if (!key) {\n return null;\n }\n return datastore.findCronJobRowByObjectKey(key);\n }\n const qid = req.quote_id?.trim();\n if (!qid) {\n return null;\n }\n return datastore.findCronByQuoteId(qid);\n}\n\nasync function emitPaymentSettleClientObservationBestEffort(params: {\n phase: \"start\" | \"result\";\n correlation: RequestCorrelation;\n quoteId: string;\n walletAddress: string;\n objectId?: string;\n objectKey?: string;\n httpStatus?: number;\n outcomeStatus?: \"succeeded\" | \"failed\";\n homeDir?: string;\n}): Promise<void> {\n try {\n const {\n phase,\n correlation,\n quoteId,\n walletAddress,\n objectId,\n objectKey,\n httpStatus,\n outcomeStatus,\n homeDir,\n } = params;\n const ts = new Date().toISOString();\n\n if (phase === \"start\") {\n await emitCloudEventBestEffort(\n \"payment-settle.started\",\n {\n operation_id: correlation.operationId,\n trace_id: correlation.traceId,\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId,\n object_key: objectKey,\n status: \"running\",\n },\n homeDir,\n );\n await appendJsonlEvent(\n \"events.jsonl\",\n {\n ts,\n event_type: \"payment.settle\",\n status: \"start\",\n source: \"command\",\n trace_id: correlation.traceId,\n operation_id: correlation.operationId,\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId ?? null,\n object_key: objectKey ?? null,\n details: { client_observation: true },\n },\n homeDir,\n );\n return;\n }\n\n const terminal = outcomeStatus ?? \"failed\";\n await emitCloudEventBestEffort(\n \"payment-settle.completed\",\n {\n operation_id: correlation.operationId,\n trace_id: correlation.traceId,\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId,\n object_key: objectKey,\n status: terminal === \"succeeded\" ? \"succeeded\" : \"failed\",\n http_status: httpStatus,\n },\n homeDir,\n );\n await appendJsonlEvent(\n \"events.jsonl\",\n {\n ts,\n event_type: \"payment.settle\",\n status: \"result\",\n source: \"command\",\n trace_id: correlation.traceId,\n operation_id: correlation.operationId,\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId ?? null,\n object_key: objectKey ?? null,\n http_status: httpStatus ?? null,\n details: { client_observation: true },\n },\n homeDir,\n );\n } catch {\n // best-effort only\n }\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 mnemosparkHomeDir = options.mnemosparkHomeDir;\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 requestPaymentSettleViaProxy = options.requestPaymentSettleViaProxyFn;\n const openClawCronAdapter = options.openClawCronAdapter;\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 === \"arg-parse-failure\") {\n return {\n text: [\n \"Could not parse command arguments.\",\n ...parsed.errors.map((e) => `- ${e}`),\n ...(parsed.warnings.length > 0\n ? [\"\", \"Notes:\", ...parsed.warnings.map((w) => `- ${w}`)]\n : []),\n \"\",\n \"Accepted formats:\",\n \"- key:value\",\n \"- key=value\",\n \"- --key value\",\n ].join(\"\\n\"),\n isError: true,\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-async\") {\n return {\n text: `Cannot build storage object: ${INVALID_ASYNC_FLAGS_MESSAGE}`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"backup-invalid-name\") {\n return {\n text: `Cannot build storage object: required arguments are ${REQUIRED_BACKUP}.`,\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 === \"payment-settle-invalid\") {\n return {\n text: `Cannot settle payment: required arguments are ${REQUIRED_PAYMENT_SETTLE}. Optional: object-id:, storage-price:.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"ls-invalid\") {\n return {\n text: `Cannot list storage object: required arguments are ${REQUIRED_LS}.`,\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:<id>.\",\n isError: true,\n };\n }\n\n const datastore = await createCloudDatastore(mnemosparkHomeDir);\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 result_text: string | null;\n }): { text: string; isError: boolean } => {\n const meta = [\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 const withResult =\n operation.status === \"succeeded\" && operation.result_text?.trim()\n ? `${meta}\\n\\n${operation.result_text}`\n : meta;\n return {\n text: withResult,\n isError:\n operation.status === \"failed\" ||\n operation.status === \"cancelled\" ||\n operation.status === \"timed_out\",\n };\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\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 (parsed.mode === \"payment-settle\") {\n const req = parsed.paymentSettleRequest;\n let walletKey: `0x${string}`;\n try {\n walletKey = await resolveWalletKey(mnemosparkHomeDir);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { text: message.trim() || \"Cannot resolve wallet key.\", isError: true };\n }\n const walletAccount = privateKeyToAccount(walletKey);\n if (walletAccount.address.toLowerCase() !== req.wallet_address.toLowerCase()) {\n return {\n text: `Cannot settle payment: wallet key address ${walletAccount.address} does not match wallet-address: ${req.wallet_address}.`,\n isError: true,\n };\n }\n\n const correlation = buildRequestCorrelation();\n const settleFetch = createPayment(walletKey).fetch;\n const objectId = req.object_id;\n const objectKey = req.object_key;\n const logQuoteId =\n req.quote_id?.trim() ||\n (req.renewal && objectKey?.trim() ? `renewal:${objectKey.trim()}` : \"\");\n\n await emitPaymentSettleClientObservationBestEffort({\n phase: \"start\",\n correlation,\n quoteId: logQuoteId,\n walletAddress: req.wallet_address,\n objectId,\n objectKey,\n homeDir: mnemosparkHomeDir,\n });\n\n let settleResult: BackendSettleForwardResult;\n try {\n settleResult = await requestPaymentSettleViaProxy(req.quote_id ?? \"\", req.wallet_address, {\n ...options.proxySettleOptions,\n correlation,\n fetchImpl: (input, init) => settleFetch(input, init),\n renewal: req.renewal === true,\n objectKey: req.object_key,\n });\n } catch (err) {\n const amountErr = await resolveAmountForPaymentSettle(\n req.quote_id,\n req.storage_price,\n datastore,\n );\n await datastore.upsertPayment({\n quote_id: logQuoteId || req.quote_id?.trim() || \"payment-settle-error\",\n wallet_address: req.wallet_address,\n trans_id: null,\n amount: amountErr,\n network: null,\n status: \"settle_failed\",\n settled_at: null,\n });\n const cronErr = await resolveCronRowForPaymentSettle(req, datastore);\n if (cronErr) {\n await datastore.upsertCronJob({ ...cronErr, status: \"active\" });\n }\n const msg = err instanceof Error ? err.message : String(err);\n await emitPaymentSettleClientObservationBestEffort({\n phase: \"result\",\n correlation,\n quoteId: logQuoteId,\n walletAddress: req.wallet_address,\n objectId,\n objectKey,\n outcomeStatus: \"failed\",\n homeDir: mnemosparkHomeDir,\n });\n return { text: `Payment settle failed: ${msg}`, isError: true };\n }\n\n const ledgerQuoteIdFromBody = parseQuoteIdFromPaymentSettleBody(settleResult.bodyText ?? \"\");\n const ledgerQuoteId = ledgerQuoteIdFromBody || req.quote_id?.trim() || logQuoteId;\n const amount = await resolveAmountForPaymentSettle(\n req.renewal ? undefined : req.quote_id,\n req.storage_price,\n datastore,\n );\n const transId =\n settleResult.status === 200\n ? parseTransIdFromPaymentSettleBody(settleResult.bodyText ?? \"\")\n : null;\n\n if (settleResult.status === 200) {\n await datastore.upsertPayment({\n quote_id: ledgerQuoteId,\n wallet_address: req.wallet_address,\n trans_id: transId,\n amount,\n network: null,\n status: \"settled\",\n settled_at: new Date().toISOString(),\n });\n const cronRow = await resolveCronRowForPaymentSettle(req, datastore);\n if (cronRow) {\n await datastore.upsertCronJob({ ...cronRow, status: \"active\" });\n }\n await emitPaymentSettleClientObservationBestEffort({\n phase: \"result\",\n correlation,\n quoteId: ledgerQuoteId,\n walletAddress: req.wallet_address,\n objectId,\n objectKey,\n httpStatus: settleResult.status,\n outcomeStatus: \"succeeded\",\n homeDir: mnemosparkHomeDir,\n });\n const label = req.renewal ? `object ${req.object_key}` : `quote ${req.quote_id}`;\n return {\n text: transId\n ? `Payment settled for ${label} (trans-id: ${transId}).`\n : `Payment settled for ${label}.`,\n };\n }\n\n await datastore.upsertPayment({\n quote_id: ledgerQuoteId,\n wallet_address: req.wallet_address,\n trans_id: transId,\n amount,\n network: null,\n status: \"settle_failed\",\n settled_at: null,\n });\n const cronRowFailed = await resolveCronRowForPaymentSettle(req, datastore);\n if (cronRowFailed) {\n await datastore.upsertCronJob({ ...cronRowFailed, status: \"active\" });\n }\n await emitPaymentSettleClientObservationBestEffort({\n phase: \"result\",\n correlation,\n quoteId: ledgerQuoteId,\n walletAddress: req.wallet_address,\n objectId,\n objectKey,\n httpStatus: settleResult.status,\n outcomeStatus: \"failed\",\n homeDir: mnemosparkHomeDir,\n });\n\n const bodySnippet = settleResult.bodyText?.trim();\n const detail =\n bodySnippet && bodySnippet.length > 500 ? `${bodySnippet.slice(0, 500)}…` : bodySnippet;\n return {\n text: detail\n ? `Payment settle failed (HTTP ${settleResult.status}): ${detail}`\n : `Payment settle failed with HTTP ${settleResult.status}.`,\n isError: true,\n };\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 mnemosparkHomeDir,\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\",\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\n );\n },\n onCompleted: async (sessionId, 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: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n status: \"succeeded\",\n error_code: null,\n error_message: null,\n result_text: result.isError ? null : result.text,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: \"succeeded\",\n subagentSessionId: sessionId,\n },\n mnemosparkHomeDir,\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\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 const subagentMetaLines = [\n `Operation started in background. operation-id: ${operationId}`,\n `orchestrator: subagent`,\n `subagent-session-id: ${dispatchResult.sessionId}`,\n timeoutSeconds ? `timeout-seconds: ${timeoutSeconds}` : null,\n ].filter((line): line is string => Boolean(line));\n return {\n text: [\n ...subagentMetaLines,\n \"\",\n formatMnemosparkCommandCopyBlock(\n `/mnemospark cloud op-status operation-id:${operationId}`,\n ),\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 mnemosparkHomeDir,\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 result_text: result.isError ? null : result.text,\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\n );\n });\n\n return {\n text: [\n `Operation started in background. operation-id: ${operationId}`,\n `orchestrator: inline`,\n \"\",\n formatMnemosparkCommandCopyBlock(`/mnemospark cloud op-status operation-id:${operationId}`),\n ].join(\"\\n\"),\n };\n }\n\n if (parsed.mode === \"backup\") {\n const backupPlatform = options.backupOptions?.platform ?? process.platform;\n if (!SUPPORTED_BACKUP_PLATFORMS.has(backupPlatform)) {\n return {\n text: \"Cloud backup is only supported on macOS and Linux.\",\n isError: true,\n };\n }\n\n try {\n let walletAddress: string;\n try {\n const walletKey = await resolveWalletKey(mnemosparkHomeDir);\n walletAddress = privateKeyToAccount(walletKey).address;\n } catch (err) {\n const message =\n err instanceof Error ? err.message : typeof err === \"string\" ? err : String(err);\n return {\n text: message.trim() || \"No mnemospark wallet found.\",\n isError: true,\n };\n }\n\n let archiveBasename: string;\n try {\n archiveBasename = sanitizeFriendlyNameForLocalBasename(parsed.friendlyName);\n } catch {\n return {\n text: \"Cannot build storage object: invalid --name for local file path (use a non-empty name without reserved path segments).\",\n isError: true,\n };\n }\n\n const result = await backupBuilder(parsed.backupTarget, {\n ...options.backupOptions,\n archiveBasename,\n });\n await emitCloudEventBestEffort(\n \"backup.completed\",\n {\n operation_id: executionContext.forcedOperationId?.trim() || randomUUID(),\n object_id: result.objectId,\n status: \"succeeded\",\n details: {\n friendly_name: parsed.friendlyName,\n archive_path: result.archivePath,\n object_id_hash: result.objectIdHash.replace(/\\s/g, \"\"),\n object_size_gb: result.objectSizeGb,\n },\n },\n mnemosparkHomeDir,\n );\n await datastore.upsertObject({\n object_id: result.objectId,\n object_key: null,\n wallet_address: walletAddress,\n quote_id: null,\n provider: null,\n bucket_name: null,\n region: null,\n sha256: result.objectIdHash,\n status: \"backed_up\",\n });\n await datastore.upsertFriendlyName({\n friendly_name: parsed.friendlyName,\n object_id: result.objectId,\n object_key: null,\n quote_id: null,\n wallet_address: walletAddress,\n });\n return {\n text: formatBackupSuccessUserMessage(result, walletAddress, parsed.friendlyName),\n };\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"already exists\")) {\n return {\n text: err.message,\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\" || parsed.mode === \"price-storage-resolve-hash\") {\n let priceStorageRequest: PriceStorageQuoteRequest;\n if (parsed.mode === \"price-storage-resolve-hash\") {\n const resolved = await resolvePriceStorageHashFromDatastore(\n datastore,\n parsed.priceStoragePartial,\n );\n if (!resolved.ok) {\n return { text: resolved.message, isError: true };\n }\n priceStorageRequest = resolved.request;\n } else {\n priceStorageRequest = parsed.priceStorageRequest;\n }\n\n const correlation = buildRequestCorrelation();\n try {\n const quote = await requestPriceStorageQuote(priceStorageRequest, {\n ...options.proxyQuoteOptions,\n correlation,\n });\n await datastore.ensureReady();\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 const verified = await datastore.findQuoteById(quote.quote_id);\n if (!verified || !quoteLookupMatchesPriceStorageResponse(verified, quote)) {\n return {\n text: \"Cannot price storage: quote was not saved to local SQLite (~/.openclaw/mnemospark/state.db). Check disk permissions or MNEMOSPARK_DISABLE_SQLITE.\",\n isError: true,\n };\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 mnemosparkHomeDir,\n );\n let friendlyForQuote: string | null = null;\n try {\n friendlyForQuote = await datastore.findLatestFriendlyNameForObjectId(quote.object_id);\n } catch {\n friendlyForQuote = null;\n }\n return {\n text: formatPriceStorageUserMessage(quote, friendlyForQuote),\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: priceStorageRequest.wallet_address,\n object_id: priceStorageRequest.object_id,\n status: \"failed\",\n },\n mnemosparkHomeDir,\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 let preparedPayload: PreparedUploadPayload | undefined;\n try {\n const loggedQuote = await datastore.findQuoteById(parsed.uploadRequest.quote_id);\n if (!loggedQuote) {\n return {\n text: \"Cannot upload storage object: quote-id not found in local SQLite. Run /mnemospark cloud price-storage first (quotes expire after about one hour on the server).\",\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 backupDir = options.backupOptions?.tmpDir ?? DEFAULT_BACKUP_DIR;\n const dbFriendly = await datastore.findLatestFriendlyNameForObjectId(\n parsed.uploadRequest.object_id,\n );\n if (!dbFriendly?.trim()) {\n return {\n text: \"Cannot upload storage object: no friendly name in local SQLite for this object-id. Run /mnemospark cloud backup with --name first.\",\n isError: true,\n };\n }\n\n if (parsed.friendlyName?.trim()) {\n if (parsed.friendlyName.trim() !== dbFriendly.trim()) {\n return {\n text: \"Cannot upload storage object: --name does not match the friendly name stored in local SQLite for this object-id.\",\n isError: true,\n };\n }\n }\n\n const resolvedArchive = await resolveLocalUploadArchivePath(\n backupDir,\n parsed.uploadRequest.object_id,\n dbFriendly,\n );\n if (!resolvedArchive.ok) {\n return { text: resolvedArchive.message, isError: true };\n }\n const archivePath = resolvedArchive.archivePath;\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(mnemosparkHomeDir);\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 preparedPayload = await prepareUploadPayload(\n archivePath,\n parsed.uploadRequest.wallet_address,\n mnemosparkHomeDir,\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 preparedPayload.encryptedTempPath,\n fetchImpl,\n preparedPayload.encryptedTempPath\n ? preparedPayload.payload.content_length_bytes\n : undefined,\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 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 openClawCronAdapter,\n mnemosparkHomeDir ?? homedir(),\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 const normalizedFriendlyName = dbFriendly.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; --name lookups may not resolve until SQLite is healthy.\";\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 mnemosparkHomeDir,\n );\n if (process.env.MNEMOSPARK_SQLITE_STRICT === \"1\") {\n throw new Error(warning);\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\n );\n const uploadErrorMessage = extractUploadErrorMessage(error);\n return {\n text: uploadErrorMessage ?? \"Cannot upload storage object\",\n isError: true,\n };\n } finally {\n if (preparedPayload?.encryptedTempPath) {\n await rm(preparedPayload.encryptedTempPath, { force: true }).catch(() => {});\n }\n }\n }\n\n if (parsed.mode === \"ls\") {\n const resolved = await resolveNameSelectorIfNeeded(\n datastore,\n parsed.storageObjectRequest,\n parsed.nameSelector,\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 const objectKeyForLs = resolvedRequest.object_key?.trim();\n const isBucketList = !objectKeyForLs;\n const correlation = buildRequestCorrelation();\n const operationId = correlation.operationId;\n const knownObject = isBucketList ? null : await datastore.findObjectByObjectKey(objectKeyForLs);\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 ?? null,\n status: \"succeeded\",\n list_mode: isBucketList,\n },\n mnemosparkHomeDir,\n );\n const lsText = await buildMnemosparkLsMessage(lsResult, {\n walletAddress: resolvedRequest.wallet_address,\n datastore,\n });\n return {\n text: lsText,\n };\n } catch (error) {\n const lsErrorMessage = extractLsErrorMessage(error) ?? \"Cannot list storage object\";\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: lsErrorMessage,\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 ?? null,\n status: \"failed\",\n list_mode: isBucketList,\n },\n mnemosparkHomeDir,\n );\n return {\n text: lsErrorMessage,\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 );\n if (resolved.error || !resolved.request) {\n return { text: resolved.error ?? \"Cannot resolve storage object request.\", isError: true };\n }\n const narrowed = toStorageObjectRequestOrError(\n resolved.request,\n `Cannot download file: required arguments are ${REQUIRED_STORAGE_OBJECT}.`,\n );\n if (!narrowed.ok) {\n return { text: narrowed.error, isError: true };\n }\n const resolvedRequest = narrowed.request;\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 let downloadLocalBasename: string | undefined;\n try {\n const friendly = await datastore.findLatestFriendlyNameForObjectKey(\n resolvedRequest.wallet_address,\n resolvedRequest.object_key,\n );\n if (friendly?.trim()) {\n try {\n downloadLocalBasename = sanitizeFriendlyNameForLocalBasename(friendly);\n } catch {\n downloadLocalBasename = undefined;\n }\n }\n } catch {\n downloadLocalBasename = undefined;\n }\n\n try {\n const downloadResult = await requestStorageDownload(resolvedRequest, {\n ...options.proxyStorageOptions,\n correlation,\n ...(downloadLocalBasename ? { downloadLocalBasename } : {}),\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 mnemosparkHomeDir,\n );\n const downloadText = `File ${resolvedRequest.object_key} downloaded to ${downloadResult.file_path}`;\n return {\n text: 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 mnemosparkHomeDir,\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 );\n if (resolved.error || !resolved.request) {\n return { text: resolved.error ?? \"Cannot resolve storage object request.\", isError: true };\n }\n const narrowedDelete = toStorageObjectRequestOrError(\n resolved.request,\n `Cannot delete file: required arguments are ${REQUIRED_STORAGE_OBJECT}.`,\n );\n if (!narrowedDelete.ok) {\n return { text: narrowedDelete.error, isError: true };\n }\n const resolvedRequest = narrowedDelete.request;\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 mnemosparkHomeDir,\n );\n return {\n text: \"Cannot delete file\",\n isError: true,\n };\n }\n let cronEntry: { cronId: string; objectId: string; objectKey: string } | 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 findCronJobInOpenClawCronJobsByObjectKey(\n resolvedRequest.object_key,\n openClawCronAdapter,\n );\n }\n if (cronEntry) {\n const fileCronDeleted = await removeStoragePaymentCronJob(\n cronEntry.cronId,\n openClawCronAdapter,\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 mnemosparkHomeDir,\n );\n const deleteText = formatStorageDeleteUserMessage(\n resolvedRequest.object_key,\n cronEntry?.cronId ?? null,\n cronDeleted,\n );\n return {\n text: 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 { CronExpressionParser } from \"cron-parser\";\n\nimport {\n isStorageLsListResponse,\n type StorageLsListObject,\n type StorageLsResponse,\n} from \"./cloud-storage.js\";\nimport type { CloudDatastore } from \"./cloud-datastore.js\";\nimport { formatBytesForDisplay } from \"./cloud-utils.js\";\n\nconst LS_NAME_DISPLAY_MAX = 72;\nconst LS_PAY_DISPLAY_MAX = 28;\nconst LS_CRON_ID_MAX = 14;\n\n/** Data column width for S3 last-modified (UTC). */\nconst LS_S3_COL_WIDTH = 12;\n/** Fits header \"NEXT PAYMENT DATE\" and time cells. */\nconst LS_NEXT_COL_WIDTH = Math.max(LS_S3_COL_WIDTH, \"NEXT PAYMENT DATE\".length);\n\nconst HDR_SIZE = \"SIZE\";\nconst HDR_S3_TIME = \"S3_TIME\";\nconst HDR_CRON_JOB = \"CRON JOB\";\nconst HDR_NEXT_PAYMENT = \"NEXT PAYMENT DATE\";\nconst HDR_AMOUNT_DUE = \"AMOUNT DUE\";\nconst HDR_FILE_OR_KEY = \"FILE NAME OR OBJECT-KEY\";\n\nconst MONTHS_SHORT = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n] as const;\n\n/** S3 object times in listings use UTC (matches backend ISO timestamps). */\nfunction formatLsTimeFieldUtc(\n iso: string | undefined,\n now: Date,\n fieldWidth: number = LS_S3_COL_WIDTH,\n): string {\n const placeholder = \" - \".slice(0, fieldWidth);\n if (!iso) {\n return placeholder.padEnd(fieldWidth, \" \");\n }\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) {\n return placeholder.padEnd(fieldWidth, \" \");\n }\n const mon = MONTHS_SHORT[d.getUTCMonth()] ?? \"???\";\n const day = String(d.getUTCDate()).padStart(2, \" \");\n const y = d.getUTCFullYear();\n const nowY = now.getUTCFullYear();\n let core: string;\n if (y === nowY) {\n const hh = String(d.getUTCHours()).padStart(2, \"0\");\n const mm = String(d.getUTCMinutes()).padStart(2, \"0\");\n core = `${mon} ${day} ${hh}:${mm}`;\n } else {\n core = `${mon} ${day} ${y}`;\n }\n return core.padEnd(fieldWidth, \" \");\n}\n\nfunction truncateEnd(value: string, max: number): string {\n if (value.length <= max) {\n return value;\n }\n if (max <= 1) {\n return \"…\";\n }\n return `${value.slice(0, max - 1)}…`;\n}\n\nfunction truncateMiddle(value: string, max: number, suffixMin: number): string {\n if (value.length <= max) {\n return value;\n }\n if (max < suffixMin + 5) {\n return truncateEnd(value, max);\n }\n const suffixLen = Math.min(suffixMin, max - 5);\n const prefixLen = max - 3 - suffixLen;\n return `${value.slice(0, prefixLen)} … ${value.slice(-suffixLen)}`;\n}\n\nfunction formatCronIdCell(cronId: string | null, width: number): string {\n if (!cronId) {\n return \" - \".slice(0, width).padStart(width, \" \");\n }\n const t = truncateEnd(cronId, width);\n return t.padStart(width, \" \");\n}\n\nfunction formatPaymentCell(\n amount: number | null,\n network: string | null,\n maxWidth: number,\n): string {\n if (amount === null) {\n return \" - \".slice(0, maxWidth).padStart(maxWidth, \" \");\n }\n let s = amount.toFixed(6).replace(/\\.?0+$/, \"\");\n if (network && network.trim()) {\n s = `${s} (${network.trim()})`;\n }\n return truncateEnd(s, maxWidth).padStart(maxWidth, \" \");\n}\n\nfunction formatNextCronUtc(schedule: string, cronStatus: string, now: Date): string {\n const blank = \" - \".slice(0, LS_NEXT_COL_WIDTH).padEnd(LS_NEXT_COL_WIDTH, \" \");\n if (cronStatus !== \"active\") {\n return blank;\n }\n try {\n const expr = CronExpressionParser.parse(schedule, { tz: \"UTC\", currentDate: now });\n const next = expr.next().toDate();\n return formatLsTimeFieldUtc(next.toISOString(), now, LS_NEXT_COL_WIDTH);\n } catch {\n return \"?\".padEnd(LS_NEXT_COL_WIDTH, \" \");\n }\n}\n\ntype PreparedLsRow = {\n sizeStr: string;\n s3time: string;\n cronIdRaw: string | null;\n nextRun: string;\n payRaw: string;\n nameRaw: string;\n};\n\nfunction buildLsProseIntro(bucket: string): string[] {\n return [\n \"☁️ mnemospark cloud\",\n `Folder: ${bucket}`,\n \"The columns: CRON JOB, NEXT PAYMENT DATE, AMOUNT DUE, FILE NAME are from this host's mnemospark SQLite catalog\",\n \"mnemospark cloud only stores the OBJECT-KEY for privacy\",\n ];\n}\n\nasync function prepareRows(\n objects: StorageLsListObject[],\n walletAddress: string,\n datastore: CloudDatastore,\n now: Date,\n): Promise<PreparedLsRow[]> {\n const sorted = [...objects].sort((a, b) => {\n const ta = a.last_modified ? Date.parse(a.last_modified) : Number.NaN;\n const tb = b.last_modified ? Date.parse(b.last_modified) : Number.NaN;\n const aOk = Number.isFinite(ta);\n const bOk = Number.isFinite(tb);\n if (aOk && bOk && tb !== ta) {\n return tb - ta;\n }\n if (aOk && !bOk) {\n return -1;\n }\n if (!aOk && bOk) {\n return 1;\n }\n return a.key.localeCompare(b.key);\n });\n\n const rows: PreparedLsRow[] = [];\n for (const obj of sorted) {\n const friendly = await datastore.findLatestFriendlyNameForObjectKey(walletAddress, obj.key);\n const cp = await datastore.findCronAndPaymentForObjectKey(walletAddress, obj.key);\n const sizeStr = formatBytesForDisplay(obj.size_bytes);\n const s3time = formatLsTimeFieldUtc(obj.last_modified, now, LS_S3_COL_WIDTH);\n let cronIdDisp: string | null = null;\n let nextRun = \" - \".slice(0, LS_NEXT_COL_WIDTH).padEnd(LS_NEXT_COL_WIDTH, \" \");\n let payCell = \"\";\n if (cp) {\n cronIdDisp = cp.cronId;\n nextRun = formatNextCronUtc(cp.schedule, cp.cronStatus, now);\n payCell = formatPaymentCell(cp.amount, cp.network, LS_PAY_DISPLAY_MAX);\n } else {\n payCell = formatPaymentCell(null, null, LS_PAY_DISPLAY_MAX);\n }\n const nameRaw = friendly ? `${friendly} (${obj.key})` : obj.key;\n rows.push({\n sizeStr,\n s3time,\n cronIdRaw: cronIdDisp,\n nextRun,\n payRaw: payCell,\n nameRaw: truncateMiddle(nameRaw, LS_NAME_DISPLAY_MAX, 8),\n });\n }\n return rows;\n}\n\ntype ColWidths = { sizeW: number; s3W: number; cronW: number; nextW: number; payW: number };\n\nfunction columnWidths(rows: PreparedLsRow[]): ColWidths {\n let sizeW = HDR_SIZE.length;\n let s3W = Math.max(LS_S3_COL_WIDTH, HDR_S3_TIME.length);\n let nextW = LS_NEXT_COL_WIDTH;\n let cronW = HDR_CRON_JOB.length;\n let payW = HDR_AMOUNT_DUE.length;\n for (const r of rows) {\n sizeW = Math.max(sizeW, r.sizeStr.length);\n s3W = Math.max(s3W, r.s3time.length);\n nextW = Math.max(nextW, r.nextRun.length);\n const cid = r.cronIdRaw ? truncateEnd(r.cronIdRaw, LS_CRON_ID_MAX) : \"\";\n cronW = Math.max(cronW, cid.length || 1);\n payW = Math.max(payW, r.payRaw.length);\n }\n cronW = Math.min(Math.max(cronW, HDR_CRON_JOB.length), LS_CRON_ID_MAX);\n payW = Math.min(Math.max(payW, HDR_AMOUNT_DUE.length), LS_PAY_DISPLAY_MAX);\n return { sizeW, s3W, cronW, nextW, payW };\n}\n\nfunction renderRow(r: PreparedLsRow, w: ColWidths): string {\n const cronPadded = formatCronIdCell(r.cronIdRaw, w.cronW);\n return [\n r.sizeStr.padStart(w.sizeW, \" \"),\n r.s3time.padEnd(w.s3W, \" \"),\n cronPadded,\n r.nextRun.padEnd(w.nextW, \" \"),\n r.payRaw.padStart(w.payW, \" \"),\n r.nameRaw,\n ].join(\" \");\n}\n\nfunction renderHeader(w: ColWidths): string {\n return [\n HDR_SIZE.padStart(w.sizeW, \" \"),\n HDR_S3_TIME.padEnd(w.s3W, \" \"),\n HDR_CRON_JOB.padStart(w.cronW, \" \"),\n HDR_NEXT_PAYMENT.padEnd(w.nextW, \" \"),\n HDR_AMOUNT_DUE.padStart(w.payW, \" \"),\n HDR_FILE_OR_KEY,\n ].join(\" \");\n}\n\nexport async function buildMnemosparkLsMessage(\n result: StorageLsResponse,\n ctx: {\n walletAddress: string;\n datastore: CloudDatastore;\n now?: Date;\n },\n): Promise<string> {\n const now = ctx.now ?? new Date();\n\n if (isStorageLsListResponse(result)) {\n const intro = buildLsProseIntro(result.bucket);\n if (result.objects.length === 0) {\n return [...intro, \"\", \"No objects in this bucket.\"].join(\"\\n\");\n }\n const rows = await prepareRows(result.objects, ctx.walletAddress, ctx.datastore, now);\n const w = columnWidths(rows);\n const header = renderHeader(w);\n const bodyLines = rows.map((r) => renderRow(r, w));\n const truncLine = result.is_truncated ? \"List truncated; more objects in bucket.\" : null;\n const prose = [...intro, ...(truncLine ? [truncLine] : [])].join(\"\\n\");\n const fence = [\"```\", [header, ...bodyLines].join(\"\\n\"), \"```\"].join(\"\\n\");\n return `${prose}\\n\\n${fence}`;\n }\n\n const friendly = await ctx.datastore.findLatestFriendlyNameForObjectKey(\n ctx.walletAddress,\n result.key,\n );\n const cp = await ctx.datastore.findCronAndPaymentForObjectKey(ctx.walletAddress, result.key);\n const sizeStr = formatBytesForDisplay(result.size_bytes);\n const s3time = formatLsTimeFieldUtc(undefined, now, LS_S3_COL_WIDTH);\n let payCell = formatPaymentCell(null, null, LS_PAY_DISPLAY_MAX);\n let cronIdDisp: string | null = null;\n let nextRun = \" - \".slice(0, LS_NEXT_COL_WIDTH).padEnd(LS_NEXT_COL_WIDTH, \" \");\n if (cp) {\n cronIdDisp = cp.cronId;\n nextRun = formatNextCronUtc(cp.schedule, cp.cronStatus, now);\n payCell = formatPaymentCell(cp.amount, cp.network, LS_PAY_DISPLAY_MAX);\n }\n const nameShown = truncateMiddle(\n friendly ? `${friendly} (${result.key})` : result.key,\n LS_NAME_DISPLAY_MAX,\n 8,\n );\n const prep: PreparedLsRow = {\n sizeStr,\n s3time,\n cronIdRaw: cronIdDisp,\n nextRun,\n payRaw: payCell,\n nameRaw: nameShown,\n };\n const w = columnWidths([prep]);\n const header = renderHeader(w);\n const line = renderRow(prep, w);\n const prose = buildLsProseIntro(result.bucket).join(\"\\n\");\n const fence = [\"```\", [header, line].join(\"\\n\"), \"```\"].join(\"\\n\");\n return `${prose}\\n\\n${fence}`;\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 /** User-visible command output on async success; persisted for op-status. */\n result_text?: 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 findCronJobRowByObjectKey: (objectKey: string) => Promise<CronJobRow | null>;\n findCronByQuoteId: (quoteId: string) => Promise<CronJobRow | null>;\n findPaymentByQuoteId: (quoteId: string) => Promise<PaymentRow | 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 result_text: 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 findLatestFriendlyNameForObjectKey: (\n walletAddress: string,\n objectKey: string,\n ) => Promise<string | null>;\n findLatestFriendlyNameForObjectId: (objectId: string) => Promise<string | null>;\n findCronAndPaymentForObjectKey: (\n walletAddress: string,\n objectKey: string,\n ) => Promise<{\n cronId: string;\n schedule: string;\n quoteId: string;\n cronStatus: string;\n amount: number | null;\n network: string | null;\n paymentStatus: string | null;\n } | null>;\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 // Multiple DatabaseSync handles may open the same file (e.g. tests + handler); wait on locks.\n nextDb.exec(\"PRAGMA busy_timeout=5000;\");\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 CREATE INDEX IF NOT EXISTS idx_cron_jobs_quote_id ON cron_jobs(quote_id);\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 addOperationsColumn(\"result_text\", \"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 findCronJobRowByObjectKey: async (objectKey) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT cron_id, object_id, object_key, quote_id, schedule, command, status\n FROM cron_jobs WHERE object_key = ? ORDER BY updated_at DESC LIMIT 1`,\n )\n .get(objectKey) as\n | {\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 | undefined;\n if (!row) return null;\n return {\n cron_id: row.cron_id,\n object_id: row.object_id,\n object_key: row.object_key,\n quote_id: row.quote_id,\n schedule: row.schedule,\n command: row.command,\n status: row.status,\n };\n }, null),\n findCronByQuoteId: async (quoteId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT cron_id, object_id, object_key, quote_id, schedule, command, status\n FROM cron_jobs WHERE quote_id = ? ORDER BY updated_at DESC LIMIT 1`,\n )\n .get(quoteId) as\n | {\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 | undefined;\n if (!row) return null;\n return {\n cron_id: row.cron_id,\n object_id: row.object_id,\n object_key: row.object_key,\n quote_id: row.quote_id,\n schedule: row.schedule,\n command: row.command,\n status: row.status,\n };\n }, null),\n findPaymentByQuoteId: async (quoteId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT quote_id, wallet_address, trans_id, amount, network, status, settled_at\n FROM payments WHERE quote_id = ? LIMIT 1`,\n )\n .get(quoteId) as\n | {\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 | undefined;\n if (!row) return null;\n return {\n quote_id: row.quote_id,\n wallet_address: row.wallet_address,\n trans_id: row.trans_id,\n amount: row.amount,\n network: row.network,\n status: row.status,\n settled_at: row.settled_at,\n };\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, result_text, 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 result_text=COALESCE(excluded.result_text, operations.result_text),\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.result_text ?? null,\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, result_text, 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 result_text: 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 findLatestFriendlyNameForObjectKey: async (walletAddress, objectKey) =>\n safe(() => {\n const w = normalizeWalletAddress(walletAddress);\n const byKey = db!\n .prepare(\n `SELECT friendly_name\n FROM friendly_names\n WHERE wallet_address = ? AND object_key = ? AND is_active = 1\n ORDER BY created_at DESC\n LIMIT 1`,\n )\n .get(w, objectKey) as { friendly_name: string } | undefined;\n if (byKey) {\n return byKey.friendly_name;\n }\n const obj = db!\n .prepare(\n `SELECT object_id FROM objects WHERE wallet_address = ? AND object_key = ? LIMIT 1`,\n )\n .get(w, objectKey) as { object_id: string } | undefined;\n if (!obj) {\n return null;\n }\n const byObj = db!\n .prepare(\n `SELECT friendly_name\n FROM friendly_names\n WHERE wallet_address = ? AND object_id = ? AND is_active = 1\n ORDER BY created_at DESC\n LIMIT 1`,\n )\n .get(w, obj.object_id) as { friendly_name: string } | undefined;\n return byObj?.friendly_name ?? null;\n }, null),\n findLatestFriendlyNameForObjectId: async (objectId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT friendly_name\n FROM friendly_names\n WHERE object_id = ? AND is_active = 1\n ORDER BY created_at DESC\n LIMIT 1`,\n )\n .get(objectId.trim()) as { friendly_name: string } | undefined;\n return row?.friendly_name ?? null;\n }, null),\n findCronAndPaymentForObjectKey: async (walletAddress, objectKey) =>\n safe(() => {\n const w = normalizeWalletAddress(walletAddress);\n const cron = db!\n .prepare(\n `SELECT c.cron_id, c.quote_id, c.schedule, c.status\n FROM cron_jobs c\n INNER JOIN objects o ON o.object_id = c.object_id\n WHERE c.object_key = ? AND o.wallet_address = ?\n ORDER BY c.updated_at DESC\n LIMIT 1`,\n )\n .get(objectKey, w) as\n | { cron_id: string; quote_id: string; schedule: string; status: string }\n | undefined;\n if (!cron) {\n return null;\n }\n const pay = db!\n .prepare(\n `SELECT amount, network, status\n FROM payments\n WHERE quote_id = ? AND wallet_address = ?\n LIMIT 1`,\n )\n .get(cron.quote_id, w) as\n | { amount: number; network: string | null; status: string }\n | undefined;\n return {\n cronId: cron.cron_id,\n schedule: cron.schedule,\n quoteId: cron.quote_id,\n cronStatus: cron.status,\n amount: pay?.amount ?? null,\n network: pay?.network ?? null,\n paymentStatus: pay?.status ?? null,\n };\n }, null),\n };\n}\n\nexport { DB_SUBPATH, SCHEMA_VERSION, resolveDbPath as resolveCloudDatastorePath };\n","export function normalizeSmartQuotes(input: string): string {\n return input.replace(/[\\u201C\\u201D]/g, '\"').replace(/[\\u2018\\u2019]/g, \"'\");\n}\n\n/**\n * Converts en/em dash at token start to `--` for flag-like tokens (after whitespace or start).\n */\nexport function normalizeFlagPositionDashes(input: string): { text: string; warnings: string[] } {\n const warnings: string[] = [];\n const pattern = /(^|\\s)[\\u2013\\u2014](?=[A-Za-z_][A-Za-z0-9_-]*)/g;\n\n let changed = false;\n const text = input.replace(pattern, (m, prefix: string) => {\n changed = true;\n return `${prefix}--`;\n });\n\n if (changed) {\n warnings.push(\"Normalized en/em dash in flag position to ASCII double hyphen.\");\n }\n\n return { text, warnings };\n}\n\nexport type NormalizedInput = {\n text: string;\n warnings: string[];\n};\n\n/**\n * Full normalization pipeline before tokenization (smart quotes, flag-position dashes).\n */\nexport function normalizeInputForParsing(input: string): NormalizedInput {\n const warnings: string[] = [];\n let text = normalizeSmartQuotes(input);\n const dashNorm = normalizeFlagPositionDashes(text);\n text = dashNorm.text;\n warnings.push(...dashNorm.warnings);\n return { text, warnings };\n}\n","function levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i]![0] = i;\n for (let j = 0; j <= n; j++) dp[0]![j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i]![j] = Math.min(dp[i - 1]![j]! + 1, dp[i]![j - 1]! + 1, dp[i - 1]![j - 1]! + cost);\n }\n }\n return dp[m]![n]!;\n}\n\n/**\n * Returns best candidate from `candidates` for unknown `raw` (low edit distance), or null.\n */\nexport function suggestNearestKey(\n raw: string,\n candidates: string[],\n maxDistance = 2,\n): string | null {\n const lower = raw.toLowerCase();\n let best: string | null = null;\n let bestDist = maxDistance + 1;\n for (const c of candidates) {\n const d = levenshtein(lower, c.toLowerCase());\n if (d < bestDist) {\n bestDist = d;\n best = c;\n }\n }\n return bestDist <= maxDistance ? best : null;\n}\n","import { normalizeInputForParsing } from \"./normalize.js\";\nimport type { ArgSpec, CommandArgSchema, ParseResult } from \"./types.js\";\nimport { suggestNearestKey } from \"./suggest.js\";\n\ntype Token = {\n raw: string;\n value: string;\n};\n\nfunction canonicalizeKey(rawKey: string): string {\n return rawKey\n .normalize(\"NFKC\")\n .replace(/[\\u2010\\u2011\\u2012\\u2013\\u2014\\u2015\\u2212]/g, \"-\")\n .replace(/_/g, \"-\")\n .toLowerCase()\n .trim();\n}\n\nexport function buildAliasMap(schema: CommandArgSchema): Map<string, ArgSpec> {\n const map = new Map<string, ArgSpec>();\n\n for (const spec of schema.args) {\n map.set(canonicalizeKey(spec.name), spec);\n for (const alias of spec.aliases ?? []) {\n map.set(canonicalizeKey(alias), spec);\n }\n }\n\n return map;\n}\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < input.length) {\n while (i < input.length && /\\s/.test(input[i]!)) i++;\n if (i >= input.length) break;\n\n let raw = \"\";\n let value = \"\";\n\n if (input[i] === '\"' || input[i] === \"'\") {\n const quote = input[i++]!;\n raw += quote;\n\n while (i < input.length) {\n const ch = input[i++]!;\n raw += ch;\n\n if (ch === \"\\\\\") {\n if (i < input.length) {\n const next = input[i++]!;\n raw += next;\n value += next;\n }\n continue;\n }\n\n if (ch === quote) {\n break;\n }\n\n value += ch;\n }\n\n tokens.push({ raw, value });\n continue;\n }\n\n while (i < input.length && !/\\s/.test(input[i]!)) {\n const ch = input[i++]!;\n raw += ch;\n value += ch;\n }\n\n tokens.push({ raw, value });\n }\n\n return tokens;\n}\n\nfunction resolveKey(\n rawKey: string,\n aliasMap: Map<string, ArgSpec>,\n schema: CommandArgSchema,\n allCanonicalNames: string[],\n): { key?: string; spec?: ArgSpec; error?: string } {\n const canonical = canonicalizeKey(rawKey);\n const spec = aliasMap.get(canonical);\n\n if (!spec) {\n if (schema.allowUnknown) return { key: canonical };\n const suggestion = suggestNearestKey(rawKey, allCanonicalNames);\n const hint = suggestion ? ` Did you mean \"${suggestion}\"?` : \"\";\n return { error: `Unknown argument \"${rawKey}\".${hint}` };\n }\n\n return { key: spec.name, spec };\n}\n\nfunction addValue(\n out: Record<string, string | string[]>,\n key: string,\n value: string,\n spec?: ArgSpec,\n): string | null {\n const existing = out[key];\n\n if (existing === undefined) {\n out[key] = spec?.repeatable ? [value] : value;\n return null;\n }\n\n if (!spec?.repeatable) {\n return `Duplicate argument \"${key}\".`;\n }\n\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n out[key] = [existing, value];\n }\n\n return null;\n}\n\nfunction collectCanonicalNames(schema: CommandArgSchema): string[] {\n const names = new Set<string>();\n for (const spec of schema.args) {\n names.add(spec.name);\n for (const a of spec.aliases ?? []) {\n names.add(a);\n }\n }\n return [...names];\n}\n\nfunction looksLikeDelimitedArgToken(token: string): boolean {\n return /^[A-Za-z_][A-Za-z0-9_-]*[:=]/.test(token);\n}\n\nfunction tryParseDelimitedToken(\n token: string,\n delimiter: \":\" | \"=\",\n aliasMap: Map<string, ArgSpec>,\n schema: CommandArgSchema,\n allCanonicalNames: string[],\n out: Record<string, string | string[]>,\n): { handled: boolean; error?: string } {\n const idx = token.indexOf(delimiter);\n if (idx <= 0) return { handled: false };\n\n const keyPart = token.slice(0, idx);\n if (!/^[A-Za-z_][A-Za-z0-9_-]*$/.test(keyPart)) return { handled: false };\n\n const rawKey = keyPart;\n const rawValue = token.slice(idx + 1);\n if (rawValue === \"\") {\n return { handled: true, error: `Empty value for argument \"${rawKey}\".` };\n }\n\n const resolved = resolveKey(rawKey, aliasMap, schema, allCanonicalNames);\n if (resolved.error) {\n return { handled: true, error: resolved.error };\n }\n\n const dupErr = addValue(out, resolved.key!, rawValue, resolved.spec);\n if (dupErr) {\n return { handled: true, error: dupErr };\n }\n\n return { handled: true };\n}\n\nexport function parseCommandArgs(input: string, schema: CommandArgSchema): ParseResult {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n const norm = normalizeInputForParsing(input);\n const normalized = norm.text;\n warnings.push(...norm.warnings);\n\n const tokens = tokenize(normalized);\n const aliasMap = buildAliasMap(schema);\n const allCanonicalNames = collectCanonicalNames(schema);\n const values: Record<string, string | string[]> = {};\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!.value;\n\n {\n const parsed = tryParseDelimitedToken(\n token,\n \":\",\n aliasMap,\n schema,\n allCanonicalNames,\n values,\n );\n if (parsed.handled) {\n if (parsed.error) errors.push(parsed.error);\n continue;\n }\n }\n\n {\n const parsed = tryParseDelimitedToken(\n token,\n \"=\",\n aliasMap,\n schema,\n allCanonicalNames,\n values,\n );\n if (parsed.handled) {\n if (parsed.error) errors.push(parsed.error);\n continue;\n }\n }\n\n if (token.startsWith(\"--\")) {\n const rawKey = token.slice(2);\n if (!rawKey) {\n errors.push('Encountered \"--\" without an argument name.');\n continue;\n }\n\n const resolved = resolveKey(rawKey, aliasMap, schema, allCanonicalNames);\n if (resolved.error) {\n errors.push(resolved.error);\n continue;\n }\n\n const next = tokens[i + 1];\n if (!next) {\n if (resolved.spec?.bareBoolean) {\n const dupErr = addValue(values, resolved.key!, \"true\", resolved.spec);\n if (dupErr) errors.push(dupErr);\n continue;\n }\n errors.push(`Missing value for argument \"${resolved.key}\".`);\n continue;\n }\n\n if (next.value.startsWith(\"--\")) {\n if (resolved.spec?.bareBoolean) {\n const dupErr = addValue(values, resolved.key!, \"true\", resolved.spec);\n if (dupErr) errors.push(dupErr);\n continue;\n }\n errors.push(`Missing value for argument \"${resolved.key}\".`);\n continue;\n }\n\n if (resolved.spec?.bareBoolean && looksLikeDelimitedArgToken(next.value)) {\n const dupErr = addValue(values, resolved.key!, \"true\", resolved.spec);\n if (dupErr) errors.push(dupErr);\n continue;\n }\n\n const dupErr = addValue(values, resolved.key!, next.value, resolved.spec);\n if (dupErr) errors.push(dupErr);\n\n i += 1;\n continue;\n }\n\n errors.push(`Unexpected token \"${token}\". Use key:value, key=value, or --key value.`);\n }\n\n for (const spec of schema.args) {\n if (spec.required && values[spec.name] === undefined) {\n errors.push(`Missing required argument \"${spec.name}\".`);\n }\n }\n\n if (errors.length > 0) {\n return {\n ok: false,\n normalizedInput: normalized,\n errors,\n warnings,\n };\n }\n\n return {\n ok: true,\n normalizedInput: normalized,\n values,\n warnings,\n };\n}\n\nexport function valuesToStringRecord(\n values: Record<string, string | string[]>,\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(values)) {\n out[k] = Array.isArray(v) ? v[v.length - 1]! : v;\n }\n return out;\n}\n","/**\n * Top-level /mnemospark argument routing (after the slash command name).\n */\n\nexport type MnemosparkRoute =\n | { kind: \"root-help\" }\n | { kind: \"cloud\"; rest: string }\n | { kind: \"wallet\"; rest: string }\n | { kind: \"error\"; message: string };\n\n/**\n * Parse first token optional `name:true` form. Rejects non-true values after colon.\n */\nexport function parseVerboseToken(token: string): { name: string; ok: boolean } {\n const t = token.trim();\n const idx = t.indexOf(\":\");\n if (idx < 0) {\n return { name: t.toLowerCase(), ok: true };\n }\n const key = t.slice(0, idx).trim();\n const val = t\n .slice(idx + 1)\n .trim()\n .toLowerCase();\n if (!key) return { name: \"\", ok: false };\n if (val === \"true\") return { name: key.toLowerCase(), ok: true };\n return { name: key.toLowerCase(), ok: false };\n}\n\nexport function firstTokenAndRest(input: string): { first: string; rest: string } {\n const t = input.trim();\n if (!t) return { first: \"\", rest: \"\" };\n const spaceIdx = t.search(/\\s/);\n if (spaceIdx === -1) return { first: t, rest: \"\" };\n return { first: t.slice(0, spaceIdx), rest: t.slice(spaceIdx + 1).trim() };\n}\n\n/**\n * Routes `ctx.args` for `/mnemospark` (everything after the command name).\n */\nexport function routeMnemosparkArgs(args: string | undefined): MnemosparkRoute {\n const trimmed = args?.trim() ?? \"\";\n if (!trimmed) {\n return { kind: \"root-help\" };\n }\n\n const { first, rest } = firstTokenAndRest(trimmed);\n const parsed = parseVerboseToken(first);\n if (!parsed.ok) {\n return {\n kind: \"error\",\n message: `Invalid token \"${first}\". Use name:true only with value true, or a bare name (e.g. cloud, wallet, help).`,\n };\n }\n\n const head = parsed.name;\n\n if (head === \"help\") {\n return { kind: \"root-help\" };\n }\n\n if (head === \"cloud\") {\n return { kind: \"cloud\", rest };\n }\n\n if (head === \"wallet\") {\n return { kind: \"wallet\", rest };\n }\n\n return {\n kind: \"error\",\n message: [\n `Unknown command \"${first}\".`,\n \"\",\n \"Try:\",\n \"• `/mnemospark help` — overview\",\n \"• `/mnemospark cloud help` — cloud commands\",\n \"• `/mnemospark wallet` — wallet status\",\n \"• `/mnemospark wallet help` — wallet commands\",\n ].join(\"\\n\"),\n };\n}\n","import type { CommandArgSchema } from \"./args/types.js\";\n\nexport const priceStorageSchema: CommandArgSchema = {\n args: [\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-id\", aliases: [\"object\"], required: true },\n // Optional: omit when the object exists in local SQLite after backup; CLI resolves sha256 from state.db.\n { name: \"object-id-hash\", aliases: [\"hash\"] },\n { name: \"gb\", required: true },\n { name: \"provider\", required: true },\n { name: \"region\", required: true },\n ],\n};\n\nexport const uploadSchema: CommandArgSchema = {\n args: [\n { name: \"quote-id\", aliases: [\"quote\"], required: true },\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-id\", aliases: [\"object\"], required: true },\n { name: \"object-id-hash\", aliases: [\"hash\"], required: true },\n { name: \"name\" },\n { name: \"async\", bareBoolean: true },\n { name: \"orchestrator\" },\n { name: \"timeout-seconds\" },\n ],\n};\n\nexport const backupFlagsSchema: CommandArgSchema = {\n args: [\n { name: \"name\" },\n { name: \"async\", bareBoolean: true },\n { name: \"orchestrator\" },\n { name: \"timeout-seconds\" },\n ],\n};\n\nexport const paymentSettleSchema: CommandArgSchema = {\n args: [\n { name: \"quote-id\", aliases: [\"quote\"] },\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-id\", aliases: [\"object\"] },\n { name: \"object-key\" },\n { name: \"storage-price\" },\n { name: \"renewal\", bareBoolean: true },\n ],\n};\n\nexport const lsSchema: CommandArgSchema = {\n args: [\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-key\" },\n { name: \"name\" },\n { name: \"latest\", bareBoolean: true },\n { name: \"at\" },\n { name: \"location\" },\n { name: \"region\" },\n ],\n};\n\nexport const downloadSchema: CommandArgSchema = {\n args: [\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-key\" },\n { name: \"name\" },\n { name: \"latest\", bareBoolean: true },\n { name: \"at\" },\n { name: \"location\" },\n { name: \"region\" },\n { name: \"async\", bareBoolean: true },\n { name: \"orchestrator\" },\n { name: \"timeout-seconds\" },\n ],\n};\n\nexport const deleteSchema: CommandArgSchema = {\n args: [\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-key\" },\n { name: \"name\" },\n { name: \"latest\", bareBoolean: true },\n { name: \"at\" },\n { name: \"location\" },\n { name: \"region\" },\n ],\n};\n\nexport const opStatusSchema: CommandArgSchema = {\n args: [\n { name: \"operation-id\", required: true },\n { name: \"cancel\", bareBoolean: true },\n ],\n};\n","/**\n * Retry Logic for mnemospark\n *\n * Provides fetch wrapper with exponential backoff for transient errors.\n * Retries on 429 (rate limit), 502, 503, 504 (server errors).\n */\n\n/** Configuration for retry behavior */\nexport type RetryConfig = {\n /** Maximum number of retries (default: 2) */\n maxRetries: number;\n /** Base delay in ms for exponential backoff (default: 500) */\n baseDelayMs: number;\n /** HTTP status codes that trigger a retry (default: [429, 502, 503, 504]) */\n retryableCodes: number[];\n};\n\n/** Default retry configuration */\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 2,\n baseDelayMs: 500,\n retryableCodes: [429, 502, 503, 504],\n};\n\n/** Sleep for a given number of milliseconds */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Wrap a fetch-like function with retry logic and exponential backoff.\n *\n * @param fetchFn - The fetch function to wrap (can be standard fetch or x402 payFetch)\n * @param url - URL to fetch\n * @param init - Fetch init options\n * @param config - Retry configuration (optional, uses defaults)\n * @returns Response from successful fetch or last failed attempt\n *\n * @example\n * ```typescript\n * const response = await fetchWithRetry(\n * fetch,\n * \"https://api.example.com/endpoint\",\n * { method: \"POST\", body: JSON.stringify(data) },\n * { maxRetries: 3 }\n * );\n * ```\n */\nexport async function fetchWithRetry(\n fetchFn: (url: string, init?: RequestInit) => Promise<Response>,\n url: string,\n init?: RequestInit,\n config?: Partial<RetryConfig>,\n): Promise<Response> {\n const cfg: RetryConfig = {\n ...DEFAULT_RETRY_CONFIG,\n ...config,\n };\n\n let lastError: Error | undefined;\n let lastResponse: Response | undefined;\n\n for (let attempt = 0; attempt <= cfg.maxRetries; attempt++) {\n try {\n const response = await fetchFn(url, init);\n\n // Success or non-retryable status — return immediately\n if (!cfg.retryableCodes.includes(response.status)) {\n return response;\n }\n\n // Retryable status — save response and maybe retry\n lastResponse = response;\n\n // Check for Retry-After header (common with 429)\n const retryAfter = response.headers.get(\"retry-after\");\n let delay: number;\n\n if (retryAfter) {\n // Retry-After can be seconds or HTTP-date\n const seconds = parseInt(retryAfter, 10);\n delay = isNaN(seconds) ? cfg.baseDelayMs * Math.pow(2, attempt) : seconds * 1000;\n } else {\n delay = cfg.baseDelayMs * Math.pow(2, attempt);\n }\n\n // Only retry if we have attempts left\n if (attempt < cfg.maxRetries) {\n await sleep(delay);\n }\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n // Network errors are retryable\n if (attempt < cfg.maxRetries) {\n const delay = cfg.baseDelayMs * Math.pow(2, attempt);\n await sleep(delay);\n }\n }\n }\n\n // All retries exhausted — return last response or throw last error\n if (lastResponse) {\n return lastResponse;\n }\n\n throw lastError ?? new Error(\"Max retries exceeded\");\n}\n\n/**\n * Check if an error or response indicates a retryable condition.\n */\nexport function isRetryable(\n errorOrResponse: Error | Response,\n config?: Partial<RetryConfig>,\n): boolean {\n const retryableCodes = config?.retryableCodes ?? DEFAULT_RETRY_CONFIG.retryableCodes;\n\n if (errorOrResponse instanceof Response) {\n return retryableCodes.includes(errorOrResponse.status);\n }\n\n // Network errors are generally retryable\n const message = errorOrResponse.message.toLowerCase();\n return (\n message.includes(\"network\") ||\n message.includes(\"timeout\") ||\n message.includes(\"econnreset\") ||\n message.includes(\"econnrefused\") ||\n message.includes(\"socket hang up\")\n );\n}\n","/**\n * mnemospark plugin entrypoint.\n *\n * This plugin provides wallet and cloud storage commands and starts a local\n * proxy that forwards mnemospark backend storage endpoints.\n */\n\nimport type { OpenClawPluginDefinition, OpenClawPluginApi, PluginCommandContext } from \"./types.js\";\nimport { startProxy } from \"./proxy.js\";\nimport { resolveOrGenerateWalletKey } from \"./auth.js\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport { VERSION } from \"./version.js\";\nimport { runMnemosparkSlashHandler } from \"./mnemospark-handler.js\";\n\n/**\n * Detect if we're running in shell completion mode.\n * In completion mode, avoid side effects and logging.\n */\nfunction isCompletionMode(): boolean {\n const args = process.argv;\n return args.some((arg, i) => arg === \"completion\" && i >= 1 && i <= 3);\n}\n\n/**\n * Detect if we're running in gateway mode.\n * The proxy should only start when the gateway is running.\n */\nfunction isGatewayMode(): boolean {\n const args = process.argv;\n return args.includes(\"gateway\");\n}\n\n// Store active proxy handle for cleanup on gateway_stop\nlet activeProxyHandle: Awaited<ReturnType<typeof startProxy>> | null = null;\n\n/**\n * Start the proxy in the background.\n * Called from register() in gateway mode.\n */\nasync function startProxyInBackground(api: OpenClawPluginApi): Promise<void> {\n const { key: walletKey, address, source } = await resolveOrGenerateWalletKey();\n\n if (source === \"generated\") {\n api.logger.info(`Generated new wallet: ${address}`);\n } else if (source === \"saved\") {\n api.logger.info(`Using saved wallet: ${address}`);\n } else {\n api.logger.info(`Using wallet from MNEMOSPARK_WALLET_KEY: ${address}`);\n }\n\n const proxy = await startProxy({\n walletKey,\n onReady: (port) => {\n api.logger.info(`mnemospark proxy listening on port ${port}`);\n },\n onError: (error) => {\n api.logger.error(`mnemospark proxy error: ${error.message}`);\n },\n onLowBalance: (info) => {\n api.logger.warn(`[!] Low balance: ${info.balanceUSD}. Fund wallet: ${info.walletAddress}`);\n },\n onInsufficientFunds: (info) => {\n api.logger.error(\n `[!] Insufficient funds. Balance: ${info.balanceUSD}, Needed: ${info.requiredUSD}. Fund wallet: ${info.walletAddress}`,\n );\n },\n });\n\n activeProxyHandle = proxy;\n api.logger.info(\"mnemospark ready\");\n\n // Non-blocking startup balance check\n const startupMonitor = new BalanceMonitor(address);\n startupMonitor\n .checkBalance()\n .then((balance) => {\n if (balance.isEmpty) {\n api.logger.info(`Wallet: ${address} | Balance: $0.00`);\n } else if (balance.isLow) {\n api.logger.info(`Wallet: ${address} | Balance: ${balance.balanceUSD} (low)`);\n } else {\n api.logger.info(`Wallet: ${address} | Balance: ${balance.balanceUSD}`);\n }\n })\n .catch(() => {\n api.logger.info(`Wallet: ${address} | Balance: (checking...)`);\n });\n}\n\nconst plugin: OpenClawPluginDefinition = {\n id: \"mnemospark\",\n name: \"mnemospark\",\n description: \"mnemospark storage and wallet plugin\",\n version: VERSION,\n\n async register(api: OpenClawPluginApi) {\n const isDisabled =\n process.env.MNEMOSPARK_DISABLED === \"true\" || process.env.MNEMOSPARK_DISABLED === \"1\";\n if (isDisabled) {\n api.logger.info(\"mnemospark disabled (MNEMOSPARK_DISABLED=true).\");\n return;\n }\n\n if (isCompletionMode()) {\n return;\n }\n\n try {\n api.registerCommand({\n name: \"mnemospark\",\n nativeNames: {\n default: \"mnemospark\",\n },\n description: \"mnemospark wallet and cloud storage commands\",\n acceptsArgs: true,\n requireAuth: true,\n handler: async (ctx: PluginCommandContext) => {\n try {\n return await runMnemosparkSlashHandler(ctx);\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : typeof err === \"string\"\n ? err\n : \"An unexpected error occurred\";\n return { text: message.trim() || \"An unexpected error occurred\", isError: true };\n }\n },\n });\n } catch (err) {\n api.logger.warn(\n `Failed to register /mnemospark command: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Register service for cleanup on gateway shutdown.\n api.registerService({\n id: \"mnemospark-proxy\",\n start: () => {\n // No-op: proxy starts below in non-blocking mode.\n },\n stop: async () => {\n if (activeProxyHandle) {\n try {\n await activeProxyHandle.close();\n api.logger.info(\"mnemospark proxy closed\");\n } catch (err) {\n api.logger.warn(\n `Error closing proxy: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n activeProxyHandle = null;\n }\n }\n },\n });\n\n // Proxy only runs in gateway mode.\n if (!isGatewayMode()) {\n return;\n }\n\n startProxyInBackground(api).catch((err) => {\n api.logger.error(\n `Failed to start mnemospark proxy: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n },\n};\n\nexport default plugin;\n\n// Re-export for programmatic use\nexport { startProxy, getProxyPort } from \"./proxy.js\";\nexport type { ProxyOptions, ProxyHandle, LowBalanceInfo, InsufficientFundsInfo } from \"./proxy.js\";\nexport { PaymentCache } from \"./payment-cache.js\";\nexport type { CachedPaymentParams } from \"./payment-cache.js\";\nexport { createPaymentFetch } from \"./x402.js\";\nexport type { PreAuthParams, PaymentFetchResult } from \"./x402.js\";\nexport { BalanceMonitor, BALANCE_THRESHOLDS } from \"./balance.js\";\nexport type { BalanceInfo, SufficiencyResult } from \"./balance.js\";\nexport {\n InsufficientFundsError,\n EmptyWalletError,\n RpcError,\n isInsufficientFundsError,\n isEmptyWalletError,\n isBalanceError,\n isRpcError,\n} from \"./errors.js\";\nexport { fetchWithRetry, isRetryable, DEFAULT_RETRY_CONFIG } from \"./retry.js\";\nexport type { RetryConfig } from \"./retry.js\";\nexport { createCloudCommand } from \"./cloud-command.js\";\nexport { runMnemosparkSlashHandler } from \"./mnemospark-handler.js\";\n"],"mappings":"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","names":["homedir","join","privateKeyToAccount","response","resolve","signTypedData","privateKeyToAccount","BASE_SEPOLIA_CHAIN_ID","encodeBase64Json","signTypedData","privateKeyToAccount","response","paymentHeader","join","segment","join","bucket","key","sizeBytes","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","privateKeyToAccount","createHash","randomUUID","createReadStream","createWriteStream","mkdir","readFile","readdir","stat","writeFile","homedir","basename","dirname","join","resolve","privateKeyToAccount","w","header","prose","fence","randomUUID","mkdir","createRequire","homedir","dirname","join","require","dupErr","join","homedir","readdir","dirname","basename","createHash","createReadStream","stat","resolve","mkdir","randomUUID","readFile","createWriteStream","writeFile","payloadHash","payload","parsedRequest","requestPaymentSettleViaProxy","privateKeyToAccount","privateKeyToAccount","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/mnemospark-handler.ts","../src/cloud-help-onboarding.ts","../src/cloud-command.ts","../src/cloud-ls-format.ts","../src/cloud-datastore.ts","../src/args/normalize.ts","../src/args/suggest.ts","../src/args/parser.ts","../src/mnemospark-route.ts","../src/arg-schemas.ts","../src/openclaw-cli.ts","../src/openclaw-renewal-runbook.ts","../src/retry.ts","../src/index.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 {\n PROXY_PORT,\n MNEMOSPARK_BACKEND_API_BASE_URL,\n MNEMOSPARK_PROXY_VERBOSE_404,\n} 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 parseStorageLsRequestPayload,\n parseProxyStorageDownloadPayload,\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 createJsonResponseHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n \"X-Content-Type-Options\": \"nosniff\",\n \"Cache-Control\": \"no-store\",\n };\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, createJsonResponseHeaders());\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(\"events.jsonl\", {\n ts: new Date().toISOString(),\n event_type: eventType,\n status,\n source: \"proxy\",\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 \"X-Content-Type-Options\": \"nosniff\",\n \"Cache-Control\": \"no-store\",\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\nfunction sendWalletRequired(res: ServerResponse): void {\n res.writeHead(400, createJsonResponseHeaders());\n res.end(createWalletRequiredBody());\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\n if (requestPayload.wallet_address.toLowerCase() !== proxyWalletAddressLower) {\n logProxyEvent(\"warn\", \"proxy_price_storage_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 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 sendWalletRequired(res);\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 walletAddress =\n typeof record?.wallet_address === \"string\" ? record.wallet_address.trim() : \"\";\n const isRenewal = record?.renewal === true;\n const objectKey = typeof record?.object_key === \"string\" ? record.object_key.trim() : \"\";\n let quoteId = typeof record?.quote_id === \"string\" ? record.quote_id.trim() : \"\";\n const inlinePayment = record?.payment;\n const inlinePaymentAuthorization = record?.payment_authorization;\n if (!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 field: wallet_address\",\n });\n return;\n }\n if (isRenewal) {\n if (quoteId) {\n logProxyEvent(\"warn\", \"proxy_payment_settle_renewal_with_quote_id\");\n emitProxyTerminalFromStatus(correlation, 400, { reason: \"renewal_with_quote_id\" });\n sendJson(res, 400, {\n error: \"Bad request\",\n message: \"renewal requests must not include quote_id\",\n });\n return;\n }\n if (!objectKey) {\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 field: object_key (renewal mode)\",\n });\n return;\n }\n quoteId = `renewal:${objectKey}`;\n } else if (!quoteId) {\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 field: quote_id (or use renewal: true with object_key)\",\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 sendWalletRequired(res);\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 renewal: isRenewal,\n objectKey: isRenewal ? objectKey : 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 sendWalletRequired(res);\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 sendWalletRequired(res);\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 sendWalletRequired(res);\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 = parseStorageLsRequestPayload(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 field: wallet_address\",\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 sendWalletRequired(res);\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 parsedDownload = parseProxyStorageDownloadPayload(payload);\n if (!parsedDownload) {\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 const requestPayload = parsedDownload.request;\n const downloadLocalBasename = parsedDownload.localBasename;\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 sendWalletRequired(res);\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 ...(downloadLocalBasename?.trim()\n ? { localOutputBasename: downloadLocalBasename.trim() }\n : {}),\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 sendWalletRequired(res);\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 if (MNEMOSPARK_PROXY_VERBOSE_404) {\n sendJson(res, 404, {\n error: \"Not found\",\n message: \"Supported paths: /health and /mnemospark/* storage endpoints\",\n });\n } else {\n sendJson(res, 404, { error: \"Not found\" });\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\n/**\n * When true, unknown HTTP paths return a 404 JSON body that includes a `message`\n * listing supported routes. Default is a generic `{ \"error\": \"Not found\" }` only.\n */\nexport const MNEMOSPARK_PROXY_VERBOSE_404 = (() => {\n const v = process.env.MNEMOSPARK_PROXY_VERBOSE_404?.trim().toLowerCase();\n return v === \"1\" || v === \"true\" || v === \"yes\";\n})();\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\nconst BYTE_SI_UNITS = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"] as const;\nconst BYTE_SI_BASE = 1000;\n\n/**\n * Human-readable size using decimal (SI) prefixes: 1 KB = 1_000 B.\n * At most one fractional digit for KB+; prefer integers when within 1% of a whole unit.\n */\nexport function formatBytesForDisplay(bytes: number): string {\n if (!Number.isInteger(bytes) || bytes < 0 || !Number.isFinite(bytes)) {\n throw new Error(\"formatBytesForDisplay expects a non-negative integer\");\n }\n if (bytes === 0) {\n return \"0 B\";\n }\n let value = bytes;\n let unitIndex = 0;\n while (value >= BYTE_SI_BASE && unitIndex < BYTE_SI_UNITS.length - 1) {\n value /= BYTE_SI_BASE;\n unitIndex += 1;\n }\n if (unitIndex === 0) {\n return `${bytes} B`;\n }\n const nearestInt = Math.round(value);\n const pickInt = nearestInt > 0 && Math.abs(value - nearestInt) / Math.max(value, 1e-9) <= 0.01;\n let rounded = pickInt ? nearestInt : Math.round(value * 10) / 10;\n if (rounded >= BYTE_SI_BASE && unitIndex < BYTE_SI_UNITS.length - 1) {\n rounded = Math.round((rounded / BYTE_SI_BASE) * 10) / 10;\n unitIndex += 1;\n }\n const text = Number.isInteger(rounded) ? String(rounded) : String(rounded).replace(/\\.0$/, \"\");\n return `${text} ${BYTE_SI_UNITS[unitIndex]}`;\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 wallet_address: string;\n quote_id?: string;\n renewal?: boolean;\n object_key?: 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 /** Monthly renewal path: JSON uses renewal + object_key (no quote_id). */\n renewal?: boolean;\n objectKey?: 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 renewal?: boolean;\n objectKey?: 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 wallet_address: walletAddress,\n };\n if (options.renewal === true && options.objectKey?.trim()) {\n requestBody.renewal = true;\n requestBody.object_key = options.objectKey.trim();\n } else {\n requestBody.quote_id = quoteId;\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 wallet_address: walletAddress,\n };\n if (options.renewal === true && options.objectKey?.trim()) {\n requestBody.renewal = true;\n requestBody.object_key = options.objectKey.trim();\n } else {\n requestBody.quote_id = quoteId;\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\n/** POST /storage/ls body: wallet required; omit object_key for S3 list mode. */\nexport type StorageLsRequest = {\n wallet_address: string;\n object_key?: string;\n location?: string;\n continuation_token?: string;\n max_keys?: number;\n prefix?: string;\n};\n\nexport type StorageLsStatResponse = {\n mode: \"stat\";\n success: boolean;\n key: string;\n size_bytes: number;\n bucket: string;\n object_id?: string;\n};\n\nexport type StorageLsListObject = {\n key: string;\n size_bytes: number;\n last_modified?: string;\n};\n\nexport type StorageLsListResponse = {\n mode: \"list\";\n success: boolean;\n list_mode: true;\n bucket: string;\n objects: StorageLsListObject[];\n is_truncated: boolean;\n next_continuation_token: string | null;\n};\n\nexport type StorageLsResponse = StorageLsStatResponse | StorageLsListResponse;\n\nexport function isStorageLsListResponse(r: StorageLsResponse): r is StorageLsListResponse {\n return r.mode === \"list\";\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 /** Proxy-only: preferred on-disk basename under the download directory (not sent to the backend). */\n downloadLocalBasename?: string;\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 /** When set, used as the relative path key for resolveDownloadPath instead of object_key. */\n localOutputBasename?: string;\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\nconst MAX_LOCAL_FRIENDLY_BASENAME_LEN = 200;\n\n/**\n * Maps a user-supplied friendly name to a single safe filename segment for local backup/download paths.\n * Throws if the result would be empty or invalid.\n */\nexport function sanitizeFriendlyNameForLocalBasename(raw: string): string {\n const normalized = raw.replace(/\\\\/g, \"/\").trim();\n if (!normalized) {\n throw new Error(\"Friendly name is empty\");\n }\n const segments = normalized\n .split(\"/\")\n .filter((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\");\n const segment = segments[segments.length - 1] ?? \"\";\n if (!segment || segment === \".\" || segment === \"..\") {\n throw new Error(\"Invalid friendly name for local file path\");\n }\n // eslint-disable-next-line no-control-regex -- intentional strip of C0 control chars for filenames\n const noCtrl = segment.replace(/[\\x00-\\x1f]/g, \"\").trim();\n if (!noCtrl || noCtrl === \".\" || noCtrl === \"..\") {\n throw new Error(\"Invalid friendly name for local file path\");\n }\n return noCtrl.length > MAX_LOCAL_FRIENDLY_BASENAME_LEN\n ? noCtrl.slice(0, MAX_LOCAL_FRIENDLY_BASENAME_LEN)\n : noCtrl;\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 jsonBody: Record<string, unknown>,\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(jsonBody),\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 jsonBody: Record<string, unknown>,\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(jsonBody),\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\n/** Proxy POST body for download: backend fields plus optional local filename hint (stripped before backend forward). */\nexport function parseProxyStorageDownloadPayload(payload: unknown): {\n request: StorageObjectRequest;\n localBasename?: string;\n} | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n const walletAddress = asNonEmptyString(record.wallet_address);\n const objectKey = asNonEmptyString(record.object_key);\n const location = asNonEmptyString(record.location) ?? undefined;\n if (!walletAddress || !objectKey) {\n return null;\n }\n const localRaw = asNonEmptyString(record.mnemospark_local_filename) ?? undefined;\n return {\n request: {\n wallet_address: walletAddress,\n object_key: objectKey,\n ...(location ? { location } : {}),\n },\n ...(localRaw ? { localBasename: localRaw } : {}),\n };\n}\n\nfunction jsonBodyForObjectRequest(request: StorageObjectRequest): Record<string, unknown> {\n const o: Record<string, unknown> = {\n wallet_address: request.wallet_address,\n object_key: request.object_key,\n };\n if (request.location) {\n o.location = request.location;\n }\n return o;\n}\n\nfunction jsonBodyForProxyDownloadRequest(\n request: StorageObjectRequest,\n downloadLocalBasename?: string,\n): Record<string, unknown> {\n const body = jsonBodyForObjectRequest(request);\n const trimmed = downloadLocalBasename?.trim();\n if (trimmed) {\n body.mnemospark_local_filename = trimmed;\n }\n return body;\n}\n\nexport function jsonBodyForLsRequest(request: StorageLsRequest): Record<string, unknown> {\n const o: Record<string, unknown> = { wallet_address: request.wallet_address };\n if (request.object_key) {\n o.object_key = request.object_key;\n }\n if (request.location) {\n o.location = request.location;\n }\n if (request.continuation_token) {\n o.continuation_token = request.continuation_token;\n }\n if (typeof request.max_keys === \"number\") {\n o.max_keys = request.max_keys;\n }\n if (request.prefix) {\n o.prefix = request.prefix;\n }\n return o;\n}\n\n/** Proxy / local CLI: parse JSON body for /storage/ls (object_key optional). */\nexport function parseStorageLsRequestPayload(payload: unknown): StorageLsRequest | null {\n const record = asRecord(payload);\n if (!record) {\n return null;\n }\n const walletAddress = asNonEmptyString(record.wallet_address);\n if (!walletAddress) {\n return null;\n }\n const objectKey = asNonEmptyString(record.object_key) ?? undefined;\n const location = asNonEmptyString(record.location) ?? undefined;\n const continuation_token = asNonEmptyString(record.continuation_token) ?? undefined;\n const maxRaw = asNumber(record.max_keys);\n const max_keys = maxRaw !== null && Number.isInteger(maxRaw) && maxRaw >= 1 ? maxRaw : undefined;\n const prefix = asNonEmptyString(record.prefix) ?? undefined;\n return {\n wallet_address: walletAddress,\n ...(objectKey ? { object_key: objectKey } : {}),\n ...(location ? { location } : {}),\n ...(continuation_token ? { continuation_token } : {}),\n ...(typeof max_keys === \"number\" ? { max_keys } : {}),\n ...(prefix ? { prefix } : {}),\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 if (record.list_mode === true) {\n const bucket = asNonEmptyString(record.bucket) ?? asNonEmptyString(record.bucket_name);\n const rawObjects = record.objects;\n if (!bucket || !Array.isArray(rawObjects)) {\n throw new Error(\"ls list response is missing required fields\");\n }\n const objects: StorageLsListObject[] = [];\n for (const item of rawObjects) {\n const row = asRecord(item);\n if (!row) {\n continue;\n }\n const key = asNonEmptyString(row.key);\n const sizeBytes = asNumber(row.size_bytes);\n if (!key || sizeBytes === null || !Number.isInteger(sizeBytes) || sizeBytes < 0) {\n continue;\n }\n const last_modified = asNonEmptyString(row.last_modified) ?? undefined;\n objects.push({ key, size_bytes: sizeBytes, last_modified });\n }\n const is_truncated = asBooleanOrDefault(record.is_truncated, false);\n const nextRaw = record.next_continuation_token;\n const next_continuation_token =\n nextRaw === undefined || nextRaw === null ? null : String(nextRaw);\n return {\n mode: \"list\",\n success: asBooleanOrDefault(record.success, true),\n list_mode: true,\n bucket,\n objects,\n is_truncated,\n next_continuation_token,\n };\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 if (!Number.isInteger(sizeBytes) || sizeBytes < 0) {\n throw new Error(\"ls response has invalid size_bytes; expected non-negative integer\");\n }\n\n return {\n mode: \"stat\",\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: StorageLsRequest,\n options: ProxyStorageOptions = {},\n): Promise<StorageLsResponse> {\n return requestJsonViaProxy(\n STORAGE_LS_PROXY_PATH,\n jsonBodyForLsRequest(request),\n parseStorageLsResponse,\n options,\n );\n}\n\nexport async function requestStorageDownloadViaProxy(\n request: StorageObjectRequest,\n options: ProxyStorageOptions = {},\n): Promise<StorageDownloadProxyResponse> {\n return requestJsonViaProxy(\n STORAGE_DOWNLOAD_PROXY_PATH,\n jsonBodyForProxyDownloadRequest(request, options.downloadLocalBasename),\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 jsonBodyForObjectRequest(request),\n parseStorageDeleteResponse,\n options,\n );\n}\n\nexport async function forwardStorageLsToBackend(\n request: StorageLsRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\"/storage/ls\", \"POST\", jsonBodyForLsRequest(request), options);\n}\n\nexport async function forwardStorageDownloadToBackend(\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\n \"/storage/download\",\n \"POST\",\n jsonBodyForObjectRequest(request),\n options,\n );\n}\n\nexport async function forwardStorageDeleteToBackend(\n request: StorageObjectRequest,\n options: BackendStorageOptions = {},\n): Promise<BackendStorageForwardResult> {\n return forwardStorageToBackend(\n \"/storage/delete\",\n \"POST\",\n jsonBodyForObjectRequest(request),\n options,\n );\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 pathKey =\n options.localOutputBasename?.trim() && options.localOutputBasename.trim().length > 0\n ? options.localOutputBasename.trim()\n : objectKey;\n const filePath = resolveDownloadPath(outputDir, pathKey);\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\");\n/** Higher ceiling now that proxy + command share events.jsonl. */\nconst MAX_BYTES = 15 * 1024 * 1024;\nconst KEEP_ROTATED = 12;\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 { existsSync, readFileSync } from \"node:fs\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport { WALLET_FILE } from \"./auth.js\";\nimport { CLOUD_ONBOARDING_BLOCK_LINES } from \"./cloud-help-onboarding.js\";\nimport { createCloudCommand } from \"./cloud-command.js\";\nimport { firstTokenAndRest, parseVerboseToken, routeMnemosparkArgs } from \"./mnemospark-route.js\";\nimport type { PluginCommandContext, PluginCommandHandler, PluginCommandResult } from \"./types.js\";\n\nexport const MNEMOSPARK_ROOT_HELP_TEXT = [\n \"☁️ **mnemospark - Wallet and go.** 💙\",\n ...CLOUD_ONBOARDING_BLOCK_LINES,\n \"To view the full help menu use these commands:\",\n \"\",\n \"**Cloud storage**\",\n \"• `/mnemospark cloud help`\",\n \"\",\n \"**Wallet status and funding link:**\",\n \"• `/mnemospark wallet`\",\n \"• `/mnemospark wallet help`\",\n \"\",\n \"**Let your agent run mnemospark for you:**\",\n \"\",\n \"mnemospark installs as an OpenClaw extension under `~/.openclaw/extensions/mnemospark/`. Point your agent at the bundled skill:\",\n \"\",\n \"Install the mnemospark skill available at `~/.openclaw/extensions/mnemospark/skills/mnemospark/SKILL.md`\",\n].join(\"\\n\");\n\nexport const MNEMOSPARK_WALLET_HELP_TEXT = (address: string) =>\n [\n \"☁️ **mnemospark Wallet**\",\n \"\",\n \"**Commands:**\",\n \"• `/mnemospark wallet` — Show address, balance, and key file path\",\n \"• `/mnemospark wallet help` — This message\",\n \"• `/mnemospark wallet export` — Export private key for backup (sensitive)\",\n \"\",\n `**Fund with USDC on Base:** https://basescan.org/address/${address}`,\n ].join(\"\\n\");\n\nexport type RunMnemosparkSlashHandlerOptions = {\n cloudCommandHandler?: PluginCommandHandler;\n};\n\nlet defaultCloudCommandHandler: PluginCommandHandler | undefined;\n\nfunction getDefaultCloudCommandHandler(): PluginCommandHandler {\n defaultCloudCommandHandler ??= createCloudCommand().handler;\n return defaultCloudCommandHandler;\n}\n\nconst NO_WALLET_FOUND_TEXT =\n \"No mnemospark wallet found. Run `openclaw plugins install mnemospark`.\";\n\nfunction resolveWalletFileSync(): { walletKey: string; address: string } | null {\n try {\n if (!existsSync(WALLET_FILE)) {\n return null;\n }\n const walletKey = readFileSync(WALLET_FILE, \"utf-8\").trim();\n if (!walletKey.startsWith(\"0x\") || walletKey.length !== 66) {\n return null;\n }\n const account = privateKeyToAccount(walletKey as `0x${string}`);\n const address = account.address.replace(/\\s/g, \"\");\n if (!address) {\n return null;\n }\n return { walletKey, address };\n } catch {\n return null;\n }\n}\n\n/**\n * OpenClaw + CLI: same handler for `/mnemospark` (args = everything after the command name).\n */\nexport async function runMnemosparkSlashHandler(\n ctx: PluginCommandContext,\n options?: RunMnemosparkSlashHandlerOptions,\n): Promise<PluginCommandResult> {\n const route = routeMnemosparkArgs(ctx.args);\n\n if (route.kind === \"root-help\") {\n return { text: MNEMOSPARK_ROOT_HELP_TEXT };\n }\n\n if (route.kind === \"error\") {\n return { text: route.message, isError: true };\n }\n\n if (route.kind === \"cloud\") {\n const cloudCommandHandler = options?.cloudCommandHandler ?? getDefaultCloudCommandHandler();\n return cloudCommandHandler({ ...ctx, args: route.rest });\n }\n\n return handleWalletSlash(route.rest);\n}\n\nasync function handleWalletSlash(rest: string): Promise<PluginCommandResult> {\n const trimmed = rest.trim();\n if (!trimmed) {\n return buildWalletStatusResponse();\n }\n\n const { first, rest: afterFirst } = firstTokenAndRest(trimmed);\n const parsed = parseVerboseToken(first);\n if (!parsed.ok) {\n return {\n text: `Invalid token \"${first}\". Use name:true only with value true.`,\n isError: true,\n };\n }\n\n if (parsed.name === \"help\") {\n if (afterFirst.trim()) {\n return {\n text: \"Unexpected extra arguments after `help`. Use `/mnemospark wallet help` alone.\",\n isError: true,\n };\n }\n return buildWalletHelpResponse();\n }\n\n if (parsed.name === \"export\") {\n if (afterFirst.trim()) {\n return {\n text: \"Unexpected extra arguments after `export`. Use `/mnemospark wallet export` alone.\",\n isError: true,\n };\n }\n return buildWalletExportResponse();\n }\n\n if (parsed.name === \"status\") {\n return buildWalletStatusResponse();\n }\n\n return {\n text: `Unknown wallet command \"${parsed.name}\". Try \\`/mnemospark wallet help\\`.`,\n isError: true,\n };\n}\n\nasync function buildWalletStatusResponse(): Promise<PluginCommandResult> {\n const wallet = resolveWalletFileSync();\n if (!wallet) {\n return {\n text: NO_WALLET_FOUND_TEXT,\n isError: true,\n };\n }\n const { address } = wallet;\n\n let balanceText = \"Balance: (checking...)\";\n try {\n const monitor = new BalanceMonitor(address);\n const balance = await monitor.checkBalance();\n balanceText = `Balance: ${balance.balanceUSD}`;\n } catch {\n balanceText = \"Balance: (could not check)\";\n }\n\n return {\n text: [\n \"☁️ **mnemospark Wallet**\",\n \"\",\n `**Address:** \\`${address}\\``,\n `**${balanceText}**`,\n `**Key File:** \\`${WALLET_FILE}\\``,\n \"\",\n \"**Commands:**\",\n \"• `/mnemospark wallet` — Show this status\",\n \"• `/mnemospark wallet help` — Commands and funding link\",\n \"• `/mnemospark wallet export` — Export private key for backup\",\n \"\",\n `**Fund with USDC on Base:** https://basescan.org/address/${address}`,\n ].join(\"\\n\"),\n };\n}\n\nasync function buildWalletHelpResponse(): Promise<PluginCommandResult> {\n const wallet = resolveWalletFileSync();\n if (!wallet) {\n return {\n text: NO_WALLET_FOUND_TEXT,\n isError: true,\n };\n }\n const { address } = wallet;\n\n return { text: MNEMOSPARK_WALLET_HELP_TEXT(address) };\n}\n\nasync function buildWalletExportResponse(): Promise<PluginCommandResult> {\n const wallet = resolveWalletFileSync();\n if (!wallet) {\n return {\n text: NO_WALLET_FOUND_TEXT,\n isError: true,\n };\n }\n const { walletKey, address } = wallet;\n\n const addressDisplay = address.replace(/\\s/g, \"\");\n const keyDisplay = walletKey.replace(/\\s/g, \"\");\n return {\n text: [\n \"☁️ **mnemospark Wallet Export**\",\n \"\",\n \"⚠️ **SECURITY WARNING**: Your private key controls your wallet funds.\",\n \"Never share this key. Anyone with this key can spend your USDC.\",\n \"\",\n `**Address:** \\`${addressDisplay}\\``,\n \"\",\n \"**Private Key:**\",\n `\\`${keyDisplay}\\``,\n \"\",\n \"**To restore on a new machine:**\",\n \"1. Set the environment variable before running OpenClaw:\",\n ` \\`export MNEMOSPARK_WALLET_KEY=${keyDisplay}\\``,\n \"2. Or save to file:\",\n ` \\`mkdir -p ~/.openclaw/mnemospark/wallet && echo \"${keyDisplay}\" > ~/.openclaw/mnemospark/wallet/wallet.key && chmod 600 ~/.openclaw/mnemospark/wallet/wallet.key\\``,\n ].join(\"\\n\"),\n };\n}\n","export const CLOUD_ONBOARDING_BLOCK_LINES = [\n \"\",\n \"Start here to securely upload a file and we'll guide you along the way. Copy the line below and replace <file|directory> with the file or directory you'd like to save to the cloud and replace <friendly-name> with an easy to remember name.\",\n \"\",\n \"`/mnemospark cloud backup <file|directory> name:<friendly-name> async:true`\",\n \"\",\n];\n","import { spawn } from \"node:child_process\";\nimport {\n createCipheriv,\n createHash,\n randomBytes as randomBytesNode,\n randomUUID,\n} from \"node:crypto\";\nimport { createReadStream, createWriteStream, statfsSync } from \"node:fs\";\nimport { lstat, mkdir, readFile, readdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { finished } from \"node:stream/promises\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nimport {\n requestPaymentSettleViaProxy,\n requestStorageUploadConfirmViaProxy,\n requestStorageUploadViaProxy,\n parsePriceStorageQuoteRequest,\n requestPriceStorageViaProxy,\n type BackendSettleForwardResult,\n type StorageUploadConfirmRequest,\n type StorageUploadRequest,\n type StorageUploadResponse,\n type UploadPayload,\n type PriceStorageQuoteRequest,\n type PriceStorageQuoteResponse,\n type ProxySettleOptions,\n type ProxyUploadConfirmOptions,\n type ProxyQuoteOptions,\n type ProxyUploadOptions,\n} from \"./cloud-price-storage.js\";\nimport { buildMnemosparkLsMessage } from \"./cloud-ls-format.js\";\nimport {\n parseStorageObjectRequest,\n requestStorageDeleteViaProxy,\n requestStorageDownloadViaProxy,\n requestStorageLsViaProxy,\n sanitizeFriendlyNameForLocalBasename,\n type ProxyStorageOptions,\n type StorageDeleteResponse,\n type StorageDownloadProxyResponse,\n type StorageLsRequest,\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 {\n createCloudDatastore,\n type CloudDatastore,\n type CronJobRow,\n type QuoteLookup,\n} from \"./cloud-datastore.js\";\nimport { appendJsonlEvent } from \"./cloud-jsonl.js\";\nimport type { RequestCorrelation } from \"./cloud-correlation.js\";\nimport { normalizeInputForParsing } from \"./args/normalize.js\";\nimport { parseCommandArgs, valuesToStringRecord } from \"./args/parser.js\";\nimport { parseVerboseToken } from \"./mnemospark-route.js\";\nimport {\n backupFlagsSchema,\n deleteSchema,\n downloadSchema,\n lsSchema,\n opStatusSchema,\n paymentSettleSchema,\n priceStorageSchema,\n uploadSchema,\n} from \"./arg-schemas.js\";\nimport { CLOUD_ONBOARDING_BLOCK_LINES } from \"./cloud-help-onboarding.js\";\nimport { parseOpenClawCliJson, runOpenClawCli } from \"./openclaw-cli.js\";\nimport { getRenewalAgentId, getRenewalNodeBinary } from \"./openclaw-renewal-runbook.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 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;\n/** Node `fs.readFile` rejects files larger than this (ERR_FS_FILE_TOO_LARGE). */\nconst NODE_FS_MAX_READFILE_BYTES = 2147483648;\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 TAR_OVERHEAD_BYTES = 10 * 1024 * 1024; // Conservative headroom for tar metadata.\n\nconst QUOTE_VALIDITY_USER_NOTE =\n \"Quotes are valid for one hour. Please run price-storage again if you need a new quote.\";\nconst MNEMOSPARK_SUPPORT_EMAIL = \"pluggedin@mnemospark.ai\";\n\nconst CLOUD_HELP_FOOTER_STATE =\n \"Local state: mnemospark records quotes, objects, payments, cron jobs, friendly names, and operation metadata in ~/.openclaw/mnemospark/state.db (SQLite). For troubleshooting and correlation, commands and the HTTP proxy append structured JSON lines to ~/.openclaw/mnemospark/events.jsonl. Monthly storage billing jobs are listed in ~/.openclaw/cron/jobs.json for OpenClaw scheduling.\";\n\nconst REQUIRED_PRICE_STORAGE =\n \"wallet-address:, object-id:, gb:, provider:, region: (object-id-hash: optional if the object exists in local SQLite after backup)\";\nconst REQUIRED_UPLOAD = \"quote-id:, wallet-address:, object-id:, object-id-hash:\";\nconst REQUIRED_BACKUP = \"<file|directory> and name:<friendly-name>\";\nconst REQUIRED_PAYMENT_SETTLE = \"wallet-address: and (quote-id: | renewal:true with object-key:)\";\nconst REQUIRED_STORAGE_OBJECT =\n \"wallet-address: and one of (object-key: | name: [latest:true|at:<timestamp>])\";\nconst REQUIRED_LS =\n \"wallet-address: (for one object add object-key: or name: [latest:true|at:<timestamp>]; omit both to list the bucket)\";\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 - Wallet and go.** 💙\",\n ...CLOUD_ONBOARDING_BLOCK_LINES,\n \"**Syntax:** use `/mnemospark cloud …`. Prefer `key:value` for arguments; `key=value` and `--key value` are also accepted. Optional verbose markers: `cloud:true`, `price-storage:true`, etc. Aliases: `wallet:` → wallet-address, `object:` → object-id, `quote:` → quote-id, `hash:` → object-id-hash.\",\n \"\",\n \"**Cloud Commands**\",\n \"\",\n \"• `/mnemospark cloud` or `/mnemospark cloud help` — show this message (equivalent: `/mnemospark cloud:true help:true`)\",\n \"\",\n \"• `/mnemospark cloud backup <file|directory> name:<friendly-name> [async:true] [orchestrator:<inline|subagent>] [timeout-seconds:<n>]`\",\n \" Purpose: create a local tar+gzip archive under ~/.openclaw/mnemospark/backup (filename from sanitized friendly name) and record metadata in SQLite for later price-storage and upload.\",\n \" Required: \" + REQUIRED_BACKUP,\n \"\",\n \"• `/mnemospark cloud price-storage wallet-address:<addr> object-id:<id> [object-id-hash:<hash>] gb:<gb> provider:aws region:us-east-1`\",\n \" Purpose: request a storage quote before upload (defaults shown; override `provider:` / `region:` for other regions). Omit `object-id-hash:` when the object is already in local SQLite (e.g. after backup); mnemospark reads sha256 from ~/.openclaw/mnemospark/state.db.\",\n \" Required: \" + REQUIRED_PRICE_STORAGE,\n \" Shorter: `wallet:… object:… [hash:…] gb:… provider:… region:…`\",\n \"\",\n \"• `/mnemospark cloud upload quote-id:<quote-id> wallet-address:<addr> object-id:<id> object-id-hash:<hash> [name:<friendly-name>] [async:true] [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 payment-settle (quote-id:<quote-id> | renewal:true object-key:<key>) wallet-address:<addr> [object-id:<id>] [storage-price:<n>]`\",\n \" Purpose: settle storage payment before upload (quote) or on the monthly cron (renewal, no new quote). Uses the same proxy + x402 path as upload pre-settlement.\",\n \" Required: \" + REQUIRED_PAYMENT_SETTLE + \" (wallet private key must match the address).\",\n \"\",\n \"• `/mnemospark cloud ls wallet-address:<addr> [object-key:<key> | name:<friendly-name> | omit both to list bucket] [latest:true|at:<timestamp>]`\",\n \" Purpose: stat one object or list all keys in the wallet bucket (S3).\",\n \" Required: \" + REQUIRED_LS,\n \"\",\n \"• `/mnemospark cloud download wallet-address:<addr> [object-key:<object-key> | name:<friendly-name>] [latest:true|at:<timestamp>] [async:true] [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:true|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:true]`\",\n \" Purpose: inspect async operation status, or request cancellation for subagent runs.\",\n \" Required: operation-id:<id>\",\n \"\",\n \"Async orchestration flags (`backup`, `upload`, `download` only):\",\n \"• `async:true`\",\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:true` and `orchestrator:subagent`.\",\n \" `n` must be a positive integer (seconds).\",\n \"• `op-status` with `cancel:true`\",\n \" Cancel a subagent-orchestrated operation by operation-id (idempotent).\",\n \"\",\n \"Examples:\",\n \"• `/mnemospark cloud upload ... async:true orchestrator:subagent`\",\n \"• `/mnemospark cloud download ... async:true orchestrator:subagent timeout-seconds:900`\",\n \"• `/mnemospark cloud op-status operation-id:<id>`\",\n \"• `/mnemospark cloud op-status operation-id:<id> cancel:true`\",\n \"\",\n CLOUD_HELP_FOOTER_STATE,\n \"\",\n \"Backup uses your configured mnemospark wallet key (no `wallet-address:` argument). Commands price-storage, upload, ls, download, delete, and payment-settle require `wallet-address:<addr>` (or `wallet:<addr>`) on the command line (must match that wallet).\",\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 PaymentSettleCommandRequest = {\n wallet_address: string;\n renewal?: boolean;\n quote_id?: string;\n object_id?: string;\n object_key?: string;\n storage_price?: number;\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 /** Sanitized basename for the archive file under tmpDir (production backup). */\n archiveBasename?: string;\n};\n\ntype BackupObjectResult = {\n objectId: string;\n objectIdHash: string;\n objectSizeGb: string;\n archivePath: 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\";\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-async\" }\n | { mode: \"backup-invalid-name\" }\n | { mode: \"price-storage\"; priceStorageRequest: PriceStorageQuoteRequest }\n | {\n mode: \"price-storage-resolve-hash\";\n priceStoragePartial: {\n wallet_address: string;\n object_id: string;\n gb: number;\n provider: string;\n region: string;\n };\n }\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: \"payment-settle\"; paymentSettleRequest: PaymentSettleCommandRequest }\n | { mode: \"payment-settle-invalid\" }\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 | { mode: \"arg-parse-failure\"; errors: string[]; warnings: string[] };\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 proxySettleOptions?: ProxySettleOptions;\n proxyUploadConfirmOptions?: ProxyUploadConfirmOptions;\n requestPaymentSettleViaProxyFn?: (\n quoteId: string,\n walletAddress: string,\n options?: ProxySettleOptions,\n ) => Promise<BackendSettleForwardResult>;\n requestStorageLsFn?: (\n request: StorageLsRequest,\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 openClawCronAdapter?: OpenClawCronAdapter;\n subagentOrchestrator?: MnemosparkSubagentOrchestrator;\n proxyStorageOptions?: ProxyStorageOptions;\n mnemosparkHomeDir?: 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 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\n/** Like parseObjectSelector but allows wallet-only list mode (no key, no --name). */\nfunction parseLsObjectSelector(\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 (latest && at) return null;\n if (!objectKey && !name && (latest || at)) return null;\n\n if (objectKey) return { objectKey };\n if (name) return { nameSelector: { name, latest, at } };\n return {};\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:` and `timeout-seconds:` require `async:true`, 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 const isAsyncControlKey = (rawKey: string): boolean => {\n const canonical = rawKey.trim().toLowerCase().replace(/_/g, \"-\");\n return canonical === \"async\" || canonical === \"orchestrator\" || canonical === \"timeout-seconds\";\n };\n const isBareBooleanFlag = (rawToken: string): boolean => {\n const canonical = rawToken.trim().toLowerCase().replace(/^--/, \"\").replace(/_/g, \"-\");\n return canonical === \"async\" || canonical === \"latest\";\n };\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 const previousToken = tokens[idx - 1];\n if (previousToken && previousToken.startsWith(\"--\") && !isBareBooleanFlag(previousToken)) {\n filtered.push(token);\n continue;\n }\n const unwrapped = stripWrappingQuotes(token);\n const colonIdx = unwrapped.indexOf(\":\");\n const equalsIdx = unwrapped.indexOf(\"=\");\n const splitIdx =\n colonIdx > 0 && equalsIdx > 0 ? Math.min(colonIdx, equalsIdx) : Math.max(colonIdx, equalsIdx);\n if (splitIdx > 0) {\n const candidateKey = unwrapped.slice(0, splitIdx);\n if (/^[A-Za-z_][A-Za-z0-9_-]*$/.test(candidateKey) && isAsyncControlKey(candidateKey)) {\n continue;\n }\n }\n filtered.push(token);\n }\n return filtered.join(\" \");\n}\n\nfunction mergeArgParseWarnings(a: string[], b: string[]): string[] {\n return [...a, ...b];\n}\n\nasync function resolvePriceStorageHashFromDatastore(\n datastore: CloudDatastore,\n partial: {\n wallet_address: string;\n object_id: string;\n gb: number;\n provider: string;\n region: string;\n },\n): Promise<{ ok: true; request: PriceStorageQuoteRequest } | { ok: false; message: string }> {\n await datastore.ensureReady();\n const row = await datastore.findObjectById(partial.object_id.trim());\n const wallet = partial.wallet_address.trim().toLowerCase();\n if (!row) {\n return {\n ok: false,\n message:\n \"Cannot resolve object-id-hash: no object found in local SQLite for this object-id. Run backup first, or pass --object-id-hash explicitly.\",\n };\n }\n if (row.wallet_address.trim().toLowerCase() !== wallet) {\n return {\n ok: false,\n message:\n \"Cannot resolve object-id-hash: wallet-address does not match the object record in ~/.openclaw/mnemospark/state.db.\",\n };\n }\n const sha = row.sha256?.trim();\n if (!sha) {\n return {\n ok: false,\n message:\n \"Cannot resolve object-id-hash: local object record has no sha256 yet. Run backup first, or pass --object-id-hash explicitly.\",\n };\n }\n return {\n ok: true,\n request: {\n wallet_address: partial.wallet_address.trim(),\n object_id: partial.object_id.trim(),\n object_id_hash: sha.replace(/\\s/g, \"\"),\n gb: partial.gb,\n provider: partial.provider.trim(),\n region: partial.region.trim(),\n },\n };\n}\n\n/** Exported for unit tests (`parseCommandArgs` integration across subcommands). */\nexport function parseCloudArgs(args?: string): ParsedCloudArgs {\n const trimmed = args?.trim() ?? \"\";\n if (!trimmed) {\n return { mode: \"help\" };\n }\n\n const norm = normalizeInputForParsing(trimmed);\n const text = norm.text;\n const normWarnings = norm.warnings;\n\n const spaceIdx = text.search(/\\s/);\n const rawFirst = spaceIdx === -1 ? text : text.slice(0, spaceIdx);\n const rest = spaceIdx === -1 ? \"\" : text.slice(spaceIdx + 1).trim();\n\n const subParsed = parseVerboseToken(rawFirst);\n if (!subParsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: [`Invalid subcommand token \"${rawFirst}\". Use name:true only with value true.`],\n warnings: normWarnings,\n };\n }\n\n const subcommand = subParsed.name;\n\n if (subcommand === \"help\") {\n return { mode: \"help\" };\n }\n\n if (subcommand === \"backup\") {\n const tokens = tokenizeArgsRaw(rest);\n if (tokens.length === 0) {\n return { mode: \"unknown\" };\n }\n const backupTarget = stripWrappingQuotes(tokens[0] ?? \"\");\n if (!backupTarget) {\n return { mode: \"unknown\" };\n }\n const remainingTokens = tokens.slice(1);\n const flagsPart = remainingTokens.join(\" \");\n const parsed = parseCommandArgs(flagsPart, backupFlagsSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\n const asyncArgs = parseAsyncOperationArgs(flags);\n if (!asyncArgs) {\n return { mode: \"backup-invalid-async\" };\n }\n const friendlyName = flags.name?.trim();\n if (!friendlyName) {\n return { mode: \"backup-invalid-name\" };\n }\n return {\n mode: \"backup\",\n backupTarget,\n friendlyName,\n ...asyncArgs,\n };\n }\n\n if (subcommand === \"price-storage\") {\n const parsed = parseCommandArgs(rest, priceStorageSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\n const gb = Number.parseFloat(flags.gb ?? \"\");\n const hashRaw = flags[\"object-id-hash\"]?.trim();\n const walletAddress = flags[\"wallet-address\"]?.trim();\n const objectId = flags[\"object-id\"]?.trim();\n const provider = flags.provider?.trim();\n const region = flags.region?.trim();\n\n if (!walletAddress || !objectId || !provider || !region || !Number.isFinite(gb)) {\n return { mode: \"price-storage-invalid\" };\n }\n\n if (hashRaw) {\n const request = parsePriceStorageQuoteRequest({\n wallet_address: walletAddress,\n object_id: objectId,\n object_id_hash: hashRaw,\n gb,\n provider,\n region,\n });\n if (!request) {\n return { mode: \"price-storage-invalid\" };\n }\n return { mode: \"price-storage\", priceStorageRequest: request };\n }\n\n return {\n mode: \"price-storage-resolve-hash\",\n priceStoragePartial: {\n wallet_address: walletAddress,\n object_id: objectId,\n gb,\n provider,\n region,\n },\n };\n }\n\n if (subcommand === \"upload\") {\n const parsed = parseCommandArgs(rest, uploadSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\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 === \"payment-settle\") {\n const parsed = parseCommandArgs(rest, paymentSettleSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\n const walletAddress = flags[\"wallet-address\"]?.trim();\n if (!walletAddress) {\n return { mode: \"payment-settle-invalid\" };\n }\n const isRenewal = flags.renewal === \"true\";\n const quoteId = flags[\"quote-id\"]?.trim();\n const objectKey = flags[\"object-key\"]?.trim();\n if (isRenewal) {\n if (quoteId) {\n return { mode: \"payment-settle-invalid\" };\n }\n if (!objectKey) {\n return { mode: \"payment-settle-invalid\" };\n }\n } else if (!quoteId) {\n return { mode: \"payment-settle-invalid\" };\n }\n let storagePrice: number | undefined;\n if (flags[\"storage-price\"] !== undefined && flags[\"storage-price\"] !== \"\") {\n const raw = flags[\"storage-price\"]?.trim() ?? \"\";\n const n = Number.parseFloat(raw);\n if (!Number.isFinite(n) || n < 0) {\n return { mode: \"payment-settle-invalid\" };\n }\n storagePrice = n;\n }\n return {\n mode: \"payment-settle\",\n paymentSettleRequest: {\n wallet_address: walletAddress,\n renewal: isRenewal || undefined,\n quote_id: quoteId || undefined,\n object_id: flags[\"object-id\"]?.trim() || undefined,\n object_key: objectKey || undefined,\n storage_price: storagePrice,\n },\n };\n }\n\n if (subcommand === \"ls\") {\n const parsed = parseCommandArgs(rest, lsSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\n const walletAddress = flags[\"wallet-address\"]?.trim() ?? \"\";\n if (!walletAddress) {\n return { mode: \"ls-invalid\" };\n }\n const selector = parseLsObjectSelector(flags);\n if (!selector) {\n return { mode: \"ls-invalid\" };\n }\n const location = flags.location?.trim() || flags.region?.trim() || undefined;\n if (selector.nameSelector) {\n return {\n mode: \"ls\",\n storageObjectRequest: { wallet_address: walletAddress, location },\n nameSelector: selector.nameSelector,\n };\n }\n if (selector.objectKey) {\n return {\n mode: \"ls\",\n storageObjectRequest: {\n wallet_address: walletAddress,\n object_key: selector.objectKey,\n location,\n },\n };\n }\n return {\n mode: \"ls\",\n storageObjectRequest: { wallet_address: walletAddress, location },\n };\n }\n\n if (subcommand === \"download\") {\n const parsed = parseCommandArgs(rest, downloadSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\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 parsed = parseCommandArgs(rest, deleteSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\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 parsed = parseCommandArgs(rest, opStatusSchema);\n if (!parsed.ok) {\n return {\n mode: \"arg-parse-failure\",\n errors: parsed.errors,\n warnings: mergeArgParseWarnings(normWarnings, parsed.warnings),\n };\n }\n const flags = valuesToStringRecord(parsed.values);\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\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\nasync function resolveLocalUploadArchivePath(\n backupDir: string,\n objectId: string,\n friendlyName: string,\n): Promise<{ ok: true; archivePath: string } | { ok: false; message: string }> {\n if (friendlyName?.trim()) {\n try {\n const sanitized = sanitizeFriendlyNameForLocalBasename(friendlyName);\n const candidate = join(backupDir, sanitized);\n try {\n const st = await stat(candidate);\n if (st.isFile()) {\n return { ok: true, archivePath: candidate };\n }\n } catch {\n // Missing friendly-name path; try legacy.\n }\n } catch {\n // Invalid friendly name for path; try legacy.\n }\n }\n\n const legacyPath = join(backupDir, objectId);\n try {\n const legacyStats = await stat(legacyPath);\n if (!legacyStats.isFile()) {\n return {\n ok: false,\n message: `Cannot upload storage object: local archive path is not a file (${legacyPath}).`,\n };\n }\n return { ok: true, archivePath: legacyPath };\n } catch {\n return {\n ok: false,\n message: `Cannot upload storage object: local archive not found. Run /mnemospark cloud backup with name:<friendly-name> (canonical layout) or restore the legacy file at ${legacyPath}.`,\n };\n }\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 archiveBaseSegment = options.archiveBasename?.trim() || objectId;\n const archivePath = join(tmpDir, archiveBaseSegment);\n\n if (options.archiveBasename?.trim()) {\n try {\n const existing = await stat(archivePath);\n if (existing.isFile() || existing.isDirectory()) {\n throw new Error(\n `Backup archive path already exists: ${archivePath}. Choose a different --name.`,\n );\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"already exists\")) {\n throw err;\n }\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw err;\n }\n }\n }\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 return {\n objectId,\n objectIdHash,\n objectSizeGb,\n archivePath,\n };\n } catch (error) {\n await rm(archivePath, { force: true }).catch(() => undefined);\n throw error;\n }\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 OpenClawCronSchedule = {\n kind: \"cron\";\n expr: string;\n tz: string;\n};\n\ntype OpenClawCronPayload = {\n kind: \"agentTurn\";\n message: string;\n};\n\ntype OpenClawCronJobEntry = {\n jobId: string;\n name: string;\n schedule: OpenClawCronSchedule;\n payload: OpenClawCronPayload;\n sessionTarget: \"isolated\";\n /** OpenClaw 2026.4.x: bind isolated renewal work to the dedicated agent. */\n agentId: string;\n};\n\ntype OpenClawCronJobForLookup = {\n jobId: string;\n message: string;\n};\n\ntype OpenClawCronAdapter = {\n add: (job: OpenClawCronJobEntry) => Promise<{ jobId: string }>;\n remove: (jobId: string) => Promise<boolean>;\n list: () => Promise<OpenClawCronJobForLookup[]>;\n};\n\nfunction normalizeOpenClawCronJobForLookup(value: unknown): OpenClawCronJobForLookup | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n const record = value as Record<string, unknown>;\n const jobIdRaw = typeof record.jobId === \"string\" ? record.jobId : record.id;\n const jobId = typeof jobIdRaw === \"string\" ? jobIdRaw.trim() : \"\";\n const payloadRaw = record.payload;\n if (!jobId || !payloadRaw || typeof payloadRaw !== \"object\") {\n return null;\n }\n const payloadRecord = payloadRaw as Record<string, unknown>;\n const payloadKind = payloadRecord.kind;\n const payloadMessage =\n typeof payloadRecord.message === \"string\" ? payloadRecord.message.trim() : \"\";\n if (payloadKind !== \"agentTurn\" || !payloadMessage) {\n return null;\n }\n\n return {\n jobId,\n message: payloadMessage,\n };\n}\n\nfunction createOpenClawCliCronAdapter(homeDir?: string): OpenClawCronAdapter {\n return {\n add: async (job) => {\n const { stdout } = await runOpenClawCli(\n [\n \"cron\",\n \"add\",\n \"--name\",\n job.name,\n \"--cron\",\n job.schedule.expr,\n \"--tz\",\n job.schedule.tz,\n \"--session\",\n job.sessionTarget,\n \"--agent\",\n job.agentId,\n \"--message\",\n job.payload.message,\n \"--no-deliver\",\n \"--json\",\n ],\n homeDir,\n );\n const payload = parseOpenClawCliJson<Record<string, unknown>>(stdout, \"cron add\");\n const createdIdRaw = typeof payload.id === \"string\" ? payload.id : payload.jobId;\n const createdId = typeof createdIdRaw === \"string\" ? createdIdRaw.trim() : \"\";\n if (!createdId) {\n throw new Error(\"openclaw cron add did not return a job id\");\n }\n return { jobId: createdId };\n },\n remove: async (jobId) => {\n const { stdout } = await runOpenClawCli([\"cron\", \"rm\", jobId, \"--json\"], homeDir);\n const payload = parseOpenClawCliJson<Record<string, unknown>>(stdout, \"cron rm\");\n if (typeof payload.removed === \"boolean\") {\n return payload.removed;\n }\n return true;\n },\n list: async () => {\n const { stdout } = await runOpenClawCli([\"cron\", \"list\", \"--all\", \"--json\"], homeDir);\n const payload = parseOpenClawCliJson<Record<string, unknown>>(stdout, \"cron list\");\n const jobsRaw = Array.isArray(payload.jobs) ? payload.jobs : [];\n return jobsRaw\n .map((entry) => normalizeOpenClawCronJobForLookup(entry))\n .filter((entry): entry is OpenClawCronJobForLookup => entry !== null);\n },\n };\n}\n\n/** Latest matching OpenClaw cron job in jobs.json for an object key (scan from end of file). */\nasync function findCronJobInOpenClawCronJobsByObjectKey(\n objectKey: string,\n adapter: OpenClawCronAdapter,\n): Promise<{ cronId: string; objectId: string; objectKey: string } | null> {\n const cronJobs = await adapter.list();\n for (let idx = cronJobs.length - 1; idx >= 0; idx -= 1) {\n const cronJob = cronJobs[idx];\n const parsed = parseStoragePaymentCronCommand(cronJob.message);\n if (parsed && parsed.objectKey === objectKey) {\n return {\n cronId: cronJob.jobId,\n objectId: parsed.objectId,\n objectKey: parsed.objectKey,\n };\n }\n }\n return null;\n}\n\nfunction quoteCronArgument(value: string | number): string {\n return JSON.stringify(String(value));\n}\n\ntype StoragePaymentRenewalJobFields = {\n walletAddress: string;\n objectId: string;\n objectKey: string;\n storagePrice: number;\n};\n\n/** Args after `cloud` for `node …/cli.js cloud …` (same shape as `/mnemospark cloud` args after the command name). */\nfunction buildStoragePaymentRenewalArgs(job: StoragePaymentRenewalJobFields): string {\n return [\n \"payment-settle\",\n \"--renewal\",\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\nfunction buildStoragePaymentCronCommand(job: StoragePaymentRenewalJobFields): string {\n return `/mnemospark cloud ${buildStoragePaymentRenewalArgs(job)}`;\n}\n\nfunction buildOpenClawRenewalAgentMessage(openClawHome: string, renewalArgs: string): string {\n const cliPath = join(openClawHome, \".openclaw/extensions/mnemospark/dist/cli.js\");\n const nodeBin = getRenewalNodeBinary();\n return `Command: ${nodeBin} ${cliPath} cloud ${renewalArgs}`;\n}\n\nfunction parseStoragePaymentCronCommand(\n command: string,\n): { objectId: string; objectKey: string } | null {\n const objectIdMatch = command.match(/--object-id\\s+(\"([^\"\\\\]|\\\\.)*\"|'([^'\\\\]|\\\\.)*'|\\S+)/);\n const objectKeyMatch = command.match(/--object-key\\s+(\"([^\"\\\\]|\\\\.)*\"|'([^'\\\\]|\\\\.)*'|\\S+)/);\n if (!objectIdMatch || !objectKeyMatch) {\n return null;\n }\n\n const parseToken = (token: string): string | null => {\n const trimmed = token.trim();\n if (!trimmed) {\n return null;\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n try {\n return JSON.parse(trimmed);\n } catch {\n return trimmed.slice(1, -1);\n }\n }\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n };\n\n const objectId = parseToken(objectIdMatch[1] ?? \"\");\n const objectKey = parseToken(objectKeyMatch[1] ?? \"\");\n if (!objectId || !objectKey) {\n return null;\n }\n\n return { objectId, objectKey };\n}\n\nasync function appendStoragePaymentCronJob(\n cronJob: StoragePaymentCronJob,\n adapter: OpenClawCronAdapter,\n payloadMessage: string,\n): Promise<{ jobId: string }> {\n const openClawJob: OpenClawCronJobEntry = {\n jobId: cronJob.cronId,\n name: \"Mnemospark Monthly Renewal\",\n schedule: {\n kind: \"cron\",\n expr: PAYMENT_CRON_SCHEDULE,\n tz: \"UTC\",\n },\n payload: {\n kind: \"agentTurn\",\n message: payloadMessage,\n },\n sessionTarget: \"isolated\",\n agentId: getRenewalAgentId(),\n };\n return adapter.add(openClawJob);\n}\n\nasync function removeStoragePaymentCronJob(\n cronId: string,\n adapter: OpenClawCronAdapter,\n): Promise<boolean> {\n return adapter.remove(cronId);\n}\n\nasync function createStoragePaymentCronJob(\n upload: StorageUploadResponse,\n storagePrice: number,\n openClawCronAdapter: OpenClawCronAdapter,\n openClawHomeDir: string,\n nowDateFn: () => Date = () => new Date(),\n): Promise<StoragePaymentCronJob> {\n const renewalFields: StoragePaymentRenewalJobFields = {\n walletAddress: upload.addr,\n objectId: upload.object_id,\n objectKey: upload.object_key,\n storagePrice,\n };\n const renewalArgs = buildStoragePaymentRenewalArgs(renewalFields);\n const provisionalCronId = randomUUID();\n const cronJob: StoragePaymentCronJob = {\n cronId: provisionalCronId,\n createdAt: nowDateFn().toISOString(),\n schedule: PAYMENT_CRON_SCHEDULE,\n command: buildStoragePaymentCronCommand(renewalFields),\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 const payloadMessage = buildOpenClawRenewalAgentMessage(openClawHomeDir, renewalArgs);\n const created = await appendStoragePaymentCronJob(cronJob, openClawCronAdapter, payloadMessage);\n // Use the actual OpenClaw job id so datastore and delete cleanup stay in sync.\n if (created.jobId?.trim()) {\n cronJob.cronId = created.jobId.trim();\n }\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\nexport function 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\n/**\n * Stream plaintext from disk through AES-256-GCM and write `nonce || ciphertext || tag`\n * to `outPath`. Same wire format as {@link encryptAesGcm}.\n */\nexport async function encryptPlaintextFileToAesGcmPath(\n plaintextPath: string,\n dek: Buffer,\n outPath: string,\n randomFn: (size: number) => Buffer = randomBytesNode,\n): Promise<void> {\n if (dek.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\", dek, nonce);\n const writeStream = createWriteStream(outPath, { flags: \"w\" });\n writeStream.write(nonce);\n try {\n for await (const chunk of createReadStream(plaintextPath)) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n const out = cipher.update(buf);\n if (out.length) {\n await new Promise<void>((resolve, reject) => {\n writeStream.write(out, (err) => (err ? reject(err) : resolve()));\n });\n }\n }\n const final = cipher.final();\n const tag = cipher.getAuthTag();\n await new Promise<void>((resolve, reject) => {\n writeStream.write(final, (err) => (err ? reject(err) : resolve()));\n });\n await new Promise<void>((resolve, reject) => {\n writeStream.write(tag, (err) => (err ? reject(err) : resolve()));\n });\n writeStream.end();\n await finished(writeStream);\n } catch (err) {\n writeStream.destroy();\n throw err;\n }\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 /** Set when the archive was small enough to buffer; null when using {@link encryptedTempPath}. */\n encryptedContent: Buffer | null;\n /** Encrypted ciphertext file (presigned path); remove after upload completes. */\n encryptedTempPath?: string;\n};\n\nasync function prepareUploadPayload(\n archivePath: string,\n walletAddress: string,\n homeDir?: string,\n): Promise<PreparedUploadPayload> {\n const archiveStat = await stat(archivePath);\n if (!archiveStat.isFile()) {\n throw new Error(`Cannot read backup archive: not a file (${archivePath}).`);\n }\n\n const { kek, keyPath } = await loadOrCreateKek(walletAddress, homeDir);\n const dek = randomBytesNode(32);\n const wrappedDek = encryptAesGcm(dek, kek);\n\n if (archiveStat.size >= NODE_FS_MAX_READFILE_BYTES) {\n const encryptedTempPath = join(tmpdir(), `mnemospark-upload-${randomUUID()}.enc`);\n try {\n await encryptPlaintextFileToAesGcmPath(archivePath, dek, encryptedTempPath);\n const encStat = await stat(encryptedTempPath);\n const payloadHash = await sha256File(encryptedTempPath);\n\n const payload: UploadPayload = {\n mode: \"presigned\",\n content_base64: undefined,\n content_sha256: payloadHash,\n content_length_bytes: encStat.size,\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: null,\n encryptedTempPath,\n };\n } catch (err) {\n await rm(encryptedTempPath, { force: true }).catch(() => {});\n throw err;\n }\n }\n\n const plaintext = await readFile(archivePath);\n const encryptedContent = encryptAesGcm(plaintext, dek);\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\ntype PresignedPutFetchInit = RequestInit & { duplex?: \"half\" };\n\nfunction presignedPutBodyInit(\n encryptedContent: Buffer | null,\n encryptedTempPath: string | undefined,\n): { body: BodyInit; duplex?: \"half\" } {\n if (encryptedTempPath?.trim()) {\n const body = Readable.toWeb(createReadStream(encryptedTempPath)) as unknown as BodyInit;\n return { body, duplex: \"half\" };\n }\n if (encryptedContent) {\n return { body: new Uint8Array(encryptedContent) };\n }\n throw new Error(\"Cannot upload storage object: missing encrypted payload body.\");\n}\n\nasync function uploadPresignedObjectIfNeeded(\n uploadResponse: StorageUploadResponse,\n uploadMode: UploadPayload[\"mode\"],\n encryptedContent: Buffer | null,\n encryptedTempPath: string | undefined,\n fetchImpl: FetchLike = fetch,\n /** Required for stream PUTs: S3 rejects chunked bodies (Transfer-Encoding) unless length is fixed. */\n presignedStreamContentLengthBytes?: number,\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 if (encryptedTempPath?.trim()) {\n const len = presignedStreamContentLengthBytes ?? (await stat(encryptedTempPath.trim())).size;\n if (!headers.has(\"content-length\")) {\n headers.set(\"content-length\", String(len));\n }\n }\n\n const { body, duplex } = presignedPutBodyInit(encryptedContent, encryptedTempPath);\n const firstInit: PresignedPutFetchInit = {\n method: \"PUT\",\n headers,\n body,\n redirect: \"manual\",\n };\n if (duplex) {\n firstInit.duplex = duplex;\n }\n const firstAttempt = await fetchImpl(uploadResponse.upload_url, firstInit);\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 retryBody = presignedPutBodyInit(encryptedContent, encryptedTempPath);\n const retryInit: PresignedPutFetchInit = {\n method: \"PUT\",\n headers,\n body: retryBody.body,\n };\n if (retryBody.duplex) {\n retryInit.duplex = retryBody.duplex;\n }\n const redirectedAttempt = await fetchImpl(location, retryInit);\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\nfunction envMeansExplicitRemoveOrKeep(value: string | undefined): boolean | null {\n if (value === undefined) {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const n = trimmed.toLowerCase();\n if (n === \"0\" || n === \"false\" || n === \"no\" || n === \"n\") {\n return false;\n }\n if (n === \"1\" || n === \"true\" || n === \"yes\" || n === \"y\") {\n return true;\n }\n return null;\n}\n\nfunction shouldRemoveLocalBackupAfterUpload(): boolean {\n const parsed = envMeansExplicitRemoveOrKeep(process.env.MNEMOSPARK_REMOVE_BACKUP_FILE);\n if (parsed !== null) {\n return parsed;\n }\n return true;\n}\n\nasync function maybeCleanupLocalBackupArchive(archivePath: string): Promise<void> {\n if (!shouldRemoveLocalBackupAfterUpload()) {\n return;\n }\n try {\n await rm(archivePath, { force: true });\n } catch {\n // Best-effort cleanup; ignore failures.\n }\n}\n\n/** Markdown fenced block for a single copy-paste command line (matches cloud ls table style). */\nfunction formatMnemosparkCommandCopyBlock(commandLine: string): string {\n return [\"```\", commandLine, \"```\"].join(\"\\n\");\n}\n\nfunction formatStorageUploadUserMessage(upload: StorageUploadResponse, cronJobId: string): string {\n const lsCommand = `/mnemospark cloud ls wallet-address:${upload.addr}`;\n return [\n `Your file \\`${upload.object_id}\\` with key \\`${upload.object_key}\\` has been stored using \\`${upload.provider}\\` in folder \\`${upload.bucket_name}\\` in region \\`${upload.location}\\``,\n \"\",\n `A cron job \\`${cronJobId}\\` has been configured to send renewal payment monthly (1st of the month, UTC), matching backend calendar billing. The object is skipped for deletion in its first UTC calendar month after upload; after that, if renewal is missing for a month, housekeeping may remove the object shortly after the 3rd (UTC).`,\n \"\",\n \"To view your cloud storage run the command:\",\n \"\",\n formatMnemosparkCommandCopyBlock(lsCommand),\n \"\",\n \"Thank you for using mnemospark!\",\n `Reach out if you need anything: ${MNEMOSPARK_SUPPORT_EMAIL}`,\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 extractLsErrorMessage(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 if (\n message.startsWith(\"ls response\") ||\n message.startsWith(\"ls list response\") ||\n message.startsWith(\"Invalid ls response payload\")\n ) {\n return `Cannot list storage object: ${message}`;\n }\n if (message === \"formatBytesForDisplay expects a non-negative integer\") {\n return \"Cannot list storage object: ls response has invalid size_bytes; expected non-negative integer\";\n }\n return null;\n}\n\nfunction formatPriceStorageUserMessage(\n quote: PriceStorageQuoteResponse,\n localArchiveHint?: string | null,\n): string {\n const uploadCommand = `/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 const lines = [\n `Your storage quote \\`${quote.quote_id}\\`: storage price \\`$${quote.storage_price}\\` for file \\`${quote.object_id}\\` with file size \\`${quote.object_size_gb}\\` in \\`${quote.provider}\\` \\`${quote.location}\\`.`,\n \"\",\n \"If you accept this quote, run:\",\n \"\",\n formatMnemosparkCommandCopyBlock(uploadCommand),\n \"\",\n ];\n if (localArchiveHint?.trim()) {\n lines.push(\n `Local backup archive uses friendly name \\`${localArchiveHint.trim()}\\` (on-disk basename is sanitized).`,\n \"\",\n );\n }\n lines.push(QUOTE_VALIDITY_USER_NOTE);\n return lines.join(\"\\n\");\n}\n\nfunction quoteLookupMatchesPriceStorageResponse(\n lookup: QuoteLookup,\n quote: PriceStorageQuoteResponse,\n): boolean {\n return (\n lookup.quoteId === quote.quote_id &&\n lookup.walletAddress.trim().toLowerCase() === quote.addr.trim().toLowerCase() &&\n lookup.objectId === quote.object_id &&\n lookup.objectIdHash.toLowerCase() === quote.object_id_hash.toLowerCase() &&\n lookup.storagePrice === quote.storage_price &&\n lookup.provider === quote.provider &&\n lookup.location === quote.location\n );\n}\n\n/** Default provider/region for the copy-paste `price-storage` line after backup (single source of truth for docs/tests). */\nexport const DEFAULT_BACKUP_QUOTE_PROVIDER = \"aws\";\nexport const DEFAULT_BACKUP_QUOTE_REGION = \"us-east-1\";\n\nfunction formatBackupSuccessUserMessage(\n result: BackupObjectResult,\n walletAddress: string,\n friendlyName: string,\n): string {\n const hash = result.objectIdHash.replace(/\\s/g, \"\");\n const priceStorageCommand = `/mnemospark cloud price-storage wallet-address:${walletAddress} object-id:${result.objectId} object-id-hash:${hash} gb:${result.objectSizeGb} provider:${DEFAULT_BACKUP_QUOTE_PROVIDER} region:${DEFAULT_BACKUP_QUOTE_REGION}`;\n return [\n `Backup archive: \\`${result.archivePath}\\``,\n \"\",\n `friendly-name: ${friendlyName}`,\n `object-id: ${result.objectId}`,\n `object-id-hash: ${hash}`,\n `object-size: ${result.objectSizeGb}`,\n \"\",\n \"Next, request a storage quote.\",\n \"\",\n formatMnemosparkCommandCopyBlock(priceStorageCommand),\n \"\",\n `The default region is ${DEFAULT_BACKUP_QUOTE_REGION}. Change the command parameters to switch regions (not required).`,\n \"\",\n \"Region examples (merge into the command above):\",\n \"North America: `provider:aws region:us-east-1`\",\n \"Europe: `provider:aws region:eu-north-1`\",\n \"South America: `provider:aws region:sa-east-1`\",\n \"Asia Pacific: `provider:aws region:ap-northeast-1`\",\n ].join(\"\\n\");\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\",\n nativeNames: {\n default: \"mnemospark\",\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 requestPaymentSettleViaProxyFn:\n options.requestPaymentSettleViaProxyFn ?? requestPaymentSettleViaProxy,\n mnemosparkHomeDir: options.mnemosparkHomeDir ?? options.backupOptions?.homeDir,\n openClawCronAdapter:\n options.openClawCronAdapter ??\n createOpenClawCliCronAdapter(\n options.mnemosparkHomeDir ?? options.backupOptions?.homeDir,\n ),\n backupOptions: options.backupOptions,\n proxyQuoteOptions: options.proxyQuoteOptions,\n proxyUploadOptions: options.proxyUploadOptions,\n proxySettleOptions: options.proxySettleOptions,\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 requestPaymentSettleViaProxyFn: NonNullable<\n CreateCloudCommandOptions[\"requestPaymentSettleViaProxyFn\"]\n >;\n openClawCronAdapter: NonNullable<CreateCloudCommandOptions[\"openClawCronAdapter\"]>;\n mnemosparkHomeDir: string | undefined;\n backupOptions: CreateCloudCommandOptions[\"backupOptions\"];\n proxyQuoteOptions: CreateCloudCommandOptions[\"proxyQuoteOptions\"];\n proxyUploadOptions: CreateCloudCommandOptions[\"proxyUploadOptions\"];\n proxySettleOptions: CreateCloudCommandOptions[\"proxySettleOptions\"];\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 resolveNameSelectorIfNeeded(\n datastore: Awaited<ReturnType<typeof createCloudDatastore>>,\n request: StorageObjectRequestInput,\n selector?: NameSelector,\n): Promise<{\n request?: StorageObjectRequest | StorageLsRequest;\n error?: string;\n}> {\n if (!selector) {\n const walletAddress = request.wallet_address?.trim();\n if (!walletAddress) {\n return { error: \"Cannot resolve storage object request.\" };\n }\n const objectKey = request.object_key?.trim();\n if (!objectKey) {\n const listRequest: StorageLsRequest = { wallet_address: walletAddress };\n if (request.location) {\n listRequest.location = request.location;\n }\n return { request: listRequest };\n }\n const parsedRequest = parseStorageObjectRequest({\n wallet_address: walletAddress,\n object_key: objectKey,\n location: request.location,\n });\n if (!parsedRequest) {\n return { error: \"Cannot resolve storage object request.\" };\n }\n return { request: parsedRequest };\n }\n try {\n await datastore.ensureReady();\n } catch {\n return {\n error:\n \"Cannot resolve --name: local SQLite (~/.openclaw/mnemospark/state.db) is unavailable. Use --object-key or restore SQLite access.\",\n };\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 const resolvedObjectKey = resolved?.objectKey ?? null;\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 { request: parsedRequest };\n}\n\nfunction toStorageObjectRequestOrError(\n request: StorageObjectRequest | StorageLsRequest,\n missingKeyMessage: string,\n): { ok: true; request: StorageObjectRequest } | { ok: false; error: string } {\n const key = request.object_key?.trim();\n if (!key) {\n return { ok: false, error: missingKeyMessage };\n }\n const parsed = parseStorageObjectRequest({\n wallet_address: request.wallet_address,\n object_key: key,\n location: request.location,\n });\n if (!parsed) {\n return { ok: false, error: \"Cannot resolve storage object request.\" };\n }\n return { ok: true, request: parsed };\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 source: \"command\",\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 source: \"command\",\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 appendJsonlEvent(\"events.jsonl\", payload, homeDir);\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\nfunction parseTransIdFromPaymentSettleBody(bodyText: string): string | null {\n const trimmed = bodyText.trim();\n if (!trimmed.startsWith(\"{\")) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as { trans_id?: unknown };\n const tid = parsed.trans_id;\n return typeof tid === \"string\" && tid.trim() ? tid.trim() : null;\n } catch {\n return null;\n }\n}\n\nfunction parseQuoteIdFromPaymentSettleBody(bodyText: string): string | null {\n const trimmed = bodyText.trim();\n if (!trimmed.startsWith(\"{\")) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as { quote_id?: unknown };\n const q = parsed.quote_id;\n return typeof q === \"string\" && q.trim() ? q.trim() : null;\n } catch {\n return null;\n }\n}\n\nasync function resolveAmountForPaymentSettle(\n quoteId: string | undefined,\n storagePriceFromFlag: number | undefined,\n datastore: Awaited<ReturnType<typeof createCloudDatastore>>,\n): Promise<number> {\n if (storagePriceFromFlag !== undefined && Number.isFinite(storagePriceFromFlag)) {\n return storagePriceFromFlag;\n }\n if (!quoteId) {\n return 0;\n }\n const quoteLookup = await datastore.findQuoteById(quoteId);\n if (quoteLookup && Number.isFinite(quoteLookup.storagePrice)) {\n return quoteLookup.storagePrice;\n }\n const payment = await datastore.findPaymentByQuoteId(quoteId);\n if (payment && Number.isFinite(payment.amount)) {\n return payment.amount;\n }\n return 0;\n}\n\nasync function resolveCronRowForPaymentSettle(\n req: PaymentSettleCommandRequest,\n datastore: Awaited<ReturnType<typeof createCloudDatastore>>,\n): Promise<CronJobRow | null> {\n if (req.renewal) {\n const key = req.object_key?.trim();\n if (!key) {\n return null;\n }\n return datastore.findCronJobRowByObjectKey(key);\n }\n const qid = req.quote_id?.trim();\n if (!qid) {\n return null;\n }\n return datastore.findCronByQuoteId(qid);\n}\n\nasync function emitPaymentSettleClientObservationBestEffort(params: {\n phase: \"start\" | \"result\";\n correlation: RequestCorrelation;\n quoteId: string;\n walletAddress: string;\n objectId?: string;\n objectKey?: string;\n httpStatus?: number;\n outcomeStatus?: \"succeeded\" | \"failed\";\n homeDir?: string;\n}): Promise<void> {\n try {\n const {\n phase,\n correlation,\n quoteId,\n walletAddress,\n objectId,\n objectKey,\n httpStatus,\n outcomeStatus,\n homeDir,\n } = params;\n const ts = new Date().toISOString();\n\n if (phase === \"start\") {\n await emitCloudEventBestEffort(\n \"payment-settle.started\",\n {\n operation_id: correlation.operationId,\n trace_id: correlation.traceId,\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId,\n object_key: objectKey,\n status: \"running\",\n },\n homeDir,\n );\n await appendJsonlEvent(\n \"events.jsonl\",\n {\n ts,\n event_type: \"payment.settle\",\n status: \"start\",\n source: \"command\",\n trace_id: correlation.traceId,\n operation_id: correlation.operationId,\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId ?? null,\n object_key: objectKey ?? null,\n details: { client_observation: true },\n },\n homeDir,\n );\n return;\n }\n\n const terminal = outcomeStatus ?? \"failed\";\n await emitCloudEventBestEffort(\n \"payment-settle.completed\",\n {\n operation_id: correlation.operationId,\n trace_id: correlation.traceId,\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId,\n object_key: objectKey,\n status: terminal === \"succeeded\" ? \"succeeded\" : \"failed\",\n http_status: httpStatus,\n },\n homeDir,\n );\n await appendJsonlEvent(\n \"events.jsonl\",\n {\n ts,\n event_type: \"payment.settle\",\n status: \"result\",\n source: \"command\",\n trace_id: correlation.traceId,\n operation_id: correlation.operationId,\n quote_id: quoteId,\n wallet_address: walletAddress,\n object_id: objectId ?? null,\n object_key: objectKey ?? null,\n http_status: httpStatus ?? null,\n details: { client_observation: true },\n },\n homeDir,\n );\n } catch {\n // best-effort only\n }\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 mnemosparkHomeDir = options.mnemosparkHomeDir;\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 requestPaymentSettleViaProxy = options.requestPaymentSettleViaProxyFn;\n const openClawCronAdapter = options.openClawCronAdapter;\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 === \"arg-parse-failure\") {\n return {\n text: [\n \"Could not parse command arguments.\",\n ...parsed.errors.map((e) => `- ${e}`),\n ...(parsed.warnings.length > 0\n ? [\"\", \"Notes:\", ...parsed.warnings.map((w) => `- ${w}`)]\n : []),\n \"\",\n \"Accepted formats:\",\n \"- key:value\",\n \"- key=value\",\n \"- --key value\",\n ].join(\"\\n\"),\n isError: true,\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-async\") {\n return {\n text: `Cannot build storage object: ${INVALID_ASYNC_FLAGS_MESSAGE}`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"backup-invalid-name\") {\n return {\n text: `Cannot build storage object: required arguments are ${REQUIRED_BACKUP}.`,\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 === \"payment-settle-invalid\") {\n return {\n text: `Cannot settle payment: required arguments are ${REQUIRED_PAYMENT_SETTLE}. Optional: object-id:, storage-price:.`,\n isError: true,\n };\n }\n\n if (parsed.mode === \"ls-invalid\") {\n return {\n text: `Cannot list storage object: required arguments are ${REQUIRED_LS}.`,\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:<id>.\",\n isError: true,\n };\n }\n\n const datastore = await createCloudDatastore(mnemosparkHomeDir);\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 result_text: string | null;\n }): { text: string; isError: boolean } => {\n const meta = [\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 const withResult =\n operation.status === \"succeeded\" && operation.result_text?.trim()\n ? `${meta}\\n\\n${operation.result_text}`\n : meta;\n return {\n text: withResult,\n isError:\n operation.status === \"failed\" ||\n operation.status === \"cancelled\" ||\n operation.status === \"timed_out\",\n };\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\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 (parsed.mode === \"payment-settle\") {\n const req = parsed.paymentSettleRequest;\n let walletKey: `0x${string}`;\n try {\n walletKey = await resolveWalletKey(mnemosparkHomeDir);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { text: message.trim() || \"Cannot resolve wallet key.\", isError: true };\n }\n const walletAccount = privateKeyToAccount(walletKey);\n if (walletAccount.address.toLowerCase() !== req.wallet_address.toLowerCase()) {\n return {\n text: `Cannot settle payment: wallet key address ${walletAccount.address} does not match wallet-address: ${req.wallet_address}.`,\n isError: true,\n };\n }\n\n const correlation = buildRequestCorrelation();\n const settleFetch = createPayment(walletKey).fetch;\n const objectId = req.object_id;\n const objectKey = req.object_key;\n const logQuoteId =\n req.quote_id?.trim() ||\n (req.renewal && objectKey?.trim() ? `renewal:${objectKey.trim()}` : \"\");\n\n await emitPaymentSettleClientObservationBestEffort({\n phase: \"start\",\n correlation,\n quoteId: logQuoteId,\n walletAddress: req.wallet_address,\n objectId,\n objectKey,\n homeDir: mnemosparkHomeDir,\n });\n\n let settleResult: BackendSettleForwardResult;\n try {\n settleResult = await requestPaymentSettleViaProxy(req.quote_id ?? \"\", req.wallet_address, {\n ...options.proxySettleOptions,\n correlation,\n fetchImpl: (input, init) => settleFetch(input, init),\n renewal: req.renewal === true,\n objectKey: req.object_key,\n });\n } catch (err) {\n const amountErr = await resolveAmountForPaymentSettle(\n req.quote_id,\n req.storage_price,\n datastore,\n );\n await datastore.upsertPayment({\n quote_id: logQuoteId || req.quote_id?.trim() || \"payment-settle-error\",\n wallet_address: req.wallet_address,\n trans_id: null,\n amount: amountErr,\n network: null,\n status: \"settle_failed\",\n settled_at: null,\n });\n const cronErr = await resolveCronRowForPaymentSettle(req, datastore);\n if (cronErr) {\n await datastore.upsertCronJob({ ...cronErr, status: \"active\" });\n }\n const msg = err instanceof Error ? err.message : String(err);\n await emitPaymentSettleClientObservationBestEffort({\n phase: \"result\",\n correlation,\n quoteId: logQuoteId,\n walletAddress: req.wallet_address,\n objectId,\n objectKey,\n outcomeStatus: \"failed\",\n homeDir: mnemosparkHomeDir,\n });\n return { text: `Payment settle failed: ${msg}`, isError: true };\n }\n\n const ledgerQuoteIdFromBody = parseQuoteIdFromPaymentSettleBody(settleResult.bodyText ?? \"\");\n const ledgerQuoteId = ledgerQuoteIdFromBody || req.quote_id?.trim() || logQuoteId;\n const amount = await resolveAmountForPaymentSettle(\n req.renewal ? undefined : req.quote_id,\n req.storage_price,\n datastore,\n );\n const transId =\n settleResult.status === 200\n ? parseTransIdFromPaymentSettleBody(settleResult.bodyText ?? \"\")\n : null;\n\n if (settleResult.status === 200) {\n await datastore.upsertPayment({\n quote_id: ledgerQuoteId,\n wallet_address: req.wallet_address,\n trans_id: transId,\n amount,\n network: null,\n status: \"settled\",\n settled_at: new Date().toISOString(),\n });\n const cronRow = await resolveCronRowForPaymentSettle(req, datastore);\n if (cronRow) {\n await datastore.upsertCronJob({ ...cronRow, status: \"active\" });\n }\n await emitPaymentSettleClientObservationBestEffort({\n phase: \"result\",\n correlation,\n quoteId: ledgerQuoteId,\n walletAddress: req.wallet_address,\n objectId,\n objectKey,\n httpStatus: settleResult.status,\n outcomeStatus: \"succeeded\",\n homeDir: mnemosparkHomeDir,\n });\n const label = req.renewal ? `object ${req.object_key}` : `quote ${req.quote_id}`;\n return {\n text: transId\n ? `Payment settled for ${label} (trans-id: ${transId}).`\n : `Payment settled for ${label}.`,\n };\n }\n\n await datastore.upsertPayment({\n quote_id: ledgerQuoteId,\n wallet_address: req.wallet_address,\n trans_id: transId,\n amount,\n network: null,\n status: \"settle_failed\",\n settled_at: null,\n });\n const cronRowFailed = await resolveCronRowForPaymentSettle(req, datastore);\n if (cronRowFailed) {\n await datastore.upsertCronJob({ ...cronRowFailed, status: \"active\" });\n }\n await emitPaymentSettleClientObservationBestEffort({\n phase: \"result\",\n correlation,\n quoteId: ledgerQuoteId,\n walletAddress: req.wallet_address,\n objectId,\n objectKey,\n httpStatus: settleResult.status,\n outcomeStatus: \"failed\",\n homeDir: mnemosparkHomeDir,\n });\n\n const bodySnippet = settleResult.bodyText?.trim();\n const detail =\n bodySnippet && bodySnippet.length > 500 ? `${bodySnippet.slice(0, 500)}…` : bodySnippet;\n return {\n text: detail\n ? `Payment settle failed (HTTP ${settleResult.status}): ${detail}`\n : `Payment settle failed with HTTP ${settleResult.status}.`,\n isError: true,\n };\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 mnemosparkHomeDir,\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\",\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\n );\n },\n onCompleted: async (sessionId, 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: \"subagent\",\n subagent_session_id: sessionId,\n timeout_seconds: timeoutSeconds,\n status: \"succeeded\",\n error_code: null,\n error_message: null,\n result_text: result.isError ? null : result.text,\n });\n await emitOperationEventBestEffort(\n \"operation.completed\",\n {\n ...eventContextBase,\n status: \"succeeded\",\n subagentSessionId: sessionId,\n },\n mnemosparkHomeDir,\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\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 const subagentMetaLines = [\n `Operation started in background. operation-id: ${operationId}`,\n `orchestrator: subagent`,\n `subagent-session-id: ${dispatchResult.sessionId}`,\n timeoutSeconds ? `timeout-seconds: ${timeoutSeconds}` : null,\n ].filter((line): line is string => Boolean(line));\n return {\n text: [\n ...subagentMetaLines,\n \"\",\n formatMnemosparkCommandCopyBlock(\n `/mnemospark cloud op-status operation-id:${operationId}`,\n ),\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 mnemosparkHomeDir,\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 result_text: result.isError ? null : result.text,\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\n );\n });\n\n return {\n text: [\n `Operation started in background. operation-id: ${operationId}`,\n `orchestrator: inline`,\n \"\",\n formatMnemosparkCommandCopyBlock(`/mnemospark cloud op-status operation-id:${operationId}`),\n ].join(\"\\n\"),\n };\n }\n\n if (parsed.mode === \"backup\") {\n const backupPlatform = options.backupOptions?.platform ?? process.platform;\n if (!SUPPORTED_BACKUP_PLATFORMS.has(backupPlatform)) {\n return {\n text: \"Cloud backup is only supported on macOS and Linux.\",\n isError: true,\n };\n }\n\n try {\n let walletAddress: string;\n try {\n const walletKey = await resolveWalletKey(mnemosparkHomeDir);\n walletAddress = privateKeyToAccount(walletKey).address;\n } catch (err) {\n const message =\n err instanceof Error ? err.message : typeof err === \"string\" ? err : String(err);\n return {\n text: message.trim() || \"No mnemospark wallet found.\",\n isError: true,\n };\n }\n\n let archiveBasename: string;\n try {\n archiveBasename = sanitizeFriendlyNameForLocalBasename(parsed.friendlyName);\n } catch {\n return {\n text: \"Cannot build storage object: invalid --name for local file path (use a non-empty name without reserved path segments).\",\n isError: true,\n };\n }\n\n const result = await backupBuilder(parsed.backupTarget, {\n ...options.backupOptions,\n archiveBasename,\n });\n await emitCloudEventBestEffort(\n \"backup.completed\",\n {\n operation_id: executionContext.forcedOperationId?.trim() || randomUUID(),\n object_id: result.objectId,\n status: \"succeeded\",\n details: {\n friendly_name: parsed.friendlyName,\n archive_path: result.archivePath,\n object_id_hash: result.objectIdHash.replace(/\\s/g, \"\"),\n object_size_gb: result.objectSizeGb,\n },\n },\n mnemosparkHomeDir,\n );\n await datastore.upsertObject({\n object_id: result.objectId,\n object_key: null,\n wallet_address: walletAddress,\n quote_id: null,\n provider: null,\n bucket_name: null,\n region: null,\n sha256: result.objectIdHash,\n status: \"backed_up\",\n });\n await datastore.upsertFriendlyName({\n friendly_name: parsed.friendlyName,\n object_id: result.objectId,\n object_key: null,\n quote_id: null,\n wallet_address: walletAddress,\n });\n return {\n text: formatBackupSuccessUserMessage(result, walletAddress, parsed.friendlyName),\n };\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"already exists\")) {\n return {\n text: err.message,\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\" || parsed.mode === \"price-storage-resolve-hash\") {\n let priceStorageRequest: PriceStorageQuoteRequest;\n if (parsed.mode === \"price-storage-resolve-hash\") {\n const resolved = await resolvePriceStorageHashFromDatastore(\n datastore,\n parsed.priceStoragePartial,\n );\n if (!resolved.ok) {\n return { text: resolved.message, isError: true };\n }\n priceStorageRequest = resolved.request;\n } else {\n priceStorageRequest = parsed.priceStorageRequest;\n }\n\n const correlation = buildRequestCorrelation();\n try {\n const quote = await requestPriceStorageQuote(priceStorageRequest, {\n ...options.proxyQuoteOptions,\n correlation,\n });\n await datastore.ensureReady();\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 const verified = await datastore.findQuoteById(quote.quote_id);\n if (!verified || !quoteLookupMatchesPriceStorageResponse(verified, quote)) {\n return {\n text: \"Cannot price storage: quote was not saved to local SQLite (~/.openclaw/mnemospark/state.db). Check disk permissions or MNEMOSPARK_DISABLE_SQLITE.\",\n isError: true,\n };\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 mnemosparkHomeDir,\n );\n let friendlyForQuote: string | null = null;\n try {\n friendlyForQuote = await datastore.findLatestFriendlyNameForObjectId(quote.object_id);\n } catch {\n friendlyForQuote = null;\n }\n return {\n text: formatPriceStorageUserMessage(quote, friendlyForQuote),\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: priceStorageRequest.wallet_address,\n object_id: priceStorageRequest.object_id,\n status: \"failed\",\n },\n mnemosparkHomeDir,\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 let preparedPayload: PreparedUploadPayload | undefined;\n try {\n const loggedQuote = await datastore.findQuoteById(parsed.uploadRequest.quote_id);\n if (!loggedQuote) {\n return {\n text: \"Cannot upload storage object: quote-id not found in local SQLite. Run /mnemospark cloud price-storage first (quotes expire after about one hour on the server).\",\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 backupDir = options.backupOptions?.tmpDir ?? DEFAULT_BACKUP_DIR;\n const dbFriendly = await datastore.findLatestFriendlyNameForObjectId(\n parsed.uploadRequest.object_id,\n );\n if (!dbFriendly?.trim()) {\n return {\n text: \"Cannot upload storage object: no friendly name in local SQLite for this object-id. Run /mnemospark cloud backup with --name first.\",\n isError: true,\n };\n }\n\n if (parsed.friendlyName?.trim()) {\n if (parsed.friendlyName.trim() !== dbFriendly.trim()) {\n return {\n text: \"Cannot upload storage object: --name does not match the friendly name stored in local SQLite for this object-id.\",\n isError: true,\n };\n }\n }\n\n const resolvedArchive = await resolveLocalUploadArchivePath(\n backupDir,\n parsed.uploadRequest.object_id,\n dbFriendly,\n );\n if (!resolvedArchive.ok) {\n return { text: resolvedArchive.message, isError: true };\n }\n const archivePath = resolvedArchive.archivePath;\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(mnemosparkHomeDir);\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 preparedPayload = await prepareUploadPayload(\n archivePath,\n parsed.uploadRequest.wallet_address,\n mnemosparkHomeDir,\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 preparedPayload.encryptedTempPath,\n fetchImpl,\n preparedPayload.encryptedTempPath\n ? preparedPayload.payload.content_length_bytes\n : undefined,\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 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 openClawCronAdapter,\n mnemosparkHomeDir ?? homedir(),\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 const normalizedFriendlyName = dbFriendly.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; --name lookups may not resolve until SQLite is healthy.\";\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 mnemosparkHomeDir,\n );\n if (process.env.MNEMOSPARK_SQLITE_STRICT === \"1\") {\n throw new Error(warning);\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 mnemosparkHomeDir,\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 mnemosparkHomeDir,\n );\n const uploadErrorMessage = extractUploadErrorMessage(error);\n return {\n text: uploadErrorMessage ?? \"Cannot upload storage object\",\n isError: true,\n };\n } finally {\n if (preparedPayload?.encryptedTempPath) {\n await rm(preparedPayload.encryptedTempPath, { force: true }).catch(() => {});\n }\n }\n }\n\n if (parsed.mode === \"ls\") {\n const resolved = await resolveNameSelectorIfNeeded(\n datastore,\n parsed.storageObjectRequest,\n parsed.nameSelector,\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 const objectKeyForLs = resolvedRequest.object_key?.trim();\n const isBucketList = !objectKeyForLs;\n const correlation = buildRequestCorrelation();\n const operationId = correlation.operationId;\n const knownObject = isBucketList ? null : await datastore.findObjectByObjectKey(objectKeyForLs);\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 ?? null,\n status: \"succeeded\",\n list_mode: isBucketList,\n },\n mnemosparkHomeDir,\n );\n const lsText = await buildMnemosparkLsMessage(lsResult, {\n walletAddress: resolvedRequest.wallet_address,\n datastore,\n });\n return {\n text: lsText,\n };\n } catch (error) {\n const lsErrorMessage = extractLsErrorMessage(error) ?? \"Cannot list storage object\";\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: lsErrorMessage,\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 ?? null,\n status: \"failed\",\n list_mode: isBucketList,\n },\n mnemosparkHomeDir,\n );\n return {\n text: lsErrorMessage,\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 );\n if (resolved.error || !resolved.request) {\n return { text: resolved.error ?? \"Cannot resolve storage object request.\", isError: true };\n }\n const narrowed = toStorageObjectRequestOrError(\n resolved.request,\n `Cannot download file: required arguments are ${REQUIRED_STORAGE_OBJECT}.`,\n );\n if (!narrowed.ok) {\n return { text: narrowed.error, isError: true };\n }\n const resolvedRequest = narrowed.request;\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 let downloadLocalBasename: string | undefined;\n try {\n const friendly = await datastore.findLatestFriendlyNameForObjectKey(\n resolvedRequest.wallet_address,\n resolvedRequest.object_key,\n );\n if (friendly?.trim()) {\n try {\n downloadLocalBasename = sanitizeFriendlyNameForLocalBasename(friendly);\n } catch {\n downloadLocalBasename = undefined;\n }\n }\n } catch {\n downloadLocalBasename = undefined;\n }\n\n try {\n const downloadResult = await requestStorageDownload(resolvedRequest, {\n ...options.proxyStorageOptions,\n correlation,\n ...(downloadLocalBasename ? { downloadLocalBasename } : {}),\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 mnemosparkHomeDir,\n );\n const downloadText = `File ${resolvedRequest.object_key} downloaded to ${downloadResult.file_path}`;\n return {\n text: 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 mnemosparkHomeDir,\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 );\n if (resolved.error || !resolved.request) {\n return { text: resolved.error ?? \"Cannot resolve storage object request.\", isError: true };\n }\n const narrowedDelete = toStorageObjectRequestOrError(\n resolved.request,\n `Cannot delete file: required arguments are ${REQUIRED_STORAGE_OBJECT}.`,\n );\n if (!narrowedDelete.ok) {\n return { text: narrowedDelete.error, isError: true };\n }\n const resolvedRequest = narrowedDelete.request;\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 mnemosparkHomeDir,\n );\n return {\n text: \"Cannot delete file\",\n isError: true,\n };\n }\n let cronEntry: { cronId: string; objectId: string; objectKey: string } | 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 findCronJobInOpenClawCronJobsByObjectKey(\n resolvedRequest.object_key,\n openClawCronAdapter,\n );\n }\n if (cronEntry) {\n const fileCronDeleted = await removeStoragePaymentCronJob(\n cronEntry.cronId,\n openClawCronAdapter,\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 mnemosparkHomeDir,\n );\n const deleteText = formatStorageDeleteUserMessage(\n resolvedRequest.object_key,\n cronEntry?.cronId ?? null,\n cronDeleted,\n );\n return {\n text: 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 { CronExpressionParser } from \"cron-parser\";\n\nimport {\n isStorageLsListResponse,\n type StorageLsListObject,\n type StorageLsResponse,\n} from \"./cloud-storage.js\";\nimport type { CloudDatastore } from \"./cloud-datastore.js\";\nimport { formatBytesForDisplay } from \"./cloud-utils.js\";\n\nconst LS_NAME_DISPLAY_MAX = 72;\nconst LS_PAY_DISPLAY_MAX = 28;\nconst LS_CRON_ID_MAX = 14;\n\n/** Data column width for S3 last-modified (UTC). */\nconst LS_S3_COL_WIDTH = 12;\n/** Fits header \"NEXT PAYMENT DATE\" and time cells. */\nconst LS_NEXT_COL_WIDTH = Math.max(LS_S3_COL_WIDTH, \"NEXT PAYMENT DATE\".length);\n\nconst HDR_SIZE = \"SIZE\";\nconst HDR_S3_TIME = \"S3_TIME\";\nconst HDR_CRON_JOB = \"CRON JOB\";\nconst HDR_NEXT_PAYMENT = \"NEXT PAYMENT DATE\";\nconst HDR_AMOUNT_DUE = \"AMOUNT DUE\";\nconst HDR_FILE_OR_KEY = \"FILE NAME OR OBJECT-KEY\";\n\nconst MONTHS_SHORT = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n] as const;\n\n/** S3 object times in listings use UTC (matches backend ISO timestamps). */\nfunction formatLsTimeFieldUtc(\n iso: string | undefined,\n now: Date,\n fieldWidth: number = LS_S3_COL_WIDTH,\n): string {\n const placeholder = \" - \".slice(0, fieldWidth);\n if (!iso) {\n return placeholder.padEnd(fieldWidth, \" \");\n }\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) {\n return placeholder.padEnd(fieldWidth, \" \");\n }\n const mon = MONTHS_SHORT[d.getUTCMonth()] ?? \"???\";\n const day = String(d.getUTCDate()).padStart(2, \" \");\n const y = d.getUTCFullYear();\n const nowY = now.getUTCFullYear();\n let core: string;\n if (y === nowY) {\n const hh = String(d.getUTCHours()).padStart(2, \"0\");\n const mm = String(d.getUTCMinutes()).padStart(2, \"0\");\n core = `${mon} ${day} ${hh}:${mm}`;\n } else {\n core = `${mon} ${day} ${y}`;\n }\n return core.padEnd(fieldWidth, \" \");\n}\n\nfunction truncateEnd(value: string, max: number): string {\n if (value.length <= max) {\n return value;\n }\n if (max <= 1) {\n return \"…\";\n }\n return `${value.slice(0, max - 1)}…`;\n}\n\nfunction truncateMiddle(value: string, max: number, suffixMin: number): string {\n if (value.length <= max) {\n return value;\n }\n if (max < suffixMin + 5) {\n return truncateEnd(value, max);\n }\n const suffixLen = Math.min(suffixMin, max - 5);\n const prefixLen = max - 3 - suffixLen;\n return `${value.slice(0, prefixLen)} … ${value.slice(-suffixLen)}`;\n}\n\nfunction formatCronIdCell(cronId: string | null, width: number): string {\n if (!cronId) {\n return \" - \".slice(0, width).padStart(width, \" \");\n }\n const t = truncateEnd(cronId, width);\n return t.padStart(width, \" \");\n}\n\nfunction formatPaymentCell(\n amount: number | null,\n network: string | null,\n maxWidth: number,\n): string {\n if (amount === null) {\n return \" - \".slice(0, maxWidth).padStart(maxWidth, \" \");\n }\n let s = amount.toFixed(6).replace(/\\.?0+$/, \"\");\n if (network && network.trim()) {\n s = `${s} (${network.trim()})`;\n }\n return truncateEnd(s, maxWidth).padStart(maxWidth, \" \");\n}\n\nfunction formatNextCronUtc(schedule: string, cronStatus: string, now: Date): string {\n const blank = \" - \".slice(0, LS_NEXT_COL_WIDTH).padEnd(LS_NEXT_COL_WIDTH, \" \");\n if (cronStatus !== \"active\") {\n return blank;\n }\n try {\n const expr = CronExpressionParser.parse(schedule, { tz: \"UTC\", currentDate: now });\n const next = expr.next().toDate();\n return formatLsTimeFieldUtc(next.toISOString(), now, LS_NEXT_COL_WIDTH);\n } catch {\n return \"?\".padEnd(LS_NEXT_COL_WIDTH, \" \");\n }\n}\n\ntype PreparedLsRow = {\n sizeStr: string;\n s3time: string;\n cronIdRaw: string | null;\n nextRun: string;\n payRaw: string;\n nameRaw: string;\n};\n\nfunction buildLsProseIntro(bucket: string): string[] {\n return [\n \"☁️ mnemospark cloud\",\n `Folder: ${bucket}`,\n \"The columns: CRON JOB, NEXT PAYMENT DATE, AMOUNT DUE, FILE NAME are from this host's mnemospark SQLite catalog\",\n \"mnemospark cloud only stores the OBJECT-KEY for privacy\",\n ];\n}\n\nasync function prepareRows(\n objects: StorageLsListObject[],\n walletAddress: string,\n datastore: CloudDatastore,\n now: Date,\n): Promise<PreparedLsRow[]> {\n const sorted = [...objects].sort((a, b) => {\n const ta = a.last_modified ? Date.parse(a.last_modified) : Number.NaN;\n const tb = b.last_modified ? Date.parse(b.last_modified) : Number.NaN;\n const aOk = Number.isFinite(ta);\n const bOk = Number.isFinite(tb);\n if (aOk && bOk && tb !== ta) {\n return tb - ta;\n }\n if (aOk && !bOk) {\n return -1;\n }\n if (!aOk && bOk) {\n return 1;\n }\n return a.key.localeCompare(b.key);\n });\n\n const rows: PreparedLsRow[] = [];\n for (const obj of sorted) {\n const friendly = await datastore.findLatestFriendlyNameForObjectKey(walletAddress, obj.key);\n const cp = await datastore.findCronAndPaymentForObjectKey(walletAddress, obj.key);\n const sizeStr = formatBytesForDisplay(obj.size_bytes);\n const s3time = formatLsTimeFieldUtc(obj.last_modified, now, LS_S3_COL_WIDTH);\n let cronIdDisp: string | null = null;\n let nextRun = \" - \".slice(0, LS_NEXT_COL_WIDTH).padEnd(LS_NEXT_COL_WIDTH, \" \");\n let payCell = \"\";\n if (cp) {\n cronIdDisp = cp.cronId;\n nextRun = formatNextCronUtc(cp.schedule, cp.cronStatus, now);\n payCell = formatPaymentCell(cp.amount, cp.network, LS_PAY_DISPLAY_MAX);\n } else {\n payCell = formatPaymentCell(null, null, LS_PAY_DISPLAY_MAX);\n }\n const nameRaw = friendly ? `${friendly} (${obj.key})` : obj.key;\n rows.push({\n sizeStr,\n s3time,\n cronIdRaw: cronIdDisp,\n nextRun,\n payRaw: payCell,\n nameRaw: truncateMiddle(nameRaw, LS_NAME_DISPLAY_MAX, 8),\n });\n }\n return rows;\n}\n\ntype ColWidths = { sizeW: number; s3W: number; cronW: number; nextW: number; payW: number };\n\nfunction columnWidths(rows: PreparedLsRow[]): ColWidths {\n let sizeW = HDR_SIZE.length;\n let s3W = Math.max(LS_S3_COL_WIDTH, HDR_S3_TIME.length);\n let nextW = LS_NEXT_COL_WIDTH;\n let cronW = HDR_CRON_JOB.length;\n let payW = HDR_AMOUNT_DUE.length;\n for (const r of rows) {\n sizeW = Math.max(sizeW, r.sizeStr.length);\n s3W = Math.max(s3W, r.s3time.length);\n nextW = Math.max(nextW, r.nextRun.length);\n const cid = r.cronIdRaw ? truncateEnd(r.cronIdRaw, LS_CRON_ID_MAX) : \"\";\n cronW = Math.max(cronW, cid.length || 1);\n payW = Math.max(payW, r.payRaw.length);\n }\n cronW = Math.min(Math.max(cronW, HDR_CRON_JOB.length), LS_CRON_ID_MAX);\n payW = Math.min(Math.max(payW, HDR_AMOUNT_DUE.length), LS_PAY_DISPLAY_MAX);\n return { sizeW, s3W, cronW, nextW, payW };\n}\n\nfunction renderRow(r: PreparedLsRow, w: ColWidths): string {\n const cronPadded = formatCronIdCell(r.cronIdRaw, w.cronW);\n return [\n r.sizeStr.padStart(w.sizeW, \" \"),\n r.s3time.padEnd(w.s3W, \" \"),\n cronPadded,\n r.nextRun.padEnd(w.nextW, \" \"),\n r.payRaw.padStart(w.payW, \" \"),\n r.nameRaw,\n ].join(\" \");\n}\n\nfunction renderHeader(w: ColWidths): string {\n return [\n HDR_SIZE.padStart(w.sizeW, \" \"),\n HDR_S3_TIME.padEnd(w.s3W, \" \"),\n HDR_CRON_JOB.padStart(w.cronW, \" \"),\n HDR_NEXT_PAYMENT.padEnd(w.nextW, \" \"),\n HDR_AMOUNT_DUE.padStart(w.payW, \" \"),\n HDR_FILE_OR_KEY,\n ].join(\" \");\n}\n\nexport async function buildMnemosparkLsMessage(\n result: StorageLsResponse,\n ctx: {\n walletAddress: string;\n datastore: CloudDatastore;\n now?: Date;\n },\n): Promise<string> {\n const now = ctx.now ?? new Date();\n\n if (isStorageLsListResponse(result)) {\n const intro = buildLsProseIntro(result.bucket);\n if (result.objects.length === 0) {\n return [...intro, \"\", \"No objects in this bucket.\"].join(\"\\n\");\n }\n const rows = await prepareRows(result.objects, ctx.walletAddress, ctx.datastore, now);\n const w = columnWidths(rows);\n const header = renderHeader(w);\n const bodyLines = rows.map((r) => renderRow(r, w));\n const truncLine = result.is_truncated ? \"List truncated; more objects in bucket.\" : null;\n const prose = [...intro, ...(truncLine ? [truncLine] : [])].join(\"\\n\");\n const fence = [\"```\", [header, ...bodyLines].join(\"\\n\"), \"```\"].join(\"\\n\");\n return `${prose}\\n\\n${fence}`;\n }\n\n const friendly = await ctx.datastore.findLatestFriendlyNameForObjectKey(\n ctx.walletAddress,\n result.key,\n );\n const cp = await ctx.datastore.findCronAndPaymentForObjectKey(ctx.walletAddress, result.key);\n const sizeStr = formatBytesForDisplay(result.size_bytes);\n const s3time = formatLsTimeFieldUtc(undefined, now, LS_S3_COL_WIDTH);\n let payCell = formatPaymentCell(null, null, LS_PAY_DISPLAY_MAX);\n let cronIdDisp: string | null = null;\n let nextRun = \" - \".slice(0, LS_NEXT_COL_WIDTH).padEnd(LS_NEXT_COL_WIDTH, \" \");\n if (cp) {\n cronIdDisp = cp.cronId;\n nextRun = formatNextCronUtc(cp.schedule, cp.cronStatus, now);\n payCell = formatPaymentCell(cp.amount, cp.network, LS_PAY_DISPLAY_MAX);\n }\n const nameShown = truncateMiddle(\n friendly ? `${friendly} (${result.key})` : result.key,\n LS_NAME_DISPLAY_MAX,\n 8,\n );\n const prep: PreparedLsRow = {\n sizeStr,\n s3time,\n cronIdRaw: cronIdDisp,\n nextRun,\n payRaw: payCell,\n nameRaw: nameShown,\n };\n const w = columnWidths([prep]);\n const header = renderHeader(w);\n const line = renderRow(prep, w);\n const prose = buildLsProseIntro(result.bucket).join(\"\\n\");\n const fence = [\"```\", [header, line].join(\"\\n\"), \"```\"].join(\"\\n\");\n return `${prose}\\n\\n${fence}`;\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 /** User-visible command output on async success; persisted for op-status. */\n result_text?: 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 findCronJobRowByObjectKey: (objectKey: string) => Promise<CronJobRow | null>;\n findCronByQuoteId: (quoteId: string) => Promise<CronJobRow | null>;\n findPaymentByQuoteId: (quoteId: string) => Promise<PaymentRow | 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 result_text: 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 findLatestFriendlyNameForObjectKey: (\n walletAddress: string,\n objectKey: string,\n ) => Promise<string | null>;\n findLatestFriendlyNameForObjectId: (objectId: string) => Promise<string | null>;\n findCronAndPaymentForObjectKey: (\n walletAddress: string,\n objectKey: string,\n ) => Promise<{\n cronId: string;\n schedule: string;\n quoteId: string;\n cronStatus: string;\n amount: number | null;\n network: string | null;\n paymentStatus: string | null;\n } | null>;\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 // Multiple DatabaseSync handles may open the same file (e.g. tests + handler); wait on locks.\n nextDb.exec(\"PRAGMA busy_timeout=5000;\");\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 CREATE INDEX IF NOT EXISTS idx_cron_jobs_quote_id ON cron_jobs(quote_id);\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 addOperationsColumn(\"result_text\", \"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 findCronJobRowByObjectKey: async (objectKey) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT cron_id, object_id, object_key, quote_id, schedule, command, status\n FROM cron_jobs WHERE object_key = ? ORDER BY updated_at DESC LIMIT 1`,\n )\n .get(objectKey) as\n | {\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 | undefined;\n if (!row) return null;\n return {\n cron_id: row.cron_id,\n object_id: row.object_id,\n object_key: row.object_key,\n quote_id: row.quote_id,\n schedule: row.schedule,\n command: row.command,\n status: row.status,\n };\n }, null),\n findCronByQuoteId: async (quoteId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT cron_id, object_id, object_key, quote_id, schedule, command, status\n FROM cron_jobs WHERE quote_id = ? ORDER BY updated_at DESC LIMIT 1`,\n )\n .get(quoteId) as\n | {\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 | undefined;\n if (!row) return null;\n return {\n cron_id: row.cron_id,\n object_id: row.object_id,\n object_key: row.object_key,\n quote_id: row.quote_id,\n schedule: row.schedule,\n command: row.command,\n status: row.status,\n };\n }, null),\n findPaymentByQuoteId: async (quoteId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT quote_id, wallet_address, trans_id, amount, network, status, settled_at\n FROM payments WHERE quote_id = ? LIMIT 1`,\n )\n .get(quoteId) as\n | {\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 | undefined;\n if (!row) return null;\n return {\n quote_id: row.quote_id,\n wallet_address: row.wallet_address,\n trans_id: row.trans_id,\n amount: row.amount,\n network: row.network,\n status: row.status,\n settled_at: row.settled_at,\n };\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, result_text, 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 result_text=COALESCE(excluded.result_text, operations.result_text),\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.result_text ?? null,\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, result_text, 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 result_text: 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 findLatestFriendlyNameForObjectKey: async (walletAddress, objectKey) =>\n safe(() => {\n const w = normalizeWalletAddress(walletAddress);\n const byKey = db!\n .prepare(\n `SELECT friendly_name\n FROM friendly_names\n WHERE wallet_address = ? AND object_key = ? AND is_active = 1\n ORDER BY created_at DESC\n LIMIT 1`,\n )\n .get(w, objectKey) as { friendly_name: string } | undefined;\n if (byKey) {\n return byKey.friendly_name;\n }\n const obj = db!\n .prepare(\n `SELECT object_id FROM objects WHERE wallet_address = ? AND object_key = ? LIMIT 1`,\n )\n .get(w, objectKey) as { object_id: string } | undefined;\n if (!obj) {\n return null;\n }\n const byObj = db!\n .prepare(\n `SELECT friendly_name\n FROM friendly_names\n WHERE wallet_address = ? AND object_id = ? AND is_active = 1\n ORDER BY created_at DESC\n LIMIT 1`,\n )\n .get(w, obj.object_id) as { friendly_name: string } | undefined;\n return byObj?.friendly_name ?? null;\n }, null),\n findLatestFriendlyNameForObjectId: async (objectId) =>\n safe(() => {\n const row = db!\n .prepare(\n `SELECT friendly_name\n FROM friendly_names\n WHERE object_id = ? AND is_active = 1\n ORDER BY created_at DESC\n LIMIT 1`,\n )\n .get(objectId.trim()) as { friendly_name: string } | undefined;\n return row?.friendly_name ?? null;\n }, null),\n findCronAndPaymentForObjectKey: async (walletAddress, objectKey) =>\n safe(() => {\n const w = normalizeWalletAddress(walletAddress);\n const cron = db!\n .prepare(\n `SELECT c.cron_id, c.quote_id, c.schedule, c.status\n FROM cron_jobs c\n INNER JOIN objects o ON o.object_id = c.object_id\n WHERE c.object_key = ? AND o.wallet_address = ?\n ORDER BY c.updated_at DESC\n LIMIT 1`,\n )\n .get(objectKey, w) as\n | { cron_id: string; quote_id: string; schedule: string; status: string }\n | undefined;\n if (!cron) {\n return null;\n }\n const pay = db!\n .prepare(\n `SELECT amount, network, status\n FROM payments\n WHERE quote_id = ? AND wallet_address = ?\n LIMIT 1`,\n )\n .get(cron.quote_id, w) as\n | { amount: number; network: string | null; status: string }\n | undefined;\n return {\n cronId: cron.cron_id,\n schedule: cron.schedule,\n quoteId: cron.quote_id,\n cronStatus: cron.status,\n amount: pay?.amount ?? null,\n network: pay?.network ?? null,\n paymentStatus: pay?.status ?? null,\n };\n }, null),\n };\n}\n\nexport { DB_SUBPATH, SCHEMA_VERSION, resolveDbPath as resolveCloudDatastorePath };\n","export function normalizeSmartQuotes(input: string): string {\n return input.replace(/[\\u201C\\u201D]/g, '\"').replace(/[\\u2018\\u2019]/g, \"'\");\n}\n\n/**\n * Converts en/em dash at token start to `--` for flag-like tokens (after whitespace or start).\n */\nexport function normalizeFlagPositionDashes(input: string): { text: string; warnings: string[] } {\n const warnings: string[] = [];\n const pattern = /(^|\\s)[\\u2013\\u2014](?=[A-Za-z_][A-Za-z0-9_-]*)/g;\n\n let changed = false;\n const text = input.replace(pattern, (m, prefix: string) => {\n changed = true;\n return `${prefix}--`;\n });\n\n if (changed) {\n warnings.push(\"Normalized en/em dash in flag position to ASCII double hyphen.\");\n }\n\n return { text, warnings };\n}\n\nexport type NormalizedInput = {\n text: string;\n warnings: string[];\n};\n\n/**\n * Full normalization pipeline before tokenization (smart quotes, flag-position dashes).\n */\nexport function normalizeInputForParsing(input: string): NormalizedInput {\n const warnings: string[] = [];\n let text = normalizeSmartQuotes(input);\n const dashNorm = normalizeFlagPositionDashes(text);\n text = dashNorm.text;\n warnings.push(...dashNorm.warnings);\n return { text, warnings };\n}\n","function levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i]![0] = i;\n for (let j = 0; j <= n; j++) dp[0]![j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i]![j] = Math.min(dp[i - 1]![j]! + 1, dp[i]![j - 1]! + 1, dp[i - 1]![j - 1]! + cost);\n }\n }\n return dp[m]![n]!;\n}\n\n/**\n * Returns best candidate from `candidates` for unknown `raw` (low edit distance), or null.\n */\nexport function suggestNearestKey(\n raw: string,\n candidates: string[],\n maxDistance = 2,\n): string | null {\n const lower = raw.toLowerCase();\n let best: string | null = null;\n let bestDist = maxDistance + 1;\n for (const c of candidates) {\n const d = levenshtein(lower, c.toLowerCase());\n if (d < bestDist) {\n bestDist = d;\n best = c;\n }\n }\n return bestDist <= maxDistance ? best : null;\n}\n","import { normalizeInputForParsing } from \"./normalize.js\";\nimport type { ArgSpec, CommandArgSchema, ParseResult } from \"./types.js\";\nimport { suggestNearestKey } from \"./suggest.js\";\n\ntype Token = {\n raw: string;\n value: string;\n};\n\nfunction canonicalizeKey(rawKey: string): string {\n return rawKey\n .normalize(\"NFKC\")\n .replace(/[\\u2010\\u2011\\u2012\\u2013\\u2014\\u2015\\u2212]/g, \"-\")\n .replace(/_/g, \"-\")\n .toLowerCase()\n .trim();\n}\n\nexport function buildAliasMap(schema: CommandArgSchema): Map<string, ArgSpec> {\n const map = new Map<string, ArgSpec>();\n\n for (const spec of schema.args) {\n map.set(canonicalizeKey(spec.name), spec);\n for (const alias of spec.aliases ?? []) {\n map.set(canonicalizeKey(alias), spec);\n }\n }\n\n return map;\n}\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < input.length) {\n while (i < input.length && /\\s/.test(input[i]!)) i++;\n if (i >= input.length) break;\n\n let raw = \"\";\n let value = \"\";\n\n if (input[i] === '\"' || input[i] === \"'\") {\n const quote = input[i++]!;\n raw += quote;\n\n while (i < input.length) {\n const ch = input[i++]!;\n raw += ch;\n\n if (ch === \"\\\\\") {\n if (i < input.length) {\n const next = input[i++]!;\n raw += next;\n value += next;\n }\n continue;\n }\n\n if (ch === quote) {\n break;\n }\n\n value += ch;\n }\n\n tokens.push({ raw, value });\n continue;\n }\n\n while (i < input.length && !/\\s/.test(input[i]!)) {\n const ch = input[i++]!;\n raw += ch;\n value += ch;\n }\n\n tokens.push({ raw, value });\n }\n\n return tokens;\n}\n\nfunction resolveKey(\n rawKey: string,\n aliasMap: Map<string, ArgSpec>,\n schema: CommandArgSchema,\n allCanonicalNames: string[],\n): { key?: string; spec?: ArgSpec; error?: string } {\n const canonical = canonicalizeKey(rawKey);\n const spec = aliasMap.get(canonical);\n\n if (!spec) {\n if (schema.allowUnknown) return { key: canonical };\n const suggestion = suggestNearestKey(rawKey, allCanonicalNames);\n const hint = suggestion ? ` Did you mean \"${suggestion}\"?` : \"\";\n return { error: `Unknown argument \"${rawKey}\".${hint}` };\n }\n\n return { key: spec.name, spec };\n}\n\nfunction addValue(\n out: Record<string, string | string[]>,\n key: string,\n value: string,\n spec?: ArgSpec,\n): string | null {\n const existing = out[key];\n\n if (existing === undefined) {\n out[key] = spec?.repeatable ? [value] : value;\n return null;\n }\n\n if (!spec?.repeatable) {\n return `Duplicate argument \"${key}\".`;\n }\n\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n out[key] = [existing, value];\n }\n\n return null;\n}\n\nfunction collectCanonicalNames(schema: CommandArgSchema): string[] {\n const names = new Set<string>();\n for (const spec of schema.args) {\n names.add(spec.name);\n for (const a of spec.aliases ?? []) {\n names.add(a);\n }\n }\n return [...names];\n}\n\nfunction looksLikeDelimitedArgToken(token: string): boolean {\n return /^[A-Za-z_][A-Za-z0-9_-]*[:=]/.test(token);\n}\n\nfunction tryParseDelimitedToken(\n token: string,\n delimiter: \":\" | \"=\",\n aliasMap: Map<string, ArgSpec>,\n schema: CommandArgSchema,\n allCanonicalNames: string[],\n out: Record<string, string | string[]>,\n): { handled: boolean; error?: string } {\n const idx = token.indexOf(delimiter);\n if (idx <= 0) return { handled: false };\n\n const keyPart = token.slice(0, idx);\n if (!/^[A-Za-z_][A-Za-z0-9_-]*$/.test(keyPart)) return { handled: false };\n\n const rawKey = keyPart;\n const rawValue = token.slice(idx + 1);\n if (rawValue === \"\") {\n return { handled: true, error: `Empty value for argument \"${rawKey}\".` };\n }\n\n const resolved = resolveKey(rawKey, aliasMap, schema, allCanonicalNames);\n if (resolved.error) {\n return { handled: true, error: resolved.error };\n }\n\n const dupErr = addValue(out, resolved.key!, rawValue, resolved.spec);\n if (dupErr) {\n return { handled: true, error: dupErr };\n }\n\n return { handled: true };\n}\n\nexport function parseCommandArgs(input: string, schema: CommandArgSchema): ParseResult {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n const norm = normalizeInputForParsing(input);\n const normalized = norm.text;\n warnings.push(...norm.warnings);\n\n const tokens = tokenize(normalized);\n const aliasMap = buildAliasMap(schema);\n const allCanonicalNames = collectCanonicalNames(schema);\n const values: Record<string, string | string[]> = {};\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!.value;\n\n {\n const parsed = tryParseDelimitedToken(\n token,\n \":\",\n aliasMap,\n schema,\n allCanonicalNames,\n values,\n );\n if (parsed.handled) {\n if (parsed.error) errors.push(parsed.error);\n continue;\n }\n }\n\n {\n const parsed = tryParseDelimitedToken(\n token,\n \"=\",\n aliasMap,\n schema,\n allCanonicalNames,\n values,\n );\n if (parsed.handled) {\n if (parsed.error) errors.push(parsed.error);\n continue;\n }\n }\n\n if (token.startsWith(\"--\")) {\n const rawKey = token.slice(2);\n if (!rawKey) {\n errors.push('Encountered \"--\" without an argument name.');\n continue;\n }\n\n const resolved = resolveKey(rawKey, aliasMap, schema, allCanonicalNames);\n if (resolved.error) {\n errors.push(resolved.error);\n continue;\n }\n\n const next = tokens[i + 1];\n if (!next) {\n if (resolved.spec?.bareBoolean) {\n const dupErr = addValue(values, resolved.key!, \"true\", resolved.spec);\n if (dupErr) errors.push(dupErr);\n continue;\n }\n errors.push(`Missing value for argument \"${resolved.key}\".`);\n continue;\n }\n\n if (next.value.startsWith(\"--\")) {\n if (resolved.spec?.bareBoolean) {\n const dupErr = addValue(values, resolved.key!, \"true\", resolved.spec);\n if (dupErr) errors.push(dupErr);\n continue;\n }\n errors.push(`Missing value for argument \"${resolved.key}\".`);\n continue;\n }\n\n if (resolved.spec?.bareBoolean && looksLikeDelimitedArgToken(next.value)) {\n const dupErr = addValue(values, resolved.key!, \"true\", resolved.spec);\n if (dupErr) errors.push(dupErr);\n continue;\n }\n\n const dupErr = addValue(values, resolved.key!, next.value, resolved.spec);\n if (dupErr) errors.push(dupErr);\n\n i += 1;\n continue;\n }\n\n errors.push(`Unexpected token \"${token}\". Use key:value, key=value, or --key value.`);\n }\n\n for (const spec of schema.args) {\n if (spec.required && values[spec.name] === undefined) {\n errors.push(`Missing required argument \"${spec.name}\".`);\n }\n }\n\n if (errors.length > 0) {\n return {\n ok: false,\n normalizedInput: normalized,\n errors,\n warnings,\n };\n }\n\n return {\n ok: true,\n normalizedInput: normalized,\n values,\n warnings,\n };\n}\n\nexport function valuesToStringRecord(\n values: Record<string, string | string[]>,\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(values)) {\n out[k] = Array.isArray(v) ? v[v.length - 1]! : v;\n }\n return out;\n}\n","/**\n * Top-level /mnemospark argument routing (after the slash command name).\n */\n\nexport type MnemosparkRoute =\n | { kind: \"root-help\" }\n | { kind: \"cloud\"; rest: string }\n | { kind: \"wallet\"; rest: string }\n | { kind: \"error\"; message: string };\n\n/**\n * Parse first token optional `name:true` form. Rejects non-true values after colon.\n */\nexport function parseVerboseToken(token: string): { name: string; ok: boolean } {\n const t = token.trim();\n const idx = t.indexOf(\":\");\n if (idx < 0) {\n return { name: t.toLowerCase(), ok: true };\n }\n const key = t.slice(0, idx).trim();\n const val = t\n .slice(idx + 1)\n .trim()\n .toLowerCase();\n if (!key) return { name: \"\", ok: false };\n if (val === \"true\") return { name: key.toLowerCase(), ok: true };\n return { name: key.toLowerCase(), ok: false };\n}\n\nexport function firstTokenAndRest(input: string): { first: string; rest: string } {\n const t = input.trim();\n if (!t) return { first: \"\", rest: \"\" };\n const spaceIdx = t.search(/\\s/);\n if (spaceIdx === -1) return { first: t, rest: \"\" };\n return { first: t.slice(0, spaceIdx), rest: t.slice(spaceIdx + 1).trim() };\n}\n\n/**\n * Routes `ctx.args` for `/mnemospark` (everything after the command name).\n */\nexport function routeMnemosparkArgs(args: string | undefined): MnemosparkRoute {\n const trimmed = args?.trim() ?? \"\";\n if (!trimmed) {\n return { kind: \"root-help\" };\n }\n\n const { first, rest } = firstTokenAndRest(trimmed);\n const parsed = parseVerboseToken(first);\n if (!parsed.ok) {\n return {\n kind: \"error\",\n message: `Invalid token \"${first}\". Use name:true only with value true, or a bare name (e.g. cloud, wallet, help).`,\n };\n }\n\n const head = parsed.name;\n\n if (head === \"help\") {\n return { kind: \"root-help\" };\n }\n\n if (head === \"cloud\") {\n return { kind: \"cloud\", rest };\n }\n\n if (head === \"wallet\") {\n return { kind: \"wallet\", rest };\n }\n\n return {\n kind: \"error\",\n message: [\n `Unknown command \"${first}\".`,\n \"\",\n \"Try:\",\n \"• `/mnemospark help` — overview\",\n \"• `/mnemospark cloud help` — cloud commands\",\n \"• `/mnemospark wallet` — wallet status\",\n \"• `/mnemospark wallet help` — wallet commands\",\n ].join(\"\\n\"),\n };\n}\n","import type { CommandArgSchema } from \"./args/types.js\";\n\nexport const priceStorageSchema: CommandArgSchema = {\n args: [\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-id\", aliases: [\"object\"], required: true },\n // Optional: omit when the object exists in local SQLite after backup; CLI resolves sha256 from state.db.\n { name: \"object-id-hash\", aliases: [\"hash\"] },\n { name: \"gb\", required: true },\n { name: \"provider\", required: true },\n { name: \"region\", required: true },\n ],\n};\n\nexport const uploadSchema: CommandArgSchema = {\n args: [\n { name: \"quote-id\", aliases: [\"quote\"], required: true },\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-id\", aliases: [\"object\"], required: true },\n { name: \"object-id-hash\", aliases: [\"hash\"], required: true },\n { name: \"name\" },\n { name: \"async\", bareBoolean: true },\n { name: \"orchestrator\" },\n { name: \"timeout-seconds\" },\n ],\n};\n\nexport const backupFlagsSchema: CommandArgSchema = {\n args: [\n { name: \"name\" },\n { name: \"async\", bareBoolean: true },\n { name: \"orchestrator\" },\n { name: \"timeout-seconds\" },\n ],\n};\n\nexport const paymentSettleSchema: CommandArgSchema = {\n args: [\n { name: \"quote-id\", aliases: [\"quote\"] },\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-id\", aliases: [\"object\"] },\n { name: \"object-key\" },\n { name: \"storage-price\" },\n { name: \"renewal\", bareBoolean: true },\n ],\n};\n\nexport const lsSchema: CommandArgSchema = {\n args: [\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-key\" },\n { name: \"name\" },\n { name: \"latest\", bareBoolean: true },\n { name: \"at\" },\n { name: \"location\" },\n { name: \"region\" },\n ],\n};\n\nexport const downloadSchema: CommandArgSchema = {\n args: [\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-key\" },\n { name: \"name\" },\n { name: \"latest\", bareBoolean: true },\n { name: \"at\" },\n { name: \"location\" },\n { name: \"region\" },\n { name: \"async\", bareBoolean: true },\n { name: \"orchestrator\" },\n { name: \"timeout-seconds\" },\n ],\n};\n\nexport const deleteSchema: CommandArgSchema = {\n args: [\n { name: \"wallet-address\", aliases: [\"wallet\"], required: true },\n { name: \"object-key\" },\n { name: \"name\" },\n { name: \"latest\", bareBoolean: true },\n { name: \"at\" },\n { name: \"location\" },\n { name: \"region\" },\n ],\n};\n\nexport const opStatusSchema: CommandArgSchema = {\n args: [\n { name: \"operation-id\", required: true },\n { name: \"cancel\", bareBoolean: true },\n ],\n};\n","import { spawn } from \"node:child_process\";\nimport { join } from \"node:path\";\n\nexport type OpenClawCliResult = { stdout: string; stderr: string };\n\n/**\n * Run the `openclaw` CLI with optional HOME override (used for tests and multi-user paths).\n */\nexport async function runOpenClawCli(args: string[], homeDir?: string): Promise<OpenClawCliResult> {\n return await new Promise<OpenClawCliResult>((resolvePromise, rejectPromise) => {\n let stdout = \"\";\n let stderr = \"\";\n const child = spawn(\"openclaw\", args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: {\n ...process.env,\n HOME: homeDir ?? process.env.HOME,\n },\n });\n child.stdout.on(\"data\", (chunk) => {\n stdout += chunk.toString();\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({ stdout, stderr });\n return;\n }\n rejectPromise(\n new Error(\n stderr.trim() ||\n stdout.trim() ||\n `openclaw ${args.join(\" \")} exited with code ${code ?? \"unknown\"}`,\n ),\n );\n });\n });\n}\n\nexport function parseOpenClawCliJson<T>(stdout: string, commandLabel: string): T {\n const trimmed = stdout.trim();\n if (!trimmed) {\n throw new Error(`openclaw ${commandLabel} returned empty JSON output`);\n }\n try {\n return JSON.parse(trimmed) as T;\n } catch {\n throw new Error(`openclaw ${commandLabel} returned invalid JSON output`);\n }\n}\n\n/**\n * Resolve `openclaw config file` output to an absolute path (CLI may print `~/.openclaw/...`).\n */\nexport async function resolveOpenClawConfigFilePath(homeDir: string): Promise<string> {\n const { stdout } = await runOpenClawCli([\"config\", \"file\"], homeDir);\n const trimmed = stdout.trim();\n if (trimmed.startsWith(\"~/\")) {\n return join(homeDir, trimmed.slice(2));\n }\n if (trimmed.startsWith(\"~\\\\\")) {\n return join(homeDir, trimmed.slice(2));\n }\n return trimmed;\n}\n","import { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nimport { resolveOpenClawConfigFilePath, runOpenClawCli } from \"./openclaw-cli.js\";\n\n/** Default OpenClaw agent id for storage renewal cron (override with MNEMOSPARK_CRON_AGENT_ID). */\nexport const DEFAULT_RENEWAL_AGENT_ID = \"mnemospark-renewal\";\n\n/** Stable allowlist entry id for /usr/bin/node (Mnemospark Renewal Agent Runbook). */\nexport const RENEWAL_NODE_ALLOWLIST_ID = \"node-usr-bin-node\";\n\nexport function getRenewalAgentId(): string {\n const fromEnv = process.env.MNEMOSPARK_CRON_AGENT_ID?.trim();\n return fromEnv && fromEnv.length > 0 ? fromEnv : DEFAULT_RENEWAL_AGENT_ID;\n}\n\n/** Absolute path to node for renewal exec (override with MNEMOSPARK_CRON_NODE_BIN). */\nexport function getRenewalNodeBinary(): string {\n const fromEnv = process.env.MNEMOSPARK_CRON_NODE_BIN?.trim();\n return fromEnv && fromEnv.length > 0 ? fromEnv : \"/usr/bin/node\";\n}\n\nexport type RenewalAgentListEntry = {\n id: string;\n tools: {\n deny: string[];\n exec: { ask: \"off\" | \"on\" | \"always\" };\n };\n};\n\n/**\n * Exact agent policy from the Mnemospark Renewal Agent Runbook (OpenClaw 2026.4.x).\n */\nexport function runbookRenewalAgentEntry(\n agentId: string = getRenewalAgentId(),\n): RenewalAgentListEntry {\n return {\n id: agentId,\n tools: {\n deny: [\"subagents\"],\n exec: { ask: \"off\" },\n },\n };\n}\n\ntype ExecApprovalsDoc = {\n agents?: Record<\n string,\n {\n allowlist?: Array<{\n id?: string;\n pattern?: string;\n source?: string;\n lastUsedAt?: number;\n }>;\n }\n >;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction renewalAgentEntrySatisfied(existing: unknown, desired: RenewalAgentListEntry): boolean {\n if (!isRecord(existing)) {\n return false;\n }\n if (existing.id !== desired.id) {\n return false;\n }\n const tools = existing.tools;\n if (!isRecord(tools)) {\n return false;\n }\n const deny = tools.deny;\n if (!Array.isArray(deny) || !deny.includes(\"subagents\")) {\n return false;\n }\n const exec = tools.exec;\n if (!isRecord(exec) || exec.ask !== \"off\") {\n return false;\n }\n return true;\n}\n\n/**\n * Ensure `agents.list` contains the renewal agent with runbook tools policy.\n * Returns whether the list was modified.\n */\nexport function mergeRenewalAgentIntoAgentsList(\n list: unknown,\n desired: RenewalAgentListEntry,\n): { list: RenewalAgentListEntry[]; changed: boolean } {\n const arr = Array.isArray(list) ? [...list] : [];\n const idx = arr.findIndex((e) => isRecord(e) && typeof e.id === \"string\" && e.id === desired.id);\n if (idx === -1) {\n return { list: [...arr, desired] as RenewalAgentListEntry[], changed: true };\n }\n if (renewalAgentEntrySatisfied(arr[idx], desired)) {\n return { list: arr as RenewalAgentListEntry[], changed: false };\n }\n const next = [...arr];\n next[idx] = desired;\n return { list: next as RenewalAgentListEntry[], changed: true };\n}\n\n/** Exported for unit tests (runbook exec-approvals merge). */\nexport function mergeExecApprovalsAllowlist(\n doc: ExecApprovalsDoc,\n agentId: string,\n nodeBinary: string,\n): { doc: ExecApprovalsDoc; changed: boolean } {\n const prevAgents = doc.agents && isRecord(doc.agents) ? doc.agents : {};\n const block = prevAgents[agentId];\n const allowlist = Array.isArray(block?.allowlist) ? [...block.allowlist] : [];\n const hasPattern = allowlist.some((e) => e?.pattern === nodeBinary);\n if (hasPattern) {\n return { doc, changed: false };\n }\n allowlist.push({\n id: RENEWAL_NODE_ALLOWLIST_ID,\n pattern: nodeBinary,\n source: \"manual\",\n lastUsedAt: Date.now(),\n });\n const nextAgents = {\n ...prevAgents,\n [agentId]: {\n ...(block && isRecord(block) ? block : {}),\n allowlist,\n },\n };\n return { doc: { ...doc, agents: nextAgents }, changed: true };\n}\n\nasync function readJsonFile(path: string): Promise<unknown> {\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw) as unknown;\n}\n\nasync function writeFileAtomic(path: string, contents: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const tmp = join(dirname(path), `.tmp-${randomUUID()}`);\n await writeFile(tmp, contents, \"utf-8\");\n await rename(tmp, path);\n}\n\nexport type EnsureOpenClawRenewalPrerequisitesOptions = {\n homeDir?: string;\n /** Skip all OpenClaw mutations (tests). */\n disabled?: boolean;\n};\n\n/**\n * Apply the Mnemospark Renewal Agent Runbook (install/update / plugin load):\n * - `agents.list` entry via `openclaw config set` + `openclaw config validate`\n * - `~/.openclaw/exec-approvals.json` merge for the node binary\n *\n * Gateway restart is not performed here; OpenClaw restarts the gateway when a plugin is installed or updated.\n */\nexport async function ensureOpenClawRenewalPrerequisites(\n options: EnsureOpenClawRenewalPrerequisitesOptions = {},\n): Promise<void> {\n if (options.disabled ?? process.env.MNEMOSPARK_DISABLE_OPENCLAW_PREREQ === \"1\") {\n return;\n }\n\n const homeDir = options.homeDir ?? homedir();\n const agentId = getRenewalAgentId();\n const desired = runbookRenewalAgentEntry(agentId);\n const nodeBinary = getRenewalNodeBinary();\n\n const configPath = await resolveOpenClawConfigFilePath(homeDir);\n let configRaw = \"{}\";\n try {\n configRaw = await readFile(configPath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw err;\n }\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(configRaw) as Record<string, unknown>;\n } catch {\n throw new Error(\n `openclaw.json at ${configPath} is not valid JSON; fix or remove it before applying renewal prerequisites.`,\n );\n }\n\n const agents = (isRecord(parsed.agents) ? parsed.agents : {}) as Record<string, unknown>;\n const { list: mergedList, changed: agentChanged } = mergeRenewalAgentIntoAgentsList(\n agents.list,\n desired,\n );\n\n if (agentChanged) {\n const listJson = JSON.stringify(mergedList);\n await runOpenClawCli([\"config\", \"set\", \"agents.list\", listJson, \"--strict-json\"], homeDir);\n await runOpenClawCli([\"config\", \"validate\"], homeDir);\n }\n\n const execPath = join(homeDir, \".openclaw\", \"exec-approvals.json\");\n let execDoc: ExecApprovalsDoc = {};\n try {\n const raw = await readJsonFile(execPath);\n execDoc = isRecord(raw) ? (raw as ExecApprovalsDoc) : {};\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw err;\n }\n }\n\n const { doc: mergedExec, changed: execChanged } = mergeExecApprovalsAllowlist(\n execDoc,\n agentId,\n nodeBinary,\n );\n if (execChanged) {\n await writeFileAtomic(execPath, `${JSON.stringify(mergedExec, null, 2)}\\n`);\n }\n}\n","/**\n * Retry Logic for mnemospark\n *\n * Provides fetch wrapper with exponential backoff for transient errors.\n * Retries on 429 (rate limit), 502, 503, 504 (server errors).\n */\n\n/** Configuration for retry behavior */\nexport type RetryConfig = {\n /** Maximum number of retries (default: 2) */\n maxRetries: number;\n /** Base delay in ms for exponential backoff (default: 500) */\n baseDelayMs: number;\n /** HTTP status codes that trigger a retry (default: [429, 502, 503, 504]) */\n retryableCodes: number[];\n};\n\n/** Default retry configuration */\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 2,\n baseDelayMs: 500,\n retryableCodes: [429, 502, 503, 504],\n};\n\n/** Sleep for a given number of milliseconds */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Wrap a fetch-like function with retry logic and exponential backoff.\n *\n * @param fetchFn - The fetch function to wrap (can be standard fetch or x402 payFetch)\n * @param url - URL to fetch\n * @param init - Fetch init options\n * @param config - Retry configuration (optional, uses defaults)\n * @returns Response from successful fetch or last failed attempt\n *\n * @example\n * ```typescript\n * const response = await fetchWithRetry(\n * fetch,\n * \"https://api.example.com/endpoint\",\n * { method: \"POST\", body: JSON.stringify(data) },\n * { maxRetries: 3 }\n * );\n * ```\n */\nexport async function fetchWithRetry(\n fetchFn: (url: string, init?: RequestInit) => Promise<Response>,\n url: string,\n init?: RequestInit,\n config?: Partial<RetryConfig>,\n): Promise<Response> {\n const cfg: RetryConfig = {\n ...DEFAULT_RETRY_CONFIG,\n ...config,\n };\n\n let lastError: Error | undefined;\n let lastResponse: Response | undefined;\n\n for (let attempt = 0; attempt <= cfg.maxRetries; attempt++) {\n try {\n const response = await fetchFn(url, init);\n\n // Success or non-retryable status — return immediately\n if (!cfg.retryableCodes.includes(response.status)) {\n return response;\n }\n\n // Retryable status — save response and maybe retry\n lastResponse = response;\n\n // Check for Retry-After header (common with 429)\n const retryAfter = response.headers.get(\"retry-after\");\n let delay: number;\n\n if (retryAfter) {\n // Retry-After can be seconds or HTTP-date\n const seconds = parseInt(retryAfter, 10);\n delay = isNaN(seconds) ? cfg.baseDelayMs * Math.pow(2, attempt) : seconds * 1000;\n } else {\n delay = cfg.baseDelayMs * Math.pow(2, attempt);\n }\n\n // Only retry if we have attempts left\n if (attempt < cfg.maxRetries) {\n await sleep(delay);\n }\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n // Network errors are retryable\n if (attempt < cfg.maxRetries) {\n const delay = cfg.baseDelayMs * Math.pow(2, attempt);\n await sleep(delay);\n }\n }\n }\n\n // All retries exhausted — return last response or throw last error\n if (lastResponse) {\n return lastResponse;\n }\n\n throw lastError ?? new Error(\"Max retries exceeded\");\n}\n\n/**\n * Check if an error or response indicates a retryable condition.\n */\nexport function isRetryable(\n errorOrResponse: Error | Response,\n config?: Partial<RetryConfig>,\n): boolean {\n const retryableCodes = config?.retryableCodes ?? DEFAULT_RETRY_CONFIG.retryableCodes;\n\n if (errorOrResponse instanceof Response) {\n return retryableCodes.includes(errorOrResponse.status);\n }\n\n // Network errors are generally retryable\n const message = errorOrResponse.message.toLowerCase();\n return (\n message.includes(\"network\") ||\n message.includes(\"timeout\") ||\n message.includes(\"econnreset\") ||\n message.includes(\"econnrefused\") ||\n message.includes(\"socket hang up\")\n );\n}\n","/**\n * mnemospark plugin entrypoint.\n *\n * This plugin provides wallet and cloud storage commands and starts a local\n * proxy that forwards mnemospark backend storage endpoints.\n */\n\nimport type { OpenClawPluginDefinition, OpenClawPluginApi, PluginCommandContext } from \"./types.js\";\nimport { startProxy } from \"./proxy.js\";\nimport { resolveOrGenerateWalletKey } from \"./auth.js\";\nimport { BalanceMonitor } from \"./balance.js\";\nimport { VERSION } from \"./version.js\";\nimport { runMnemosparkSlashHandler } from \"./mnemospark-handler.js\";\nimport { ensureOpenClawRenewalPrerequisites } from \"./openclaw-renewal-runbook.js\";\n\n/**\n * Detect if we're running in shell completion mode.\n * In completion mode, avoid side effects and logging.\n */\nfunction isCompletionMode(): boolean {\n const args = process.argv;\n return args.some((arg, i) => arg === \"completion\" && i >= 1 && i <= 3);\n}\n\n/**\n * Detect if we're running in gateway mode.\n * The proxy should only start when the gateway is running.\n */\nfunction isGatewayMode(): boolean {\n const args = process.argv;\n return args.includes(\"gateway\");\n}\n\n// Store active proxy handle for cleanup on gateway_stop\nlet activeProxyHandle: Awaited<ReturnType<typeof startProxy>> | null = null;\n\n/**\n * Start the proxy in the background.\n * Called from register() in gateway mode.\n */\nasync function startProxyInBackground(api: OpenClawPluginApi): Promise<void> {\n const { key: walletKey, address, source } = await resolveOrGenerateWalletKey();\n\n if (source === \"generated\") {\n api.logger.info(`Generated new wallet: ${address}`);\n } else if (source === \"saved\") {\n api.logger.info(`Using saved wallet: ${address}`);\n } else {\n api.logger.info(`Using wallet from MNEMOSPARK_WALLET_KEY: ${address}`);\n }\n\n const proxy = await startProxy({\n walletKey,\n onReady: (port) => {\n api.logger.info(`mnemospark proxy listening on port ${port}`);\n },\n onError: (error) => {\n api.logger.error(`mnemospark proxy error: ${error.message}`);\n },\n onLowBalance: (info) => {\n api.logger.warn(`[!] Low balance: ${info.balanceUSD}. Fund wallet: ${info.walletAddress}`);\n },\n onInsufficientFunds: (info) => {\n api.logger.error(\n `[!] Insufficient funds. Balance: ${info.balanceUSD}, Needed: ${info.requiredUSD}. Fund wallet: ${info.walletAddress}`,\n );\n },\n });\n\n activeProxyHandle = proxy;\n api.logger.info(\"mnemospark ready\");\n\n // Non-blocking startup balance check\n const startupMonitor = new BalanceMonitor(address);\n startupMonitor\n .checkBalance()\n .then((balance) => {\n if (balance.isEmpty) {\n api.logger.info(`Wallet: ${address} | Balance: $0.00`);\n } else if (balance.isLow) {\n api.logger.info(`Wallet: ${address} | Balance: ${balance.balanceUSD} (low)`);\n } else {\n api.logger.info(`Wallet: ${address} | Balance: ${balance.balanceUSD}`);\n }\n })\n .catch(() => {\n api.logger.info(`Wallet: ${address} | Balance: (checking...)`);\n });\n}\n\nconst plugin: OpenClawPluginDefinition = {\n id: \"mnemospark\",\n name: \"mnemospark\",\n description: \"mnemospark storage and wallet plugin\",\n version: VERSION,\n\n async register(api: OpenClawPluginApi) {\n const isDisabled =\n process.env.MNEMOSPARK_DISABLED === \"true\" || process.env.MNEMOSPARK_DISABLED === \"1\";\n if (isDisabled) {\n api.logger.info(\"mnemospark disabled (MNEMOSPARK_DISABLED=true).\");\n return;\n }\n\n if (isCompletionMode()) {\n return;\n }\n\n try {\n await ensureOpenClawRenewalPrerequisites();\n } catch (err) {\n api.logger.warn(\n `mnemospark renewal prerequisites: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n try {\n api.registerCommand({\n name: \"mnemospark\",\n nativeNames: {\n default: \"mnemospark\",\n },\n description: \"mnemospark wallet and cloud storage commands\",\n acceptsArgs: true,\n requireAuth: true,\n handler: async (ctx: PluginCommandContext) => {\n try {\n return await runMnemosparkSlashHandler(ctx);\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : typeof err === \"string\"\n ? err\n : \"An unexpected error occurred\";\n return { text: message.trim() || \"An unexpected error occurred\", isError: true };\n }\n },\n });\n } catch (err) {\n api.logger.warn(\n `Failed to register /mnemospark command: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Register service for cleanup on gateway shutdown.\n api.registerService({\n id: \"mnemospark-proxy\",\n start: () => {\n // No-op: proxy starts below in non-blocking mode.\n },\n stop: async () => {\n if (activeProxyHandle) {\n try {\n await activeProxyHandle.close();\n api.logger.info(\"mnemospark proxy closed\");\n } catch (err) {\n api.logger.warn(\n `Error closing proxy: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n activeProxyHandle = null;\n }\n }\n },\n });\n\n // Proxy only runs in gateway mode.\n if (!isGatewayMode()) {\n return;\n }\n\n startProxyInBackground(api).catch((err) => {\n api.logger.error(\n `Failed to start mnemospark proxy: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n },\n};\n\nexport default plugin;\n\n// Re-export for programmatic use\nexport { startProxy, getProxyPort } from \"./proxy.js\";\nexport type { ProxyOptions, ProxyHandle, LowBalanceInfo, InsufficientFundsInfo } from \"./proxy.js\";\nexport { PaymentCache } from \"./payment-cache.js\";\nexport type { CachedPaymentParams } from \"./payment-cache.js\";\nexport { createPaymentFetch } from \"./x402.js\";\nexport type { PreAuthParams, PaymentFetchResult } from \"./x402.js\";\nexport { BalanceMonitor, BALANCE_THRESHOLDS } from \"./balance.js\";\nexport type { BalanceInfo, SufficiencyResult } from \"./balance.js\";\nexport {\n InsufficientFundsError,\n EmptyWalletError,\n RpcError,\n isInsufficientFundsError,\n isEmptyWalletError,\n isBalanceError,\n isRpcError,\n} from \"./errors.js\";\nexport { fetchWithRetry, isRetryable, DEFAULT_RETRY_CONFIG } from \"./retry.js\";\nexport type { RetryConfig } from \"./retry.js\";\nexport { createCloudCommand } from \"./cloud-command.js\";\nexport {\n ensureOpenClawRenewalPrerequisites,\n getRenewalAgentId,\n getRenewalNodeBinary,\n} from \"./openclaw-renewal-runbook.js\";\nexport type { EnsureOpenClawRenewalPrerequisitesOptions } from \"./openclaw-renewal-runbook.js\";\nexport { runMnemosparkSlashHandler } from \"./mnemospark-handler.js\";\n"],"mappings":"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","names":["homedir","join","privateKeyToAccount","response","resolve","signTypedData","privateKeyToAccount","BASE_SEPOLIA_CHAIN_ID","encodeBase64Json","signTypedData","privateKeyToAccount","response","paymentHeader","join","segment","join","bucket","key","sizeBytes","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","privateKeyToAccount","spawn","createHash","randomUUID","createReadStream","createWriteStream","mkdir","readFile","readdir","stat","writeFile","homedir","basename","dirname","join","resolve","privateKeyToAccount","w","header","prose","fence","randomUUID","mkdir","createRequire","homedir","dirname","join","require","dupErr","join","mkdir","readFile","rename","writeFile","homedir","dirname","join","randomUUID","readFile","mkdir","dirname","join","randomUUID","writeFile","rename","homedir","join","homedir","readdir","dirname","basename","spawn","createHash","createReadStream","stat","resolve","mkdir","randomUUID","readFile","createWriteStream","writeFile","payloadHash","payload","parsedRequest","requestPaymentSettleViaProxy","privateKeyToAccount","privateKeyToAccount","resolve"]}
|