@xerg/cli 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/command-display.ts","../src/commands/audit.ts","../../core/src/cursor/usage-csv.ts","../../core/src/utils/hash.ts","../../core/src/utils/time.ts","../../core/src/db/client.ts","../../core/src/db/schema.ts","../../core/src/db/persist.ts","../../core/src/report/comparison.ts","../../core/src/db/read.ts","../../core/src/findings/cursor.ts","../../core/src/findings/engine.ts","../../core/src/pricing-catalog.ts","../../core/src/recommendations.ts","../../core/src/report/timeseries.ts","../../core/src/report/summary.ts","../../core/src/runtime.ts","../../core/src/detect/hermes.ts","../../core/src/normalize/hermes.ts","../../core/src/utils/records.ts","../../core/src/utils/paths.ts","../../core/src/detect/shared.ts","../../core/src/detect/openclaw.ts","../../core/src/normalize/openclaw.ts","../../core/src/audit.ts","../../core/src/report/render.ts","../../schemas/dist/index.js","../../core/src/wire.ts","../src/errors.ts","../src/log.ts","../src/push/client.ts","../src/push/config.ts","../src/auth/credentials.ts","../src/source-meta.ts","../src/transport/ssh.ts","../src/transport/railway.ts","../src/transport/config.ts","../src/version.ts","../src/commands/login.ts","../src/cloud.ts","../src/prompts.ts","../src/commands/push.ts","../src/commands/connect.ts","../src/commands/doctor.ts","../src/commands/mcp-setup.ts","../src/commands/init.ts","../src/commands/logout.ts","../src/help.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { styleText } from 'node:util';\n\nimport { formatCommand, resolveCommandDisplay } from './command-display.js';\nimport { runAuditCommand } from './commands/audit.js';\nimport { runConnectCommand } from './commands/connect.js';\nimport { runDoctorCommand } from './commands/doctor.js';\nimport { runInitCommand } from './commands/init.js';\nimport { runLoginCommand } from './commands/login.js';\nimport { runLogoutCommand } from './commands/logout.js';\nimport { runMcpSetupCommand } from './commands/mcp-setup.js';\nimport { runPushCommand } from './commands/push.js';\nimport { NoDataError } from './errors.js';\nimport {\n renderAuditHelp,\n renderConnectHelp,\n renderDoctorHelp,\n renderInitHelp,\n renderMcpSetupHelp,\n renderPushHelp,\n renderRootHelp,\n} from './help.js';\nimport { getCliVersion } from './version.js';\n\ntype AuditCliOptions = {\n runtime?: 'openclaw' | 'hermes';\n logFile?: string;\n sessionsDir?: string;\n cursorUsageCsv?: string;\n since?: string;\n compare?: boolean;\n json?: boolean;\n markdown?: boolean;\n db?: string;\n noDb?: boolean;\n remote?: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n remoteConfig?: string;\n keepRemoteFiles?: boolean;\n railway?: boolean;\n railwayProject?: string;\n railwayEnvironment?: string;\n railwayService?: string;\n push?: boolean;\n dryRun?: boolean;\n failAboveWasteRate?: number;\n failAboveWasteUsd?: number;\n verbose?: boolean;\n};\n\ntype PushCliOptions = {\n file?: string;\n dryRun?: boolean;\n};\n\ntype DoctorCliOptions = {\n runtime?: 'openclaw' | 'hermes';\n logFile?: string;\n sessionsDir?: string;\n cursorUsageCsv?: string;\n remote?: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n railway?: boolean;\n railwayProject?: string;\n railwayEnvironment?: string;\n railwayService?: string;\n verbose?: boolean;\n};\n\nconst VERSION = getCliVersion();\nconst argv = process.argv.slice(2);\nconst commandDisplay = resolveCommandDisplay();\n\nconst command = argv[0];\n\nif (!command || command === '--help' || command === '-h' || command === 'help') {\n process.stdout.write(renderRootHelp(VERSION, commandDisplay));\n process.exit(0);\n}\n\nif (command === '--version' || command === '-v' || command === 'version') {\n process.stdout.write(`${VERSION}\\n`);\n process.exit(0);\n}\n\nrun().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : 'Unknown error';\n process.stderr.write(`${colorError(`${commandDisplay.name} failed: ${message}`)}\\n`);\n process.exitCode = error instanceof NoDataError ? 2 : 1;\n});\n\nasync function run() {\n if (command === 'audit') {\n const options = parseAuditOptions(argv.slice(1));\n if (options.json && options.markdown) {\n throw new Error('Use either --json or --markdown, not both.');\n }\n\n await runAuditCommand({\n ...options,\n commandPrefix: commandDisplay.prefix,\n });\n return;\n }\n\n if (command === 'init') {\n parseBareCommandOptions(argv.slice(1), renderInitHelp(commandDisplay.prefix), 'init');\n await runInitCommand();\n return;\n }\n\n if (command === 'doctor') {\n const options = parseDoctorOptions(argv.slice(1));\n await runDoctorCommand({\n ...options,\n commandPrefix: commandDisplay.prefix,\n });\n return;\n }\n\n if (command === 'push') {\n const options = parsePushOptions(argv.slice(1));\n await runPushCommand(options);\n return;\n }\n\n if (command === 'connect') {\n parseBareCommandOptions(argv.slice(1), renderConnectHelp(commandDisplay.prefix), 'connect');\n await runConnectCommand();\n return;\n }\n\n if (command === 'login') {\n await runLoginCommand();\n return;\n }\n\n if (command === 'logout') {\n runLogoutCommand();\n return;\n }\n\n if (command === 'mcp-setup') {\n parseBareCommandOptions(argv.slice(1), renderMcpSetupHelp(commandDisplay.prefix), 'mcp-setup');\n await runMcpSetupCommand();\n return;\n }\n\n throw new Error(\n `Unknown command \"${command}\". Run \\`${formatCommand('--help', commandDisplay.prefix)}\\` to see available commands.`,\n );\n}\n\nfunction parseBareCommandOptions(raw: string[], helpText: string, commandName: string) {\n const argv = expandEqualsArgs(raw);\n\n for (const arg of argv) {\n switch (arg) {\n case '--help':\n case '-h':\n process.stdout.write(helpText);\n process.exit(0);\n break;\n default:\n throw new Error(\n `Unknown ${commandName} option \"${arg}\". Run \\`${formatCommand([commandName, '--help'], commandDisplay.prefix)}\\` for usage.`,\n );\n }\n }\n}\n\nfunction parseAuditOptions(raw: string[]) {\n const argv = expandEqualsArgs(raw);\n const options: AuditCliOptions = {};\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n\n switch (arg) {\n case '--help':\n case '-h':\n process.stdout.write(renderAuditHelp(commandDisplay.prefix));\n process.exit(0);\n break;\n case '--log-file':\n options.logFile = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--runtime':\n options.runtime = readValue(arg, argv[index + 1]) as AuditCliOptions['runtime'];\n index += 1;\n break;\n case '--sessions-dir':\n options.sessionsDir = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--cursor-usage-csv':\n options.cursorUsageCsv = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--since':\n options.since = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--db':\n options.db = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--compare':\n options.compare = true;\n break;\n case '--json':\n options.json = true;\n break;\n case '--markdown':\n options.markdown = true;\n break;\n case '--no-db':\n options.noDb = true;\n break;\n case '--remote':\n options.remote = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote-log-file':\n options.remoteLogFile = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote-sessions-dir':\n options.remoteSessionsDir = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote-config':\n options.remoteConfig = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--keep-remote-files':\n options.keepRemoteFiles = true;\n break;\n case '--railway':\n options.railway = true;\n break;\n case '--project':\n options.railwayProject = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--environment':\n options.railwayEnvironment = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--service':\n options.railwayService = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--push':\n options.push = true;\n break;\n case '--dry-run':\n options.dryRun = true;\n break;\n case '--verbose':\n options.verbose = true;\n break;\n case '--fail-above-waste-rate':\n options.failAboveWasteRate = readFloat(arg, argv[index + 1]);\n index += 1;\n break;\n case '--fail-above-waste-usd':\n options.failAboveWasteUsd = readFloat(arg, argv[index + 1]);\n index += 1;\n break;\n default:\n throw new Error(\n `Unknown audit option \"${arg}\". Run \\`${formatCommand(['audit', '--help'], commandDisplay.prefix)}\\` for usage.`,\n );\n }\n }\n\n return options;\n}\n\nfunction parsePushOptions(raw: string[]) {\n const argv = expandEqualsArgs(raw);\n const options: PushCliOptions = {};\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n\n switch (arg) {\n case '--help':\n case '-h':\n process.stdout.write(renderPushHelp(commandDisplay.prefix));\n process.exit(0);\n break;\n case '--file':\n options.file = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--dry-run':\n options.dryRun = true;\n break;\n default:\n throw new Error(\n `Unknown push option \"${arg}\". Run \\`${formatCommand(['push', '--help'], commandDisplay.prefix)}\\` for usage.`,\n );\n }\n }\n\n return options;\n}\n\nfunction parseDoctorOptions(raw: string[]) {\n const argv = expandEqualsArgs(raw);\n const options: DoctorCliOptions = {};\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n\n switch (arg) {\n case '--help':\n case '-h':\n process.stdout.write(renderDoctorHelp(commandDisplay.prefix));\n process.exit(0);\n break;\n case '--log-file':\n options.logFile = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--runtime':\n options.runtime = readValue(arg, argv[index + 1]) as DoctorCliOptions['runtime'];\n index += 1;\n break;\n case '--sessions-dir':\n options.sessionsDir = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--cursor-usage-csv':\n options.cursorUsageCsv = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote':\n options.remote = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote-log-file':\n options.remoteLogFile = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote-sessions-dir':\n options.remoteSessionsDir = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--railway':\n options.railway = true;\n break;\n case '--project':\n options.railwayProject = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--environment':\n options.railwayEnvironment = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--service':\n options.railwayService = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--verbose':\n options.verbose = true;\n break;\n default:\n throw new Error(\n `Unknown doctor option \"${arg}\". Run \\`${formatCommand(['doctor', '--help'], commandDisplay.prefix)}\\` for usage.`,\n );\n }\n }\n\n return options;\n}\n\nfunction expandEqualsArgs(argv: string[]): string[] {\n const result: string[] = [];\n for (const arg of argv) {\n const eqIndex = arg.indexOf('=');\n if (eqIndex > 0 && arg.startsWith('--')) {\n result.push(arg.slice(0, eqIndex), arg.slice(eqIndex + 1));\n } else {\n result.push(arg);\n }\n }\n return result;\n}\n\nfunction readValue(flag: string, value: string | undefined) {\n if (!value || value.startsWith('-')) {\n throw new Error(`The ${flag} flag needs a value.`);\n }\n\n return value;\n}\n\nfunction readFloat(flag: string, value: string | undefined): number {\n const raw = readValue(flag, value);\n const num = Number.parseFloat(raw);\n if (Number.isNaN(num)) {\n throw new Error(`The ${flag} flag requires a numeric value, got \"${raw}\".`);\n }\n return num;\n}\n\nfunction colorError(message: string) {\n return process.stderr.isTTY ? styleText('red', message) : message;\n}\n","const PACKAGE_NAME = '@xerg/cli';\nconst DEFAULT_COMMAND_PREFIX = 'xerg';\n\ntype PackageExecutor = 'npx' | 'pnpm dlx' | 'yarn dlx' | 'bunx';\n\nexport interface CommandDisplay {\n prefix: string;\n name: string;\n}\n\nexport function resolveCommandDisplay(context?: {\n argv?: string[];\n env?: NodeJS.ProcessEnv;\n}): CommandDisplay {\n const runner = detectPackageExecutor(context);\n if (!runner) {\n return {\n prefix: DEFAULT_COMMAND_PREFIX,\n name: DEFAULT_COMMAND_PREFIX,\n };\n }\n\n return {\n prefix: `${runner} ${PACKAGE_NAME}`,\n name: PACKAGE_NAME,\n };\n}\n\nexport function formatCommand(\n command: string | string[],\n commandPrefix = resolveCommandDisplay().prefix,\n): string {\n const suffix = Array.isArray(command) ? command.join(' ') : command;\n return suffix ? `${commandPrefix} ${suffix}` : commandPrefix;\n}\n\nfunction detectPackageExecutor(context?: {\n argv?: string[];\n env?: NodeJS.ProcessEnv;\n}): PackageExecutor | null {\n const env = context?.env ?? process.env;\n const argv = context?.argv ?? process.argv;\n\n const userAgent = normalizeSignal(env.npm_config_user_agent);\n const execPath = normalizeSignal(env.npm_execpath);\n const argvPath = normalizeSignal(argv[1]);\n\n const fromArgvPath = detectRunnerFromArgvPath(argvPath);\n if (fromArgvPath) {\n return fromArgvPath;\n }\n\n if (looksLikeInstalledCli(argvPath)) {\n return null;\n }\n\n const fromUserAgent = detectRunnerFromSignal(userAgent);\n if (fromUserAgent) {\n return fromUserAgent;\n }\n\n const fromExecPath = detectRunnerFromSignal(execPath);\n if (fromExecPath) {\n return fromExecPath;\n }\n\n if (argvPath.includes('/_npx/') || argvPath.includes('\\\\_npx\\\\')) {\n return 'npx';\n }\n\n if (argvPath.includes('/.yarn/') && argvPath.includes('/dlx/')) {\n return 'yarn dlx';\n }\n\n if (argvPath.includes('/bunx/') || argvPath.includes('\\\\bunx\\\\')) {\n return 'bunx';\n }\n\n if (argvPath.includes('/dlx-') || argvPath.includes('\\\\dlx-')) {\n return 'pnpm dlx';\n }\n\n if (userAgent || execPath) {\n return 'npx';\n }\n\n return null;\n}\n\nfunction detectRunnerFromArgvPath(argvPath: string): PackageExecutor | null {\n if (!argvPath) {\n return null;\n }\n\n if (argvPath.includes('/_npx/') || argvPath.includes('\\\\_npx\\\\')) {\n return 'npx';\n }\n\n if (argvPath.includes('/.yarn/') && argvPath.includes('/dlx/')) {\n return 'yarn dlx';\n }\n\n if (argvPath.includes('/bunx/') || argvPath.includes('\\\\bunx\\\\')) {\n return 'bunx';\n }\n\n if (argvPath.includes('/dlx-') || argvPath.includes('\\\\dlx-')) {\n return 'pnpm dlx';\n }\n\n return null;\n}\n\nfunction looksLikeInstalledCli(argvPath: string): boolean {\n if (!argvPath) {\n return false;\n }\n\n const normalized = argvPath.replaceAll('\\\\', '/');\n return (\n normalized.endsWith('/node_modules/.bin/xerg') ||\n normalized.includes('/node_modules/@xerg/cli/dist/index.js') ||\n normalized.endsWith('/bin/xerg')\n );\n}\n\nfunction detectRunnerFromSignal(signal: string): PackageExecutor | null {\n if (!signal) {\n return null;\n }\n\n const tokens = signal.split(/[^a-z0-9]+/).filter(Boolean);\n\n if (tokens.includes('pnpm')) {\n return 'pnpm dlx';\n }\n\n if (tokens.includes('yarn')) {\n return 'yarn dlx';\n }\n\n if (tokens.includes('bun')) {\n return 'bunx';\n }\n\n if (tokens.includes('npm')) {\n return 'npx';\n }\n\n return null;\n}\n\nfunction normalizeSignal(value: string | undefined): string {\n return value?.trim().toLowerCase() ?? '';\n}\n","import { rmSync } from 'node:fs';\nimport {\n auditAgentRuntime,\n auditCursorUsageCsv,\n renderMarkdownSummary,\n renderTerminalSummary,\n toWirePayload,\n} from '@xergai/core';\nimport type { AuditSummary, WirePayloadMeta } from '@xergai/core';\n\nimport { NoDataError } from '../errors.js';\nimport { createCliLogger } from '../log.js';\nimport { loadPushConfig, pushAudit } from '../push/index.js';\nimport { buildLocalPushSourceMeta, buildRemotePushSourceMeta } from '../source-meta.js';\nimport {\n buildComparisonKeyForRailway,\n buildComparisonKeyForRemote,\n buildRailwaySourceFromFlags,\n buildSourceFromFlags,\n loadRemoteConfig,\n pullRemoteFiles,\n pullRemoteFilesRailway,\n} from '../transport/index.js';\nimport type { PullResult, RailwayTarget, RemoteSource } from '../transport/index.js';\nimport { getCliVersion } from '../version.js';\n\nexport interface AuditCommandOptions {\n runtime?: 'openclaw' | 'hermes';\n logFile?: string;\n sessionsDir?: string;\n cursorUsageCsv?: string;\n since?: string;\n compare?: boolean;\n json?: boolean;\n markdown?: boolean;\n db?: string;\n noDb?: boolean;\n remote?: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n remoteConfig?: string;\n keepRemoteFiles?: boolean;\n railway?: boolean;\n railwayProject?: string;\n railwayEnvironment?: string;\n railwayService?: string;\n push?: boolean;\n dryRun?: boolean;\n failAboveWasteRate?: number;\n failAboveWasteUsd?: number;\n verbose?: boolean;\n commandPrefix?: string;\n}\n\nconst NO_DATA_PATTERN = /no (openclaw|hermes|supported local runtime) sources? were detected/i;\n\nasync function auditOrNoData(\n ...args: Parameters<typeof auditAgentRuntime>\n): ReturnType<typeof auditAgentRuntime> {\n try {\n return await auditAgentRuntime(...args);\n } catch (err) {\n if (err instanceof Error && NO_DATA_PATTERN.test(err.message)) {\n throw new NoDataError(err.message);\n }\n throw err;\n }\n}\n\nexport async function runAuditCommand(options: AuditCommandOptions) {\n const logger = createCliLogger({ verbose: options.verbose });\n\n if (options.dryRun && !options.push) {\n throw new Error('--dry-run requires --push.');\n }\n\n validateRuntimeOption(options.runtime);\n validateCursorUsageCsvOptions(options);\n validateHermesLocalOnly(options);\n\n const remoteFlags = [options.remote, options.remoteConfig, options.railway].filter(\n Boolean,\n ).length;\n if (remoteFlags > 1) {\n throw new Error('Use only one of --remote, --remote-config, or --railway.');\n }\n\n if (!options.remote && !options.remoteConfig && !options.railway) {\n return runLocalAudit(options, logger);\n }\n\n if (options.railway) {\n const railwayTarget = buildRailwayTarget(options);\n const source = buildRailwaySourceFromFlags({\n railway: railwayTarget,\n remoteLogFile: options.remoteLogFile,\n remoteSessionsDir: options.remoteSessionsDir,\n });\n return runSingleRemoteAudit(source, options, logger);\n }\n\n if (options.remoteConfig) {\n const sources = loadRemoteConfig(options.remoteConfig);\n if (sources.length === 1) {\n return runSingleRemoteAudit(sources[0], options, logger);\n }\n return runMultiRemoteAudit(sources, options, logger);\n }\n\n const remote = options.remote as string;\n const source = buildSourceFromFlags({\n remote,\n remoteLogFile: options.remoteLogFile,\n remoteSessionsDir: options.remoteSessionsDir,\n });\n return runSingleRemoteAudit(source, options, logger);\n}\n\nfunction buildRailwayTarget(options: AuditCommandOptions): RailwayTarget | undefined {\n if (options.railwayProject && options.railwayEnvironment && options.railwayService) {\n return {\n projectId: options.railwayProject,\n environmentId: options.railwayEnvironment,\n serviceId: options.railwayService,\n };\n }\n return undefined;\n}\n\nasync function runLocalAudit(\n options: AuditCommandOptions,\n logger: ReturnType<typeof createCliLogger>,\n) {\n if (options.cursorUsageCsv) {\n logger.verbose('Running a local Cursor usage CSV audit.');\n logger.verbose(`Using Cursor usage CSV: ${options.cursorUsageCsv}`);\n\n const summary = await auditCursorUsageCsv({\n cursorUsageCsv: options.cursorUsageCsv,\n since: options.since,\n compare: options.compare,\n dbPath: options.db,\n noDb: options.noDb,\n commandPrefix: options.commandPrefix,\n onProgress: logger.verbose,\n });\n\n renderOutput(summary, options);\n\n if (options.push) {\n const meta = buildMeta(buildLocalPushSourceMeta('cursor'));\n await handlePush(summary, meta, options);\n }\n\n checkThresholds(summary, options);\n return;\n }\n\n logger.verbose(\n options.runtime\n ? `Running a local ${options.runtime === 'hermes' ? 'Hermes' : 'OpenClaw'} audit.`\n : 'Running a local runtime audit with auto-detection.',\n );\n if (options.logFile) {\n logger.verbose(`Using explicit local log file: ${options.logFile}`);\n }\n if (options.sessionsDir) {\n logger.verbose(`Using explicit local sessions directory: ${options.sessionsDir}`);\n }\n\n const summary = await auditOrNoData({\n runtime: options.runtime ?? 'auto',\n logFile: options.logFile,\n sessionsDir: options.sessionsDir,\n since: options.since,\n compare: options.compare,\n dbPath: options.db,\n noDb: options.noDb,\n commandPrefix: options.commandPrefix,\n onProgress: logger.verbose,\n });\n\n renderOutput(summary, options);\n\n if (options.push) {\n const meta = buildMeta(buildLocalPushSourceMeta(summary.runtime));\n await handlePush(summary, meta, options);\n }\n\n checkThresholds(summary, options);\n}\n\nfunction validateRuntimeOption(runtime?: AuditCommandOptions['runtime']) {\n if (!runtime) {\n return;\n }\n\n if (runtime !== 'openclaw' && runtime !== 'hermes') {\n throw new Error(\n `Unsupported runtime \"${runtime}\". Use --runtime openclaw or --runtime hermes.`,\n );\n }\n}\n\nfunction validateCursorUsageCsvOptions(options: AuditCommandOptions) {\n if (!options.cursorUsageCsv) {\n return;\n }\n\n const conflicts = [\n options.runtime ? '--runtime' : null,\n options.logFile ? '--log-file' : null,\n options.sessionsDir ? '--sessions-dir' : null,\n options.remote ? '--remote' : null,\n options.remoteLogFile ? '--remote-log-file' : null,\n options.remoteSessionsDir ? '--remote-sessions-dir' : null,\n options.remoteConfig ? '--remote-config' : null,\n options.keepRemoteFiles ? '--keep-remote-files' : null,\n options.railway ? '--railway' : null,\n options.railwayProject ? '--project' : null,\n options.railwayEnvironment ? '--environment' : null,\n options.railwayService ? '--service' : null,\n ].filter((flag): flag is string => flag !== null);\n\n if (conflicts.length > 0) {\n throw new Error(`The --cursor-usage-csv flag cannot be combined with ${conflicts.join(', ')}.`);\n }\n}\n\nfunction validateHermesLocalOnly(options: AuditCommandOptions) {\n if (options.runtime !== 'hermes') {\n return;\n }\n\n const conflicts = [\n options.remote ? '--remote' : null,\n options.remoteLogFile ? '--remote-log-file' : null,\n options.remoteSessionsDir ? '--remote-sessions-dir' : null,\n options.remoteConfig ? '--remote-config' : null,\n options.keepRemoteFiles ? '--keep-remote-files' : null,\n options.railway ? '--railway' : null,\n options.railwayProject ? '--project' : null,\n options.railwayEnvironment ? '--environment' : null,\n options.railwayService ? '--service' : null,\n ].filter((flag): flag is string => flag !== null);\n\n if (conflicts.length > 0) {\n throw new Error(\n `Hermes remote transport is not supported yet. Remove ${conflicts.join(', ')} or switch to --runtime openclaw.`,\n );\n }\n}\n\nfunction getComparisonKey(source: RemoteSource): string {\n if (source.transport === 'railway') {\n return buildComparisonKeyForRailway(source);\n }\n return buildComparisonKeyForRemote(source);\n}\n\nfunction pullFiles(\n source: RemoteSource,\n since?: string,\n keepFiles?: boolean,\n onProgress?: (message: string) => void,\n): Promise<PullResult> {\n if (source.transport === 'railway') {\n return pullRemoteFilesRailway({ source, since, keepFiles, onProgress });\n }\n return pullRemoteFiles({ source, since, keepFiles, onProgress });\n}\n\nfunction describeSource(source: RemoteSource): string {\n if (source.transport === 'railway') {\n return source.railway\n ? `${source.name} (Railway service ${source.railway.serviceId.slice(0, 8)})`\n : `${source.name} (Railway linked project)`;\n }\n return source.host;\n}\n\nasync function runSingleRemoteAudit(\n source: RemoteSource,\n options: AuditCommandOptions,\n logger: ReturnType<typeof createCliLogger>,\n) {\n logger.info(`Pulling files from ${describeSource(source)}...`);\n\n const pullResult = await pullFiles(\n source,\n options.since,\n options.keepRemoteFiles,\n logger.verbose,\n );\n logger.verbose(`Files staged at ${pullResult.localPath}.`);\n\n try {\n const comparisonKeyOverride = getComparisonKey(source);\n const summary = await auditOrNoData({\n runtime: 'openclaw',\n logFile: pullResult.logFile,\n sessionsDir: pullResult.sessionsDir,\n since: options.since,\n compare: options.compare,\n dbPath: options.db,\n noDb: options.noDb,\n comparisonKeyOverride,\n commandPrefix: options.commandPrefix,\n onProgress: logger.verbose,\n });\n\n renderOutput(summary, options);\n\n if (options.push) {\n const meta = buildMeta(buildRemotePushSourceMeta(source));\n await handlePush(summary, meta, options);\n }\n\n checkThresholds(summary, options);\n } finally {\n cleanupPullResult(pullResult, options.keepRemoteFiles);\n }\n}\n\nasync function runMultiRemoteAudit(\n sources: RemoteSource[],\n options: AuditCommandOptions,\n logger: ReturnType<typeof createCliLogger>,\n) {\n const results: { source: RemoteSource; pullResult: PullResult }[] = [];\n const errors: { source: RemoteSource; error: string }[] = [];\n\n for (const source of sources) {\n logger.info(`Pulling files from ${source.name} (${describeSource(source)})...`);\n try {\n const pullResult = await pullFiles(\n source,\n options.since,\n options.keepRemoteFiles,\n logger.verbose,\n );\n results.push({ source, pullResult });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n errors.push({ source, error: message });\n process.stderr.write(` Warning: ${message}\\n`);\n }\n }\n\n if (results.length === 0) {\n const errorMessages = errors.map((e) => ` ${e.source.name}: ${e.error}`).join('\\n');\n throw new Error(`No sources could be pulled:\\n${errorMessages}`);\n }\n\n try {\n const summaries: { name: string; source: RemoteSource; summary: AuditSummary }[] = [];\n for (const { source, pullResult } of results) {\n const comparisonKeyOverride = getComparisonKey(source);\n const summary = await auditOrNoData({\n runtime: 'openclaw',\n logFile: pullResult.logFile,\n sessionsDir: pullResult.sessionsDir,\n since: options.since,\n compare: options.compare,\n dbPath: options.db,\n noDb: options.noDb,\n comparisonKeyOverride,\n commandPrefix: options.commandPrefix,\n onProgress: logger.verbose,\n });\n summaries.push({ name: source.name, source, summary });\n }\n\n if (options.json) {\n const output =\n summaries.length === 1\n ? summaries[0].summary\n : {\n sources: summaries.map((s) => ({\n name: s.name,\n ...s.summary,\n })),\n };\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`);\n } else {\n for (const { name, summary } of summaries) {\n if (summaries.length > 1) {\n process.stdout.write(`\\n${'═'.repeat(60)}\\n Source: ${name}\\n${'═'.repeat(60)}\\n\\n`);\n }\n\n if (options.markdown) {\n process.stdout.write(`${renderMarkdownSummary(summary)}\\n`);\n } else {\n process.stdout.write(`${renderTerminalSummary(summary)}\\n`);\n }\n }\n }\n\n if (errors.length > 0) {\n process.stderr.write('\\nSources that could not be reached:\\n');\n for (const { source, error } of errors) {\n process.stderr.write(` ${source.name}: ${error}\\n`);\n }\n }\n\n if (options.push) {\n for (const { source, summary } of summaries) {\n const meta = buildMeta(buildRemotePushSourceMeta(source));\n await handlePush(summary, meta, options);\n }\n }\n\n for (const { summary } of summaries) {\n checkThresholds(summary, options);\n }\n } finally {\n for (const { pullResult } of results) {\n cleanupPullResult(pullResult, options.keepRemoteFiles);\n }\n }\n}\n\nfunction buildMeta(input: {\n environment: WirePayloadMeta['environment'];\n sourceId: string;\n sourceHost: string;\n}): WirePayloadMeta {\n return {\n cliVersion: getCliVersion(),\n sourceId: input.sourceId,\n sourceHost: input.sourceHost,\n environment: input.environment,\n };\n}\n\nasync function handlePush(\n summary: AuditSummary,\n meta: WirePayloadMeta,\n options: AuditCommandOptions,\n) {\n const payload = toWirePayload(summary, meta);\n\n if (options.dryRun) {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n return;\n }\n\n const config = loadPushConfig();\n process.stderr.write(`Pushing audit ${summary.auditId} to ${config.apiUrl}...\\n`);\n\n const result = await pushAudit(payload, config);\n\n if (result.ok) {\n process.stderr.write(`Pushed successfully (audit: ${result.auditId}).\\n`);\n } else {\n const statusInfo = result.status > 0 ? ` (HTTP ${result.status})` : '';\n throw new Error(`Push failed${statusInfo}: ${result.message}`);\n }\n}\n\nfunction renderOutput(summary: AuditSummary, options: AuditCommandOptions) {\n if (options.push && options.dryRun) {\n return;\n }\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify(summary, null, 2)}\\n`);\n return;\n }\n\n if (options.markdown) {\n process.stdout.write(`${renderMarkdownSummary(summary)}\\n`);\n return;\n }\n\n process.stdout.write(`${renderTerminalSummary(summary)}\\n`);\n}\n\nfunction checkThresholds(summary: AuditSummary, options: AuditCommandOptions) {\n const breaches: string[] = [];\n\n if (\n options.failAboveWasteRate !== undefined &&\n summary.structuralWasteRate > options.failAboveWasteRate\n ) {\n breaches.push(\n `Structural waste rate ${(summary.structuralWasteRate * 100).toFixed(1)}% exceeds threshold ${(options.failAboveWasteRate * 100).toFixed(1)}%`,\n );\n }\n\n if (\n options.failAboveWasteUsd !== undefined &&\n summary.wasteSpendUsd > options.failAboveWasteUsd\n ) {\n breaches.push(\n `Waste spend $${summary.wasteSpendUsd.toFixed(2)} exceeds threshold $${options.failAboveWasteUsd.toFixed(2)}`,\n );\n }\n\n if (breaches.length > 0) {\n process.stderr.write(`\\nThreshold exceeded:\\n${breaches.map((b) => ` ${b}`).join('\\n')}\\n`);\n process.exitCode = 3;\n }\n}\n\nfunction cleanupPullResult(pullResult: PullResult, keepFiles?: boolean) {\n if (keepFiles) return;\n try {\n rmSync(pullResult.localPath, { recursive: true, force: true });\n } catch {\n // best-effort cleanup\n }\n}\n","import { readFileSync, statSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport type {\n AuditOptions,\n CostSource,\n CursorUsageCsvDoctorReport,\n CursorUsageInsights,\n DetectedSourceFile,\n NormalizedCall,\n NormalizedRun,\n PricingCoverage,\n} from '../types.js';\nimport { sha1 } from '../utils/hash.js';\nimport { parseSince } from '../utils/time.js';\n\nconst REQUIRED_HEADERS = [\n 'Date',\n 'Kind',\n 'Model',\n 'Max Mode',\n 'Input (w/ Cache Write)',\n 'Input (w/o Cache Write)',\n 'Cache Read',\n 'Output Tokens',\n 'Total Tokens',\n 'Cost',\n] as const;\n\ntype RequiredHeader = (typeof REQUIRED_HEADERS)[number];\n\ninterface CursorAliasPricing {\n provider: string;\n canonicalModel: string;\n inputPer1m: number;\n outputPer1m: number;\n cacheWritePer1m?: number;\n cachedInputPer1m?: number;\n}\n\ninterface CursorUsageCsvRow {\n timestamp: string;\n kind: string;\n modelAlias: string;\n maxMode: boolean;\n inputWithCacheWriteTokens: number;\n inputWithoutCacheWriteTokens: number;\n cacheReadTokens: number;\n outputTokens: number;\n totalTokens: number;\n costLabel: string;\n observedCostUsd: number | null;\n}\n\ninterface CursorUsageCsvFile {\n source: DetectedSourceFile;\n rows: CursorUsageCsvRow[];\n headers: string[];\n hasObservedCostRows: boolean;\n}\n\ninterface CursorRowCostEstimate {\n costUsd: number;\n costSource: CostSource;\n cacheCostUsd: number | null;\n cacheWriteCostUsd: number | null;\n pricing: CursorAliasPricing | null;\n canonicalModelKey: string;\n}\n\nconst CURSOR_ALIAS_PRICING: Record<string, CursorAliasPricing> = {\n 'claude-4.6-opus-high-thinking': {\n provider: 'anthropic',\n canonicalModel: 'claude-opus-4',\n inputPer1m: 15,\n outputPer1m: 75,\n cacheWritePer1m: 18.75,\n cachedInputPer1m: 1.5,\n },\n 'claude-4.5-sonnet': {\n provider: 'anthropic',\n canonicalModel: 'claude-sonnet-4-5',\n inputPer1m: 3,\n outputPer1m: 15,\n cacheWritePer1m: 3.75,\n cachedInputPer1m: 0.3,\n },\n 'claude-4.5-sonnet-thinking': {\n provider: 'anthropic',\n canonicalModel: 'claude-sonnet-4-5',\n inputPer1m: 3,\n outputPer1m: 15,\n cacheWritePer1m: 3.75,\n cachedInputPer1m: 0.3,\n },\n 'claude-4.5-opus-high-thinking': {\n provider: 'anthropic',\n canonicalModel: 'claude-opus-4-5',\n inputPer1m: 5,\n outputPer1m: 25,\n cacheWritePer1m: 6.25,\n cachedInputPer1m: 0.5,\n },\n 'gpt-5.1-codex': {\n provider: 'openai',\n canonicalModel: 'gpt-5.1-codex',\n inputPer1m: 1.25,\n outputPer1m: 10,\n cacheWritePer1m: 1.25,\n cachedInputPer1m: 0.125,\n },\n 'gpt-5-high-fast': {\n provider: 'openai',\n canonicalModel: 'gpt-5-high-fast',\n inputPer1m: 1.25,\n outputPer1m: 10,\n cacheWritePer1m: 1.25,\n cachedInputPer1m: 0.125,\n },\n 'gpt-5': {\n provider: 'openai',\n canonicalModel: 'gpt-5',\n inputPer1m: 1.25,\n outputPer1m: 10,\n cacheWritePer1m: 1.25,\n cachedInputPer1m: 0.125,\n },\n};\n\nfunction round(value: number) {\n return Number(value.toFixed(6));\n}\n\nfunction parseCsvLine(line: string): string[] {\n const values: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let index = 0; index < line.length; index += 1) {\n const char = line[index];\n\n if (char === '\"') {\n const next = line[index + 1];\n if (inQuotes && next === '\"') {\n current += '\"';\n index += 1;\n } else {\n inQuotes = !inQuotes;\n }\n continue;\n }\n\n if (char === ',' && !inQuotes) {\n values.push(current);\n current = '';\n continue;\n }\n\n current += char;\n }\n\n values.push(current);\n return values.map((value) => value.trim());\n}\n\nfunction parseInteger(raw: string, column: RequiredHeader, rowNumber: number) {\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new Error(`Invalid ${column} value \"${raw}\" on row ${rowNumber}.`);\n }\n\n return parsed;\n}\n\nfunction parseTimestamp(raw: string, rowNumber: number) {\n const parsed = new Date(raw);\n if (Number.isNaN(parsed.getTime())) {\n throw new Error(`Invalid Date value \"${raw}\" on row ${rowNumber}.`);\n }\n\n return parsed.toISOString();\n}\n\nfunction parseMaxMode(raw: string) {\n return raw.trim().toLowerCase() === 'yes';\n}\n\nfunction parseObservedCost(raw: string) {\n const value = raw.trim();\n if (value.length === 0 || value === '-' || value.toLowerCase() === 'included') {\n return null;\n }\n\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction createDetectedSource(path: string): DetectedSourceFile {\n const resolvedPath = resolve(path);\n\n try {\n const stats = statSync(resolvedPath);\n if (!stats.isFile()) {\n throw new Error(`Cursor usage CSV path is not a file: ${resolvedPath}`);\n }\n\n return {\n kind: 'cursor-usage-csv',\n runtime: 'cursor',\n path: resolvedPath,\n sizeBytes: stats.size,\n mtimeMs: stats.mtimeMs,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : `Cursor usage CSV not found: ${path}`;\n throw new Error(message);\n }\n}\n\nfunction validateHeaders(headers: string[]) {\n const missing = REQUIRED_HEADERS.filter((header) => !headers.includes(header));\n if (missing.length > 0) {\n throw new Error(`Cursor usage CSV is missing required headers: ${missing.join(', ')}.`);\n }\n}\n\nfunction parseRow(values: string[], headers: string[], rowNumber: number): CursorUsageCsvRow {\n const record = Object.fromEntries(headers.map((header, index) => [header, values[index] ?? '']));\n const costLabel = record.Cost ?? '';\n\n return {\n timestamp: parseTimestamp(record.Date ?? '', rowNumber),\n kind: record.Kind ?? '',\n modelAlias: record.Model ?? '',\n maxMode: parseMaxMode(record['Max Mode'] ?? ''),\n inputWithCacheWriteTokens: parseInteger(\n record['Input (w/ Cache Write)'] ?? '',\n 'Input (w/ Cache Write)',\n rowNumber,\n ),\n inputWithoutCacheWriteTokens: parseInteger(\n record['Input (w/o Cache Write)'] ?? '',\n 'Input (w/o Cache Write)',\n rowNumber,\n ),\n cacheReadTokens: parseInteger(record['Cache Read'] ?? '', 'Cache Read', rowNumber),\n outputTokens: parseInteger(record['Output Tokens'] ?? '', 'Output Tokens', rowNumber),\n totalTokens: parseInteger(record['Total Tokens'] ?? '', 'Total Tokens', rowNumber),\n costLabel,\n observedCostUsd: parseObservedCost(costLabel),\n };\n}\n\nfunction parseRows(lines: string[], headers: string[]) {\n const rows: CursorUsageCsvRow[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n if (!line.trim()) {\n continue;\n }\n\n rows.push(parseRow(parseCsvLine(line), headers, index + 2));\n }\n\n return rows;\n}\n\nexport function readCursorUsageCsv(path: string): CursorUsageCsvFile {\n const source = createDetectedSource(path);\n const content = readFileSync(source.path, 'utf8');\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (lines.length === 0) {\n throw new Error(`Cursor usage CSV is empty: ${source.path}`);\n }\n\n const headers = parseCsvLine(lines[0]);\n validateHeaders(headers);\n\n const rows = parseRows(lines.slice(1), headers);\n\n return {\n source,\n rows,\n headers,\n hasObservedCostRows: rows.some((row) => row.observedCostUsd !== null),\n };\n}\n\nfunction isErroredNoCharge(kind: string) {\n const normalized = kind.trim().toLowerCase();\n return (\n (normalized.includes('errored') && normalized.includes('no charge')) ||\n normalized.includes('not charged')\n );\n}\n\nfunction inferProvider(modelAlias: string) {\n const normalized = modelAlias.trim().toLowerCase();\n\n if (normalized.startsWith('claude-')) {\n return 'anthropic';\n }\n\n if (normalized.startsWith('gpt-')) {\n return 'openai';\n }\n\n return 'cursor';\n}\n\nfunction buildModelKey(modelAlias: string, pricing: CursorAliasPricing | null) {\n if (pricing) {\n return `${pricing.provider}/${pricing.canonicalModel}`;\n }\n\n return `${inferProvider(modelAlias)}/${modelAlias}`;\n}\n\nfunction getWorkflowKey(row: CursorUsageCsvRow) {\n const kind = row.kind.trim().toLowerCase();\n\n if (kind.includes('on-demand')) {\n return row.maxMode ? 'on-demand / max mode' : 'on-demand / standard mode';\n }\n\n if (kind.includes('included')) {\n return row.maxMode ? 'included / max mode' : 'included / standard mode';\n }\n\n if (kind.includes('error') || kind.includes('not charged')) {\n return 'not charged / failed or aborted';\n }\n\n return row.maxMode ? 'other / max mode' : 'other / standard mode';\n}\n\nfunction estimateCursorRowCost(\n row: CursorUsageCsvRow,\n options: {\n preferObservedCost: boolean;\n },\n): CursorRowCostEstimate {\n const pricing = CURSOR_ALIAS_PRICING[row.modelAlias.trim().toLowerCase()] ?? null;\n\n if (isErroredNoCharge(row.kind)) {\n return {\n costUsd: 0,\n costSource: 'observed',\n cacheCostUsd: 0,\n cacheWriteCostUsd: 0,\n pricing,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n }\n\n if (options.preferObservedCost) {\n if (row.observedCostUsd !== null) {\n const cacheCost =\n row.cacheReadTokens > 0 && pricing?.cachedInputPer1m !== undefined\n ? round((row.cacheReadTokens / 1_000_000) * pricing.cachedInputPer1m)\n : null;\n const cacheWriteCost =\n row.inputWithCacheWriteTokens > 0 && pricing\n ? round(\n (row.inputWithCacheWriteTokens / 1_000_000) *\n (pricing.cacheWritePer1m ?? pricing.inputPer1m),\n )\n : null;\n\n return {\n costUsd: row.observedCostUsd,\n costSource: 'observed',\n cacheCostUsd: cacheCost,\n cacheWriteCostUsd: cacheWriteCost,\n pricing,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n }\n\n return {\n costUsd: 0,\n costSource: 'observed',\n cacheCostUsd: 0,\n cacheWriteCostUsd: 0,\n pricing,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n }\n\n if (!pricing) {\n return {\n costUsd: 0,\n costSource: 'unpriced',\n cacheCostUsd: null,\n cacheWriteCostUsd: null,\n pricing: null,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n }\n\n if (row.cacheReadTokens > 0 && pricing.cachedInputPer1m === undefined) {\n return {\n costUsd: 0,\n costSource: 'unpriced',\n cacheCostUsd: null,\n cacheWriteCostUsd: null,\n pricing: null,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n }\n\n const inputCost = (row.inputWithoutCacheWriteTokens / 1_000_000) * pricing.inputPer1m;\n const cacheWriteCost =\n (row.inputWithCacheWriteTokens / 1_000_000) * (pricing.cacheWritePer1m ?? pricing.inputPer1m);\n const outputCost = (row.outputTokens / 1_000_000) * pricing.outputPer1m;\n const cacheCost =\n row.cacheReadTokens > 0 && pricing.cachedInputPer1m !== undefined\n ? (row.cacheReadTokens / 1_000_000) * pricing.cachedInputPer1m\n : 0;\n\n return {\n costUsd: round(inputCost + cacheWriteCost + outputCost + cacheCost),\n costSource: 'estimated',\n cacheCostUsd: round(cacheCost),\n cacheWriteCostUsd: round(cacheWriteCost),\n pricing,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n}\n\nfunction buildCall(\n row: CursorUsageCsvRow,\n source: DetectedSourceFile,\n runId: string,\n index: number,\n options: {\n preferObservedCost: boolean;\n },\n): { call: NormalizedCall; cost: CursorRowCostEstimate } {\n const cost = estimateCursorRowCost(row, options);\n const totalInputTokens = Math.max(row.totalTokens - row.outputTokens, 0);\n\n return {\n cost,\n call: {\n id: sha1(`${runId}:${source.path}:${index}:${row.modelAlias}:${row.timestamp}`),\n runId,\n timestamp: row.timestamp,\n provider: cost.pricing?.provider ?? inferProvider(row.modelAlias),\n model: cost.pricing?.canonicalModel ?? row.modelAlias,\n inputTokens: totalInputTokens,\n outputTokens: row.outputTokens,\n costUsd: cost.costUsd,\n costSource: cost.costSource,\n latencyMs: null,\n toolCalls: 0,\n retries: 0,\n attempt: null,\n iteration: null,\n status: isErroredNoCharge(row.kind) ? 'error' : null,\n taskClass: null,\n cacheHit: row.cacheReadTokens > 0,\n cacheCostUsd: cost.cacheCostUsd,\n metadata: {\n source: 'cursor-usage-csv',\n kind: row.kind,\n maxMode: row.maxMode,\n modelAlias: row.modelAlias,\n costLabel: row.costLabel,\n totalTokens: row.totalTokens,\n inputWithCacheWriteTokens: row.inputWithCacheWriteTokens,\n inputWithoutCacheWriteTokens: row.inputWithoutCacheWriteTokens,\n cacheReadTokens: row.cacheReadTokens,\n pricingProvider: cost.pricing?.provider ?? null,\n pricingModel: cost.pricing?.canonicalModel ?? null,\n canonicalModelKey: cost.canonicalModelKey,\n observedCostUsd: row.observedCostUsd,\n cacheWriteCostUsd: cost.cacheWriteCostUsd,\n },\n },\n };\n}\n\nexport function normalizeCursorUsageCsv(input: {\n source: DetectedSourceFile;\n rows: CursorUsageCsvRow[];\n hasObservedCostRows?: boolean;\n since?: string;\n}): {\n runs: NormalizedRun[];\n pricingCoverage: PricingCoverage;\n cursorUsage: CursorUsageInsights;\n} {\n const cutoff = parseSince(input.since);\n const runs: NormalizedRun[] = [];\n const modelCoverage = new Map<string, { callCount: number; totalTokens: number }>();\n const modes = new Map<\n string,\n { callCount: number; totalTokens: number; estimatedSpendUsd: number }\n >();\n const models = new Map<\n string,\n {\n callCount: number;\n totalTokens: number;\n estimatedSpendUsd: number;\n pricedCallCount: number;\n unpricedCallCount: number;\n }\n >();\n\n let pricedCallCount = 0;\n let unpricedCallCount = 0;\n let pricedTokenCount = 0;\n let unpricedTokenCount = 0;\n let totalTokens = 0;\n let totalOutputTokens = 0;\n let totalCacheReadTokens = 0;\n let totalInputWithCacheWriteTokens = 0;\n let totalInputWithoutCacheWriteTokens = 0;\n\n input.rows.forEach((row, index) => {\n const timestampMs = new Date(row.timestamp).getTime();\n if (cutoff && timestampMs < cutoff) {\n return;\n }\n\n const workflow = getWorkflowKey(row);\n const runId = sha1(`${input.source.path}:${row.timestamp}:${row.modelAlias}:${index}`);\n const { call, cost } = buildCall(row, input.source, runId, index, {\n preferObservedCost: input.hasObservedCostRows ?? false,\n });\n const run: NormalizedRun = {\n id: runId,\n sourceKind: input.source.kind,\n sourcePath: input.source.path,\n timestamp: row.timestamp,\n workflow,\n environment: 'local',\n tags: {\n sourceKind: input.source.kind,\n maxMode: row.maxMode,\n kind: row.kind,\n },\n calls: [call],\n totalCostUsd: call.costUsd,\n totalTokens: row.totalTokens,\n observedCostUsd: call.costSource === 'observed' ? call.costUsd : 0,\n estimatedCostUsd: call.costSource === 'estimated' ? call.costUsd : 0,\n };\n runs.push(run);\n\n totalTokens += row.totalTokens;\n totalOutputTokens += row.outputTokens;\n totalCacheReadTokens += row.cacheReadTokens;\n totalInputWithCacheWriteTokens += row.inputWithCacheWriteTokens;\n totalInputWithoutCacheWriteTokens += row.inputWithoutCacheWriteTokens;\n\n const totalRowTokens = row.totalTokens;\n if (cost.costSource === 'unpriced') {\n unpricedCallCount += 1;\n unpricedTokenCount += totalRowTokens;\n const current = modelCoverage.get(row.modelAlias) ?? { callCount: 0, totalTokens: 0 };\n current.callCount += 1;\n current.totalTokens += totalRowTokens;\n modelCoverage.set(row.modelAlias, current);\n } else {\n pricedCallCount += 1;\n pricedTokenCount += totalRowTokens;\n }\n\n const modeBucket = modes.get(workflow) ?? {\n callCount: 0,\n totalTokens: 0,\n estimatedSpendUsd: 0,\n };\n modeBucket.callCount += 1;\n modeBucket.totalTokens += totalRowTokens;\n modeBucket.estimatedSpendUsd = round(modeBucket.estimatedSpendUsd + call.costUsd);\n modes.set(workflow, modeBucket);\n\n const modelBucket = models.get(cost.canonicalModelKey) ?? {\n callCount: 0,\n totalTokens: 0,\n estimatedSpendUsd: 0,\n pricedCallCount: 0,\n unpricedCallCount: 0,\n };\n modelBucket.callCount += 1;\n modelBucket.totalTokens += totalRowTokens;\n modelBucket.estimatedSpendUsd = round(modelBucket.estimatedSpendUsd + call.costUsd);\n if (cost.costSource === 'unpriced') {\n modelBucket.unpricedCallCount += 1;\n } else {\n modelBucket.pricedCallCount += 1;\n }\n models.set(cost.canonicalModelKey, modelBucket);\n });\n\n runs.sort(\n (left, right) => new Date(left.timestamp).getTime() - new Date(right.timestamp).getTime(),\n );\n\n return {\n runs,\n pricingCoverage: {\n pricedCallCount,\n unpricedCallCount,\n pricedTokenCount,\n unpricedTokenCount,\n topUnpricedModels: Array.from(modelCoverage.entries())\n .map(([key, value]) => ({\n key,\n callCount: value.callCount,\n totalTokens: value.totalTokens,\n }))\n .sort((left, right) => right.totalTokens - left.totalTokens)\n .slice(0, 5),\n },\n cursorUsage: {\n totalTokens,\n totalInputTokens: Math.max(totalTokens - totalOutputTokens, 0),\n totalOutputTokens,\n totalCacheReadTokens,\n totalInputWithCacheWriteTokens,\n totalInputWithoutCacheWriteTokens,\n modes: Array.from(modes.entries())\n .map(([key, value]) => ({\n key,\n callCount: value.callCount,\n totalTokens: value.totalTokens,\n estimatedSpendUsd: value.estimatedSpendUsd,\n }))\n .sort((left, right) => right.totalTokens - left.totalTokens),\n models: Array.from(models.entries())\n .map(([key, value]) => ({\n key,\n callCount: value.callCount,\n totalTokens: value.totalTokens,\n estimatedSpendUsd: value.estimatedSpendUsd,\n pricedCallCount: value.pricedCallCount,\n unpricedCallCount: value.unpricedCallCount,\n }))\n .sort((left, right) => right.totalTokens - left.totalTokens),\n },\n };\n}\n\nfunction buildDoctorNotes(report: CursorUsageCsvDoctorReport) {\n const notes = ['Cursor usage CSV headers validated.'];\n\n if (report.rowCount === 0) {\n notes.push('The CSV contains no usage rows.');\n }\n\n if (report.pricingCoverage.unpricedCallCount > 0) {\n const aliases = report.pricingCoverage.topUnpricedModels.map((model) => model.key).join(', ');\n notes.push(\n `Some Cursor aliases do not have full local pricing coverage: ${aliases || 'unknown aliases'}.`,\n );\n } else {\n notes.push('All rows in this CSV have local pricing coverage.');\n }\n\n notes.push('Cursor CSV audits use exported usage rows rather than raw session transcripts.');\n\n return notes;\n}\n\nexport async function inspectCursorUsageCsv(\n options: AuditOptions,\n): Promise<CursorUsageCsvDoctorReport> {\n const filePath = options.cursorUsageCsv ? resolve(options.cursorUsageCsv) : '';\n options.onProgress?.('Inspecting Cursor usage CSV...');\n\n if (!filePath) {\n return {\n canAudit: false,\n filePath,\n source: null,\n rowCount: 0,\n dateRange: null,\n pricingCoverage: {\n pricedCallCount: 0,\n unpricedCallCount: 0,\n pricedTokenCount: 0,\n unpricedTokenCount: 0,\n topUnpricedModels: [],\n },\n notes: ['No Cursor usage CSV path was provided.'],\n };\n }\n\n try {\n const parsed = readCursorUsageCsv(filePath);\n const normalized = normalizeCursorUsageCsv({\n source: parsed.source,\n rows: parsed.rows,\n hasObservedCostRows: parsed.hasObservedCostRows,\n });\n const dateRange =\n parsed.rows.length === 0\n ? null\n : {\n start: parsed.rows\n .map((row) => row.timestamp)\n .sort((left, right) => new Date(left).getTime() - new Date(right).getTime())[0],\n end: parsed.rows\n .map((row) => row.timestamp)\n .sort((left, right) => new Date(left).getTime() - new Date(right).getTime())\n .at(-1) as string,\n };\n\n const report: CursorUsageCsvDoctorReport = {\n canAudit: true,\n filePath: parsed.source.path,\n source: parsed.source,\n rowCount: parsed.rows.length,\n dateRange,\n pricingCoverage: normalized.pricingCoverage,\n notes: [],\n };\n report.notes = buildDoctorNotes(report);\n options.onProgress?.(\n `Cursor usage CSV is ready (${report.rowCount} row${report.rowCount === 1 ? '' : 's'}).`,\n );\n return report;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n options.onProgress?.(`Cursor usage CSV is not ready: ${message}`);\n return {\n canAudit: false,\n filePath,\n source: null,\n rowCount: 0,\n dateRange: null,\n pricingCoverage: {\n pricedCallCount: 0,\n unpricedCallCount: 0,\n pricedTokenCount: 0,\n unpricedTokenCount: 0,\n topUnpricedModels: [],\n },\n notes: [message],\n };\n }\n}\n","import { createHash } from 'node:crypto';\nimport { closeSync, openSync, readSync } from 'node:fs';\n\nexport function sha1(input: string) {\n return createHash('sha1').update(input).digest('hex');\n}\n\nexport function sha1File(path: string) {\n const hash = createHash('sha1');\n const fd = openSync(path, 'r');\n const buffer = Buffer.allocUnsafe(64 * 1024);\n\n try {\n let bytesRead = 0;\n do {\n bytesRead = readSync(fd, buffer, 0, buffer.length, null);\n if (bytesRead > 0) {\n hash.update(buffer.subarray(0, bytesRead));\n }\n } while (bytesRead > 0);\n } finally {\n closeSync(fd);\n }\n\n return hash.digest('hex');\n}\n","export function parseSince(value?: string): number | null {\n if (!value) {\n return null;\n }\n\n const match = value.trim().match(/^(\\d+)([mhdw])$/i);\n if (!match) {\n throw new Error(`Invalid --since value \"${value}\". Use values like 30m, 24h, 7d, 2w.`);\n }\n\n const amount = Number(match[1]);\n const unit = match[2].toLowerCase();\n const multipliers: Record<string, number> = {\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n w: 7 * 24 * 60 * 60 * 1000,\n };\n\n return Date.now() - amount * multipliers[unit];\n}\n\nexport function isoNow() {\n return new Date().toISOString();\n}\n\nexport function toIsoOrNow(value: unknown) {\n if (typeof value === 'string') {\n const candidate = new Date(value);\n if (!Number.isNaN(candidate.getTime())) {\n return candidate.toISOString();\n }\n }\n\n if (typeof value === 'number') {\n const candidate = new Date(value);\n if (!Number.isNaN(candidate.getTime())) {\n return candidate.toISOString();\n }\n }\n\n return isoNow();\n}\n","import { mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport Database from 'better-sqlite3';\n\nimport { SCHEMA_SQL, SCHEMA_VERSION } from './schema.js';\n\ntype SqliteDatabase = InstanceType<typeof Database>;\n\nexport interface DbClient {\n sqlite: SqliteDatabase;\n}\n\nexport function createDb(path: string): DbClient {\n mkdirSync(dirname(path), { recursive: true });\n const sqlite = new Database(path);\n const currentVersion = sqlite.pragma('user_version', { simple: true }) as number;\n\n if (currentVersion > SCHEMA_VERSION) {\n sqlite.close();\n throw new Error(\n `Unsupported Xerg database schema version ${currentVersion}. This build supports up to ${SCHEMA_VERSION}.`,\n );\n }\n\n sqlite.exec(SCHEMA_SQL);\n if (currentVersion < SCHEMA_VERSION) {\n sqlite.pragma(`user_version = ${SCHEMA_VERSION}`);\n }\n\n return { sqlite };\n}\n","export const SCHEMA_VERSION = 1;\n\nexport const SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS source_files (\n id TEXT PRIMARY KEY,\n path TEXT NOT NULL,\n kind TEXT NOT NULL,\n file_hash TEXT NOT NULL,\n mtime_ms INTEGER NOT NULL,\n size_bytes INTEGER NOT NULL,\n imported_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS runs (\n id TEXT PRIMARY KEY,\n source_path TEXT NOT NULL,\n source_kind TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n workflow TEXT NOT NULL,\n environment TEXT NOT NULL,\n tags_json TEXT NOT NULL,\n total_cost_usd REAL NOT NULL,\n total_tokens INTEGER NOT NULL,\n observed_cost_usd REAL NOT NULL,\n estimated_cost_usd REAL NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS calls (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n provider TEXT NOT NULL,\n model TEXT NOT NULL,\n input_tokens INTEGER NOT NULL,\n output_tokens INTEGER NOT NULL,\n cost_usd REAL NOT NULL,\n cost_source TEXT NOT NULL,\n latency_ms INTEGER,\n tool_calls INTEGER NOT NULL,\n retries INTEGER NOT NULL,\n attempt INTEGER,\n iteration INTEGER,\n status TEXT,\n task_class TEXT,\n cache_hit INTEGER NOT NULL,\n cache_cost_usd REAL,\n metadata_json TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS findings (\n id TEXT PRIMARY KEY,\n audit_id TEXT NOT NULL,\n classification TEXT NOT NULL,\n confidence TEXT NOT NULL,\n kind TEXT NOT NULL,\n title TEXT NOT NULL,\n summary TEXT NOT NULL,\n scope TEXT NOT NULL,\n scope_id TEXT NOT NULL,\n cost_impact_usd REAL NOT NULL,\n details_json TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS pricing_catalog (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL,\n model TEXT NOT NULL,\n effective_date TEXT NOT NULL,\n input_per_1m REAL NOT NULL,\n output_per_1m REAL NOT NULL,\n cached_input_per_1m REAL\n);\n\nCREATE TABLE IF NOT EXISTS audit_snapshots (\n id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n summary_json TEXT NOT NULL\n);\n`;\n","import type { PersistedAudit } from '../types.js';\nimport { sha1, sha1File } from '../utils/hash.js';\nimport { isoNow } from '../utils/time.js';\nimport { createDb } from './client.js';\n\nexport function persistAudit(audit: PersistedAudit, dbPath: string) {\n const { sqlite } = createDb(dbPath);\n const importedAt = isoNow();\n const pricingRows = audit.pricingCatalog.map((entry) => ({\n ...entry,\n cachedInputPer1m: entry.cachedInputPer1m ?? null,\n }));\n const sourceFileRows = audit.summary.sourceFiles.map((file) => ({\n id: sha1(`${file.path}:${file.mtimeMs}:${file.sizeBytes}`),\n path: file.path,\n kind: file.kind,\n fileHash: sha1File(file.path),\n mtimeMs: Math.trunc(file.mtimeMs),\n sizeBytes: file.sizeBytes,\n importedAt,\n }));\n const runRows = audit.runs.map((run) => ({\n id: run.id,\n sourcePath: run.sourcePath,\n sourceKind: run.sourceKind,\n timestamp: run.timestamp,\n workflow: run.workflow,\n environment: run.environment,\n tagsJson: JSON.stringify(run.tags),\n totalCostUsd: run.totalCostUsd,\n totalTokens: run.totalTokens,\n observedCostUsd: run.observedCostUsd,\n estimatedCostUsd: run.estimatedCostUsd,\n }));\n const callRows = audit.runs.flatMap((run) =>\n run.calls.map((call) => ({\n id: call.id,\n runId: call.runId,\n timestamp: call.timestamp,\n provider: call.provider,\n model: call.model,\n inputTokens: call.inputTokens,\n outputTokens: call.outputTokens,\n costUsd: call.costUsd,\n costSource: call.costSource,\n latencyMs: call.latencyMs,\n toolCalls: call.toolCalls,\n retries: call.retries,\n attempt: call.attempt,\n iteration: call.iteration,\n status: call.status,\n taskClass: call.taskClass,\n cacheHit: call.cacheHit,\n cacheCostUsd: call.cacheCostUsd,\n metadataJson: JSON.stringify(call.metadata),\n })),\n );\n const findingRows = audit.summary.findings.map((finding) => ({\n id: finding.id,\n auditId: audit.summary.auditId,\n classification: finding.classification,\n confidence: finding.confidence,\n kind: finding.kind,\n title: finding.title,\n summary: finding.summary,\n scope: finding.scope,\n scopeId: finding.scopeId,\n costImpactUsd: finding.costImpactUsd,\n detailsJson: JSON.stringify(finding.details),\n }));\n const persistTransaction = sqlite.transaction(() => {\n insertMany(\n sqlite,\n `\n INSERT OR IGNORE INTO pricing_catalog (\n id,\n provider,\n model,\n effective_date,\n input_per_1m,\n output_per_1m,\n cached_input_per_1m\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `,\n pricingRows.map((row) => [\n row.id,\n row.provider,\n row.model,\n row.effectiveDate,\n row.inputPer1m,\n row.outputPer1m,\n row.cachedInputPer1m,\n ]),\n );\n\n insertMany(\n sqlite,\n `\n INSERT OR IGNORE INTO source_files (\n id,\n path,\n kind,\n file_hash,\n mtime_ms,\n size_bytes,\n imported_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `,\n sourceFileRows.map((row) => [\n row.id,\n row.path,\n row.kind,\n row.fileHash,\n row.mtimeMs,\n row.sizeBytes,\n row.importedAt,\n ]),\n );\n\n insertMany(\n sqlite,\n `\n INSERT OR IGNORE INTO runs (\n id,\n source_path,\n source_kind,\n timestamp,\n workflow,\n environment,\n tags_json,\n total_cost_usd,\n total_tokens,\n observed_cost_usd,\n estimated_cost_usd\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n runRows.map((row) => [\n row.id,\n row.sourcePath,\n row.sourceKind,\n row.timestamp,\n row.workflow,\n row.environment,\n row.tagsJson,\n row.totalCostUsd,\n row.totalTokens,\n row.observedCostUsd,\n row.estimatedCostUsd,\n ]),\n );\n\n insertMany(\n sqlite,\n `\n INSERT OR IGNORE INTO calls (\n id,\n run_id,\n timestamp,\n provider,\n model,\n input_tokens,\n output_tokens,\n cost_usd,\n cost_source,\n latency_ms,\n tool_calls,\n retries,\n attempt,\n iteration,\n status,\n task_class,\n cache_hit,\n cache_cost_usd,\n metadata_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n callRows.map((row) => [\n row.id,\n row.runId,\n row.timestamp,\n row.provider,\n row.model,\n row.inputTokens,\n row.outputTokens,\n row.costUsd,\n row.costSource,\n row.latencyMs ?? null,\n row.toolCalls,\n row.retries,\n row.attempt ?? null,\n row.iteration ?? null,\n row.status ?? null,\n row.taskClass ?? null,\n row.cacheHit ? 1 : 0,\n row.cacheCostUsd ?? null,\n row.metadataJson,\n ]),\n );\n\n insertMany(\n sqlite,\n `\n INSERT OR IGNORE INTO findings (\n id,\n audit_id,\n classification,\n confidence,\n kind,\n title,\n summary,\n scope,\n scope_id,\n cost_impact_usd,\n details_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n findingRows.map((row) => [\n row.id,\n row.auditId,\n row.classification,\n row.confidence,\n row.kind,\n row.title,\n row.summary,\n row.scope,\n row.scopeId,\n row.costImpactUsd,\n row.detailsJson,\n ]),\n );\n\n sqlite\n .prepare(\n `\n INSERT OR IGNORE INTO audit_snapshots (\n id,\n created_at,\n summary_json\n ) VALUES (?, ?, ?)\n `,\n )\n .run(audit.summary.auditId, audit.summary.generatedAt, JSON.stringify(audit.summary));\n });\n\n try {\n persistTransaction();\n } finally {\n sqlite.close();\n }\n}\n\nfunction insertMany(sqlite: ReturnType<typeof createDb>['sqlite'], sql: string, rows: unknown[][]) {\n if (rows.length === 0) {\n return;\n }\n\n const statement = sqlite.prepare(sql);\n\n for (const row of rows) {\n statement.run(...row);\n }\n}\n","import type {\n AuditComparison,\n AuditRuntime,\n AuditSummary,\n DetectedSourceFile,\n Finding,\n FindingChange,\n FindingClassification,\n FindingTaxonomyBucket,\n SpendBreakdown,\n SpendDelta,\n} from '../types.js';\nimport { sha1 } from '../utils/hash.js';\n\nconst FINDING_KIND_LABELS: Record<string, string> = {\n 'retry-waste': 'Retry waste',\n 'context-outlier': 'Context bloat',\n 'loop-waste': 'Loop waste',\n 'candidate-downgrade': 'Downgrade candidates',\n 'idle-spend': 'Idle waste',\n};\n\nfunction round(value: number) {\n return Number(value.toFixed(6));\n}\n\nfunction normalizeSinceValue(since?: string) {\n if (!since) {\n return 'all';\n }\n\n const match = since\n .trim()\n .toLowerCase()\n .match(/^(\\d+)([mhdw])$/);\n if (!match) {\n return since.trim().toLowerCase();\n }\n\n return `${Number(match[1])}${match[2]}`;\n}\n\nfunction normalizePath(path: string) {\n return path.replace(/\\\\/g, '/');\n}\n\nfunction findSessionsRoot(path: string) {\n const normalized = normalizePath(path);\n const marker = '/sessions/';\n const index = normalized.lastIndexOf(marker);\n\n if (index >= 0) {\n return normalized.slice(0, index + marker.length - 1);\n }\n\n return normalized.slice(0, normalized.lastIndexOf('/')) || normalized;\n}\n\nfunction findGatewayRoot(path: string) {\n const normalized = normalizePath(path);\n return normalized.slice(0, normalized.lastIndexOf('/')) || normalized;\n}\n\nexport function getFindingKindLabel(kind: string) {\n return FINDING_KIND_LABELS[kind] ?? kind;\n}\n\nexport function getComparisonSourceRoot(source: DetectedSourceFile) {\n if (source.kind === 'sessions') {\n return findSessionsRoot(source.path);\n }\n\n return findGatewayRoot(source.path);\n}\n\nexport function buildComparisonKey(input: {\n runtime: AuditRuntime;\n sources: DetectedSourceFile[];\n since?: string;\n}) {\n const kinds = Array.from(new Set(input.sources.map((source) => source.kind))).sort();\n const roots = Array.from(\n new Set(input.sources.map((source) => `${source.kind}:${getComparisonSourceRoot(source)}`)),\n ).sort();\n\n return sha1(\n JSON.stringify({\n runtime: input.runtime,\n kinds,\n roots,\n since: normalizeSinceValue(input.since),\n }),\n );\n}\n\nexport function buildTaxonomyBuckets(\n findings: Finding[],\n classification: FindingClassification,\n): FindingTaxonomyBucket[] {\n const buckets = new Map<string, FindingTaxonomyBucket>();\n\n for (const finding of findings) {\n if (finding.classification !== classification) {\n continue;\n }\n\n const current = buckets.get(finding.kind) ?? {\n kind: finding.kind,\n label: getFindingKindLabel(finding.kind),\n classification,\n spendUsd: 0,\n findingCount: 0,\n };\n\n current.spendUsd = round(current.spendUsd + finding.costImpactUsd);\n current.findingCount += 1;\n buckets.set(finding.kind, current);\n }\n\n return Array.from(buckets.values()).sort((left, right) => right.spendUsd - left.spendUsd);\n}\n\nfunction toSpendMap(rows: SpendBreakdown[]) {\n return new Map(rows.map((row) => [row.key, row.spendUsd]));\n}\n\nfunction buildTopSpendDeltas(currentRows: SpendBreakdown[], baselineRows: SpendBreakdown[]) {\n const currentMap = toSpendMap(currentRows);\n const baselineMap = toSpendMap(baselineRows);\n const keys = Array.from(new Set([...currentMap.keys(), ...baselineMap.keys()]));\n\n return keys\n .map((key) => {\n const baselineSpendUsd = baselineMap.get(key) ?? 0;\n const currentSpendUsd = currentMap.get(key) ?? 0;\n\n return {\n key,\n baselineSpendUsd: round(baselineSpendUsd),\n currentSpendUsd: round(currentSpendUsd),\n deltaSpendUsd: round(currentSpendUsd - baselineSpendUsd),\n } satisfies SpendDelta;\n })\n .filter((row) => row.deltaSpendUsd !== 0)\n .sort((left, right) => Math.abs(right.deltaSpendUsd) - Math.abs(left.deltaSpendUsd))\n .slice(0, 3);\n}\n\nfunction getFindingIdentity(finding: Finding) {\n return `${finding.kind}:${finding.scope}:${finding.scopeId}`;\n}\n\nfunction sortFindingChanges(changes: FindingChange[]) {\n return changes.sort(\n (left, right) => Math.abs(right.deltaCostImpactUsd) - Math.abs(left.deltaCostImpactUsd),\n );\n}\n\nfunction buildFindingChanges(currentFindings: Finding[], baselineFindings: Finding[]) {\n const currentWaste = currentFindings.filter(\n (finding) => finding.classification === 'waste' && finding.confidence === 'high',\n );\n const baselineWaste = baselineFindings.filter(\n (finding) => finding.classification === 'waste' && finding.confidence === 'high',\n );\n const currentMap = new Map(currentWaste.map((finding) => [getFindingIdentity(finding), finding]));\n const baselineMap = new Map(\n baselineWaste.map((finding) => [getFindingIdentity(finding), finding]),\n );\n\n const newHighConfidenceWaste: FindingChange[] = [];\n const resolvedHighConfidenceWaste: FindingChange[] = [];\n const worsenedHighConfidenceWaste: FindingChange[] = [];\n\n for (const [identity, current] of currentMap.entries()) {\n const baseline = baselineMap.get(identity);\n\n if (!baseline) {\n newHighConfidenceWaste.push({\n kind: current.kind,\n title: current.title,\n scope: current.scope,\n scopeId: current.scopeId,\n currentCostImpactUsd: current.costImpactUsd,\n deltaCostImpactUsd: round(current.costImpactUsd),\n });\n continue;\n }\n\n const deltaCostImpactUsd = round(current.costImpactUsd - baseline.costImpactUsd);\n if (deltaCostImpactUsd > 0) {\n worsenedHighConfidenceWaste.push({\n kind: current.kind,\n title: current.title,\n scope: current.scope,\n scopeId: current.scopeId,\n baselineCostImpactUsd: baseline.costImpactUsd,\n currentCostImpactUsd: current.costImpactUsd,\n deltaCostImpactUsd,\n });\n }\n }\n\n for (const [identity, baseline] of baselineMap.entries()) {\n if (currentMap.has(identity)) {\n continue;\n }\n\n resolvedHighConfidenceWaste.push({\n kind: baseline.kind,\n title: baseline.title,\n scope: baseline.scope,\n scopeId: baseline.scopeId,\n baselineCostImpactUsd: baseline.costImpactUsd,\n deltaCostImpactUsd: round(-baseline.costImpactUsd),\n });\n }\n\n return {\n newHighConfidenceWaste: sortFindingChanges(newHighConfidenceWaste),\n resolvedHighConfidenceWaste: sortFindingChanges(resolvedHighConfidenceWaste),\n worsenedHighConfidenceWaste: sortFindingChanges(worsenedHighConfidenceWaste),\n };\n}\n\nfunction inferSummaryRuntime(summary: AuditSummary): AuditRuntime {\n if ('runtime' in summary && summary.runtime) {\n return summary.runtime;\n }\n\n if (summary.sourceFiles.some((source) => source.kind === 'cursor-usage-csv')) {\n return 'cursor';\n }\n\n return 'openclaw';\n}\n\nexport function hydrateAuditSummary(summary: AuditSummary): AuditSummary {\n const runtime = inferSummaryRuntime(summary);\n const shouldRebuildComparisonKey =\n !('runtime' in summary) || !summary.runtime || !summary.comparisonKey;\n const hydratedSources = summary.sourceFiles.map((source) => ({\n ...source,\n runtime:\n source.runtime ??\n (source.kind === 'cursor-usage-csv' ? 'cursor' : runtime === 'cursor' ? 'openclaw' : runtime),\n }));\n\n return {\n ...summary,\n runtime,\n sourceFiles: hydratedSources,\n comparisonKey: shouldRebuildComparisonKey\n ? buildComparisonKey({\n runtime,\n sources: hydratedSources,\n since: summary.since,\n })\n : summary.comparisonKey,\n comparison: summary.comparison ?? null,\n wasteByKind:\n summary.wasteByKind?.length > 0\n ? summary.wasteByKind\n : buildTaxonomyBuckets(summary.findings, 'waste'),\n opportunityByKind:\n summary.opportunityByKind?.length > 0\n ? summary.opportunityByKind\n : buildTaxonomyBuckets(summary.findings, 'opportunity'),\n spendByDay: summary.spendByDay ?? [],\n wasteByDay: summary.wasteByDay ?? [],\n recommendations: summary.recommendations ?? [],\n notes: summary.notes ?? [],\n pricingCoverage: summary.pricingCoverage ?? null,\n cursorUsage: summary.cursorUsage ?? null,\n };\n}\n\nexport function buildAuditComparison(\n current: AuditSummary,\n baseline: AuditSummary,\n): AuditComparison {\n const workflowDeltas = buildTopSpendDeltas(current.spendByWorkflow, baseline.spendByWorkflow);\n const modelDeltas = buildTopSpendDeltas(current.spendByModel, baseline.spendByModel);\n\n return {\n baselineAuditId: baseline.auditId,\n baselineGeneratedAt: baseline.generatedAt,\n baselineRunCount: baseline.runCount,\n baselineCallCount: baseline.callCount,\n baselineTotalSpendUsd: baseline.totalSpendUsd,\n baselineObservedSpendUsd: baseline.observedSpendUsd,\n baselineEstimatedSpendUsd: baseline.estimatedSpendUsd,\n baselineWasteSpendUsd: baseline.wasteSpendUsd,\n baselineOpportunitySpendUsd: baseline.opportunitySpendUsd,\n baselineStructuralWasteRate: baseline.structuralWasteRate,\n deltaTotalSpendUsd: round(current.totalSpendUsd - baseline.totalSpendUsd),\n deltaObservedSpendUsd: round(current.observedSpendUsd - baseline.observedSpendUsd),\n deltaEstimatedSpendUsd: round(current.estimatedSpendUsd - baseline.estimatedSpendUsd),\n deltaWasteSpendUsd: round(current.wasteSpendUsd - baseline.wasteSpendUsd),\n deltaOpportunitySpendUsd: round(current.opportunitySpendUsd - baseline.opportunitySpendUsd),\n deltaStructuralWasteRate: round(current.structuralWasteRate - baseline.structuralWasteRate),\n deltaRunCount: current.runCount - baseline.runCount,\n deltaCallCount: current.callCount - baseline.callCount,\n workflowDeltas,\n modelDeltas,\n findingChanges: buildFindingChanges(current.findings, baseline.findings),\n };\n}\n","import { hydrateAuditSummary } from '../report/comparison.js';\nimport type { AuditSummary } from '../types.js';\nimport { createDb } from './client.js';\n\nfunction parseAuditSummary(row: { id: string; summaryJson: string }) {\n try {\n return hydrateAuditSummary(JSON.parse(row.summaryJson) as AuditSummary);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n process.stderr.write(`Warning: skipping unreadable audit snapshot ${row.id}: ${message}\\n`);\n return null;\n }\n}\n\nexport function listStoredAuditSummaries(dbPath: string): AuditSummary[] {\n const { sqlite } = createDb(dbPath);\n\n try {\n const rows = sqlite\n .prepare(\n `\n SELECT id, summary_json AS summaryJson\n FROM audit_snapshots\n ORDER BY created_at DESC\n `,\n )\n .all() as { id: string; summaryJson: string }[];\n\n return rows\n .map((row) => parseAuditSummary(row))\n .filter((summary): summary is AuditSummary => summary !== null);\n } finally {\n sqlite.close();\n }\n}\n\nexport function readLatestComparableAuditSummary(input: {\n dbPath: string;\n comparisonKey: string;\n currentAuditId?: string;\n}) {\n return listStoredAuditSummaries(input.dbPath).find((summary) => {\n if (input.currentAuditId && summary.auditId === input.currentAuditId) {\n return false;\n }\n\n return summary.comparisonKey === input.comparisonKey;\n });\n}\n","import type {\n Finding,\n FindingBuildResult,\n FindingClassification,\n FindingConfidence,\n NormalizedRun,\n} from '../types.js';\nimport { sha1 } from '../utils/hash.js';\n\nfunction round(value: number) {\n return Number(value.toFixed(6));\n}\n\nfunction createFinding(input: Omit<Finding, 'id'>): Finding {\n return {\n ...input,\n id: sha1(\n `${input.kind}:${input.scope}:${input.scopeId}:${input.title}:${input.costImpactUsd}:${input.summary}`,\n ),\n };\n}\n\nfunction asNumber(value: unknown) {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction asBoolean(value: unknown) {\n return value === true;\n}\n\nexport function buildCursorUsageFindings(runs: NormalizedRun[]): FindingBuildResult {\n const calls = runs.flatMap((run) => run.calls);\n const billableCalls = calls.filter((call) => call.costUsd > 0);\n if (billableCalls.length === 0) {\n return { findings: [], wasteAttributions: [] };\n }\n\n const cacheAwareCalls = billableCalls.filter((call) => {\n return asNumber(call.metadata.cacheReadTokens) > 0;\n });\n if (cacheAwareCalls.length === 0) {\n return { findings: [], wasteAttributions: [] };\n }\n\n const totalSpendUsd = billableCalls.reduce((sum, call) => sum + call.costUsd, 0);\n const totalInputTokens = billableCalls.reduce((sum, call) => sum + call.inputTokens, 0);\n const totalCacheReadTokens = cacheAwareCalls.reduce(\n (sum, call) => sum + asNumber(call.metadata.cacheReadTokens),\n 0,\n );\n const totalCacheWriteTokens = billableCalls.reduce(\n (sum, call) => sum + asNumber(call.metadata.inputWithCacheWriteTokens),\n 0,\n );\n const cacheSpendUsd = cacheAwareCalls.reduce((sum, call) => sum + (call.cacheCostUsd ?? 0), 0);\n const cacheWriteSpendUsd = billableCalls.reduce(\n (sum, call) => sum + asNumber(call.metadata.cacheWriteCostUsd),\n 0,\n );\n const coveredSpendUsd = billableCalls\n .filter((call) => call.cacheCostUsd !== null)\n .reduce((sum, call) => sum + call.costUsd, 0);\n const maxModeSpendUsd = billableCalls\n .filter((call) => asBoolean(call.metadata.maxMode))\n .reduce((sum, call) => sum + call.costUsd, 0);\n const cacheReadShare = totalInputTokens === 0 ? 0 : totalCacheReadTokens / totalInputTokens;\n const cacheCoverageShare = totalSpendUsd === 0 ? 0 : coveredSpendUsd / totalSpendUsd;\n const maxModeSpendShare = totalSpendUsd === 0 ? 0 : maxModeSpendUsd / totalSpendUsd;\n const cacheImpactUsd = round(cacheSpendUsd + cacheWriteSpendUsd);\n\n const meetsWasteBar =\n cacheImpactUsd >= 25 &&\n cacheReadShare >= 0.6 &&\n cacheAwareCalls.length >= 20 &&\n cacheCoverageShare >= 0.4;\n const meetsOpportunityBar =\n cacheImpactUsd >= 5 &&\n cacheReadShare >= 0.35 &&\n cacheAwareCalls.length >= 10 &&\n cacheCoverageShare >= 0.25;\n\n if (!meetsWasteBar && !meetsOpportunityBar) {\n return { findings: [], wasteAttributions: [] };\n }\n\n const classification: FindingClassification = meetsWasteBar ? 'waste' : 'opportunity';\n\n const confidence: FindingConfidence =\n cacheReadShare >= 0.8 && cacheAwareCalls.length >= 50 && cacheCoverageShare >= 0.5\n ? 'high'\n : cacheReadShare >= 0.5 && cacheAwareCalls.length >= 20\n ? 'medium'\n : 'low';\n\n const summary =\n classification === 'waste'\n ? `Xerg estimated ${cacheImpactUsd.toFixed(2)} USD of billed spend was driven by repeatedly replaying cached context across ${cacheAwareCalls.length} paid row${cacheAwareCalls.length === 1 ? '' : 's'}. This pattern is consistent with long chats carrying more history than needed.`\n : `Xerg estimated ${cacheImpactUsd.toFixed(2)} USD of billed spend was tied to cached context replay across ${cacheAwareCalls.length} paid row${cacheAwareCalls.length === 1 ? '' : 's'}. Summarizing and resetting long chats could reduce this carryover cost.`;\n\n const findings: Finding[] = [\n createFinding({\n classification,\n confidence,\n kind: 'cache-carryover',\n title:\n classification === 'waste'\n ? 'Cached context carryover is driving avoidable spend'\n : 'Cached context carryover looks like a strong cost-reduction opportunity',\n summary,\n scope: 'global',\n scopeId: 'all',\n scopeLabel: 'Cursor usage',\n costImpactUsd: cacheImpactUsd,\n details: {\n cacheReadShare: round(cacheReadShare),\n cacheCoverageShare: round(cacheCoverageShare),\n totalCacheReadTokens,\n totalCacheWriteTokens,\n billableCallCount: billableCalls.length,\n cacheAwareCallCount: cacheAwareCalls.length,\n maxModeSpendShare: round(maxModeSpendShare),\n estimatedCacheReadSpendUsd: round(cacheSpendUsd),\n estimatedCacheWriteSpendUsd: round(cacheWriteSpendUsd),\n },\n }),\n ];\n\n const maxModeCalls = billableCalls.filter((call) => asBoolean(call.metadata.maxMode));\n const maxModeCallShare =\n billableCalls.length === 0 ? 0 : maxModeCalls.length / billableCalls.length;\n\n if (maxModeSpendShare >= 0.6 && maxModeSpendUsd >= 25 && maxModeCalls.length >= 10) {\n const maxModeConfidence: FindingConfidence =\n maxModeSpendShare >= 0.85 && maxModeCalls.length >= 50\n ? 'high'\n : maxModeSpendShare >= 0.7 && maxModeCalls.length >= 20\n ? 'medium'\n : 'low';\n\n findings.push(\n createFinding({\n classification: 'opportunity',\n confidence: maxModeConfidence,\n kind: 'max-mode-concentration',\n title: 'Max mode is concentrated in the billed spend mix',\n summary: `Max mode accounts for ${(maxModeSpendShare * 100).toFixed(0)}% of billed spend across ${maxModeCalls.length} paid row${maxModeCalls.length === 1 ? '' : 's'}. This is a strong candidate for splitting work between premium and standard passes.`,\n scope: 'global',\n scopeId: 'all',\n scopeLabel: 'Cursor usage',\n costImpactUsd: round(maxModeSpendUsd * 0.2),\n details: {\n maxModeSpendUsd: round(maxModeSpendUsd),\n maxModeSpendShare: round(maxModeSpendShare),\n maxModeCallCount: maxModeCalls.length,\n maxModeCallShare: round(maxModeCallShare),\n },\n }),\n );\n }\n\n const wasteAttributions =\n classification === 'waste'\n ? billableCalls\n .map((call) => ({\n kind: 'cache-carryover',\n timestamp: call.timestamp,\n wasteUsd: round((call.cacheCostUsd ?? 0) + asNumber(call.metadata.cacheWriteCostUsd)),\n }))\n .filter((attribution) => attribution.wasteUsd > 0)\n : [];\n\n return {\n findings: findings.sort((left, right) => right.costImpactUsd - left.costImpactUsd),\n wasteAttributions,\n };\n}\n","import type { Finding, FindingBuildResult, NormalizedRun, WasteAttribution } from '../types.js';\nimport { sha1 } from '../utils/hash.js';\n\nfunction createFinding(input: Omit<Finding, 'id'>): Finding {\n return {\n ...input,\n id: sha1(\n `${input.kind}:${input.scope}:${input.scopeId}:${input.title}:${input.costImpactUsd}:${input.summary}`,\n ),\n };\n}\n\nfunction round(value: number) {\n return Number(value.toFixed(6));\n}\n\nexport function buildFindings(runs: NormalizedRun[]): FindingBuildResult {\n const findings: Finding[] = [];\n const wasteAttributions: WasteAttribution[] = [];\n const allCalls = runs.flatMap((run) => run.calls.map((call) => ({ run, call })));\n\n const retryCandidates = allCalls.filter(({ call }) => {\n const status = (call.status ?? '').toLowerCase();\n return status.includes('error') || status.includes('fail');\n });\n\n const retryCost = retryCandidates.reduce((sum, item) => sum + item.call.costUsd, 0);\n if (retryCost > 0) {\n wasteAttributions.push(\n ...retryCandidates.map(({ call }) => ({\n kind: 'retry-waste',\n timestamp: call.timestamp,\n wasteUsd: call.costUsd,\n })),\n );\n findings.push(\n createFinding({\n classification: 'waste',\n confidence: 'high',\n kind: 'retry-waste',\n title: 'Retry waste is consuming measurable spend',\n summary: `${retryCandidates.length} failed call${retryCandidates.length === 1 ? '' : 's'} were followed by additional work, making their spend pure retry overhead.`,\n scope: 'global',\n scopeId: 'all',\n scopeLabel: 'workspace',\n costImpactUsd: round(retryCost),\n details: {\n failedCallCount: retryCandidates.length,\n },\n }),\n );\n }\n\n for (const run of runs) {\n const maxIteration = Math.max(...run.calls.map((call) => call.iteration ?? 0));\n if (maxIteration >= 7) {\n const loopCalls = run.calls.filter((call) => (call.iteration ?? 0) > 5);\n const loopCost = loopCalls.reduce((sum, call) => sum + call.costUsd, 0);\n wasteAttributions.push(\n ...loopCalls.map((call) => ({\n kind: 'loop-waste',\n timestamp: call.timestamp,\n wasteUsd: call.costUsd,\n })),\n );\n findings.push(\n createFinding({\n classification: 'waste',\n confidence: 'high',\n kind: 'loop-waste',\n title: `Workflow \"${run.workflow}\" ran beyond efficient loop bounds`,\n summary: `This run reached ${maxIteration} iterations. Xerg treats the spend after iteration 5 as likely loop waste.`,\n scope: 'run',\n scopeId: run.workflow,\n scopeLabel: run.workflow,\n costImpactUsd: round(loopCost),\n details: {\n workflow: run.workflow,\n maxIteration,\n },\n }),\n );\n }\n }\n\n const runsByWorkflow = new Map<string, NormalizedRun[]>();\n for (const run of runs) {\n const bucket = runsByWorkflow.get(run.workflow) ?? [];\n bucket.push(run);\n runsByWorkflow.set(run.workflow, bucket);\n }\n\n for (const [workflow, workflowRuns] of runsByWorkflow.entries()) {\n if (workflowRuns.length >= 3) {\n const totalInputs = workflowRuns.map((run) =>\n run.calls.reduce((sum, call) => sum + call.inputTokens, 0),\n );\n const average = totalInputs.reduce((sum, value) => sum + value, 0) / totalInputs.length;\n const outlierRuns = workflowRuns.filter((run) => {\n const tokens = run.calls.reduce((sum, call) => sum + call.inputTokens, 0);\n return tokens > average * 1.75 && tokens > 1500;\n });\n\n if (outlierRuns.length > 0) {\n const outlierCost = outlierRuns.reduce((sum, run) => sum + run.totalCostUsd, 0);\n findings.push(\n createFinding({\n classification: 'opportunity',\n confidence: 'medium',\n kind: 'context-outlier',\n title: `Context usage in \"${workflow}\" is well above its baseline`,\n summary: `Xerg found ${outlierRuns.length} run${outlierRuns.length === 1 ? '' : 's'} in this workflow with input token volume far above the workflow average.`,\n scope: 'workflow',\n scopeId: workflow,\n scopeLabel: workflow,\n costImpactUsd: round(outlierCost),\n details: {\n workflow,\n averageInputTokens: round(average),\n outlierRunCount: outlierRuns.length,\n },\n }),\n );\n }\n }\n\n const idleRuns = workflowRuns.filter((run) =>\n /(heartbeat|cron|monitor|poll)/i.test(run.workflow),\n );\n if (idleRuns.length > 0) {\n const idleCost = idleRuns.reduce((sum, run) => sum + run.totalCostUsd, 0);\n findings.push(\n createFinding({\n classification: 'opportunity',\n confidence: 'medium',\n kind: 'idle-spend',\n title: `Idle or monitoring spend detected in \"${workflow}\"`,\n summary:\n 'This workflow name looks like a recurring heartbeat or monitoring loop. Review whether the cadence and model tier are justified.',\n scope: 'workflow',\n scopeId: workflow,\n scopeLabel: workflow,\n costImpactUsd: round(idleCost),\n details: {\n workflow,\n },\n }),\n );\n }\n\n const downgradeCalls = workflowRuns\n .flatMap((run) => run.calls)\n .filter((call) => {\n return (\n /(opus|gpt-4o|sonnet)/i.test(call.model) &&\n /(heartbeat|cron|monitor|summary|tag|triage)/i.test(call.taskClass ?? workflow)\n );\n });\n\n if (downgradeCalls.length > 0) {\n const spend = downgradeCalls.reduce((sum, call) => sum + call.costUsd, 0);\n findings.push(\n createFinding({\n classification: 'opportunity',\n confidence: 'low',\n kind: 'candidate-downgrade',\n title: `Candidate model downgrade opportunity in \"${workflow}\"`,\n summary:\n 'An expensive model is being used on a workflow that looks operationally simple. Treat this as an A/B test candidate, not proven waste.',\n scope: 'workflow',\n scopeId: workflow,\n scopeLabel: workflow,\n costImpactUsd: round(spend * 0.3),\n details: {\n workflow,\n expensiveCallCount: downgradeCalls.length,\n inspectedSpendUsd: round(spend),\n },\n }),\n );\n }\n }\n\n return {\n findings: findings.sort((left, right) => right.costImpactUsd - left.costImpactUsd),\n wasteAttributions,\n };\n}\n","import type { PricingEntry } from './types.js';\n\nexport const PRICING_CATALOG: PricingEntry[] = [\n {\n id: 'anthropic-claude-haiku-4-5-2026-03-01',\n provider: 'anthropic',\n model: 'claude-haiku-4-5',\n effectiveDate: '2026-03-01',\n inputPer1m: 0.8,\n outputPer1m: 4,\n },\n {\n id: 'anthropic-claude-sonnet-4-5-2026-03-01',\n provider: 'anthropic',\n model: 'claude-sonnet-4-5',\n effectiveDate: '2026-03-01',\n inputPer1m: 3,\n outputPer1m: 15,\n },\n {\n id: 'anthropic-claude-opus-4-2026-03-01',\n provider: 'anthropic',\n model: 'claude-opus-4',\n effectiveDate: '2026-03-01',\n inputPer1m: 15,\n outputPer1m: 75,\n },\n {\n id: 'openai-gpt-4o-2026-03-01',\n provider: 'openai',\n model: 'gpt-4o',\n effectiveDate: '2026-03-01',\n inputPer1m: 2.5,\n outputPer1m: 10,\n },\n {\n id: 'openai-gpt-4.1-mini-2026-03-01',\n provider: 'openai',\n model: 'gpt-4.1-mini',\n effectiveDate: '2026-03-01',\n inputPer1m: 0.4,\n outputPer1m: 1.6,\n },\n {\n id: 'google-gemini-2.0-flash-2026-03-01',\n provider: 'google',\n model: 'gemini-2.0-flash',\n effectiveDate: '2026-03-01',\n inputPer1m: 0.35,\n outputPer1m: 1.4,\n },\n {\n id: 'meta-llama-3.3-70b-2026-03-01',\n provider: 'meta',\n model: 'llama-3.3-70b-instruct',\n effectiveDate: '2026-03-01',\n inputPer1m: 0.9,\n outputPer1m: 0.9,\n },\n];\n\nexport function getPricingEntry(provider: string, model: string): PricingEntry | undefined {\n const normalizedProvider = provider.trim().toLowerCase();\n const normalizedModel = model.trim().toLowerCase();\n\n return PRICING_CATALOG.find((entry) => {\n return (\n entry.provider.toLowerCase() === normalizedProvider &&\n entry.model.toLowerCase() === normalizedModel\n );\n });\n}\n\nexport function estimateCostUsd(\n provider: string,\n model: string,\n inputTokens: number,\n outputTokens: number,\n) {\n const entry = getPricingEntry(provider, model);\n\n if (!entry) {\n return null;\n }\n\n const inputCost = (Math.max(inputTokens, 0) / 1_000_000) * entry.inputPer1m;\n const outputCost = (Math.max(outputTokens, 0) / 1_000_000) * entry.outputPer1m;\n\n return Number((inputCost + outputCost).toFixed(8));\n}\n","import type {\n XergRecommendation,\n XergRecommendationCategory,\n XergRecommendationEffort,\n XergRecommendationPriorityBucket,\n XergRecommendationSeverity,\n XergRecommendationSurface,\n} from '@xerg/schemas';\n\nimport type { AuditSummary, Finding } from './types.js';\nimport { sha1 } from './utils/hash.js';\n\ninterface RecommendationTemplate {\n priorityBucket: XergRecommendationPriorityBucket;\n implementationSurface: XergRecommendationSurface;\n category: XergRecommendationCategory;\n severity: XergRecommendationSeverity;\n effort: XergRecommendationEffort;\n titleFn: (finding: Finding) => string;\n summaryFn: (finding: Finding) => string;\n whereToChangeFn: (finding: Finding) => string;\n validationPlanFn: (finding: Finding) => string;\n actionsFn: (finding: Finding) => string[];\n}\n\nconst PRIORITY_RANK: Record<XergRecommendationPriorityBucket, number> = {\n fix_now: 2,\n test_next: 1,\n watch: 0,\n};\n\nconst CONFIDENCE_RANK: Record<XergRecommendation['confidence'], number> = {\n high: 2,\n medium: 1,\n low: 0,\n};\n\nfunction roundCurrency(value: number) {\n return Number(value.toFixed(6));\n}\n\nfunction roundPct(value: number) {\n return Number(value.toFixed(4));\n}\n\nfunction formatScopeLabel(finding: Finding) {\n if (finding.scope === 'global') {\n return 'workspace';\n }\n\n return finding.scopeLabel?.trim() || finding.scopeId;\n}\n\nfunction normalizeRecommendationScope(finding: Finding): XergRecommendation['scope'] {\n if (finding.scope === 'global') {\n return 'workspace';\n }\n\n return 'workflow';\n}\n\nfunction stableScopeKeyForFinding(finding: Finding) {\n if (finding.scope === 'global') {\n return 'workspace';\n }\n\n return finding.scopeId;\n}\n\nfunction resolveScopeId(finding: Finding, scope: XergRecommendation['scope']) {\n return scope === 'workspace' ? 'workspace' : stableScopeKeyForFinding(finding);\n}\n\nfunction dedupKeyForFinding(finding: Finding) {\n const scope = normalizeRecommendationScope(finding);\n return `${finding.kind}:${scope}:${stableScopeKeyForFinding(finding)}`;\n}\n\nfunction recommendationIdForFinding(\n finding: Finding,\n implementationSurface: XergRecommendationSurface,\n) {\n const scope = normalizeRecommendationScope(finding);\n return sha1(\n `rec:v2:${finding.kind}:${scope}:${stableScopeKeyForFinding(finding)}:${implementationSurface}`,\n );\n}\n\nfunction compareRecommendations(left: XergRecommendation, right: XergRecommendation) {\n const priorityDelta = PRIORITY_RANK[right.priorityBucket] - PRIORITY_RANK[left.priorityBucket];\n if (priorityDelta !== 0) {\n return priorityDelta;\n }\n\n if (right.estimatedSavingsUsd !== left.estimatedSavingsUsd) {\n return right.estimatedSavingsUsd - left.estimatedSavingsUsd;\n }\n\n const confidenceDelta = CONFIDENCE_RANK[right.confidence] - CONFIDENCE_RANK[left.confidence];\n if (confidenceDelta !== 0) {\n return confidenceDelta;\n }\n\n return left.title.localeCompare(right.title);\n}\n\nconst templatesByKind: Record<string, RecommendationTemplate> = {\n 'retry-waste': {\n priorityBucket: 'fix_now',\n implementationSurface: 'retry_policy',\n category: 'structural_efficiency',\n severity: 'high',\n effort: 'low',\n titleFn: (finding) => `Reduce retry waste in ${formatScopeLabel(finding)}`,\n summaryFn: (finding) =>\n `${finding.summary} This is confirmed retry overhead, so it is a fix-now issue rather than an experiment.`,\n whereToChangeFn: (finding) =>\n `Reduce retries or add exponential backoff in the retry wrapper for ${formatScopeLabel(finding)}.`,\n validationPlanFn: () =>\n 'Ship the change, then rerun `xerg audit --compare --push` against the same source. Retry waste should drop materially on the next audit.',\n actionsFn: () => [\n 'Lower max retry count.',\n 'Add exponential backoff if none exists.',\n 'Log or alert when retries hit the cap.',\n ],\n },\n 'loop-waste': {\n priorityBucket: 'fix_now',\n implementationSurface: 'loop_guard',\n category: 'structural_efficiency',\n severity: 'high',\n effort: 'medium',\n titleFn: (finding) => `Cap loop depth in ${formatScopeLabel(finding)}`,\n summaryFn: (finding) =>\n `${finding.summary} This is confirmed loop waste and should be fixed before chasing lower-confidence opportunities.`,\n whereToChangeFn: (finding) =>\n `Cap iteration depth or add an early-exit guard in the loop controller for ${formatScopeLabel(finding)}.`,\n validationPlanFn: () =>\n 'Ship the change, then rerun `xerg audit --compare --push`. Loop waste and call volume should fall on the next audit.',\n actionsFn: () => [\n 'Add a hard iteration cap.',\n 'Add a no-progress exit.',\n 'Emit a warning when the cap is hit.',\n ],\n },\n 'context-outlier': {\n priorityBucket: 'test_next',\n implementationSurface: 'prompt_builder',\n category: 'context_hygiene',\n severity: 'medium',\n effort: 'medium',\n titleFn: (finding) => `Trim context in ${formatScopeLabel(finding)}`,\n summaryFn: (finding) =>\n `${finding.summary} Treat this as a reversible optimization test rather than proven waste.`,\n whereToChangeFn: (finding) =>\n `Trim input context in the prompt builder for ${formatScopeLabel(finding)}.`,\n validationPlanFn: () =>\n 'Ship the change, then rerun `xerg audit --compare --push`. Input tokens and context-related spend should fall.',\n actionsFn: () => [\n 'Drop stale context blocks.',\n 'Summarize long histories.',\n 'Cap prompt size for this workflow.',\n ],\n },\n 'idle-spend': {\n priorityBucket: 'test_next',\n implementationSurface: 'scheduler',\n category: 'cadence_activity',\n severity: 'medium',\n effort: 'low',\n titleFn: (finding) => `Review cadence for ${formatScopeLabel(finding)}`,\n summaryFn: (finding) =>\n `${finding.summary} This is usually a scheduling decision, so validate it by lowering or gating activity instead of rewriting the workflow.`,\n whereToChangeFn: (finding) =>\n `Lower cadence or move to event-driven triggers for ${formatScopeLabel(finding)}.`,\n validationPlanFn: () =>\n 'Ship the change, then rerun `xerg audit --compare --push`. Idle spend per day should drop.',\n actionsFn: () => [\n 'Reduce poll frequency.',\n 'Gate runs behind a real trigger.',\n 'Disable runs during dead windows.',\n ],\n },\n 'candidate-downgrade': {\n priorityBucket: 'test_next',\n implementationSurface: 'model_routing',\n category: 'model_fit',\n severity: 'low',\n effort: 'low',\n titleFn: (finding) => `Evaluate a cheaper model for ${formatScopeLabel(finding)}`,\n summaryFn: (finding) =>\n `${finding.summary} This is an A/B candidate: spend may fall, but quality needs to be checked before rollout.`,\n whereToChangeFn: (finding) =>\n `Re-map ${formatScopeLabel(finding)} to a cheaper model in the routing layer.`,\n validationPlanFn: () =>\n 'A/B the cheaper model, then rerun `xerg audit --compare --push`. Confirm spend drops without a quality regression.',\n actionsFn: () => [\n 'Try a cheaper model on this workflow.',\n 'Compare quality on a labeled sample.',\n 'Roll out if acceptable.',\n ],\n },\n 'cache-carryover': {\n priorityBucket: 'test_next',\n implementationSurface: 'user_behavior',\n category: 'context_hygiene',\n severity: 'medium',\n effort: 'low',\n titleFn: () => 'Reset or summarize long Cursor chats',\n summaryFn: (finding) =>\n `${finding.summary} This is about session behavior rather than code structure, so the intervention is to reset context more aggressively.`,\n whereToChangeFn: () =>\n 'Reset or summarize long Cursor chats instead of continuing the same session.',\n validationPlanFn: () =>\n 'Change session behavior, then push a new Cursor usage audit with `--compare --push`. Cache-read share should fall.',\n actionsFn: () => [\n 'Summarize context into a short recall note.',\n 'Start a fresh chat.',\n 'Carry forward only the recall note and necessary facts.',\n ],\n },\n 'max-mode-concentration': {\n priorityBucket: 'test_next',\n implementationSurface: 'user_behavior',\n category: 'model_fit',\n severity: 'medium',\n effort: 'low',\n titleFn: () => 'Reserve max mode for the hardest Cursor turns',\n summaryFn: (finding) =>\n `${finding.summary} The likely fix is changing mode habits or escalation rules, not modifying a prompt builder.`,\n whereToChangeFn: () =>\n 'Reserve max mode for the hardest Cursor turns; default to standard mode.',\n validationPlanFn: () =>\n 'Change your mode defaults, then push a new Cursor usage audit with `--compare --push`. Max-mode spend share should fall.',\n actionsFn: () => [\n 'Start in standard mode.',\n 'Escalate only when standard fails.',\n 'Review any auto-escalation habit.',\n ],\n },\n};\n\nconst unknownTemplate: RecommendationTemplate = {\n priorityBucket: 'watch',\n implementationSurface: 'other',\n category: 'other',\n severity: 'low',\n effort: 'medium',\n titleFn: (finding) => `Review ${finding.title}`,\n summaryFn: (finding) => finding.summary,\n whereToChangeFn: (finding) => `Review ${formatScopeLabel(finding)} with your operator.`,\n validationPlanFn: () =>\n 'Ship any change, then rerun `xerg audit --compare --push` to confirm impact.',\n actionsFn: () => [\n 'Investigate the finding details.',\n 'Decide whether to act.',\n 'Re-audit after the change.',\n ],\n};\n\nfunction buildSingleRecommendation(summary: AuditSummary, finding: Finding): XergRecommendation {\n const template = templatesByKind[finding.kind] ?? unknownTemplate;\n const scope = normalizeRecommendationScope(finding);\n const scopeId = resolveScopeId(finding, scope);\n const scopeLabel = formatScopeLabel(finding);\n const estimatedSavingsPct =\n summary.totalSpendUsd === 0\n ? 0\n : roundPct(Math.min(Math.max(finding.costImpactUsd / summary.totalSpendUsd, 0), 1));\n\n return {\n id: recommendationIdForFinding(finding, template.implementationSurface),\n findingId: finding.id,\n kind: finding.kind,\n title: template.titleFn(finding),\n summary: template.summaryFn(finding),\n priorityBucket: template.priorityBucket,\n recommendedOrder: 0,\n implementationSurface: template.implementationSurface,\n category: template.category,\n severity: template.severity,\n estimatedSavingsUsd: roundCurrency(finding.costImpactUsd),\n estimatedSavingsPct,\n confidence: finding.confidence,\n effort: template.effort,\n scope,\n scopeId,\n scopeLabel,\n whereToChange: template.whereToChangeFn(finding),\n validationPlan: template.validationPlanFn(finding),\n actions: template.actionsFn(finding),\n };\n}\n\nexport function buildRecommendations(summary: AuditSummary): XergRecommendation[] {\n const deduped = new Map<string, XergRecommendation>();\n\n for (const finding of summary.findings) {\n const recommendation = buildSingleRecommendation(summary, finding);\n const key = dedupKeyForFinding(finding);\n const existing = deduped.get(key);\n\n if (!existing) {\n deduped.set(key, recommendation);\n continue;\n }\n\n if (\n recommendation.estimatedSavingsUsd > existing.estimatedSavingsUsd ||\n (recommendation.estimatedSavingsUsd === existing.estimatedSavingsUsd &&\n CONFIDENCE_RANK[recommendation.confidence] > CONFIDENCE_RANK[existing.confidence])\n ) {\n deduped.set(key, recommendation);\n }\n }\n\n return [...deduped.values()].sort(compareRecommendations).map((recommendation, index) => ({\n ...recommendation,\n recommendedOrder: index + 1,\n }));\n}\n","import type {\n DailySpendBreakdown,\n DailyWasteBreakdown,\n NormalizedRun,\n WasteAttribution,\n} from '../types.js';\n\nfunction round(value: number) {\n return Number(value.toFixed(6));\n}\n\nfunction toUtcDay(timestamp: string): string | null {\n const candidate = new Date(timestamp);\n if (Number.isNaN(candidate.getTime())) {\n return null;\n }\n\n return candidate.toISOString().slice(0, 10);\n}\n\nfunction incrementUtcDay(date: string) {\n const candidate = new Date(`${date}T00:00:00.000Z`);\n candidate.setUTCDate(candidate.getUTCDate() + 1);\n return candidate.toISOString().slice(0, 10);\n}\n\nexport function buildObservedUtcDayRange(runs: NormalizedRun[]): string[] {\n const days = runs\n .flatMap((run) => run.calls)\n .map((call) => toUtcDay(call.timestamp))\n .filter((day): day is string => day !== null)\n .sort();\n\n if (days.length === 0) {\n return [];\n }\n\n const range: string[] = [];\n let current = days[0];\n const last = days[days.length - 1];\n\n while (current <= last) {\n range.push(current);\n current = incrementUtcDay(current);\n }\n\n return range;\n}\n\nfunction reconcileDailyTotal<T extends Record<string, number | string>>(\n rows: T[],\n key: keyof T,\n expected: number,\n) {\n if (rows.length === 0) {\n return;\n }\n\n const actual = round(\n rows.reduce((sum, row) => sum + (typeof row[key] === 'number' ? (row[key] as number) : 0), 0),\n );\n const delta = round(expected - actual);\n\n if (delta === 0) {\n return;\n }\n\n const last = rows[rows.length - 1];\n const current = last[key];\n if (typeof current === 'number') {\n last[key] = round(current + delta) as T[keyof T];\n }\n}\n\nexport function buildSpendByDay(runs: NormalizedRun[]): DailySpendBreakdown[] {\n const days = buildObservedUtcDayRange(runs);\n if (days.length === 0) {\n return [];\n }\n\n const byDay = new Map(\n days.map((day) => [\n day,\n { date: day, observedSpendUsd: 0, estimatedSpendUsd: 0, callCount: 0 },\n ]),\n );\n\n for (const run of runs) {\n for (const call of run.calls) {\n const day = toUtcDay(call.timestamp);\n if (!day) {\n continue;\n }\n\n const bucket = byDay.get(day);\n if (!bucket) {\n continue;\n }\n\n bucket.callCount += 1;\n if (call.costSource === 'observed') {\n bucket.observedSpendUsd += call.costUsd;\n } else if (call.costSource === 'estimated') {\n bucket.estimatedSpendUsd += call.costUsd;\n }\n }\n }\n\n const rows = days.map((day) => {\n const bucket = byDay.get(day);\n const observedSpendUsd = round(bucket?.observedSpendUsd ?? 0);\n const estimatedSpendUsd = round(bucket?.estimatedSpendUsd ?? 0);\n\n return {\n date: day,\n observedSpendUsd,\n estimatedSpendUsd,\n spendUsd: round(observedSpendUsd + estimatedSpendUsd),\n callCount: bucket?.callCount ?? 0,\n };\n });\n\n reconcileDailyTotal(\n rows,\n 'observedSpendUsd',\n round(runs.reduce((sum, run) => sum + run.observedCostUsd, 0)),\n );\n reconcileDailyTotal(\n rows,\n 'estimatedSpendUsd',\n round(runs.reduce((sum, run) => sum + run.estimatedCostUsd, 0)),\n );\n\n for (const row of rows) {\n row.spendUsd = round(row.observedSpendUsd + row.estimatedSpendUsd);\n }\n\n return rows;\n}\n\nexport function buildWasteByDay(\n wasteAttributions: WasteAttribution[],\n days: string[],\n expectedWasteUsd: number,\n): DailyWasteBreakdown[] {\n if (days.length === 0) {\n return [];\n }\n\n const byDay = new Map(days.map((day) => [day, 0]));\n\n for (const attribution of wasteAttributions) {\n const day = toUtcDay(attribution.timestamp);\n if (!day || !byDay.has(day)) {\n continue;\n }\n\n byDay.set(day, (byDay.get(day) ?? 0) + attribution.wasteUsd);\n }\n\n const rows = days.map((day) => ({\n date: day,\n wasteUsd: round(byDay.get(day) ?? 0),\n }));\n\n reconcileDailyTotal(rows, 'wasteUsd', round(expectedWasteUsd));\n\n return rows;\n}\n","import { buildRecommendations } from '../recommendations.js';\nimport type {\n AuditRuntime,\n AuditSummary,\n DetectedSourceFile,\n Finding,\n NormalizedRun,\n SpendBreakdown,\n WasteAttribution,\n} from '../types.js';\nimport { sha1 } from '../utils/hash.js';\nimport { isoNow } from '../utils/time.js';\nimport { buildComparisonKey, buildTaxonomyBuckets } from './comparison.js';\nimport { buildObservedUtcDayRange, buildSpendByDay, buildWasteByDay } from './timeseries.js';\n\nfunction buildBreakdown(\n items: { key: string; spendUsd: number; observedSpendUsd: number }[],\n): SpendBreakdown[] {\n const buckets = new Map<\n string,\n { spendUsd: number; observedSpendUsd: number; callCount: number }\n >();\n\n for (const item of items) {\n const current = buckets.get(item.key) ?? { spendUsd: 0, observedSpendUsd: 0, callCount: 0 };\n current.spendUsd += item.spendUsd;\n current.observedSpendUsd += item.observedSpendUsd;\n current.callCount += 1;\n buckets.set(item.key, current);\n }\n\n return Array.from(buckets.entries())\n .map(([key, value]) => {\n const observedShare = value.spendUsd === 0 ? 0 : value.observedSpendUsd / value.spendUsd;\n return {\n key,\n spendUsd: Number(value.spendUsd.toFixed(6)),\n callCount: value.callCount,\n observedShare: Number(observedShare.toFixed(4)),\n };\n })\n .sort((left, right) => right.spendUsd - left.spendUsd);\n}\n\nexport function buildAuditSummary(input: {\n runtime: AuditRuntime;\n runs: NormalizedRun[];\n findings: Finding[];\n wasteAttributions: WasteAttribution[];\n sources: DetectedSourceFile[];\n since?: string;\n dbPath?: string;\n comparisonKeyOverride?: string;\n}): AuditSummary {\n const callCount = input.runs.reduce((sum, run) => sum + run.calls.length, 0);\n const totalSpendUsd = input.runs.reduce((sum, run) => sum + run.totalCostUsd, 0);\n const observedSpendUsd = input.runs.reduce((sum, run) => sum + run.observedCostUsd, 0);\n const estimatedSpendUsd = input.runs.reduce((sum, run) => sum + run.estimatedCostUsd, 0);\n const wasteSpendUsd = input.findings\n .filter((finding) => finding.classification === 'waste')\n .reduce((sum, finding) => sum + finding.costImpactUsd, 0);\n const opportunitySpendUsd = input.findings\n .filter((finding) => finding.classification === 'opportunity')\n .reduce((sum, finding) => sum + finding.costImpactUsd, 0);\n const generatedAt = isoNow();\n const spendByDay = buildSpendByDay(input.runs);\n const observedDays = buildObservedUtcDayRange(input.runs);\n const summary: AuditSummary = {\n auditId: sha1(\n `${generatedAt}:${input.runs.length}:${input.sources.map((source) => source.path).join('|')}`,\n ),\n generatedAt,\n runtime: input.runtime,\n comparisonKey:\n input.comparisonKeyOverride ??\n buildComparisonKey({\n runtime: input.runtime,\n sources: input.sources,\n since: input.since,\n }),\n comparison: null,\n since: input.since,\n runCount: input.runs.length,\n callCount,\n totalSpendUsd: Number(totalSpendUsd.toFixed(6)),\n observedSpendUsd: Number(observedSpendUsd.toFixed(6)),\n estimatedSpendUsd: Number(estimatedSpendUsd.toFixed(6)),\n wasteSpendUsd: Number(wasteSpendUsd.toFixed(6)),\n opportunitySpendUsd: Number(opportunitySpendUsd.toFixed(6)),\n structuralWasteRate: Number(\n (totalSpendUsd === 0 ? 0 : wasteSpendUsd / totalSpendUsd).toFixed(4),\n ),\n wasteByKind: buildTaxonomyBuckets(input.findings, 'waste'),\n opportunityByKind: buildTaxonomyBuckets(input.findings, 'opportunity'),\n spendByWorkflow: buildBreakdown(\n input.runs.map((run) => ({\n key: run.workflow,\n spendUsd: run.totalCostUsd,\n observedSpendUsd: run.observedCostUsd,\n })),\n ),\n spendByModel: buildBreakdown(\n input.runs.flatMap((run) =>\n run.calls.map((call) => ({\n key: `${call.provider}/${call.model}`,\n spendUsd: call.costUsd,\n observedSpendUsd: call.costSource === 'observed' ? call.costUsd : 0,\n })),\n ),\n ),\n spendByDay,\n wasteByDay: buildWasteByDay(input.wasteAttributions, observedDays, wasteSpendUsd),\n findings: input.findings,\n recommendations: [],\n notes: [\n 'Cost per outcome is intentionally unavailable in v0. Xerg is measuring waste intelligence only.',\n 'Opportunity findings are directional recommendations, not proven waste.',\n ],\n sourceFiles: input.sources,\n dbPath: input.dbPath,\n };\n\n summary.recommendations = buildRecommendations(summary);\n\n return summary;\n}\n","import { basename } from 'node:path';\n\nimport { detectHermesSources } from './detect/hermes.js';\nimport { detectOpenClawSources } from './detect/openclaw.js';\nimport { normalizeHermesSources } from './normalize/hermes.js';\nimport { normalizeOpenClawSources } from './normalize/openclaw.js';\nimport type { AgentRuntime, AuditOptions, DetectedSourceFile, DoctorReport } from './types.js';\nimport {\n getDefaultHermesGatewayPattern,\n getDefaultHermesSessionsPattern,\n getDefaultOpenClawGatewayPattern,\n getDefaultOpenClawSessionsPattern,\n} from './utils/paths.js';\n\nexport interface RuntimeAdapter {\n runtime: AgentRuntime;\n productName: string;\n detectSources: (options: AuditOptions) => Promise<DetectedSourceFile[]>;\n normalizeSources: typeof normalizeOpenClawSources;\n noSourceNotes: string[];\n gatewayNote: string;\n sessionNote: string;\n noDataError: (commandPrefix: string) => string;\n defaultPaths: () => {\n runtime: AgentRuntime;\n gatewayPattern: string;\n sessionsPattern: string;\n };\n}\n\nconst RUNTIME_ADAPTERS: Record<AgentRuntime, RuntimeAdapter> = {\n openclaw: {\n runtime: 'openclaw',\n productName: 'OpenClaw',\n detectSources: detectOpenClawSources,\n normalizeSources: normalizeOpenClawSources,\n noSourceNotes: [\n 'No OpenClaw gateway logs or session files were detected.',\n 'Doctor checks local defaults by default. Use --log-file or --sessions-dir if your OpenClaw data lives outside the defaults.',\n 'Use --remote or --railway to inspect remote OpenClaw targets.',\n ],\n gatewayNote: 'Gateway logs detected. These are preferred when cost metadata is present.',\n sessionNote: 'Session transcript fallback detected. Xerg will extract usage metadata only.',\n noDataError: (commandPrefix: string) =>\n `No OpenClaw sources were detected. Run \\`${commandPrefix} doctor --runtime openclaw\\` or provide --log-file / --sessions-dir.`,\n defaultPaths: () => ({\n runtime: 'openclaw',\n gatewayPattern: getDefaultOpenClawGatewayPattern(),\n sessionsPattern: getDefaultOpenClawSessionsPattern(),\n }),\n },\n hermes: {\n runtime: 'hermes',\n productName: 'Hermes',\n detectSources: detectHermesSources,\n normalizeSources: normalizeHermesSources,\n noSourceNotes: [\n 'No Hermes gateway logs or session files were detected.',\n 'Doctor checks local defaults by default. Use --log-file or --sessions-dir if your Hermes data lives outside the defaults.',\n 'Hermes remote transport is not part of this rollout yet.',\n ],\n gatewayNote:\n 'Hermes gateway logs detected. Xerg prefers agent.log entries when billable model-call records are present.',\n sessionNote: 'Hermes session transcripts detected. Xerg will extract usage metadata only.',\n noDataError: (commandPrefix: string) =>\n `No Hermes sources were detected. Run \\`${commandPrefix} doctor --runtime hermes\\` or provide --log-file / --sessions-dir.`,\n defaultPaths: () => ({\n runtime: 'hermes',\n gatewayPattern: getDefaultHermesGatewayPattern(),\n sessionsPattern: getDefaultHermesSessionsPattern(),\n }),\n },\n};\n\ninterface RuntimeCandidate {\n adapter: RuntimeAdapter;\n sources: DetectedSourceFile[];\n usable: boolean;\n}\n\nexport function getRuntimeAdapter(runtime: AgentRuntime) {\n return RUNTIME_ADAPTERS[runtime];\n}\n\nfunction hasExplicitLocalPaths(options: AuditOptions) {\n return Boolean(options.logFile || options.sessionsDir);\n}\n\nfunction inferRuntimeFromExplicitPaths(options: AuditOptions): AgentRuntime | null {\n const paths = [options.logFile, options.sessionsDir]\n .filter((path): path is string => Boolean(path))\n .map((path) => path.replace(/\\\\/g, '/').toLowerCase());\n\n if (paths.length === 0) {\n return null;\n }\n\n const hints = new Set<AgentRuntime>();\n\n for (const path of paths) {\n const name = basename(path).toLowerCase();\n\n if (\n path.includes('/.openclaw/') ||\n path.includes('/openclaw/') ||\n path.includes('/tmp/openclaw') ||\n name.includes('openclaw')\n ) {\n hints.add('openclaw');\n }\n\n if (\n path.includes('/.hermes/') ||\n path.includes('/hermes/') ||\n path.includes('/.hermes') ||\n name.includes('hermes') ||\n name.startsWith('agent.log')\n ) {\n hints.add('hermes');\n }\n }\n\n return hints.size === 1 ? Array.from(hints)[0] : null;\n}\n\nasync function probeRuntimeCandidate(\n adapter: RuntimeAdapter,\n options: AuditOptions,\n): Promise<RuntimeCandidate> {\n const sources = await adapter.detectSources(options);\n return {\n adapter,\n sources,\n usable: sources.length > 0,\n };\n}\n\nfunction buildResolvedDoctorNotes(adapter: RuntimeAdapter, sources: DetectedSourceFile[]) {\n if (sources.length === 0) {\n return adapter.noSourceNotes;\n }\n\n const notes: string[] = [];\n if (sources.some((source) => source.kind === 'gateway')) {\n notes.push(adapter.gatewayNote);\n }\n if (sources.some((source) => source.kind === 'sessions')) {\n notes.push(adapter.sessionNote);\n }\n\n return notes;\n}\n\nfunction buildResolvedDoctorReport(\n adapter: RuntimeAdapter,\n sources: DetectedSourceFile[],\n): DoctorReport {\n return {\n canAudit: sources.length > 0,\n mode: sources.length > 0 ? 'resolved' : 'none',\n runtime: sources.length > 0 ? adapter.runtime : null,\n sources,\n defaults: [adapter.defaultPaths()],\n notes: buildResolvedDoctorNotes(adapter, sources),\n };\n}\n\nfunction buildAutoNoDataDoctorReport(candidates: RuntimeCandidate[]): DoctorReport {\n return {\n canAudit: false,\n mode: 'none',\n runtime: null,\n sources: candidates.flatMap((candidate) => candidate.sources),\n defaults: Object.values(RUNTIME_ADAPTERS).map((adapter) => adapter.defaultPaths()),\n notes: [\n 'No supported local runtime sources were detected.',\n 'Auto-detection checked both OpenClaw and Hermes local defaults.',\n 'Use --runtime openclaw or --runtime hermes with --log-file / --sessions-dir when you want to point Xerg at explicit local paths.',\n ],\n };\n}\n\nfunction buildAutoAmbiguousDoctorReport(candidates: RuntimeCandidate[]): DoctorReport {\n return {\n canAudit: false,\n mode: 'ambiguous',\n runtime: null,\n sources: candidates.flatMap((candidate) => candidate.sources),\n defaults: Object.values(RUNTIME_ADAPTERS).map((adapter) => adapter.defaultPaths()),\n notes: [\n 'Both OpenClaw and Hermes local sources were detected.',\n 'Re-run doctor with --runtime openclaw or --runtime hermes to choose the local runtime explicitly.',\n ],\n };\n}\n\nfunction buildExplicitNoDataError(\n options: AuditOptions,\n hintedRuntime: AgentRuntime | null,\n): string {\n const commandPrefix = options.commandPrefix ?? 'xerg';\n\n if (hintedRuntime) {\n return getRuntimeAdapter(hintedRuntime).noDataError(commandPrefix);\n }\n\n return `No supported local runtime sources were detected. Run \\`${commandPrefix} doctor\\`, or use --runtime openclaw / --runtime hermes with --log-file / --sessions-dir.`;\n}\n\nfunction buildExplicitNoDataDoctorReport(\n candidates: RuntimeCandidate[],\n hintedRuntime: AgentRuntime | null,\n): DoctorReport {\n if (hintedRuntime) {\n const adapter = getRuntimeAdapter(hintedRuntime);\n return {\n canAudit: false,\n mode: 'none',\n runtime: null,\n sources: [],\n defaults: [adapter.defaultPaths()],\n notes: [\n `No ${adapter.productName} sources were detected from the provided local paths.`,\n `Verify --log-file / --sessions-dir and re-run doctor with --runtime ${adapter.runtime} if needed.`,\n ],\n };\n }\n\n return {\n canAudit: false,\n mode: 'none',\n runtime: null,\n sources: candidates.flatMap((candidate) => candidate.sources),\n defaults: Object.values(RUNTIME_ADAPTERS).map((adapter) => adapter.defaultPaths()),\n notes: [\n 'No supported local runtime sources were detected from the provided local paths.',\n 'Verify --log-file / --sessions-dir and re-run doctor with --runtime openclaw or --runtime hermes if needed.',\n ],\n };\n}\n\nexport function getRuntimeProductName(runtime: AgentRuntime) {\n return getRuntimeAdapter(runtime).productName;\n}\n\nexport async function resolveRuntimeCandidates(options: AuditOptions) {\n return Promise.all(\n (Object.values(RUNTIME_ADAPTERS) as RuntimeAdapter[]).map((adapter) =>\n probeRuntimeCandidate(adapter, options),\n ),\n );\n}\n\nexport async function resolveLocalAgentRuntime(options: AuditOptions) {\n const requestedRuntime = options.runtime ?? 'auto';\n\n if (requestedRuntime !== 'auto') {\n const adapter = getRuntimeAdapter(requestedRuntime);\n const sources = await adapter.detectSources(options);\n return {\n adapter,\n sources,\n };\n }\n\n const candidates = await resolveRuntimeCandidates(options);\n const usableCandidates = candidates.filter((candidate) => candidate.usable);\n\n if (hasExplicitLocalPaths(options)) {\n const hintedRuntime = inferRuntimeFromExplicitPaths(options);\n if (hintedRuntime) {\n const hintedCandidate = usableCandidates.find(\n (candidate) => candidate.adapter.runtime === hintedRuntime,\n );\n if (hintedCandidate) {\n return {\n adapter: hintedCandidate.adapter,\n sources: hintedCandidate.sources,\n };\n }\n }\n\n if (usableCandidates.length === 0) {\n throw new Error(buildExplicitNoDataError(options, hintedRuntime));\n }\n\n if (usableCandidates.length === 1) {\n return {\n adapter: usableCandidates[0].adapter,\n sources: usableCandidates[0].sources,\n };\n }\n\n throw new Error(\n 'Could not determine whether the provided local files belong to OpenClaw or Hermes. Re-run with --runtime openclaw or --runtime hermes.',\n );\n }\n\n if (usableCandidates.length === 0) {\n throw new Error(\n `No supported local runtime sources were detected. Run \\`${options.commandPrefix ?? 'xerg'} doctor\\`, or use --runtime openclaw / --runtime hermes with --log-file / --sessions-dir.`,\n );\n }\n\n if (usableCandidates.length > 1) {\n throw new Error(\n 'Both OpenClaw and Hermes local sources were detected. Re-run with --runtime openclaw or --runtime hermes.',\n );\n }\n\n return {\n adapter: usableCandidates[0].adapter,\n sources: usableCandidates[0].sources,\n };\n}\n\nexport async function doctorAgentRuntime(options: AuditOptions): Promise<DoctorReport> {\n const requestedRuntime = options.runtime ?? 'auto';\n\n if (requestedRuntime !== 'auto') {\n options.onProgress?.(`Checking local ${getRuntimeProductName(requestedRuntime)} defaults...`);\n const adapter = getRuntimeAdapter(requestedRuntime);\n const sources = await adapter.detectSources(options);\n options.onProgress?.(\n sources.length > 0\n ? `Detected ${sources.length} local source file${sources.length === 1 ? '' : 's'}.`\n : `No local ${adapter.productName} source files were detected.`,\n );\n return buildResolvedDoctorReport(adapter, sources);\n }\n\n options.onProgress?.('Checking local runtime defaults...');\n const candidates = await resolveRuntimeCandidates(options);\n const usableCandidates = candidates.filter((candidate) => candidate.usable);\n const detectedCount = candidates.reduce((sum, candidate) => sum + candidate.sources.length, 0);\n options.onProgress?.(\n detectedCount > 0\n ? `Detected ${detectedCount} local source file${detectedCount === 1 ? '' : 's'} across supported runtimes.`\n : 'No local runtime source files were detected.',\n );\n\n if (hasExplicitLocalPaths(options)) {\n const hintedRuntime = inferRuntimeFromExplicitPaths(options);\n if (hintedRuntime) {\n const hintedCandidate = usableCandidates.find(\n (candidate) => candidate.adapter.runtime === hintedRuntime,\n );\n if (hintedCandidate) {\n return buildResolvedDoctorReport(hintedCandidate.adapter, hintedCandidate.sources);\n }\n }\n\n if (usableCandidates.length === 0) {\n return buildExplicitNoDataDoctorReport(candidates, hintedRuntime);\n }\n\n if (usableCandidates.length === 1) {\n return buildResolvedDoctorReport(usableCandidates[0].adapter, usableCandidates[0].sources);\n }\n\n return {\n canAudit: false,\n mode: 'ambiguous',\n runtime: null,\n sources: candidates.flatMap((candidate) => candidate.sources),\n defaults: Object.values(RUNTIME_ADAPTERS).map((adapter) => adapter.defaultPaths()),\n notes: [\n 'Could not determine whether the provided local files belong to OpenClaw or Hermes.',\n 'Re-run doctor with --runtime openclaw or --runtime hermes to choose the local runtime explicitly.',\n ],\n };\n }\n\n if (usableCandidates.length === 0) {\n return buildAutoNoDataDoctorReport(candidates);\n }\n\n if (usableCandidates.length > 1) {\n return buildAutoAmbiguousDoctorReport(usableCandidates);\n }\n\n return buildResolvedDoctorReport(usableCandidates[0].adapter, usableCandidates[0].sources);\n}\n\nexport function buildRuntimeNoDataError(runtime: AgentRuntime, commandPrefix = 'xerg') {\n return getRuntimeAdapter(runtime).noDataError(commandPrefix);\n}\n","import { homedir } from 'node:os';\nimport { basename, join } from 'node:path';\n\nimport { logFileHasBillableRecords } from '../normalize/hermes.js';\nimport type { AuditOptions, DetectedSourceFile } from '../types.js';\nimport { getDefaultHermesGatewayPattern, getDefaultHermesSessionsPattern } from '../utils/paths.js';\nimport { collectGlobMatches, toDetected } from './shared.js';\n\nfunction getDefaultAgentLogPattern() {\n return join(process.env.HOME ?? homedir(), '.hermes', 'logs', 'agent.log*');\n}\n\nfunction getDefaultGatewayLogPattern() {\n return join(process.env.HOME ?? homedir(), '.hermes', 'logs', 'gateway.log*');\n}\n\nfunction getDefaultSessionsDirPattern() {\n return join(process.env.HOME ?? homedir(), '.hermes', 'sessions', '**', '*');\n}\n\nfunction isHermesSessionTranscript(path: string) {\n const lowerName = basename(path).toLowerCase();\n if (lowerName === 'sessions.json') {\n return false;\n }\n\n return lowerName.endsWith('.jsonl') || lowerName.endsWith('.json');\n}\n\nasync function collectHermesSessionMatches(baseDir: string) {\n const matches = await collectGlobMatches('**/*', {\n cwd: baseDir,\n resolveWith: baseDir,\n });\n\n return matches.filter((match) => isHermesSessionTranscript(match));\n}\n\nasync function pickPreferredLogFamily() {\n const [agentMatches, gatewayMatches] = await Promise.all([\n collectGlobMatches(getDefaultAgentLogPattern()),\n collectGlobMatches(getDefaultGatewayLogPattern()),\n ]);\n\n if (agentMatches.some((path) => logFileHasBillableRecords(path))) {\n return agentMatches;\n }\n\n if (gatewayMatches.some((path) => logFileHasBillableRecords(path))) {\n return gatewayMatches;\n }\n\n return [...agentMatches, ...gatewayMatches];\n}\n\nexport async function detectHermesSources(options: AuditOptions): Promise<DetectedSourceFile[]> {\n const explicitSources: DetectedSourceFile[] = [];\n\n if (options.logFile) {\n const detected = toDetected(options.logFile, 'gateway', 'hermes');\n if (detected) {\n explicitSources.push(detected);\n }\n }\n\n if (options.sessionsDir) {\n const matches = await collectHermesSessionMatches(options.sessionsDir);\n\n for (const match of matches) {\n const detected = toDetected(match, 'sessions', 'hermes');\n if (detected) {\n explicitSources.push(detected);\n }\n }\n }\n\n if (explicitSources.length > 0) {\n return explicitSources.sort((left, right) => right.mtimeMs - left.mtimeMs);\n }\n\n const [gatewayMatches, sessionMatches] = await Promise.all([\n pickPreferredLogFamily(),\n collectGlobMatches(getDefaultSessionsDirPattern()),\n ]);\n\n const detected = [\n ...gatewayMatches.map((path) => toDetected(path, 'gateway', 'hermes')).filter(Boolean),\n ...sessionMatches\n .filter((path) => isHermesSessionTranscript(path))\n .map((path) => toDetected(path, 'sessions', 'hermes'))\n .filter(Boolean),\n ] as DetectedSourceFile[];\n\n return detected.sort((left, right) => right.mtimeMs - left.mtimeMs);\n}\n\nexport function getHermesDefaultDoctorPaths() {\n return {\n runtime: 'hermes' as const,\n gatewayPattern: getDefaultHermesGatewayPattern(),\n sessionsPattern: getDefaultHermesSessionsPattern(),\n };\n}\n","import { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\n\nimport { estimateCostUsd } from '../pricing-catalog.js';\nimport type { DetectedSourceFile, NormalizedCall, NormalizedRun } from '../types.js';\nimport { sha1 } from '../utils/hash.js';\nimport { asBoolean, asNumber, asString, getNestedValue, pickMetadata } from '../utils/records.js';\nimport { parseSince, toIsoOrNow } from '../utils/time.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nconst PRICING_PROVIDER_PREFIXES = new Set(['anthropic', 'openai', 'google', 'meta']);\n\nfunction parseJsonLine(line: string): JsonRecord | null {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n try {\n return JSON.parse(trimmed) as JsonRecord;\n } catch {}\n\n const jsonStart = trimmed.indexOf('{');\n const jsonEnd = trimmed.lastIndexOf('}');\n if (jsonStart < 0 || jsonEnd <= jsonStart) {\n return null;\n }\n\n try {\n return JSON.parse(trimmed.slice(jsonStart, jsonEnd + 1)) as JsonRecord;\n } catch {\n return null;\n }\n}\n\nfunction parseJsonLines(path: string) {\n const content = readFileSync(path, 'utf8');\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const records: JsonRecord[] = [];\n\n for (const line of lines) {\n const parsed = parseJsonLine(line);\n if (parsed) {\n records.push(parsed);\n }\n }\n\n return records;\n}\n\nfunction flattenSourceRecords(source: DetectedSourceFile) {\n const records = parseJsonLines(source.path);\n\n if (source.kind !== 'sessions') {\n return records;\n }\n\n return records.flatMap((record) => expandSessionRecord(record));\n}\n\nfunction expandSessionRecord(record: JsonRecord): JsonRecord[] {\n const messages = getNestedValue(record, [['messages']]);\n if (!Array.isArray(messages)) {\n return [record];\n }\n\n return messages\n .filter((message): message is JsonRecord => Boolean(message) && typeof message === 'object')\n .map((message, index) => ({\n ...record,\n message,\n timestamp:\n asString(\n getNestedValue(message, [['timestamp'], ['created_at'], ['createdAt'], ['time']]),\n ) ??\n asString(\n getNestedValue(record, [['timestamp'], ['created_at'], ['createdAt'], ['updated_at']]),\n ) ??\n `${sourceTimestampSeed(record)}:${index}`,\n }));\n}\n\nfunction sourceTimestampSeed(record: JsonRecord) {\n return (\n asString(getNestedValue(record, [['updated_at'], ['created_at'], ['timestamp'], ['id']])) ??\n 'session'\n );\n}\n\nfunction normalizeProviderAndModel(record: JsonRecord) {\n const rawProvider =\n asString(\n getNestedValue(record, [\n ['provider'],\n ['provider_name'],\n ['runtime', 'provider'],\n ['usage', 'provider'],\n ['token_usage', 'provider'],\n ['message', 'provider'],\n ['message', 'usage', 'provider'],\n ]),\n ) ?? 'unknown';\n\n const rawModel =\n asString(\n getNestedValue(record, [\n ['model'],\n ['model_name'],\n ['runtime', 'model'],\n ['usage', 'model'],\n ['token_usage', 'model'],\n ['message', 'model'],\n ['message', 'usage', 'model'],\n ]),\n ) ?? 'unknown-model';\n\n if (rawModel.includes('/')) {\n const [providerPrefix, ...rest] = rawModel.split('/');\n if (PRICING_PROVIDER_PREFIXES.has(providerPrefix.toLowerCase()) && rest.length > 0) {\n return {\n provider: providerPrefix.toLowerCase(),\n model: rest.join('/'),\n };\n }\n }\n\n return {\n provider: rawProvider.toLowerCase(),\n model: rawModel,\n };\n}\n\nfunction inferWorkflow(record: JsonRecord, sourcePath: string) {\n return (\n asString(\n getNestedValue(record, [\n ['workflow'],\n ['job_name'],\n ['task_class'],\n ['taskClass'],\n ['agent_name'],\n ['agent', 'name'],\n ['source'],\n ['session', 'source'],\n ['session_key'],\n ['session_id'],\n ['sessionId'],\n ['title'],\n ]),\n ) ?? basename(sourcePath).replace(/\\.(jsonl|json|log)(\\.\\d+)?$/i, '')\n );\n}\n\nfunction inferEnvironment(record: JsonRecord) {\n return (\n asString(getNestedValue(record, [['environment'], ['env'], ['metadata', 'environment']])) ??\n 'local'\n );\n}\n\nfunction inferRunKey(record: JsonRecord, workflow: string, index: number, sourcePath: string) {\n return (\n asString(\n getNestedValue(record, [\n ['run_id'],\n ['runId'],\n ['session_id'],\n ['sessionId'],\n ['session_key'],\n ['thread_id'],\n ['threadId'],\n ['trace_id'],\n ['traceId'],\n ['conversation_id'],\n ['conversationId'],\n ['id'],\n ]),\n ) ?? `${sourcePath}:${workflow}:${index}`\n );\n}\n\nfunction inferTaskClass(record: JsonRecord, workflow: string) {\n return (\n asString(\n getNestedValue(record, [\n ['task_class'],\n ['taskClass'],\n ['event'],\n ['source'],\n ['message', 'source'],\n ]),\n ) ?? workflow.toLowerCase()\n );\n}\n\nfunction inferToolCalls(record: JsonRecord) {\n const direct =\n asNumber(\n getNestedValue(record, [\n ['tool_calls'],\n ['toolCalls'],\n ['usage', 'tool_calls'],\n ['message', 'usage', 'tool_calls'],\n ]),\n ) ?? null;\n\n if (direct !== null) {\n return direct;\n }\n\n const toolCalls = getNestedValue(record, [\n ['tool_calls'],\n ['toolCalls'],\n ['message', 'tool_calls'],\n ]);\n return Array.isArray(toolCalls) ? toolCalls.length : 0;\n}\n\nfunction extractUsage(record: JsonRecord) {\n const inputTokens =\n asNumber(\n getNestedValue(record, [\n ['input_tokens'],\n ['inputTokens'],\n ['usage', 'input_tokens'],\n ['usage', 'inputTokens'],\n ['usage', 'prompt_tokens'],\n ['token_usage', 'input_tokens'],\n ['token_usage', 'prompt_tokens'],\n ['token_usage', 'input'],\n ['message', 'usage', 'input_tokens'],\n ['message', 'usage', 'prompt_tokens'],\n ['message', 'token_usage', 'input_tokens'],\n ]),\n ) ?? 0;\n\n const outputTokens =\n asNumber(\n getNestedValue(record, [\n ['output_tokens'],\n ['outputTokens'],\n ['usage', 'output_tokens'],\n ['usage', 'outputTokens'],\n ['usage', 'completion_tokens'],\n ['token_usage', 'output_tokens'],\n ['token_usage', 'completion_tokens'],\n ['token_usage', 'output'],\n ['message', 'usage', 'output_tokens'],\n ['message', 'usage', 'completion_tokens'],\n ['message', 'token_usage', 'output_tokens'],\n ]),\n ) ?? 0;\n\n const observedCost =\n asNumber(\n getNestedValue(record, [\n ['cost_usd'],\n ['costUsd'],\n ['estimated_cost_usd'],\n ['estimatedCostUsd'],\n ['total_cost_usd'],\n ['usage', 'cost_usd'],\n ['usage', 'costUsd'],\n ['usage', 'estimated_cost_usd'],\n ['usage', 'total_cost_usd'],\n ['token_usage', 'cost_usd'],\n ['token_usage', 'total_cost_usd'],\n ['cost', 'usd'],\n ['cost', 'total_usd'],\n ['pricing', 'total_usd'],\n ['message', 'usage', 'cost_usd'],\n ['message', 'cost_usd'],\n ]),\n ) ?? null;\n\n return {\n inputTokens,\n outputTokens,\n observedCost,\n };\n}\n\nfunction shouldTreatAsCall(record: JsonRecord) {\n const { inputTokens, outputTokens, observedCost } = extractUsage(record);\n return inputTokens > 0 || outputTokens > 0 || observedCost !== null;\n}\n\nfunction buildCall(\n source: DetectedSourceFile,\n record: JsonRecord,\n runId: string,\n index: number,\n): NormalizedCall {\n const { provider, model } = normalizeProviderAndModel(record);\n const workflow = inferWorkflow(record, source.path);\n const { inputTokens, outputTokens, observedCost } = extractUsage(record);\n const estimatedCost = estimateCostUsd(provider, model, inputTokens, outputTokens);\n const timestamp = toIsoOrNow(\n getNestedValue(record, [\n ['timestamp'],\n ['createdAt'],\n ['created_at'],\n ['time'],\n ['updated_at'],\n ]),\n );\n const attempt =\n asNumber(\n getNestedValue(record, [['attempt'], ['usage', 'attempt'], ['metadata', 'attempt']]),\n ) ?? null;\n const iteration =\n asNumber(\n getNestedValue(record, [['iteration'], ['loop_iteration'], ['metadata', 'iteration']]),\n ) ?? null;\n const retries =\n asNumber(getNestedValue(record, [['retries'], ['retry_count'], ['metadata', 'retries']])) ?? 0;\n const costUsd = observedCost ?? estimatedCost ?? 0;\n\n return {\n id: sha1(`${runId}:${source.path}:${index}:${model}:${timestamp}:${costUsd}`),\n runId,\n timestamp,\n provider,\n model,\n inputTokens,\n outputTokens,\n costUsd,\n costSource:\n observedCost !== null ? 'observed' : estimatedCost !== null ? 'estimated' : 'unpriced',\n latencyMs:\n asNumber(getNestedValue(record, [['latency_ms'], ['latencyMs'], ['usage', 'latency_ms']])) ??\n null,\n toolCalls: inferToolCalls(record),\n retries,\n attempt,\n iteration,\n status:\n asString(getNestedValue(record, [['status'], ['level'], ['result'], ['error', 'type']])) ??\n null,\n taskClass: inferTaskClass(record, workflow),\n cacheHit: asBoolean(\n getNestedValue(record, [['cache_hit'], ['cacheHit'], ['usage', 'cache_hit']]),\n ),\n cacheCostUsd:\n asNumber(\n getNestedValue(record, [['cache_cost_usd'], ['cacheCostUsd'], ['usage', 'cache_cost_usd']]),\n ) ?? null,\n metadata: pickMetadata(record, [\n 'event',\n 'type',\n 'source',\n 'session_id',\n 'sessionId',\n 'thread_id',\n 'trace_id',\n ]),\n };\n}\n\nexport function logFileHasBillableRecords(path: string) {\n return flattenSourceRecords({\n kind: 'gateway',\n runtime: 'hermes',\n path,\n sizeBytes: 0,\n mtimeMs: 0,\n }).some((record) => shouldTreatAsCall(record));\n}\n\nexport function normalizeHermesSources(\n sources: DetectedSourceFile[],\n since?: string,\n): NormalizedRun[] {\n const cutoff = parseSince(since);\n const runsById = new Map<string, NormalizedRun>();\n\n for (const source of sources) {\n const records = flattenSourceRecords(source);\n\n records.forEach((record, index) => {\n if (!shouldTreatAsCall(record)) {\n return;\n }\n\n const workflow = inferWorkflow(record, source.path);\n const timestamp = toIsoOrNow(\n getNestedValue(record, [\n ['timestamp'],\n ['createdAt'],\n ['created_at'],\n ['time'],\n ['updated_at'],\n ]),\n );\n if (cutoff && new Date(timestamp).getTime() < cutoff) {\n return;\n }\n\n const runKey = inferRunKey(record, workflow, index, source.path);\n const runId = sha1(`${source.path}:${runKey}`);\n const call = buildCall(source, record, runId, index);\n const existing = runsById.get(runId);\n\n if (!existing) {\n runsById.set(runId, {\n id: runId,\n sourceKind: source.kind,\n sourcePath: source.path,\n timestamp,\n workflow,\n environment: inferEnvironment(record),\n tags: {\n sourceKind: source.kind,\n },\n calls: [call],\n totalCostUsd: call.costUsd,\n totalTokens: call.inputTokens + call.outputTokens,\n observedCostUsd: call.costSource === 'observed' ? call.costUsd : 0,\n estimatedCostUsd: call.costSource === 'estimated' ? call.costUsd : 0,\n });\n return;\n }\n\n existing.calls.push(call);\n existing.totalCostUsd = Number((existing.totalCostUsd + call.costUsd).toFixed(8));\n existing.totalTokens += call.inputTokens + call.outputTokens;\n existing.observedCostUsd += call.costSource === 'observed' ? call.costUsd : 0;\n existing.estimatedCostUsd += call.costSource === 'estimated' ? call.costUsd : 0;\n if (timestamp < existing.timestamp) {\n existing.timestamp = timestamp;\n }\n });\n }\n\n return Array.from(runsById.values()).sort((left, right) =>\n left.timestamp < right.timestamp ? -1 : 1,\n );\n}\n","export function getNestedValue(input: unknown, paths: string[][]): unknown {\n if (!input || typeof input !== 'object') {\n return null;\n }\n\n const record = input as Record<string, unknown>;\n\n for (const path of paths) {\n let current: unknown = record;\n\n for (const segment of path) {\n if (!current || typeof current !== 'object' || !(segment in current)) {\n current = undefined;\n break;\n }\n\n current = (current as Record<string, unknown>)[segment];\n }\n\n if (current !== undefined) {\n return current;\n }\n }\n\n return null;\n}\n\nexport function asNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : null;\n }\n\n return null;\n}\n\nexport function asString(value: unknown): string | null {\n if (typeof value === 'string' && value.trim() !== '') {\n return value.trim();\n }\n\n return null;\n}\n\nexport function asBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string') {\n return ['true', '1', 'yes'].includes(value.trim().toLowerCase());\n }\n\n if (typeof value === 'number') {\n return value > 0;\n }\n\n return false;\n}\n\nexport function pickMetadata(input: Record<string, unknown>, keys: string[]) {\n const output: Record<string, string | number | boolean | null> = {};\n\n for (const key of keys) {\n const value = input[key];\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n output[key] = value;\n }\n }\n\n return output;\n}\n","import { mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { platform } from 'node:process';\n\nfunction getUserHome() {\n return process.env.HOME ?? homedir();\n}\n\nexport function getAppPaths() {\n const home = getUserHome();\n return platform === 'darwin'\n ? {\n data: join(home, 'Library', 'Application Support', 'xerg'),\n config: join(home, 'Library', 'Preferences', 'xerg'),\n cache: join(home, 'Library', 'Caches', 'xerg'),\n }\n : platform === 'win32'\n ? {\n data: join(process.env.LOCALAPPDATA ?? join(home, 'AppData', 'Local'), 'xerg', 'Data'),\n config: join(process.env.APPDATA ?? join(home, 'AppData', 'Roaming'), 'xerg', 'Config'),\n cache: join(process.env.LOCALAPPDATA ?? join(home, 'AppData', 'Local'), 'xerg', 'Cache'),\n }\n : {\n data: join(process.env.XDG_DATA_HOME ?? join(home, '.local', 'share'), 'xerg'),\n config: join(process.env.XDG_CONFIG_HOME ?? join(home, '.config'), 'xerg'),\n cache: join(process.env.XDG_CACHE_HOME ?? join(home, '.cache'), 'xerg'),\n };\n}\n\nexport function ensureAppPaths() {\n const paths = getAppPaths();\n for (const path of Object.values(paths)) {\n mkdirSync(path, { recursive: true });\n }\n\n return paths;\n}\n\nexport function getDefaultDbPath() {\n return join(getAppPaths().data, 'xerg.db');\n}\n\nexport function getDefaultOpenClawSessionsPattern() {\n return join(getUserHome(), '.openclaw', 'agents', '*', 'sessions', '*.jsonl');\n}\n\nexport function getDefaultOpenClawGatewayPattern() {\n return '/tmp/openclaw/openclaw-*.log';\n}\n\nexport function getDefaultHermesSessionsPattern() {\n return join(getUserHome(), '.hermes', 'sessions', '**', '*.{json,jsonl}');\n}\n\nexport function getDefaultHermesGatewayPattern() {\n return join(getUserHome(), '.hermes', 'logs', 'agent.log* (fallback: gateway.log*)');\n}\n\nexport function getDefaultSessionsPattern() {\n return getDefaultOpenClawSessionsPattern();\n}\n\nexport function getDefaultGatewayPattern() {\n return getDefaultOpenClawGatewayPattern();\n}\n","import { readdirSync, statSync } from 'node:fs';\nimport { isAbsolute, join, resolve, sep } from 'node:path';\n\nimport type { AuditRuntime, DetectedSourceFile, SourceKind } from '../types.js';\n\nexport function toDetected(\n path: string,\n kind: Extract<SourceKind, 'gateway' | 'sessions'>,\n runtime: AuditRuntime,\n): DetectedSourceFile | null {\n try {\n const stats = statSync(path);\n if (!stats.isFile()) {\n return null;\n }\n\n return {\n kind,\n runtime,\n path,\n sizeBytes: stats.size,\n mtimeMs: stats.mtimeMs,\n };\n } catch {\n return null;\n }\n}\n\nexport async function collectGlobMatches(\n pattern: string,\n options?: {\n cwd?: string;\n resolveWith?: string;\n },\n) {\n const baseDir = options?.cwd ? resolve(options.cwd) : isAbsolute(pattern) ? sep : process.cwd();\n const relativePattern = options?.cwd\n ? pattern\n : isAbsolute(pattern)\n ? pattern.slice(baseDir.length)\n : pattern;\n const segments = relativePattern.split('/').filter(Boolean);\n const matches = collectMatchesFromSegments(baseDir, segments);\n\n return matches.map((match) =>\n options?.resolveWith ? resolve(options.resolveWith, match) : match,\n );\n}\n\nfunction collectMatchesFromSegments(currentPath: string, segments: string[]): string[] {\n if (segments.length === 0) {\n return [currentPath];\n }\n\n const [segment, ...rest] = segments;\n\n if (segment === '**') {\n const matches = collectMatchesFromSegments(currentPath, rest);\n\n for (const entry of readDirSafe(currentPath)) {\n if (entry.isDirectory()) {\n matches.push(...collectMatchesFromSegments(join(currentPath, entry.name), segments));\n }\n }\n\n return matches;\n }\n\n const matches: string[] = [];\n const matcher = segmentToRegExp(segment);\n\n for (const entry of readDirSafe(currentPath)) {\n if (!matcher.test(entry.name)) {\n continue;\n }\n\n const nextPath = join(currentPath, entry.name);\n if (rest.length === 0) {\n matches.push(nextPath);\n continue;\n }\n\n if (entry.isDirectory()) {\n matches.push(...collectMatchesFromSegments(nextPath, rest));\n }\n }\n\n return matches;\n}\n\nfunction readDirSafe(path: string) {\n try {\n return readdirSync(path, { withFileTypes: true });\n } catch {\n return [];\n }\n}\n\nfunction segmentToRegExp(segment: string) {\n const escaped = segment.replaceAll(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replaceAll('*', '.*');\n return new RegExp(`^${escaped}$`);\n}\n","import type { AuditOptions, DetectedSourceFile } from '../types.js';\nimport {\n getDefaultOpenClawGatewayPattern,\n getDefaultOpenClawSessionsPattern,\n} from '../utils/paths.js';\nimport { collectGlobMatches, toDetected } from './shared.js';\n\nexport async function detectOpenClawSources(options: AuditOptions): Promise<DetectedSourceFile[]> {\n const explicitSources: DetectedSourceFile[] = [];\n\n if (options.logFile) {\n const detected = toDetected(options.logFile, 'gateway', 'openclaw');\n if (detected) {\n explicitSources.push(detected);\n }\n }\n\n if (options.sessionsDir) {\n const matches = await collectGlobMatches('**/*.jsonl', {\n cwd: options.sessionsDir,\n resolveWith: options.sessionsDir,\n });\n\n for (const match of matches) {\n const detected = toDetected(match, 'sessions', 'openclaw');\n if (detected) {\n explicitSources.push(detected);\n }\n }\n }\n\n if (explicitSources.length > 0) {\n return explicitSources.sort((left, right) => right.mtimeMs - left.mtimeMs);\n }\n\n const [gatewayMatches, sessionMatches] = await Promise.all([\n collectGlobMatches(getDefaultOpenClawGatewayPattern()),\n collectGlobMatches(getDefaultOpenClawSessionsPattern()),\n ]);\n\n const detected = [\n ...gatewayMatches.map((path) => toDetected(path, 'gateway', 'openclaw')).filter(Boolean),\n ...sessionMatches.map((path) => toDetected(path, 'sessions', 'openclaw')).filter(Boolean),\n ] as DetectedSourceFile[];\n\n return detected.sort((left, right) => right.mtimeMs - left.mtimeMs);\n}\n","import { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\n\nimport { estimateCostUsd } from '../pricing-catalog.js';\nimport type { DetectedSourceFile, NormalizedCall, NormalizedRun } from '../types.js';\nimport { sha1 } from '../utils/hash.js';\nimport { asBoolean, asNumber, asString, getNestedValue, pickMetadata } from '../utils/records.js';\nimport { parseSince, toIsoOrNow } from '../utils/time.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction parseJsonLines(path: string) {\n const content = readFileSync(path, 'utf8');\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const records: JsonRecord[] = [];\n\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line) as JsonRecord;\n records.push(parsed);\n } catch {}\n }\n\n return records;\n}\n\nfunction inferProvider(record: JsonRecord) {\n return (\n asString(\n getNestedValue(record, [['provider'], ['message', 'provider'], ['usage', 'provider']]),\n ) ?? 'unknown'\n );\n}\n\nfunction inferModel(record: JsonRecord) {\n return (\n asString(getNestedValue(record, [['model'], ['message', 'model'], ['usage', 'model']])) ??\n 'unknown-model'\n );\n}\n\nfunction inferWorkflow(record: JsonRecord, sourcePath: string) {\n return (\n asString(\n getNestedValue(record, [\n ['workflow'],\n ['session', 'workflow'],\n ['metadata', 'workflow'],\n ['agent', 'name'],\n ['agentId'],\n ['sessionId'],\n ]),\n ) ?? basename(sourcePath, '.jsonl')\n );\n}\n\nfunction inferEnvironment(record: JsonRecord) {\n return (\n asString(getNestedValue(record, [['environment'], ['env'], ['metadata', 'environment']])) ??\n 'local'\n );\n}\n\nfunction inferRunKey(record: JsonRecord, workflow: string, index: number, sourcePath: string) {\n return (\n asString(\n getNestedValue(record, [\n ['run_id'],\n ['runId'],\n ['trace_id'],\n ['traceId'],\n ['sessionId'],\n ['thread_id'],\n ]),\n ) ?? `${sourcePath}:${workflow}:${index}`\n );\n}\n\nfunction inferTaskClass(record: JsonRecord, workflow: string) {\n return (\n asString(getNestedValue(record, [['task_class'], ['taskClass'], ['metadata', 'taskClass']])) ??\n workflow.toLowerCase()\n );\n}\n\nfunction extractUsage(record: JsonRecord) {\n const inputTokens =\n asNumber(\n getNestedValue(record, [\n ['input_tokens'],\n ['inputTokens'],\n ['usage', 'input_tokens'],\n ['usage', 'inputTokens'],\n ['message', 'usage', 'input_tokens'],\n ['message', 'usage', 'inputTokens'],\n ['usage', 'prompt_tokens'],\n ['message', 'usage', 'prompt_tokens'],\n ]),\n ) ?? 0;\n\n const outputTokens =\n asNumber(\n getNestedValue(record, [\n ['output_tokens'],\n ['outputTokens'],\n ['usage', 'output_tokens'],\n ['usage', 'outputTokens'],\n ['message', 'usage', 'output_tokens'],\n ['message', 'usage', 'outputTokens'],\n ['usage', 'completion_tokens'],\n ['message', 'usage', 'completion_tokens'],\n ]),\n ) ?? 0;\n\n const observedCost =\n asNumber(\n getNestedValue(record, [\n ['cost_usd'],\n ['costUsd'],\n ['usage', 'cost_usd'],\n ['usage', 'costUsd'],\n ['usage', 'cost', 'total'],\n ['message', 'usage', 'cost', 'total'],\n ['message', 'usage', 'cost_usd'],\n ['pricing', 'total_usd'],\n ]),\n ) ?? null;\n\n return {\n inputTokens,\n outputTokens,\n observedCost,\n };\n}\n\nfunction buildCall(\n source: DetectedSourceFile,\n record: JsonRecord,\n runId: string,\n index: number,\n): NormalizedCall {\n const provider = inferProvider(record);\n const model = inferModel(record);\n const workflow = inferWorkflow(record, source.path);\n const { inputTokens, outputTokens, observedCost } = extractUsage(record);\n const estimatedCost = estimateCostUsd(provider, model, inputTokens, outputTokens);\n const timestamp = toIsoOrNow(\n getNestedValue(record, [['timestamp'], ['createdAt'], ['created_at']]),\n );\n const attempt =\n asNumber(\n getNestedValue(record, [['attempt'], ['usage', 'attempt'], ['metadata', 'attempt']]),\n ) ?? null;\n const iteration =\n asNumber(\n getNestedValue(record, [['iteration'], ['loop_iteration'], ['metadata', 'iteration']]),\n ) ?? null;\n const retries =\n asNumber(getNestedValue(record, [['retries'], ['retry_count'], ['metadata', 'retries']])) ?? 0;\n const costUsd = observedCost ?? estimatedCost ?? 0;\n\n return {\n id: sha1(`${runId}:${source.path}:${index}:${model}:${timestamp}:${costUsd}`),\n runId,\n timestamp,\n provider,\n model,\n inputTokens,\n outputTokens,\n costUsd,\n costSource: observedCost !== null ? 'observed' : 'estimated',\n latencyMs:\n asNumber(getNestedValue(record, [['latency_ms'], ['latencyMs'], ['usage', 'latency_ms']])) ??\n null,\n toolCalls:\n asNumber(getNestedValue(record, [['tool_calls'], ['toolCalls'], ['usage', 'tool_calls']])) ??\n 0,\n retries,\n attempt,\n iteration,\n status:\n asString(getNestedValue(record, [['status'], ['level'], ['result'], ['error', 'type']])) ??\n null,\n taskClass: inferTaskClass(record, workflow),\n cacheHit: asBoolean(\n getNestedValue(record, [['cache_hit'], ['cacheHit'], ['usage', 'cache_hit']]),\n ),\n cacheCostUsd:\n asNumber(\n getNestedValue(record, [['cache_cost_usd'], ['cacheCostUsd'], ['usage', 'cache_cost_usd']]),\n ) ?? null,\n metadata: pickMetadata(record, ['event', 'type', 'sessionId', 'agentId']),\n };\n}\n\nfunction shouldTreatAsCall(record: JsonRecord) {\n const hasUsage =\n extractUsage(record).inputTokens > 0 ||\n extractUsage(record).outputTokens > 0 ||\n extractUsage(record).observedCost !== null;\n\n return hasUsage;\n}\n\nexport function normalizeOpenClawSources(\n sources: DetectedSourceFile[],\n since?: string,\n): NormalizedRun[] {\n const cutoff = parseSince(since);\n const runsById = new Map<string, NormalizedRun>();\n\n for (const source of sources) {\n const records = parseJsonLines(source.path);\n\n records.forEach((record, index) => {\n if (!shouldTreatAsCall(record)) {\n return;\n }\n\n const workflow = inferWorkflow(record, source.path);\n const timestamp = toIsoOrNow(\n getNestedValue(record, [['timestamp'], ['createdAt'], ['created_at']]),\n );\n if (cutoff && new Date(timestamp).getTime() < cutoff) {\n return;\n }\n\n const runKey = inferRunKey(record, workflow, index, source.path);\n const runId = sha1(`${source.path}:${runKey}`);\n const call = buildCall(source, record, runId, index);\n const existing = runsById.get(runId);\n\n if (!existing) {\n runsById.set(runId, {\n id: runId,\n sourceKind: source.kind,\n sourcePath: source.path,\n timestamp,\n workflow,\n environment: inferEnvironment(record),\n tags: {\n sourceKind: source.kind,\n },\n calls: [call],\n totalCostUsd: call.costUsd,\n totalTokens: call.inputTokens + call.outputTokens,\n observedCostUsd: call.costSource === 'observed' ? call.costUsd : 0,\n estimatedCostUsd: call.costSource === 'estimated' ? call.costUsd : 0,\n });\n return;\n }\n\n existing.calls.push(call);\n existing.totalCostUsd = Number((existing.totalCostUsd + call.costUsd).toFixed(8));\n existing.totalTokens += call.inputTokens + call.outputTokens;\n existing.observedCostUsd += call.costSource === 'observed' ? call.costUsd : 0;\n existing.estimatedCostUsd += call.costSource === 'estimated' ? call.costUsd : 0;\n });\n }\n\n return Array.from(runsById.values()).sort((left, right) => {\n return new Date(left.timestamp).getTime() - new Date(right.timestamp).getTime();\n });\n}\n","import {\n inspectCursorUsageCsv,\n normalizeCursorUsageCsv,\n readCursorUsageCsv,\n} from './cursor/usage-csv.js';\nimport { persistAudit } from './db/persist.js';\nimport { readLatestComparableAuditSummary } from './db/read.js';\nimport { buildCursorUsageFindings } from './findings/cursor.js';\nimport { buildFindings } from './findings/engine.js';\nimport { PRICING_CATALOG } from './pricing-catalog.js';\nimport { buildAuditComparison } from './report/comparison.js';\nimport { buildAuditSummary } from './report/summary.js';\nimport { doctorAgentRuntime, getRuntimeAdapter, resolveLocalAgentRuntime } from './runtime.js';\nimport type { AgentRuntime, AuditOptions, AuditSummary, PricingCoverage } from './types.js';\nimport { getDefaultDbPath } from './utils/paths.js';\n\nexport async function doctorOpenClaw(options: AuditOptions) {\n return doctorAgentRuntime({\n ...options,\n runtime: 'openclaw',\n });\n}\n\nexport async function doctorHermes(options: AuditOptions) {\n return doctorAgentRuntime({\n ...options,\n runtime: 'hermes',\n });\n}\n\nexport { doctorAgentRuntime };\n\nexport async function auditOpenClaw(options: AuditOptions) {\n return auditAgentRuntime({\n ...options,\n runtime: 'openclaw',\n });\n}\n\nexport async function auditHermes(options: AuditOptions) {\n return auditAgentRuntime({\n ...options,\n runtime: 'hermes',\n });\n}\n\nexport async function doctorCursorUsageCsv(options: AuditOptions) {\n return inspectCursorUsageCsv(options);\n}\n\nfunction validateCompareOptions(options: AuditOptions) {\n if (options.compare && options.noDb) {\n throw new Error(\n 'The --compare flag needs local snapshot history. Remove --no-db or provide --db <path>.',\n );\n }\n}\n\nfunction maybeAttachComparison(\n options: AuditOptions,\n dbPath: string | undefined,\n summary: AuditSummary,\n) {\n if (!options.compare || !dbPath) {\n return;\n }\n\n options.onProgress?.('Looking for a comparable baseline audit...');\n const baseline = readLatestComparableAuditSummary({\n dbPath,\n comparisonKey: summary.comparisonKey,\n currentAuditId: summary.auditId,\n });\n\n if (!baseline) {\n summary.notes = [\n ...summary.notes,\n 'No prior comparable audit was found. Run the same audit again after a fix to unlock before/after deltas.',\n ];\n return;\n }\n\n summary.comparison = buildAuditComparison(summary, baseline);\n\n if (hasPricingCoverageChange(summary.pricingCoverage, baseline.pricingCoverage)) {\n summary.notes = [\n ...summary.notes,\n 'Pricing coverage changed versus the baseline audit. Spend deltas are directional because different Cursor aliases were priced in each run.',\n ];\n }\n}\n\nfunction persistLocalSnapshot(\n summary: AuditSummary,\n runs: Parameters<typeof persistAudit>[0]['runs'],\n dbPath: string | undefined,\n onProgress?: (message: string) => void,\n) {\n if (!dbPath) {\n onProgress?.('Skipping local snapshot persistence (--no-db).');\n return;\n }\n\n onProgress?.(`Persisting local snapshot to ${dbPath}...`);\n persistAudit(\n {\n summary,\n runs,\n pricingCatalog: PRICING_CATALOG,\n },\n dbPath,\n );\n onProgress?.('Local snapshot stored.');\n}\n\nfunction hasPricingCoverageChange(\n current?: PricingCoverage | null,\n baseline?: PricingCoverage | null,\n) {\n if (!current && !baseline) {\n return false;\n }\n\n return (\n (current?.pricedCallCount ?? 0) !== (baseline?.pricedCallCount ?? 0) ||\n (current?.unpricedCallCount ?? 0) !== (baseline?.unpricedCallCount ?? 0) ||\n (current?.pricedTokenCount ?? 0) !== (baseline?.pricedTokenCount ?? 0) ||\n (current?.unpricedTokenCount ?? 0) !== (baseline?.unpricedTokenCount ?? 0)\n );\n}\n\nasync function auditResolvedRuntime(\n runtime: AgentRuntime,\n options: AuditOptions,\n detectedSources?: Awaited<ReturnType<typeof resolveLocalAgentRuntime>>['sources'],\n) {\n const adapter = getRuntimeAdapter(runtime);\n options.onProgress?.(`Scanning for ${adapter.productName} source files...`);\n validateCompareOptions(options);\n\n const sources = detectedSources ?? (await adapter.detectSources(options));\n if (sources.length === 0) {\n options.onProgress?.(`No ${adapter.productName} source files were detected.`);\n throw new Error(adapter.noDataError(options.commandPrefix ?? 'xerg'));\n }\n options.onProgress?.(`Detected ${sources.length} source file${sources.length === 1 ? '' : 's'}.`);\n\n options.onProgress?.(`Normalizing ${adapter.productName} source files...`);\n const runs = adapter.normalizeSources(sources, options.since);\n options.onProgress?.(`Normalized ${runs.length} run${runs.length === 1 ? '' : 's'}.`);\n options.onProgress?.('Computing waste and savings findings...');\n const { findings, wasteAttributions } = buildFindings(runs);\n const dbPath = options.noDb ? undefined : (options.dbPath ?? getDefaultDbPath());\n options.onProgress?.('Building audit summary...');\n const summary = buildAuditSummary({\n runtime,\n runs,\n findings,\n wasteAttributions,\n sources,\n since: options.since,\n dbPath,\n comparisonKeyOverride: options.comparisonKeyOverride,\n });\n\n maybeAttachComparison(options, dbPath, summary);\n persistLocalSnapshot(summary, runs, dbPath, options.onProgress);\n\n return summary;\n}\n\nexport async function auditAgentRuntime(options: AuditOptions) {\n const runtime = options.runtime ?? 'auto';\n\n if (runtime !== 'auto') {\n return auditResolvedRuntime(runtime, options);\n }\n\n const resolved = await resolveLocalAgentRuntime(options);\n return auditResolvedRuntime(resolved.adapter.runtime, options, resolved.sources);\n}\n\nexport async function auditCursorUsageCsv(options: AuditOptions) {\n options.onProgress?.('Reading Cursor usage CSV...');\n validateCompareOptions(options);\n\n if (!options.cursorUsageCsv) {\n throw new Error('No Cursor usage CSV was provided. Use --cursor-usage-csv <path>.');\n }\n\n const parsed = readCursorUsageCsv(options.cursorUsageCsv);\n options.onProgress?.(`Loaded Cursor usage CSV: ${parsed.source.path}`);\n options.onProgress?.('Normalizing Cursor usage rows...');\n const normalized = normalizeCursorUsageCsv({\n source: parsed.source,\n rows: parsed.rows,\n hasObservedCostRows: parsed.hasObservedCostRows,\n since: options.since,\n });\n options.onProgress?.(\n `Normalized ${normalized.runs.length} usage row${normalized.runs.length === 1 ? '' : 's'}.`,\n );\n options.onProgress?.('Computing Cursor-specific findings...');\n const { findings, wasteAttributions } = buildCursorUsageFindings(normalized.runs);\n const dbPath = options.noDb ? undefined : (options.dbPath ?? getDefaultDbPath());\n options.onProgress?.('Building audit summary...');\n const summary = buildAuditSummary({\n runtime: 'cursor',\n runs: normalized.runs,\n findings,\n wasteAttributions,\n sources: [parsed.source],\n since: options.since,\n dbPath,\n comparisonKeyOverride: options.comparisonKeyOverride,\n });\n\n summary.pricingCoverage = normalized.pricingCoverage;\n summary.cursorUsage = normalized.cursorUsage;\n summary.notes = [\n 'Cursor CSV audits analyze exported usage rows rather than raw session transcripts.',\n 'OpenClaw-specific retry, loop, and session-level workflow findings are still unavailable for Cursor CSV inputs because the export does not include retries, iterations, or real workflow IDs.',\n parsed.hasObservedCostRows\n ? 'Numeric Cost values were used as observed spend. Included rows are treated as zero billed spend in this export mode.'\n : 'This CSV did not include numeric Cost values, so spend was estimated from local model pricing where possible.',\n ];\n\n if (parsed.rows.length > 0 && normalized.runs.length === 0 && options.since) {\n summary.notes = [\n ...summary.notes,\n `No Cursor usage rows matched the --since window (${options.since}).`,\n ];\n }\n\n if (normalized.pricingCoverage.unpricedCallCount > 0) {\n const aliases = normalized.pricingCoverage.topUnpricedModels\n .map((model) => model.key)\n .join(', ');\n summary.notes = [\n ...summary.notes,\n `Some Cursor aliases do not have full local pricing coverage: ${aliases || 'unknown aliases'}.`,\n ];\n }\n\n maybeAttachComparison(options, dbPath, summary);\n persistLocalSnapshot(summary, normalized.runs, dbPath, options.onProgress);\n\n return summary;\n}\n","import type { XergRecommendation } from '@xerg/schemas';\nimport type {\n AuditSummary,\n CursorUsageCsvDoctorReport,\n CursorUsageModeBreakdown,\n CursorUsageModelBreakdown,\n DailySpendBreakdown,\n DailyWasteBreakdown,\n DoctorReport,\n Finding,\n FindingChange,\n FindingTaxonomyBucket,\n SpendBreakdown,\n SpendDelta,\n} from '../types.js';\n\nfunction formatUsd(value: number) {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: value >= 1 ? 2 : 4,\n maximumFractionDigits: 4,\n }).format(value);\n}\n\nfunction formatPercent(value: number) {\n return `${(value * 100).toFixed(0)}%`;\n}\n\nfunction formatPercentDelta(value: number) {\n const points = value * 100;\n const sign = points > 0 ? '+' : '';\n return `${sign}${points.toFixed(0)} pts`;\n}\n\nfunction formatCount(value: number) {\n return new Intl.NumberFormat('en-US').format(value);\n}\n\nfunction formatUsdDelta(value: number) {\n const sign = value > 0 ? '+' : '';\n return `${sign}${formatUsd(value)}`;\n}\n\nfunction isCursorUsageSummary(summary: AuditSummary) {\n return summary.sourceFiles.some((source) => source.kind === 'cursor-usage-csv');\n}\n\nfunction topRows(rows: SpendBreakdown[], limit = 5) {\n return rows.slice(0, limit).map((row) => {\n return `- ${row.key}: ${formatUsd(row.spendUsd)} (${formatPercent(row.observedShare)} observed)`;\n });\n}\n\nfunction renderTaxonomyRows(rows: FindingTaxonomyBucket[], emptyLabel: string, suffix?: string) {\n if (rows.length === 0) {\n return [`- ${emptyLabel}`];\n }\n\n return rows.map((row) => {\n const countLabel = `${row.findingCount} finding${row.findingCount === 1 ? '' : 's'}`;\n const detail = suffix ? ` ${suffix}` : '';\n return `- ${row.label}: ${formatUsd(row.spendUsd)} across ${countLabel}${detail}`;\n });\n}\n\nfunction renderTaxonomyBlock(summary: AuditSummary) {\n return [\n '## Waste taxonomy',\n 'Structural waste',\n ...renderTaxonomyRows(summary.wasteByKind, 'No confirmed waste buckets detected.'),\n 'Savings opportunities',\n ...renderTaxonomyRows(\n summary.opportunityByKind,\n 'No opportunity buckets detected.',\n '(directional)',\n ),\n ];\n}\n\nfunction topFinding(summary: AuditSummary, classification: 'waste' | 'opportunity') {\n return summary.findings\n .filter((finding) => finding.classification === classification)\n .sort((left, right) => right.costImpactUsd - left.costImpactUsd)[0];\n}\n\nfunction renderFindingList(findings: Finding[], emptyLabel: string) {\n if (findings.length === 0) {\n return [`- ${emptyLabel}`];\n }\n\n return findings.slice(0, 5).map((finding) => {\n return `- ${finding.title}: ${formatUsd(finding.costImpactUsd)} (${finding.confidence})`;\n });\n}\n\nfunction renderActionQueueRow(label: string, recommendation?: XergRecommendation) {\n if (!recommendation) {\n return [`${label}`, '- none'];\n }\n\n return [\n label,\n `- ${recommendation.title} [${recommendation.scopeLabel}]: ${formatUsd(recommendation.estimatedSavingsUsd)} (${recommendation.severity})`,\n ];\n}\n\nfunction renderActionQueue(summary: AuditSummary) {\n const fixNow = summary.recommendations.find(\n (recommendation) => recommendation.priorityBucket === 'fix_now',\n );\n const testNext = summary.recommendations.find(\n (recommendation) => recommendation.priorityBucket === 'test_next',\n );\n const watch = summary.recommendations.find(\n (recommendation) => recommendation.priorityBucket === 'watch',\n );\n\n return [\n '## Action queue',\n ...renderActionQueueRow('Fix now', fixNow),\n ...renderActionQueueRow('Test next', testNext),\n ...renderActionQueueRow('Watch', watch),\n 'How to validate: `xerg audit --compare --push`',\n ];\n}\n\nfunction describeSpendDelta(delta: SpendDelta) {\n return `${delta.key} (${formatUsdDelta(delta.deltaSpendUsd)})`;\n}\n\nfunction pickBiggestImprovement(deltas: SpendDelta[]) {\n return deltas\n .filter((delta) => delta.deltaSpendUsd < 0)\n .sort((left, right) => left.deltaSpendUsd - right.deltaSpendUsd)[0];\n}\n\nfunction pickBiggestRegression(deltas: SpendDelta[]) {\n return deltas\n .filter((delta) => delta.deltaSpendUsd > 0)\n .sort((left, right) => right.deltaSpendUsd - left.deltaSpendUsd)[0];\n}\n\nfunction renderFindingChange(change: FindingChange, state: 'new' | 'resolved' | 'worsened') {\n if (state === 'resolved') {\n return `- Resolved: ${change.title} (${formatUsd(change.baselineCostImpactUsd ?? 0)})`;\n }\n\n if (state === 'worsened') {\n return `- Worsened: ${change.title} (${formatUsdDelta(change.deltaCostImpactUsd)})`;\n }\n\n return `- New: ${change.title} (${formatUsd(change.currentCostImpactUsd ?? 0)})`;\n}\n\nfunction renderCompareBlock(summary: AuditSummary) {\n if (!summary.comparison) {\n return [];\n }\n\n const comparison = summary.comparison;\n const biggestImprovement = pickBiggestImprovement(comparison.workflowDeltas);\n const biggestRegression = pickBiggestRegression(comparison.workflowDeltas);\n const firstWorkflowToInspect = biggestRegression?.key ?? summary.spendByWorkflow[0]?.key ?? null;\n const findingChanges = [\n ...comparison.findingChanges.newHighConfidenceWaste.map((change) =>\n renderFindingChange(change, 'new'),\n ),\n ...comparison.findingChanges.resolvedHighConfidenceWaste.map((change) =>\n renderFindingChange(change, 'resolved'),\n ),\n ...comparison.findingChanges.worsenedHighConfidenceWaste.map((change) =>\n renderFindingChange(change, 'worsened'),\n ),\n ].slice(0, 5);\n\n return [\n '## Before / after',\n `Compared against ${comparison.baselineGeneratedAt}`,\n `- Total spend: ${formatUsd(comparison.baselineTotalSpendUsd)} -> ${formatUsd(summary.totalSpendUsd)} (${formatUsdDelta(comparison.deltaTotalSpendUsd)})`,\n `- Structural waste: ${formatUsd(comparison.baselineWasteSpendUsd)} -> ${formatUsd(summary.wasteSpendUsd)} (${formatUsdDelta(comparison.deltaWasteSpendUsd)})`,\n `- Waste rate: ${formatPercent(comparison.baselineStructuralWasteRate)} -> ${formatPercent(summary.structuralWasteRate)} (${formatPercentDelta(comparison.deltaStructuralWasteRate)})`,\n `- Runs analyzed: ${comparison.baselineRunCount} -> ${summary.runCount} (${comparison.deltaRunCount > 0 ? '+' : ''}${comparison.deltaRunCount})`,\n `- Model calls: ${comparison.baselineCallCount} -> ${summary.callCount} (${comparison.deltaCallCount > 0 ? '+' : ''}${comparison.deltaCallCount})`,\n biggestImprovement\n ? `- Biggest improvement: ${describeSpendDelta(biggestImprovement)}`\n : '- Biggest improvement: none detected',\n biggestRegression\n ? `- Biggest regression: ${describeSpendDelta(biggestRegression)}`\n : '- Biggest regression: none detected',\n firstWorkflowToInspect\n ? `- First workflow to inspect now: ${firstWorkflowToInspect}`\n : '- First workflow to inspect now: no workflow delta available',\n ...(comparison.modelDeltas.length > 0\n ? [`- Model swing to inspect: ${describeSpendDelta(comparison.modelDeltas[0])}`]\n : ['- Model swing to inspect: none']),\n ...(findingChanges.length > 0 ? findingChanges : ['- High-confidence waste changes: none']),\n ];\n}\n\nfunction renderDailyTrendRows(\n spendByDay: DailySpendBreakdown[],\n wasteByDay: DailyWasteBreakdown[],\n) {\n if (spendByDay.length <= 1) {\n return [];\n }\n\n const wasteByDate = new Map(wasteByDay.map((row) => [row.date, row.wasteUsd]));\n\n return [\n '## Daily trend',\n ...spendByDay.map((row) => {\n const wasteUsd = wasteByDate.get(row.date) ?? 0;\n return `- ${row.date}: ${formatUsd(row.spendUsd)} spend, ${formatUsd(wasteUsd)} waste`;\n }),\n ];\n}\n\nexport function renderDoctorReport(report: DoctorReport, options?: { commandPrefix?: string }) {\n const commandPrefix = options?.commandPrefix ?? 'xerg';\n const status =\n report.mode === 'resolved' && report.runtime\n ? `${report.runtime === 'hermes' ? 'Hermes' : 'OpenClaw'} sources detected.`\n : report.mode === 'ambiguous'\n ? 'Multiple supported local runtimes detected.'\n : 'No supported local sources detected.';\n const nextSteps = report.canAudit\n ? []\n : report.mode === 'ambiguous'\n ? [\n '',\n '## Next steps',\n `- Inspect OpenClaw only: ${commandPrefix} doctor --runtime openclaw`,\n `- Inspect Hermes only: ${commandPrefix} doctor --runtime hermes`,\n `- Try explicit local paths: ${commandPrefix} doctor --runtime hermes --log-file /path/to/log --sessions-dir /path/to/sessions`,\n ]\n : [\n '',\n '## Next steps',\n `- Inspect OpenClaw locally: ${commandPrefix} doctor --runtime openclaw`,\n `- Inspect Hermes locally: ${commandPrefix} doctor --runtime hermes`,\n `- Try explicit local paths: ${commandPrefix} doctor --runtime hermes --log-file /path/to/log --sessions-dir /path/to/sessions`,\n `- Inspect an SSH host for OpenClaw: ${commandPrefix} doctor --remote user@host`,\n `- Inspect a Railway service for OpenClaw: ${commandPrefix} doctor --railway`,\n '- Remote audits still analyze locally after Xerg pulls the source files to your machine.',\n ];\n\n const sections = [\n '# Xerg doctor',\n '',\n status,\n '',\n '## Defaults',\n ...report.defaults.flatMap((defaults) => [\n `- ${defaults.runtime === 'hermes' ? 'Hermes' : 'OpenClaw'} gateway logs: ${defaults.gatewayPattern}`,\n `- ${defaults.runtime === 'hermes' ? 'Hermes' : 'OpenClaw'} session files: ${defaults.sessionsPattern}`,\n ]),\n '',\n '## Sources',\n ...(report.sources.length > 0\n ? report.sources.map((source) => `- [${source.runtime}/${source.kind}] ${source.path}`)\n : ['- none']),\n '',\n '## Notes',\n ...report.notes.map((note) => `- ${note}`),\n ...nextSteps,\n ];\n\n return sections.join('\\n');\n}\n\nexport function renderCursorDoctorReport(report: CursorUsageCsvDoctorReport) {\n const status = report.canAudit ? 'Cursor usage CSV detected.' : 'Cursor usage CSV is not ready.';\n\n return [\n '# Xerg doctor [cursor csv]',\n '',\n status,\n '',\n `File: ${report.filePath || '(not provided)'}`,\n `Rows: ${formatCount(report.rowCount)}`,\n `Date range: ${report.dateRange ? `${report.dateRange.start} -> ${report.dateRange.end}` : 'unavailable'}`,\n '',\n '## Pricing coverage',\n `- Priced rows: ${formatCount(report.pricingCoverage.pricedCallCount)}`,\n `- Unpriced rows: ${formatCount(report.pricingCoverage.unpricedCallCount)}`,\n `- Priced tokens: ${formatCount(report.pricingCoverage.pricedTokenCount)}`,\n `- Unpriced tokens: ${formatCount(report.pricingCoverage.unpricedTokenCount)}`,\n ...(report.pricingCoverage.topUnpricedModels.length > 0\n ? report.pricingCoverage.topUnpricedModels.map(\n (model) =>\n `- Unpriced model: ${model.key} (${formatCount(model.totalTokens)} tokens across ${formatCount(model.callCount)} row${model.callCount === 1 ? '' : 's'})`,\n )\n : ['- Unpriced model: none']),\n '',\n '## Notes',\n ...report.notes.map((note) => `- ${note}`),\n ].join('\\n');\n}\n\nfunction renderCursorModeRows(rows: CursorUsageModeBreakdown[]) {\n if (rows.length === 0) {\n return ['- none'];\n }\n\n return rows.map((row) => {\n return `- ${row.key}: ${formatCount(row.callCount)} row${row.callCount === 1 ? '' : 's'}, ${formatCount(row.totalTokens)} tokens, ${formatUsd(row.estimatedSpendUsd)} spend`;\n });\n}\n\nfunction renderCursorModelRows(rows: CursorUsageModelBreakdown[]) {\n if (rows.length === 0) {\n return ['- none'];\n }\n\n return rows.slice(0, 8).map((row) => {\n const coverage =\n row.unpricedCallCount === 0\n ? `${formatUsd(row.estimatedSpendUsd)} spend`\n : row.pricedCallCount === 0\n ? 'unpriced'\n : `${formatUsd(row.estimatedSpendUsd)} spend, ${formatCount(row.unpricedCallCount)} unpriced row${row.unpricedCallCount === 1 ? '' : 's'}`;\n\n return `- ${row.key}: ${formatCount(row.callCount)} row${row.callCount === 1 ? '' : 's'}, ${formatCount(row.totalTokens)} tokens, ${coverage}`;\n });\n}\n\nfunction renderCursorPricingCoverage(summary: AuditSummary) {\n const coverage = summary.pricingCoverage;\n if (!coverage) {\n return ['- Pricing coverage unavailable'];\n }\n\n return [\n `- Priced rows: ${formatCount(coverage.pricedCallCount)}`,\n `- Unpriced rows: ${formatCount(coverage.unpricedCallCount)}`,\n `- Priced tokens: ${formatCount(coverage.pricedTokenCount)}`,\n `- Unpriced tokens: ${formatCount(coverage.unpricedTokenCount)}`,\n ...(coverage.topUnpricedModels.length > 0\n ? coverage.topUnpricedModels.map(\n (model) =>\n `- Unpriced model: ${model.key} (${formatCount(model.totalTokens)} tokens across ${formatCount(model.callCount)} row${model.callCount === 1 ? '' : 's'})`,\n )\n : ['- Unpriced model: none']),\n ];\n}\n\nfunction renderCursorCompareBlock(summary: AuditSummary) {\n if (!summary.comparison) {\n return [];\n }\n\n const comparison = summary.comparison;\n const modeSwing = comparison.workflowDeltas[0];\n const modelSwing = comparison.modelDeltas[0];\n\n return [\n '## Before / after',\n `Compared against ${comparison.baselineGeneratedAt}`,\n `- Total spend: ${formatUsd(comparison.baselineTotalSpendUsd)} -> ${formatUsd(summary.totalSpendUsd)} (${formatUsdDelta(comparison.deltaTotalSpendUsd)})`,\n `- Rows analyzed: ${formatCount(comparison.baselineRunCount)} -> ${formatCount(summary.runCount)} (${comparison.deltaRunCount > 0 ? '+' : ''}${comparison.deltaRunCount})`,\n `- Usage rows with pricing: ${formatCount(summary.pricingCoverage?.pricedCallCount ?? 0)}`,\n modeSwing\n ? `- Mode swing to inspect: ${describeSpendDelta(modeSwing)}`\n : '- Mode swing to inspect: none',\n modelSwing\n ? `- Model swing to inspect: ${describeSpendDelta(modelSwing)}`\n : '- Model swing to inspect: none',\n ];\n}\n\nfunction renderCursorTerminalSummary(summary: AuditSummary) {\n const usage = summary.cursorUsage;\n\n return [\n '# Xerg audit [cursor csv]',\n '',\n `Total spend: ${formatUsd(summary.totalSpendUsd)}`,\n `Observed spend: ${formatUsd(summary.observedSpendUsd)}`,\n `Estimated spend: ${formatUsd(summary.estimatedSpendUsd)}`,\n `Rows analyzed: ${formatCount(summary.runCount)}`,\n `Usage rows with pricing: ${formatCount(summary.pricingCoverage?.pricedCallCount ?? 0)} / ${formatCount(summary.runCount)}`,\n `Total tokens: ${formatCount(usage?.totalTokens ?? 0)}`,\n `Structural waste identified: ${formatUsd(summary.wasteSpendUsd)} (${formatPercent(summary.structuralWasteRate)})`,\n `Potential impact surfaced: ${formatUsd(summary.opportunitySpendUsd)}`,\n '',\n '## Token mix',\n `- Input tokens: ${formatCount(usage?.totalInputTokens ?? 0)}`,\n `- Output tokens: ${formatCount(usage?.totalOutputTokens ?? 0)}`,\n `- Cache read tokens: ${formatCount(usage?.totalCacheReadTokens ?? 0)}`,\n `- Input (cache write): ${formatCount(usage?.totalInputWithCacheWriteTokens ?? 0)}`,\n `- Input (no cache write): ${formatCount(usage?.totalInputWithoutCacheWriteTokens ?? 0)}`,\n '',\n '## Max mode usage',\n ...renderCursorModeRows(usage?.modes ?? []),\n '',\n '## Model mix',\n ...renderCursorModelRows(usage?.models ?? []),\n '',\n '## Pricing coverage',\n ...renderCursorPricingCoverage(summary),\n '',\n ...renderDailyTrendRows(summary.spendByDay, summary.wasteByDay),\n ...(summary.spendByDay.length > 1 ? [''] : []),\n '## Waste taxonomy',\n 'Structural waste',\n ...renderTaxonomyRows(summary.wasteByKind, 'No confirmed waste buckets detected.'),\n 'Savings opportunities',\n ...renderTaxonomyRows(\n summary.opportunityByKind,\n 'No opportunity buckets detected.',\n '(directional)',\n ),\n '',\n '## Findings',\n ...renderFindingList(summary.findings, 'none detected'),\n '',\n ...renderActionQueue(summary),\n '',\n ...renderCursorCompareBlock(summary),\n ...(summary.comparison ? [''] : []),\n '## Notes',\n ...summary.notes.map((note) => `- ${note}`),\n ].join('\\n');\n}\n\nfunction renderCursorMarkdownSummary(summary: AuditSummary) {\n const usage = summary.cursorUsage;\n\n return [\n '# Xerg Cursor CSV Audit',\n '',\n `- Generated: ${summary.generatedAt}`,\n `- Total spend: ${formatUsd(summary.totalSpendUsd)}`,\n `- Observed spend: ${formatUsd(summary.observedSpendUsd)}`,\n `- Estimated spend: ${formatUsd(summary.estimatedSpendUsd)}`,\n `- Structural waste identified: ${formatUsd(summary.wasteSpendUsd)} (${formatPercent(summary.structuralWasteRate)})`,\n `- Potential impact surfaced: ${formatUsd(summary.opportunitySpendUsd)}`,\n `- Rows analyzed: ${formatCount(summary.runCount)}`,\n `- Usage rows with pricing: ${formatCount(summary.pricingCoverage?.pricedCallCount ?? 0)} / ${formatCount(summary.runCount)}`,\n `- Total tokens: ${formatCount(usage?.totalTokens ?? 0)}`,\n '',\n '## Token mix',\n `- Input tokens: ${formatCount(usage?.totalInputTokens ?? 0)}`,\n `- Output tokens: ${formatCount(usage?.totalOutputTokens ?? 0)}`,\n `- Cache read tokens: ${formatCount(usage?.totalCacheReadTokens ?? 0)}`,\n '',\n '## Max mode usage',\n ...renderCursorModeRows(usage?.modes ?? []),\n '',\n '## Model mix',\n ...renderCursorModelRows(usage?.models ?? []),\n '',\n '## Pricing coverage',\n ...renderCursorPricingCoverage(summary),\n '',\n ...renderDailyTrendRows(summary.spendByDay, summary.wasteByDay),\n ...(summary.spendByDay.length > 1 ? [''] : []),\n ...renderTaxonomyBlock(summary),\n '',\n '## Findings',\n ...summary.findings.slice(0, 10).map((finding) => {\n return `- **${finding.title}** (${finding.classification}, ${finding.confidence}) — ${finding.summary} Estimated impact: ${formatUsd(finding.costImpactUsd)}.`;\n }),\n '',\n ...renderActionQueue(summary),\n ...(summary.comparison ? ['', ...renderCursorCompareBlock(summary)] : []),\n '',\n '## Notes',\n ...summary.notes.map((note) => `- ${note}`),\n ].join('\\n');\n}\n\nexport function renderTerminalSummary(summary: AuditSummary) {\n if (isCursorUsageSummary(summary)) {\n return renderCursorTerminalSummary(summary);\n }\n\n const wasteFindings = summary.findings.filter((finding) => finding.classification === 'waste');\n const opportunityFindings = summary.findings.filter(\n (finding) => finding.classification === 'opportunity',\n );\n const topWaste = topFinding(summary, 'waste');\n\n return [\n '# Xerg audit',\n '',\n `Total spend: ${formatUsd(summary.totalSpendUsd)}`,\n `Observed spend: ${formatUsd(summary.observedSpendUsd)}`,\n `Estimated spend: ${formatUsd(summary.estimatedSpendUsd)}`,\n `Runs analyzed: ${summary.runCount}`,\n `Model calls: ${summary.callCount}`,\n `Structural waste identified: ${formatUsd(summary.wasteSpendUsd)} (${formatPercent(summary.structuralWasteRate)})`,\n `Potential impact surfaced: ${formatUsd(summary.opportunitySpendUsd)}`,\n '',\n ...renderTaxonomyBlock(summary),\n '',\n '## Top workflows',\n ...topRows(summary.spendByWorkflow),\n '',\n '## Top models',\n ...topRows(summary.spendByModel),\n '',\n ...renderDailyTrendRows(summary.spendByDay, summary.wasteByDay),\n ...(summary.spendByDay.length > 1 ? [''] : []),\n '## High-confidence waste',\n ...renderFindingList(wasteFindings, 'none detected'),\n '',\n '## Opportunities',\n ...renderFindingList(opportunityFindings, 'none detected'),\n '',\n ...renderActionQueue(summary),\n '',\n ...(topWaste\n ? [`- Confirmed leak to close first: ${topWaste.title}`]\n : ['- Confirmed leak to close first: none']),\n ...(summary.spendByWorkflow[0]\n ? [`- Workflow to inspect first: ${summary.spendByWorkflow[0].key}`]\n : ['- Workflow to inspect first: none']),\n '',\n ...renderCompareBlock(summary),\n ...(summary.comparison ? [''] : []),\n '## Notes',\n ...summary.notes.map((note) => `- ${note}`),\n ].join('\\n');\n}\n\nexport function renderMarkdownSummary(summary: AuditSummary) {\n if (isCursorUsageSummary(summary)) {\n return renderCursorMarkdownSummary(summary);\n }\n\n const lines = [\n '# Xerg Audit Report',\n '',\n `- Generated: ${summary.generatedAt}`,\n `- Total spend: ${formatUsd(summary.totalSpendUsd)}`,\n `- Observed spend: ${formatUsd(summary.observedSpendUsd)}`,\n `- Estimated spend: ${formatUsd(summary.estimatedSpendUsd)}`,\n `- Structural waste identified: ${formatUsd(summary.wasteSpendUsd)} (${formatPercent(summary.structuralWasteRate)})`,\n `- Potential impact surfaced: ${formatUsd(summary.opportunitySpendUsd)}`,\n `- Runs analyzed: ${summary.runCount}`,\n `- Model calls: ${summary.callCount}`,\n '',\n ...renderTaxonomyBlock(summary),\n '',\n '## Top workflows',\n ...topRows(summary.spendByWorkflow),\n '',\n ...renderDailyTrendRows(summary.spendByDay, summary.wasteByDay),\n ...(summary.spendByDay.length > 1 ? [''] : []),\n '',\n '## Findings',\n ...summary.findings.slice(0, 10).map((finding) => {\n return `- **${finding.title}** (${finding.classification}, ${finding.confidence}) — ${finding.summary} Estimated impact: ${formatUsd(finding.costImpactUsd)}.`;\n }),\n '',\n ...renderActionQueue(summary),\n ];\n\n if (summary.comparison) {\n const comparison = summary.comparison;\n lines.push(\n '',\n '## Before / after',\n `- Compared against: ${comparison.baselineGeneratedAt}`,\n `- Total spend: ${formatUsd(comparison.baselineTotalSpendUsd)} -> ${formatUsd(summary.totalSpendUsd)} (${formatUsdDelta(comparison.deltaTotalSpendUsd)})`,\n `- Structural waste: ${formatUsd(comparison.baselineWasteSpendUsd)} -> ${formatUsd(summary.wasteSpendUsd)} (${formatUsdDelta(comparison.deltaWasteSpendUsd)})`,\n `- Waste rate: ${formatPercent(comparison.baselineStructuralWasteRate)} -> ${formatPercent(summary.structuralWasteRate)} (${formatPercentDelta(comparison.deltaStructuralWasteRate)})`,\n );\n }\n\n return lines.join('\\n');\n}\n","// src/audit-push-payload.ts\nvar AUDIT_PUSH_PAYLOAD_VERSION = 2;\nexport {\n AUDIT_PUSH_PAYLOAD_VERSION\n};\n","import {\n AUDIT_PUSH_PAYLOAD_VERSION,\n type AuditPushPayload,\n type WireComparison,\n type WireFinding,\n} from '@xerg/schemas';\n\nimport type { AuditComparison, AuditSummary, Finding, WirePayloadMeta } from './types.js';\nimport { isoNow } from './utils/time.js';\n\nfunction toWireFinding(finding: Finding): WireFinding {\n return {\n id: finding.id,\n classification: finding.classification,\n confidence: finding.confidence,\n kind: finding.kind,\n title: finding.title,\n summary: finding.summary,\n scope: finding.scope,\n scopeId: finding.scopeId,\n costImpactUsd: finding.costImpactUsd,\n };\n}\n\nfunction toWireComparison(comparison: AuditComparison): WireComparison {\n return {\n baselineAuditId: comparison.baselineAuditId,\n baselineGeneratedAt: comparison.baselineGeneratedAt,\n baselineTotalSpendUsd: comparison.baselineTotalSpendUsd,\n baselineWasteSpendUsd: comparison.baselineWasteSpendUsd,\n baselineStructuralWasteRate: comparison.baselineStructuralWasteRate,\n deltaTotalSpendUsd: comparison.deltaTotalSpendUsd,\n deltaWasteSpendUsd: comparison.deltaWasteSpendUsd,\n deltaStructuralWasteRate: comparison.deltaStructuralWasteRate,\n deltaRunCount: comparison.deltaRunCount,\n deltaCallCount: comparison.deltaCallCount,\n };\n}\n\nexport function toWirePayload(summary: AuditSummary, meta: WirePayloadMeta): AuditPushPayload {\n return {\n version: AUDIT_PUSH_PAYLOAD_VERSION,\n summary: {\n auditId: summary.auditId,\n generatedAt: summary.generatedAt,\n comparisonKey: summary.comparisonKey,\n runCount: summary.runCount,\n callCount: summary.callCount,\n totalSpendUsd: summary.totalSpendUsd,\n observedSpendUsd: summary.observedSpendUsd,\n estimatedSpendUsd: summary.estimatedSpendUsd,\n wasteSpendUsd: summary.wasteSpendUsd,\n opportunitySpendUsd: summary.opportunitySpendUsd,\n structuralWasteRate: summary.structuralWasteRate,\n wasteByKind: summary.wasteByKind,\n opportunityByKind: summary.opportunityByKind,\n spendByWorkflow: summary.spendByWorkflow,\n spendByModel: summary.spendByModel,\n spendByDay: summary.spendByDay,\n wasteByDay: summary.wasteByDay,\n findings: summary.findings.map(toWireFinding),\n recommendations: summary.recommendations,\n notes: summary.notes,\n comparison: summary.comparison ? toWireComparison(summary.comparison) : null,\n },\n meta: {\n cliVersion: meta.cliVersion,\n sourceId: meta.sourceId,\n sourceHost: meta.sourceHost,\n environment: meta.environment,\n pushedAt: isoNow(),\n },\n };\n}\n","export class NoDataError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'NoDataError';\n }\n}\n","export interface CliLogger {\n info: (message: string) => void;\n verbose: (message: string) => void;\n}\n\nexport function createCliLogger(options: { verbose?: boolean }): CliLogger {\n return {\n info(message: string) {\n process.stderr.write(`${message}\\n`);\n },\n verbose(message: string) {\n if (!options.verbose) {\n return;\n }\n\n process.stderr.write(`[verbose] ${message}\\n`);\n },\n };\n}\n","import type { AuditPushPayload } from '@xerg/schemas';\n\nimport type { PushConfig } from './config.js';\n\nexport interface PushSuccess {\n ok: true;\n auditId: string;\n}\n\nexport interface PushFailure {\n ok: false;\n status: number;\n message: string;\n}\n\nexport type PushResult = PushSuccess | PushFailure;\n\nexport async function pushAudit(\n payload: AuditPushPayload,\n config: PushConfig,\n): Promise<PushResult> {\n const url = `${config.apiUrl}/v1/audits`;\n const body = JSON.stringify(payload);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.apiKey}`,\n },\n body,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Network error';\n return { ok: false, status: 0, message: `Failed to reach ${config.apiUrl}: ${message}` };\n }\n\n if (response.status === 201) {\n const data = (await response.json()) as { id?: string };\n return { ok: true, auditId: data.id ?? payload.summary.auditId };\n }\n\n let errorMessage: string;\n try {\n const data = (await response.json()) as { error?: string; message?: string };\n errorMessage = data.error || data.message || response.statusText;\n } catch {\n errorMessage = response.statusText || `HTTP ${response.status}`;\n }\n\n return { ok: false, status: response.status, message: errorMessage };\n}\n","import { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { loadStoredCredentials } from '../auth/credentials.js';\nimport { formatCommand } from '../command-display.js';\n\nexport interface PushConfig {\n apiKey: string;\n apiUrl: string;\n source: 'env' | 'config' | 'stored';\n}\n\nconst DEFAULT_API_URL = 'https://api.xerg.ai';\nconst CONFIG_PATH = join(homedir(), '.xerg', 'config.json');\n\nexport function loadPushConfig(): PushConfig {\n const envKey = process.env.XERG_API_KEY;\n const envUrl = process.env.XERG_API_URL;\n\n if (envKey) {\n return {\n apiKey: envKey,\n apiUrl: envUrl || DEFAULT_API_URL,\n source: 'env',\n };\n }\n\n try {\n const raw = readFileSync(CONFIG_PATH, 'utf8');\n const parsed = JSON.parse(raw) as { apiKey?: string; apiUrl?: string };\n\n if (parsed.apiKey) {\n return {\n apiKey: parsed.apiKey,\n apiUrl: envUrl || parsed.apiUrl || DEFAULT_API_URL,\n source: 'config',\n };\n }\n } catch {\n // config file doesn't exist or isn't valid JSON — fall through\n }\n\n const storedToken = loadStoredCredentials();\n if (storedToken) {\n return {\n apiKey: storedToken,\n apiUrl: envUrl || DEFAULT_API_URL,\n source: 'stored',\n };\n }\n\n throw new Error(\n `No API key configured. Set XERG_API_KEY, add \"apiKey\" to ${CONFIG_PATH}, or run \\`${formatCommand('login')}\\`.\\nGet your key at https://xerg.ai/dashboard/settings`,\n );\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\ninterface StoredCredentials {\n token: string;\n storedAt: string;\n}\n\nexport function getCredentialsPath(): string {\n const xdgConfig = process.env.XDG_CONFIG_HOME || join(homedir(), '.config');\n return join(xdgConfig, 'xerg', 'credentials.json');\n}\n\nexport function storeCredentials(token: string): void {\n const credPath = getCredentialsPath();\n const dir = dirname(credPath);\n mkdirSync(dir, { recursive: true });\n const data: StoredCredentials = { token, storedAt: new Date().toISOString() };\n writeFileSync(credPath, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function loadStoredCredentials(): string | null {\n const credPath = getCredentialsPath();\n try {\n if (!existsSync(credPath)) return null;\n const raw = readFileSync(credPath, 'utf8');\n const parsed = JSON.parse(raw) as StoredCredentials;\n return parsed.token || null;\n } catch {\n return null;\n }\n}\n\nexport function clearCredentials(): boolean {\n const credPath = getCredentialsPath();\n try {\n if (!existsSync(credPath)) return false;\n rmSync(credPath);\n return true;\n } catch {\n return false;\n }\n}\n","import { hostname } from 'node:os';\nimport type { AuditRuntime, AuditSummary, WirePayloadMeta } from '@xergai/core';\n\nimport { parseRemoteTarget } from './transport/index.js';\nimport type { RemoteSource } from './transport/index.js';\n\ntype PushSourceMeta = Pick<WirePayloadMeta, 'environment' | 'sourceHost' | 'sourceId'>;\n\nconst RAILWAY_SOURCE_ID = 'OpenClaw - Railway';\n\nexport function buildLocalPushSourceMeta(\n kind: AuditRuntime,\n localHost = hostname(),\n): PushSourceMeta {\n const productName = kind === 'cursor' ? 'Cursor' : kind === 'hermes' ? 'Hermes' : 'OpenClaw';\n\n return {\n environment: 'local',\n sourceId: `${productName} - ${localHost}`,\n sourceHost: localHost,\n };\n}\n\nexport function buildRemotePushSourceMeta(source: RemoteSource): PushSourceMeta {\n if (source.transport === 'railway') {\n return {\n environment: 'railway',\n sourceId: isGeneratedRailwayName(source.name)\n ? RAILWAY_SOURCE_ID\n : `OpenClaw - ${source.name}`,\n sourceHost: isGeneratedRailwayName(source.host) ? 'Railway' : source.host,\n };\n }\n\n return {\n environment: 'remote',\n sourceId: `OpenClaw - ${source.name}`,\n sourceHost: resolveRemoteHost(source.host),\n };\n}\n\nexport function buildCachedPushSourceMeta(\n summary: AuditSummary,\n localHost = hostname(),\n): PushSourceMeta {\n if (summary.runtime === 'cursor') {\n return buildLocalPushSourceMeta('cursor', localHost);\n }\n\n const sourceFiles = summary.sourceFiles ?? [];\n const comparisonKey = summary.comparisonKey ?? '';\n\n if (sourceFiles.some((sourceFile) => sourceFile.kind === 'cursor-usage-csv')) {\n return buildLocalPushSourceMeta('cursor', localHost);\n }\n\n if (isRailwayComparisonKey(comparisonKey)) {\n return {\n environment: 'railway',\n sourceId: RAILWAY_SOURCE_ID,\n sourceHost: 'Railway',\n };\n }\n\n const remoteHost = parseRemoteHostFromComparisonKey(comparisonKey);\n if (remoteHost) {\n return {\n environment: 'remote',\n sourceId: `OpenClaw - ${remoteHost}`,\n sourceHost: remoteHost,\n };\n }\n\n if (summary.runtime === 'hermes') {\n return buildLocalPushSourceMeta('hermes', localHost);\n }\n\n return buildLocalPushSourceMeta('openclaw', localHost);\n}\n\nfunction isGeneratedRailwayName(name: string): boolean {\n return name === 'railway-linked' || /^railway-[a-z0-9]{8}$/i.test(name);\n}\n\nfunction isRailwayComparisonKey(comparisonKey: string): boolean {\n return comparisonKey.startsWith('railway:') || comparisonKey.startsWith('railway-linked:');\n}\n\nfunction parseRemoteHostFromComparisonKey(comparisonKey: string): string | null {\n const parts = comparisonKey.split(':');\n if (parts.length < 3) {\n return null;\n }\n\n const target = parts.slice(0, -2).join(':');\n if (!target) {\n return null;\n }\n\n return resolveRemoteHost(target);\n}\n\nfunction resolveRemoteHost(target: string): string {\n const parsed = parseRemoteTarget(target);\n return parsed.host || target;\n}\n","import { execSync, spawnSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { mkdirSync, rmSync } from 'node:fs';\nimport { homedir, tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\nimport type { PullResult, RemoteDoctorReport, RemoteSource } from './types.js';\n\nconst DEFAULT_GATEWAY_DIR = '/tmp/openclaw';\nconst DEFAULT_SESSIONS_DIR = '~/.openclaw/agents';\n\nfunction hashString(input: string): string {\n return createHash('sha256').update(input).digest('hex').slice(0, 12);\n}\n\nfunction sshArgs(source: RemoteSource): string[] {\n const args: string[] = [];\n if (source.identityFile) {\n const resolved = source.identityFile.replace(/^~/, homedir());\n args.push('-i', resolved);\n }\n args.push('-o', 'BatchMode=yes', '-o', 'ConnectTimeout=10');\n return args;\n}\n\nfunction rsyncSshCommand(source: RemoteSource): string {\n const parts = ['ssh'];\n if (source.identityFile) {\n const resolved = source.identityFile.replace(/^~/, homedir());\n parts.push(`-i \"${resolved}\"`);\n }\n parts.push('-o BatchMode=yes', '-o ConnectTimeout=10');\n return parts.join(' ');\n}\n\nfunction isRsyncAvailable(): boolean {\n try {\n spawnSync('rsync', ['--version'], { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isRemoteRsyncAvailable(source: RemoteSource): boolean {\n try {\n const result = spawnSync('ssh', [...sshArgs(source), source.host, 'which rsync'], {\n stdio: 'pipe',\n timeout: 15_000,\n });\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\nfunction testSshConnectivity(source: RemoteSource): { ok: boolean; error?: string } {\n const result = spawnSync('ssh', [...sshArgs(source), source.host, 'echo ok'], {\n stdio: 'pipe',\n timeout: 15_000,\n });\n\n if (result.status === 0) {\n return { ok: true };\n }\n\n const stderr = result.stderr?.toString().trim() || 'Connection failed';\n return { ok: false, error: stderr };\n}\n\nfunction sshExec(source: RemoteSource, command: string): { stdout: string; status: number } {\n const result = spawnSync('ssh', [...sshArgs(source), source.host, command], {\n stdio: 'pipe',\n timeout: 30_000,\n });\n return {\n stdout: result.stdout?.toString().trim() ?? '',\n status: result.status ?? 1,\n };\n}\n\nfunction buildSinceFind(since: string | undefined): string {\n if (!since) return '';\n\n const match = since\n .trim()\n .toLowerCase()\n .match(/^(\\d+)([mhdw])$/);\n if (!match) return '';\n\n const value = Number(match[1]);\n const unit = match[2];\n\n let minutes: number;\n switch (unit) {\n case 'm':\n minutes = value;\n break;\n case 'h':\n minutes = value * 60;\n break;\n case 'd':\n minutes = value * 60 * 24;\n break;\n case 'w':\n minutes = value * 60 * 24 * 7;\n break;\n default:\n return '';\n }\n\n return `-mmin -${minutes}`;\n}\n\nfunction rsyncPull(opts: {\n source: RemoteSource;\n remotePath: string;\n localDir: string;\n includes?: string[];\n since?: string;\n}): boolean {\n mkdirSync(opts.localDir, { recursive: true });\n\n const args = ['-avz', '--timeout=30', '-e', rsyncSshCommand(opts.source)];\n\n if (opts.includes) {\n for (const pattern of opts.includes) {\n args.push('--include', pattern);\n }\n args.push('--exclude', '*');\n }\n\n if (opts.since) {\n const findArgs = buildSinceFind(opts.since);\n if (findArgs) {\n const fileListCmd = `find ${opts.remotePath} -type f ${findArgs} 2>/dev/null`;\n const { stdout, status } = sshExec(opts.source, fileListCmd);\n if (status !== 0 || !stdout) return false;\n\n const files = stdout.split('\\n').filter(Boolean);\n if (files.length === 0) return false;\n\n const tmpFile = join(tmpdir(), `xerg-filelist-${hashString(opts.remotePath)}`);\n const relativePaths = files.map((f) =>\n f.startsWith(opts.remotePath) ? f.slice(opts.remotePath.length).replace(/^\\//, '') : f,\n );\n execSync(`cat > ${tmpFile} << 'XERGEOF'\\n${relativePaths.join('\\n')}\\nXERGEOF`);\n args.push('--files-from', tmpFile);\n }\n }\n\n const remoteSrc = opts.remotePath.endsWith('/')\n ? `${opts.source.host}:${opts.remotePath}`\n : `${opts.source.host}:${opts.remotePath}/`;\n\n args.push(remoteSrc, `${opts.localDir}/`);\n\n const result = spawnSync('rsync', args, { stdio: 'pipe', timeout: 120_000 });\n return result.status === 0;\n}\n\nfunction tarSshPull(opts: {\n source: RemoteSource;\n remotePath: string;\n localDir: string;\n}): boolean {\n mkdirSync(opts.localDir, { recursive: true });\n\n const tarCmd = `tar -czf - -C ${opts.remotePath} . 2>/dev/null`;\n const sshArgsList = sshArgs(opts.source);\n const fullCmd = `ssh ${sshArgsList.map((a) => `\"${a}\"`).join(' ')} ${opts.source.host} '${tarCmd}' | tar -xzf - -C ${opts.localDir}`;\n\n try {\n execSync(fullCmd, { stdio: 'pipe', timeout: 120_000 });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pullDirectory(opts: {\n source: RemoteSource;\n remotePath: string;\n localDir: string;\n includes?: string[];\n since?: string;\n useRsync: boolean;\n}): boolean {\n if (opts.useRsync) {\n const ok = rsyncPull({\n source: opts.source,\n remotePath: opts.remotePath,\n localDir: opts.localDir,\n includes: opts.includes,\n since: opts.since,\n });\n if (ok) return true;\n }\n\n process.stderr.write(\n opts.useRsync\n ? 'rsync transfer failed, falling back to tar over ssh\\n'\n : 'rsync not found, using tar over ssh\\n',\n );\n\n return tarSshPull({\n source: opts.source,\n remotePath: opts.remotePath,\n localDir: opts.localDir,\n });\n}\n\nfunction resolveLocalPath(source: RemoteSource, keepFiles: boolean): string {\n if (keepFiles) {\n const cacheDir = join(homedir(), '.xerg', 'remote-cache', source.name);\n mkdirSync(cacheDir, { recursive: true });\n return cacheDir;\n }\n\n const hash = hashString(`${source.host}:${Date.now()}`);\n const tmpPath = join(tmpdir(), `xerg-remote-${hash}`);\n mkdirSync(tmpPath, { recursive: true });\n return tmpPath;\n}\n\nexport function parseRemoteTarget(target: string): { user: string; host: string; port?: string } {\n const portMatch = target.match(/^(.+):(\\d+)$/);\n if (portMatch) {\n const userHost = portMatch[1];\n const port = portMatch[2];\n const atIndex = userHost.indexOf('@');\n return {\n user: atIndex >= 0 ? userHost.slice(0, atIndex) : '',\n host: atIndex >= 0 ? userHost.slice(atIndex + 1) : userHost,\n port,\n };\n }\n\n const atIndex = target.indexOf('@');\n return {\n user: atIndex >= 0 ? target.slice(0, atIndex) : '',\n host: atIndex >= 0 ? target.slice(atIndex + 1) : target,\n };\n}\n\nexport function buildSourceFromFlags(opts: {\n remote: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n}): RemoteSource {\n const parsed = parseRemoteTarget(opts.remote);\n return {\n name: parsed.host,\n transport: 'ssh',\n host: opts.remote,\n logFile: opts.remoteLogFile,\n sessionsDir: opts.remoteSessionsDir,\n };\n}\n\nexport function buildComparisonKeyForRemote(source: RemoteSource): string {\n const logPath = source.logFile ?? DEFAULT_GATEWAY_DIR;\n const sessPath = source.sessionsDir ?? DEFAULT_SESSIONS_DIR;\n return `${source.host}:${logPath}:${sessPath}`;\n}\n\nexport async function pullRemoteFiles(opts: {\n source: RemoteSource;\n since?: string;\n keepFiles?: boolean;\n onProgress?: (message: string) => void;\n}): Promise<PullResult> {\n const { source, since, keepFiles = false, onProgress } = opts;\n\n onProgress?.(`Testing SSH connectivity to ${source.host}...`);\n const connectivity = testSshConnectivity(source);\n if (!connectivity.ok) {\n throw new Error(\n `Cannot connect to ${source.host}. Check SSH config and key access.${connectivity.error ? ` (${connectivity.error})` : ''}`,\n );\n }\n onProgress?.('SSH connectivity OK.');\n\n const useRsync = isRsyncAvailable();\n onProgress?.(\n useRsync\n ? 'Local rsync detected. Xerg will prefer rsync and fall back to tar over SSH if needed.'\n : 'Local rsync not detected. Xerg will pull files with tar over SSH.',\n );\n const localBase = resolveLocalPath(source, keepFiles);\n const gatewayDir = join(localBase, 'gateway');\n const sessionsDir = join(localBase, 'sessions');\n\n const remoteLogPath = source.logFile ?? DEFAULT_GATEWAY_DIR;\n const remoteSessionsPath = source.sessionsDir ?? DEFAULT_SESSIONS_DIR;\n\n const { stdout: expandedSessions } = sshExec(source, `eval echo ${remoteSessionsPath}`);\n const resolvedSessionsPath = expandedSessions || remoteSessionsPath;\n onProgress?.('Checking remote default paths for gateway logs and sessions...');\n\n const { status: logPathExists } = sshExec(source, `test -e ${remoteLogPath} && echo exists`);\n const { status: sessPathExists } = sshExec(\n source,\n `test -e ${resolvedSessionsPath} && echo exists`,\n );\n\n let pulledLog = false;\n let pulledSessions = false;\n\n if (logPathExists === 0) {\n onProgress?.(`Pulling gateway logs from ${remoteLogPath}...`);\n const { stdout: isFile } = sshExec(source, `test -f ${remoteLogPath} && echo file`);\n if (isFile === 'file') {\n const parentDir = remoteLogPath.slice(0, remoteLogPath.lastIndexOf('/')) || '/tmp';\n const fileName = remoteLogPath.slice(remoteLogPath.lastIndexOf('/') + 1);\n pulledLog = pullDirectory({\n source,\n remotePath: parentDir,\n localDir: gatewayDir,\n includes: [fileName],\n since,\n useRsync,\n });\n } else {\n pulledLog = pullDirectory({\n source,\n remotePath: remoteLogPath,\n localDir: gatewayDir,\n includes: ['openclaw-*.log', '*.log'],\n since,\n useRsync,\n });\n }\n }\n\n if (sessPathExists === 0) {\n onProgress?.(`Pulling session files from ${resolvedSessionsPath}...`);\n pulledSessions = pullDirectory({\n source,\n remotePath: resolvedSessionsPath,\n localDir: sessionsDir,\n includes: ['**/', '*.jsonl'],\n since,\n useRsync,\n });\n }\n\n if (!pulledLog && !pulledSessions) {\n if (keepFiles) {\n rmSync(localBase, { recursive: true, force: true });\n }\n throw new Error(\n `No OpenClaw data found at default paths on ${source.host}. Use --remote-log-file or --remote-sessions-dir.`,\n );\n }\n\n const result: PullResult = {\n localPath: localBase,\n source,\n };\n\n if (pulledLog) result.logFile = gatewayDir;\n if (pulledSessions) result.sessionsDir = sessionsDir;\n onProgress?.('Remote files pulled successfully.');\n\n return result;\n}\n\nexport async function runRemoteDoctor(opts: {\n source: RemoteSource;\n onProgress?: (message: string) => void;\n}): Promise<RemoteDoctorReport> {\n const { source, onProgress } = opts;\n const notes: string[] = [];\n\n onProgress?.(`Testing SSH connectivity to ${source.host}...`);\n const connectivity = testSshConnectivity(source);\n if (!connectivity.ok) {\n return {\n host: source.host,\n sshConnectivity: false,\n sshError: connectivity.error,\n rsyncAvailableLocal: false,\n rsyncAvailableRemote: false,\n defaultPaths: {\n gatewayExists: false,\n gatewayPath: DEFAULT_GATEWAY_DIR,\n gatewayFileCount: 0,\n gatewayTotalBytes: 0,\n sessionsExists: false,\n sessionsPath: DEFAULT_SESSIONS_DIR,\n sessionsFileCount: 0,\n sessionsTotalBytes: 0,\n },\n notes: [\n `Cannot connect to ${source.host}. Check SSH config and key access.${connectivity.error ? ` (${connectivity.error})` : ''}`,\n ],\n };\n }\n\n onProgress?.('SSH connectivity OK.');\n notes.push('SSH connectivity: OK');\n\n onProgress?.('Checking rsync availability locally and on the remote host...');\n const rsyncLocal = isRsyncAvailable();\n const rsyncRemote = isRemoteRsyncAvailable(source);\n notes.push(`rsync available locally: ${rsyncLocal ? 'yes' : 'no'}`);\n notes.push(`rsync available on remote: ${rsyncRemote ? 'yes' : 'no'}`);\n if (!rsyncLocal || !rsyncRemote) {\n notes.push('tar over ssh fallback will be used for file transfer');\n }\n\n function checkPath(remotePath: string) {\n const { stdout: expanded } = sshExec(source, `eval echo ${remotePath}`);\n const resolved = expanded || remotePath;\n const { status: exists } = sshExec(source, `test -e ${resolved} && echo exists`);\n if (exists !== 0) {\n return { exists: false, path: resolved, fileCount: 0, totalBytes: 0 };\n }\n const { stdout: countOut } = sshExec(source, `find ${resolved} -type f 2>/dev/null | wc -l`);\n const { stdout: sizeOut } = sshExec(source, `du -sb ${resolved} 2>/dev/null | cut -f1`);\n return {\n exists: true,\n path: resolved,\n fileCount: Number.parseInt(countOut, 10) || 0,\n totalBytes: Number.parseInt(sizeOut, 10) || 0,\n };\n }\n\n onProgress?.('Inspecting remote default paths...');\n const gateway = checkPath(DEFAULT_GATEWAY_DIR);\n const sessions = checkPath(DEFAULT_SESSIONS_DIR);\n\n if (gateway.exists) {\n notes.push(\n `Gateway logs found at ${gateway.path}: ${gateway.fileCount} files, ${formatBytes(gateway.totalBytes)}`,\n );\n } else {\n notes.push(`No gateway logs at ${gateway.path}`);\n }\n\n if (sessions.exists) {\n notes.push(\n `Sessions found at ${sessions.path}: ${sessions.fileCount} files, ${formatBytes(sessions.totalBytes)}`,\n );\n } else {\n notes.push(`No sessions at ${sessions.path}`);\n }\n\n const report: RemoteDoctorReport = {\n host: source.host,\n sshConnectivity: true,\n rsyncAvailableLocal: rsyncLocal,\n rsyncAvailableRemote: rsyncRemote,\n defaultPaths: {\n gatewayExists: gateway.exists,\n gatewayPath: gateway.path,\n gatewayFileCount: gateway.fileCount,\n gatewayTotalBytes: gateway.totalBytes,\n sessionsExists: sessions.exists,\n sessionsPath: sessions.path,\n sessionsFileCount: sessions.fileCount,\n sessionsTotalBytes: sessions.totalBytes,\n },\n notes,\n };\n\n if (source.logFile || source.sessionsDir) {\n const logCheck = source.logFile ? checkPath(source.logFile) : null;\n const sessCheck = source.sessionsDir ? checkPath(source.sessionsDir) : null;\n\n report.customPaths = {\n logFileExists: logCheck?.exists ?? false,\n logFilePath: source.logFile ?? '',\n logFileBytes: logCheck?.totalBytes ?? 0,\n sessionsDirExists: sessCheck?.exists ?? false,\n sessionsDirPath: source.sessionsDir ?? '',\n sessionsFileCount: sessCheck?.fileCount ?? 0,\n sessionsTotalBytes: sessCheck?.totalBytes ?? 0,\n };\n\n if (logCheck?.exists) {\n notes.push(`Custom log path ${source.logFile}: ${formatBytes(logCheck.totalBytes)}`);\n } else if (source.logFile) {\n notes.push(`Custom log path ${source.logFile}: not found`);\n }\n\n if (sessCheck?.exists) {\n notes.push(\n `Custom sessions path ${source.sessionsDir}: ${sessCheck.fileCount} files, ${formatBytes(sessCheck.totalBytes)}`,\n );\n } else if (source.sessionsDir) {\n notes.push(`Custom sessions path ${source.sessionsDir}: not found`);\n }\n }\n\n return report;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const value = bytes / 1024 ** i;\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n","import { execSync, spawnSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { mkdirSync, rmSync } from 'node:fs';\nimport { homedir, tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\nimport type { PullResult, RailwayDoctorReport, RailwayTarget, RemoteSource } from './types.js';\n\nconst DEFAULT_GATEWAY_DIR = '/tmp/openclaw';\nconst DEFAULT_SESSIONS_DIR = '~/.openclaw/agents';\n\nconst ALTERNATE_SESSION_PATHS = ['/data/.clawdbot/agents/main/sessions'];\n\nfunction hashString(input: string): string {\n return createHash('sha256').update(input).digest('hex').slice(0, 12);\n}\n\nfunction railwaySshArgs(target?: RailwayTarget): string[] {\n const args = ['ssh'];\n if (target) {\n args.push(`--project=${target.projectId}`);\n args.push(`--environment=${target.environmentId}`);\n args.push(`--service=${target.serviceId}`);\n }\n return args;\n}\n\nfunction railwayExec(command: string, target?: RailwayTarget): { stdout: string; status: number } {\n const args = [...railwaySshArgs(target), command];\n const result = spawnSync('railway', args, { stdio: 'pipe', timeout: 30_000 });\n return {\n stdout: result.stdout?.toString().trim() ?? '',\n status: result.status ?? 1,\n };\n}\n\nfunction buildSinceFind(since: string | undefined): string {\n if (!since) return '';\n\n const match = since\n .trim()\n .toLowerCase()\n .match(/^(\\d+)([mhdw])$/);\n if (!match) return '';\n\n const value = Number(match[1]);\n const unit = match[2];\n\n let minutes: number;\n switch (unit) {\n case 'm':\n minutes = value;\n break;\n case 'h':\n minutes = value * 60;\n break;\n case 'd':\n minutes = value * 60 * 24;\n break;\n case 'w':\n minutes = value * 60 * 24 * 7;\n break;\n default:\n return '';\n }\n\n return `-mmin -${minutes}`;\n}\n\nfunction tarRailwayPull(opts: {\n target?: RailwayTarget;\n remotePath: string;\n localDir: string;\n since?: string;\n}): boolean {\n mkdirSync(opts.localDir, { recursive: true });\n\n // Railway SSH allocates a PTY that corrupts binary data (LF → CRLF).\n // Base64-encoding the tar stream on the remote side avoids this.\n let tarCmd: string;\n if (opts.since) {\n const findArgs = buildSinceFind(opts.since);\n if (findArgs) {\n tarCmd = `find ${opts.remotePath} -type f ${findArgs} -print0 2>/dev/null | tar -czf - --null -T - 2>/dev/null | base64`;\n } else {\n tarCmd = `tar -czf - -C ${opts.remotePath} . 2>/dev/null | base64`;\n }\n } else {\n tarCmd = `tar -czf - -C ${opts.remotePath} . 2>/dev/null | base64`;\n }\n\n const sshArgs = railwaySshArgs(opts.target).join(' ');\n const fullCmd = `railway ${sshArgs} '${tarCmd}' | base64 -d | tar -xzf - -C ${opts.localDir}`;\n\n try {\n execSync(fullCmd, { stdio: 'pipe', timeout: 120_000 });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction resolveLocalPath(source: RemoteSource, keepFiles: boolean): string {\n if (keepFiles) {\n const cacheDir = join(homedir(), '.xerg', 'remote-cache', source.name);\n mkdirSync(cacheDir, { recursive: true });\n return cacheDir;\n }\n\n const identity = source.railway\n ? `railway:${source.railway.projectId}:${Date.now()}`\n : `${source.name}:${Date.now()}`;\n const hash = hashString(identity);\n const tmpPath = join(tmpdir(), `xerg-remote-${hash}`);\n mkdirSync(tmpPath, { recursive: true });\n return tmpPath;\n}\n\nfunction checkRemotePath(remotePath: string, target?: RailwayTarget) {\n const { status: exists } = railwayExec(`test -e ${remotePath} && echo exists`, target);\n if (exists !== 0) {\n return { exists: false, path: remotePath, fileCount: 0, totalBytes: 0 };\n }\n const { stdout: countOut } = railwayExec(\n `find ${remotePath} -type f 2>/dev/null | wc -l`,\n target,\n );\n const { stdout: sizeOut } = railwayExec(`du -sb ${remotePath} 2>/dev/null | cut -f1`, target);\n return {\n exists: true,\n path: remotePath,\n fileCount: Number.parseInt(countOut, 10) || 0,\n totalBytes: Number.parseInt(sizeOut, 10) || 0,\n };\n}\n\nfunction findSessionsPath(target?: RailwayTarget, customPath?: string): string | null {\n if (customPath) {\n const check = checkRemotePath(customPath, target);\n return check.exists ? customPath : null;\n }\n\n const { stdout: expandedDefault } = railwayExec(`eval echo ${DEFAULT_SESSIONS_DIR}`, target);\n const defaultPath = expandedDefault || DEFAULT_SESSIONS_DIR;\n const defaultCheck = checkRemotePath(defaultPath, target);\n if (defaultCheck.exists && defaultCheck.fileCount > 0) {\n return defaultPath;\n }\n\n for (const altPath of ALTERNATE_SESSION_PATHS) {\n const check = checkRemotePath(altPath, target);\n if (check.exists && check.fileCount > 0) {\n return altPath;\n }\n }\n\n return null;\n}\n\nexport function buildRailwaySourceFromFlags(opts: {\n railway?: RailwayTarget;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n}): RemoteSource {\n // Linked mode intentionally follows the Railway service linked to the current cwd.\n // If that turns out to be a database or sidecar, diagnostics should nudge users to relink.\n const name = opts.railway ? `railway-${opts.railway.serviceId.slice(0, 8)}` : 'railway-linked';\n return {\n name,\n transport: 'railway',\n host: name,\n logFile: opts.remoteLogFile,\n sessionsDir: opts.remoteSessionsDir,\n railway: opts.railway,\n };\n}\n\nexport function buildComparisonKeyForRailway(source: RemoteSource): string {\n const logPath = source.logFile ?? DEFAULT_GATEWAY_DIR;\n const sessPath = source.sessionsDir ?? DEFAULT_SESSIONS_DIR;\n if (source.railway) {\n return `railway:${source.railway.projectId}:${source.railway.environmentId}:${source.railway.serviceId}:${logPath}:${sessPath}`;\n }\n return `railway-linked:${logPath}:${sessPath}`;\n}\n\nexport async function pullRemoteFilesRailway(opts: {\n source: RemoteSource;\n since?: string;\n keepFiles?: boolean;\n onProgress?: (message: string) => void;\n}): Promise<PullResult> {\n const { source, since, keepFiles = false, onProgress } = opts;\n const target = source.railway;\n\n onProgress?.('Testing Railway service connectivity...');\n const { status } = railwayExec('echo ok', target);\n if (status !== 0) {\n throw new Error(\n target\n ? `Cannot reach Railway service ${target.serviceId} (project: ${target.projectId}). Check the provided --project / --environment / --service values and confirm the Railway CLI can reach that service.`\n : 'Cannot reach the Railway service linked to this directory. Run `railway link` here and choose the OpenClaw app service, or pass --project / --environment / --service explicitly.',\n );\n }\n onProgress?.('Railway service reachable.');\n\n const localBase = resolveLocalPath(source, keepFiles);\n const gatewayDir = join(localBase, 'gateway');\n const sessionsDir = join(localBase, 'sessions');\n\n const remoteLogPath = source.logFile ?? DEFAULT_GATEWAY_DIR;\n\n onProgress?.('Checking Railway default paths for gateway logs and sessions...');\n const logCheck = checkRemotePath(remoteLogPath, target);\n const resolvedSessionsPath = findSessionsPath(target, source.sessionsDir);\n\n let pulledLog = false;\n let pulledSessions = false;\n\n if (logCheck.fileCount > 0) {\n onProgress?.(`Pulling gateway logs from ${remoteLogPath}...`);\n const { stdout: isFile } = railwayExec(`test -f ${remoteLogPath} && echo file`, target);\n if (isFile === 'file') {\n const parentDir = remoteLogPath.slice(0, remoteLogPath.lastIndexOf('/')) || '/tmp';\n pulledLog = tarRailwayPull({\n target,\n remotePath: parentDir,\n localDir: gatewayDir,\n since,\n });\n } else {\n pulledLog = tarRailwayPull({\n target,\n remotePath: remoteLogPath,\n localDir: gatewayDir,\n since,\n });\n }\n }\n\n if (resolvedSessionsPath) {\n onProgress?.(`Pulling session files from ${resolvedSessionsPath}...`);\n pulledSessions = tarRailwayPull({\n target,\n remotePath: resolvedSessionsPath,\n localDir: sessionsDir,\n since,\n });\n }\n\n if (!pulledLog && !pulledSessions) {\n if (keepFiles) {\n rmSync(localBase, { recursive: true, force: true });\n }\n const checkedPaths = [remoteLogPath, DEFAULT_SESSIONS_DIR, ...ALTERNATE_SESSION_PATHS].join(\n ', ',\n );\n const wrongServiceHint = target\n ? ' Verify that the selected service is the OpenClaw app, or use --remote-log-file / --remote-sessions-dir for custom paths.'\n : ' If this directory is linked to a database or sidecar instead of the OpenClaw app, run `railway link` again and choose the app service.';\n throw new Error(\n `No OpenClaw data found on Railway service. Checked: ${checkedPaths}. Use --remote-log-file or --remote-sessions-dir to specify custom paths.${wrongServiceHint}`,\n );\n }\n\n const result: PullResult = {\n localPath: localBase,\n source,\n };\n\n if (pulledLog) result.logFile = gatewayDir;\n if (pulledSessions) result.sessionsDir = sessionsDir;\n onProgress?.('Railway files pulled successfully.');\n\n return result;\n}\n\nexport async function runRailwayDoctor(opts: {\n source: RemoteSource;\n onProgress?: (message: string) => void;\n}): Promise<RailwayDoctorReport> {\n const { source, onProgress } = opts;\n const target = source.railway;\n const notes: string[] = [];\n\n onProgress?.('Checking whether the Railway CLI is installed...');\n const whichCheck = spawnSync('which', ['railway'], { stdio: 'pipe', timeout: 5_000 });\n const railwayCliInstalled = whichCheck.status === 0;\n\n if (!railwayCliInstalled) {\n return {\n transport: 'railway',\n name: source.name,\n railwayCliInstalled: false,\n railwayAuthenticated: false,\n serviceReachable: false,\n defaultPaths: emptyDefaultPaths(),\n alternateSessionPaths: [],\n notes: ['Railway CLI is not installed. Install it: npm i -g @railway/cli'],\n };\n }\n\n const railwayPath = whichCheck.stdout?.toString().trim() ?? 'railway';\n onProgress?.('Checking Railway CLI authentication...');\n const versionCheck = spawnSync('railway', ['version'], { stdio: 'pipe', timeout: 10_000 });\n const versionStr =\n versionCheck.status === 0 ? versionCheck.stdout?.toString().trim() : railwayPath;\n notes.push(`Railway CLI: installed (${versionStr})`);\n\n const whoami = spawnSync('railway', ['whoami'], { stdio: 'pipe', timeout: 10_000 });\n const railwayAuthenticated = whoami.status === 0;\n const railwayAuthUser = railwayAuthenticated ? whoami.stdout?.toString().trim() : undefined;\n\n if (!railwayAuthenticated) {\n return {\n transport: 'railway',\n name: source.name,\n railwayCliInstalled: true,\n railwayAuthenticated: false,\n serviceReachable: false,\n defaultPaths: emptyDefaultPaths(),\n alternateSessionPaths: [],\n notes: [...notes, 'Not authenticated. Run: railway login'],\n };\n }\n\n notes.push(`Authenticated as: ${railwayAuthUser}`);\n\n onProgress?.('Testing Railway service connectivity...');\n const { status: reachStatus } = railwayExec('echo ok', target);\n const serviceReachable = reachStatus === 0;\n\n if (!serviceReachable) {\n return {\n transport: 'railway',\n name: source.name,\n railwayCliInstalled: true,\n railwayAuthenticated: true,\n railwayAuthUser,\n serviceReachable: false,\n serviceError: target\n ? `Cannot reach service ${target.serviceId} in project ${target.projectId}`\n : 'Current directory is not linked to a reachable Railway service. Run `railway link` here and choose the OpenClaw app service, or pass --project / --environment / --service.',\n defaultPaths: emptyDefaultPaths(),\n alternateSessionPaths: [],\n notes: [\n ...notes,\n target\n ? `Service unreachable (project: ${target.projectId}, service: ${target.serviceId}). Verify the provided Railway IDs point at the OpenClaw app service.`\n : 'Service unreachable for the current directory. Run `railway link` here and choose the OpenClaw app service, or pass explicit Railway IDs.',\n ],\n };\n }\n\n notes.push('Service connectivity: OK');\n\n onProgress?.('Inspecting Railway default paths...');\n const gateway = checkRemotePath(DEFAULT_GATEWAY_DIR, target);\n const { stdout: expandedDefault } = railwayExec(`eval echo ${DEFAULT_SESSIONS_DIR}`, target);\n const resolvedDefault = expandedDefault || DEFAULT_SESSIONS_DIR;\n const sessions = checkRemotePath(resolvedDefault, target);\n\n if (gateway.exists) {\n notes.push(\n `Gateway logs at ${gateway.path}: ${gateway.fileCount} files, ${formatBytes(gateway.totalBytes)}`,\n );\n } else {\n notes.push(`No gateway logs at ${DEFAULT_GATEWAY_DIR}`);\n }\n\n if (sessions.exists) {\n notes.push(\n `Sessions at ${sessions.path}: ${sessions.fileCount} files, ${formatBytes(sessions.totalBytes)}`,\n );\n } else {\n notes.push(`No sessions at ${resolvedDefault}`);\n }\n\n const alternateSessionPaths = ALTERNATE_SESSION_PATHS.map((altPath) => {\n const check = checkRemotePath(altPath, target);\n if (check.exists) {\n notes.push(\n `Alternate sessions at ${altPath}: ${check.fileCount} files, ${formatBytes(check.totalBytes)}`,\n );\n } else {\n notes.push(`No alternate sessions at ${altPath}`);\n }\n return {\n path: altPath,\n exists: check.exists,\n fileCount: check.fileCount,\n totalBytes: check.totalBytes,\n };\n });\n\n const report: RailwayDoctorReport = {\n transport: 'railway',\n name: source.name,\n railwayCliInstalled: true,\n railwayAuthenticated: true,\n railwayAuthUser,\n serviceReachable: true,\n defaultPaths: {\n gatewayExists: gateway.exists,\n gatewayPath: gateway.path,\n gatewayFileCount: gateway.fileCount,\n gatewayTotalBytes: gateway.totalBytes,\n sessionsExists: sessions.exists,\n sessionsPath: sessions.path,\n sessionsFileCount: sessions.fileCount,\n sessionsTotalBytes: sessions.totalBytes,\n },\n alternateSessionPaths,\n notes,\n };\n\n let logCheck: ReturnType<typeof checkRemotePath> | null = null;\n let sessCheck: ReturnType<typeof checkRemotePath> | null = null;\n\n if (source.logFile || source.sessionsDir) {\n logCheck = source.logFile ? checkRemotePath(source.logFile, target) : null;\n sessCheck = source.sessionsDir ? checkRemotePath(source.sessionsDir, target) : null;\n\n report.customPaths = {\n logFileExists: logCheck?.exists ?? false,\n logFilePath: source.logFile ?? '',\n logFileBytes: logCheck?.totalBytes ?? 0,\n sessionsDirExists: sessCheck?.exists ?? false,\n sessionsDirPath: source.sessionsDir ?? '',\n sessionsFileCount: sessCheck?.fileCount ?? 0,\n sessionsTotalBytes: sessCheck?.totalBytes ?? 0,\n };\n\n if (logCheck?.exists) {\n notes.push(`Custom log path ${source.logFile}: ${formatBytes(logCheck.totalBytes)}`);\n } else if (source.logFile) {\n notes.push(`Custom log path ${source.logFile}: not found`);\n }\n\n if (sessCheck?.exists) {\n notes.push(\n `Custom sessions path ${source.sessionsDir}: ${sessCheck.fileCount} files, ${formatBytes(sessCheck.totalBytes)}`,\n );\n } else if (source.sessionsDir) {\n notes.push(`Custom sessions path ${source.sessionsDir}: not found`);\n }\n }\n\n const foundOpenClawData =\n gateway.fileCount > 0 ||\n sessions.fileCount > 0 ||\n alternateSessionPaths.some((path) => path.fileCount > 0) ||\n (logCheck?.fileCount ?? 0) > 0 ||\n (sessCheck?.fileCount ?? 0) > 0;\n\n if (!foundOpenClawData) {\n notes.push(\n target\n ? 'No OpenClaw data was found on this Railway service. Verify that the selected service is the OpenClaw app, or use --remote-log-file / --remote-sessions-dir for custom paths.'\n : 'No OpenClaw data was found on the linked Railway service. If this directory is linked to a database or sidecar instead of the OpenClaw app, run `railway link` again and choose the app service.',\n );\n }\n\n return report;\n}\n\nfunction emptyDefaultPaths() {\n return {\n gatewayExists: false,\n gatewayPath: DEFAULT_GATEWAY_DIR,\n gatewayFileCount: 0,\n gatewayTotalBytes: 0,\n sessionsExists: false,\n sessionsPath: DEFAULT_SESSIONS_DIR,\n sessionsFileCount: 0,\n sessionsTotalBytes: 0,\n };\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const value = bytes / 1024 ** i;\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport type { RemoteConfig, RemoteConfigEntry, RemoteSource } from './types.js';\n\nexport function loadRemoteConfig(configPath: string): RemoteSource[] {\n const resolved = resolve(configPath);\n let raw: string;\n\n try {\n raw = readFileSync(resolved, 'utf8');\n } catch {\n throw new Error(`Cannot read remote config at ${resolved}`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid JSON in remote config at ${resolved}`);\n }\n\n const config = parsed as RemoteConfig;\n if (!config.remotes || !Array.isArray(config.remotes)) {\n throw new Error('Remote config must have a \"remotes\" array');\n }\n\n if (config.remotes.length === 0) {\n throw new Error('Remote config \"remotes\" array is empty');\n }\n\n return config.remotes.map((entry) => validateAndNormalize(entry));\n}\n\nfunction validateAndNormalize(entry: RemoteConfigEntry): RemoteSource {\n if (!entry.name || typeof entry.name !== 'string') {\n throw new Error('Each remote must have a \"name\" string');\n }\n\n const transport = entry.transport ?? 'ssh';\n\n if (transport !== 'ssh' && transport !== 'railway') {\n throw new Error(\n `Remote \"${entry.name}\" has invalid transport \"${transport}\". Use \"ssh\" or \"railway\".`,\n );\n }\n\n if (transport === 'railway') {\n return validateRailwayEntry(entry);\n }\n\n return validateSshEntry(entry);\n}\n\nfunction validateSshEntry(entry: RemoteConfigEntry): RemoteSource {\n if (!entry.host || typeof entry.host !== 'string') {\n throw new Error(`Remote \"${entry.name}\" must have a \"host\" string`);\n }\n\n return {\n name: entry.name,\n transport: 'ssh',\n host: entry.host,\n logFile: entry.logFile,\n sessionsDir: entry.sessionsDir,\n identityFile: entry.identityFile,\n };\n}\n\nfunction validateRailwayEntry(entry: RemoteConfigEntry): RemoteSource {\n if (!entry.railway || typeof entry.railway !== 'object') {\n throw new Error(`Remote \"${entry.name}\" with transport \"railway\" must have a \"railway\" object`);\n }\n\n const { projectId, environmentId, serviceId } = entry.railway;\n\n if (!projectId || typeof projectId !== 'string') {\n throw new Error(`Remote \"${entry.name}\" railway config must have a \"projectId\" string`);\n }\n if (!environmentId || typeof environmentId !== 'string') {\n throw new Error(`Remote \"${entry.name}\" railway config must have an \"environmentId\" string`);\n }\n if (!serviceId || typeof serviceId !== 'string') {\n throw new Error(`Remote \"${entry.name}\" railway config must have a \"serviceId\" string`);\n }\n\n return {\n name: entry.name,\n transport: 'railway',\n host: `railway-${serviceId.slice(0, 8)}`,\n logFile: entry.logFile,\n sessionsDir: entry.sessionsDir,\n railway: { projectId, environmentId, serviceId },\n };\n}\n","import { readFileSync } from 'node:fs';\n\nexport function getCliVersion(): string {\n try {\n const packageJsonPath = new URL('../package.json', import.meta.url);\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as {\n version?: string;\n };\n return packageJson.version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n","import { styleText } from 'node:util';\n\nimport {\n getCredentialsPath,\n loadStoredCredentials,\n storeCredentials,\n} from '../auth/credentials.js';\nimport { formatCommand } from '../command-display.js';\n\nconst DEFAULT_AUTH_URL = 'https://xerg.ai/dashboard/settings';\nconst DEFAULT_API_URL = 'https://api.xerg.ai';\nconst POLL_INTERVAL_MS = 2000;\nconst POLL_TIMEOUT_MS = 300_000; // 5 minutes\n\nexport async function runLoginCommand() {\n const existing = loadStoredCredentials();\n if (existing) {\n process.stderr.write(\n `Already logged in. Credentials stored at ${getCredentialsPath()}.\\nRun ${colorBold(formatCommand('logout'))} first to re-authenticate.\\n`,\n );\n return;\n }\n\n const data = await performDeviceLogin();\n storeCredentials(data.token);\n const teamInfo = data.teamName ? ` (team: ${data.teamName})` : '';\n process.stderr.write(\n `\\n${colorSuccess('Authenticated successfully')}${teamInfo}.\\nCredentials saved to ${getCredentialsPath()}.\\n`,\n );\n}\n\nexport async function performDeviceLogin(): Promise<{ token: string; teamName?: string }> {\n const apiUrl = process.env.XERG_API_URL || DEFAULT_API_URL;\n const deviceCodeUrl = `${apiUrl}/v1/auth/device-code`;\n\n let deviceResponse: {\n deviceCode: string;\n userCode: string;\n verificationUrl: string;\n interval?: number;\n };\n try {\n const res = await fetch(deviceCodeUrl, { method: 'POST' });\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n }\n deviceResponse = (await res.json()) as typeof deviceResponse;\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n throw new Error(\n `Could not start device auth flow (${msg}).\\n\\nAlternative: create an API key at ${DEFAULT_AUTH_URL}\\nand set XERG_API_KEY in your environment.`,\n );\n }\n\n const verifyUrl = deviceResponse.verificationUrl || DEFAULT_AUTH_URL;\n const pollInterval = (deviceResponse.interval || 2) * 1000;\n\n process.stderr.write(\n `\\nOpen this URL in your browser to authenticate:\\n\\n ${colorBold(verifyUrl)}\\n\\n`,\n );\n if (deviceResponse.userCode) {\n process.stderr.write(`Your code: ${colorBold(deviceResponse.userCode)}\\n\\n`);\n }\n process.stderr.write('Waiting for authentication...\\n');\n\n await openBrowser(verifyUrl);\n\n const tokenUrl = `${apiUrl}/v1/auth/device-token`;\n const startTime = Date.now();\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n await sleep(Math.max(pollInterval, POLL_INTERVAL_MS));\n\n try {\n const res = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ deviceCode: deviceResponse.deviceCode }),\n });\n\n if (res.status === 200) {\n return (await res.json()) as { token: string; teamName?: string };\n }\n\n if (res.status === 428) {\n // Authorization pending -- keep polling\n continue;\n }\n\n if (res.status === 410) {\n throw new Error(`Device code expired. Please run \\`${formatCommand('login')}\\` again.`);\n }\n\n const body = (await res.json().catch(() => ({}))) as { error?: string };\n throw new Error(body.error || `Unexpected response: HTTP ${res.status}`);\n } catch (err) {\n if (\n err instanceof Error &&\n (err.message.includes('expired') || err.message.includes('Unexpected'))\n ) {\n throw err;\n }\n // Network errors during poll -- keep trying\n }\n }\n\n throw new Error(`Authentication timed out. Please run \\`${formatCommand('login')}\\` again.`);\n}\n\nasync function openBrowser(url: string): Promise<void> {\n const { exec } = await import('node:child_process');\n const { platform } = await import('node:os');\n\n const commands: Record<string, string> = {\n darwin: 'open',\n win32: 'start',\n linux: 'xdg-open',\n };\n\n const cmd = commands[platform()];\n if (!cmd) return;\n\n return new Promise((resolve) => {\n exec(`${cmd} ${JSON.stringify(url)}`, () => resolve());\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction colorBold(text: string): string {\n return process.stderr.isTTY ? styleText('bold', text) : text;\n}\n\nfunction colorSuccess(text: string): string {\n return process.stderr.isTTY ? styleText('green', text) : text;\n}\n","import { getCredentialsPath, storeCredentials } from './auth/credentials.js';\nimport { performDeviceLogin } from './commands/login.js';\nimport { loadPushConfig } from './push/index.js';\nimport type { PushConfig } from './push/index.js';\n\nexport function loadPushConfigOrNull(): PushConfig | null {\n try {\n return loadPushConfig();\n } catch {\n return null;\n }\n}\n\nexport async function authenticateAndLoadPushConfig(): Promise<PushConfig> {\n const data = await performDeviceLogin();\n storeCredentials(data.token);\n\n const teamInfo = data.teamName ? ` (team: ${data.teamName})` : '';\n process.stderr.write(\n `\\nAuthenticated successfully${teamInfo}.\\nCredentials saved to ${getCredentialsPath()}.\\n`,\n );\n\n return loadPushConfig();\n}\n\nexport function renderCloudDisclaimer(): string {\n return [\n 'Xerg Cloud sync and hosted MCP are optional paid workspace features.',\n 'Local audits and compare stay free, and you can keep using Xerg locally if you skip this step.',\n ].join('\\n');\n}\n\nexport function renderMcpCredentialSourceMessage(config: PushConfig): string {\n if (config.source === 'stored') {\n return 'Using your stored login token. If hosted MCP requires a workspace API key, create one at xerg.ai/dashboard/settings and set XERG_API_KEY.';\n }\n\n return 'Using your workspace API key.';\n}\n","import { confirm, select } from '@inquirer/prompts';\n\nexport interface PromptChoice<T> {\n name: string;\n value: T;\n description?: string;\n}\n\nexport function hasPromptTty(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nexport async function promptConfirm(message: string, defaultValue = true): Promise<boolean> {\n return confirm({\n message,\n default: defaultValue,\n });\n}\n\nexport async function promptSelect<T>(message: string, choices: PromptChoice<T>[]): Promise<T> {\n return select({\n message,\n choices,\n });\n}\n","import { readFileSync } from 'node:fs';\nimport type { AuditPushPayload } from '@xerg/schemas';\nimport { getDefaultDbPath, listStoredAuditSummaries, toWirePayload } from '@xergai/core';\nimport type { WirePayloadMeta } from '@xergai/core';\n\nimport { formatCommand } from '../command-display.js';\nimport { NoDataError } from '../errors.js';\nimport { loadPushConfig, pushAudit } from '../push/index.js';\nimport { buildCachedPushSourceMeta } from '../source-meta.js';\nimport { getCliVersion } from '../version.js';\n\nexport interface PushCommandOptions {\n file?: string;\n dryRun?: boolean;\n}\n\nexport async function runPushCommand(options: PushCommandOptions) {\n const payload = options.file ? loadPayloadFromFile(options.file) : loadLatestCachedAuditPayload();\n\n if (options.dryRun) {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n return;\n }\n\n const config = loadPushConfig();\n const auditId = payload.summary.auditId;\n process.stderr.write(`Pushing audit ${auditId} to ${config.apiUrl}...\\n`);\n\n const result = await pushAudit(payload, config);\n\n if (result.ok) {\n process.stderr.write(`Pushed successfully (audit: ${result.auditId}).\\n`);\n } else {\n const statusInfo = result.status > 0 ? ` (HTTP ${result.status})` : '';\n throw new Error(`Push failed${statusInfo}: ${result.message}`);\n }\n}\n\nfunction loadPayloadFromFile(filePath: string): AuditPushPayload {\n let raw: string;\n try {\n raw = readFileSync(filePath, 'utf8');\n } catch {\n throw new Error(`Cannot read file: ${filePath}`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`File is not valid JSON: ${filePath}`);\n }\n\n const payload = parsed as AuditPushPayload;\n if (!payload.version || !payload.summary || !payload.meta) {\n throw new Error(\n `File does not look like an AuditPushPayload (missing version, summary, or meta): ${filePath}`,\n );\n }\n\n return payload;\n}\n\nexport function loadLatestCachedAuditPayload(): AuditPushPayload {\n const dbPath = getDefaultDbPath();\n let summaries: ReturnType<typeof listStoredAuditSummaries>;\n\n try {\n summaries = listStoredAuditSummaries(dbPath);\n } catch {\n throw new NoDataError(\n `No local audit database found. Run \\`${formatCommand('audit')}\\` first, or use \\`${formatCommand('push --file <path>')}\\`.`,\n );\n }\n\n if (summaries.length === 0) {\n throw new NoDataError(\n `No cached audit snapshots found. Run \\`${formatCommand('audit')}\\` first, or use \\`${formatCommand('push --file <path>')}\\`.`,\n );\n }\n\n const latest = summaries[0];\n const meta = buildMeta(latest);\n\n process.stderr.write(\n `Using most recent cached audit: ${latest.auditId} (${latest.generatedAt})\\n`,\n );\n\n return toWirePayload(latest, meta);\n}\n\nfunction buildMeta(summary: Parameters<typeof buildCachedPushSourceMeta>[0]): WirePayloadMeta {\n const sourceMeta = buildCachedPushSourceMeta(summary);\n return {\n cliVersion: getCliVersion(),\n sourceId: sourceMeta.sourceId,\n sourceHost: sourceMeta.sourceHost,\n environment: sourceMeta.environment,\n };\n}\n","import { toWirePayload } from '@xergai/core';\nimport type { AuditSummary, WirePayloadMeta } from '@xergai/core';\n\nimport {\n authenticateAndLoadPushConfig,\n loadPushConfigOrNull,\n renderCloudDisclaimer,\n} from '../cloud.js';\nimport { formatCommand } from '../command-display.js';\nimport { NoDataError } from '../errors.js';\nimport { hasPromptTty, promptConfirm } from '../prompts.js';\nimport { loadPushConfig, pushAudit } from '../push/index.js';\nimport { buildLocalPushSourceMeta } from '../source-meta.js';\nimport { getCliVersion } from '../version.js';\nimport { loadLatestCachedAuditPayload } from './push.js';\n\nexport async function runConnectCommand() {\n await runConnectFlow();\n}\n\nexport async function runConnectFlow(options?: {\n skipDisclaimer?: boolean;\n auditSummary?: AuditSummary;\n}): Promise<boolean> {\n if (!options?.skipDisclaimer) {\n process.stderr.write(`${renderCloudDisclaimer()}\\n`);\n }\n\n let config = loadPushConfigOrNull();\n if (config) {\n process.stderr.write('Xerg authentication detected.\\n');\n } else {\n if (!hasPromptTty()) {\n process.stderr.write(\n `No Xerg authentication is configured, and ${formatCommand('connect')} needs an interactive terminal before it can start browser login.\\nRun ${formatCommand('login')} from a TTY, or keep using local audits for free.\\n`,\n );\n process.exitCode = 1;\n return false;\n }\n\n const shouldLogin = await promptConfirm('Sign in to Xerg Cloud now?', true);\n if (!shouldLogin) {\n process.stderr.write(\n 'Skipped Xerg Cloud setup. You can keep using local audits and compare without connecting.\\n',\n );\n return false;\n }\n\n config = await authenticateAndLoadPushConfig();\n }\n\n if (!hasPromptTty()) {\n if (!options?.auditSummary) {\n process.stderr.write(\n `Non-interactive mode skips the push prompt. Run ${formatCommand('push')} when you want to sync a cached audit.\\n`,\n );\n } else {\n process.stderr.write(\n `Authentication is ready. Run ${formatCommand('push')} later if you want to sync this audit.\\n`,\n );\n }\n return true;\n }\n\n const shouldPush = await promptConfirm(\n options?.auditSummary\n ? 'Push this audit to Xerg Cloud?'\n : 'Push your latest cached audit to Xerg Cloud?',\n true,\n );\n\n if (!shouldPush) {\n process.stderr.write(\n options?.auditSummary\n ? `Skipped push. Run ${formatCommand('push')} later if you want to sync a cached audit.\\n`\n : `Skipped push. Run ${formatCommand('push')} when you want to sync a cached audit.\\n`,\n );\n return true;\n }\n\n const payload = options?.auditSummary\n ? toWirePayload(options.auditSummary, buildLocalMeta(options.auditSummary))\n : loadStandalonePayload();\n\n if (!payload) {\n return true;\n }\n\n await pushResolvedPayload(payload, config ?? loadPushConfig());\n return true;\n}\n\nfunction buildLocalMeta(summary: AuditSummary): WirePayloadMeta {\n const sourceMeta = buildLocalPushSourceMeta(summary.runtime);\n return {\n cliVersion: getCliVersion(),\n sourceId: sourceMeta.sourceId,\n sourceHost: sourceMeta.sourceHost,\n environment: sourceMeta.environment,\n };\n}\n\nfunction loadStandalonePayload() {\n try {\n return loadLatestCachedAuditPayload();\n } catch (error) {\n if (error instanceof NoDataError || (error instanceof Error && error.name === 'NoDataError')) {\n process.stderr.write(\n `${error instanceof Error ? error.message : 'No cached audit snapshots found.'}\\n`,\n );\n return null;\n }\n throw error;\n }\n}\n\nasync function pushResolvedPayload(\n payload: Parameters<typeof pushAudit>[0],\n config: Parameters<typeof pushAudit>[1],\n) {\n process.stderr.write(`Pushing audit ${payload.summary.auditId} to ${config.apiUrl}...\\n`);\n const result = await pushAudit(payload, config);\n\n if (result.ok) {\n process.stderr.write(`Pushed successfully (audit: ${result.auditId}).\\n`);\n return;\n }\n\n const statusInfo = result.status > 0 ? ` (HTTP ${result.status})` : '';\n throw new Error(`Push failed${statusInfo}: ${result.message}`);\n}\n","import {\n doctorAgentRuntime,\n doctorCursorUsageCsv,\n renderCursorDoctorReport,\n renderDoctorReport,\n} from '@xergai/core';\n\nimport { createCliLogger } from '../log.js';\nimport {\n buildRailwaySourceFromFlags,\n buildSourceFromFlags,\n runRailwayDoctor,\n runRemoteDoctor,\n} from '../transport/index.js';\nimport type { RailwayDoctorReport, RailwayTarget, RemoteDoctorReport } from '../transport/index.js';\n\nexport interface DoctorCommandOptions {\n runtime?: 'openclaw' | 'hermes';\n logFile?: string;\n sessionsDir?: string;\n cursorUsageCsv?: string;\n remote?: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n railway?: boolean;\n railwayProject?: string;\n railwayEnvironment?: string;\n railwayService?: string;\n verbose?: boolean;\n commandPrefix?: string;\n}\n\nexport async function runDoctorCommand(options: DoctorCommandOptions) {\n const logger = createCliLogger({ verbose: options.verbose });\n validateRuntimeOption(options.runtime);\n validateCursorUsageCsvOptions(options);\n validateHermesLocalOnly(options);\n\n if (options.railway) {\n logger.verbose('Inspecting Railway audit readiness.');\n const railwayTarget = buildRailwayTarget(options);\n const source = buildRailwaySourceFromFlags({\n railway: railwayTarget,\n remoteLogFile: options.remoteLogFile,\n remoteSessionsDir: options.remoteSessionsDir,\n });\n\n const report = await runRailwayDoctor({ source, onProgress: logger.verbose });\n process.stdout.write(`${renderRailwayDoctorReport(report)}\\n`);\n return;\n }\n\n if (options.remote) {\n logger.verbose(`Inspecting SSH audit readiness for ${options.remote}.`);\n const source = buildSourceFromFlags({\n remote: options.remote,\n remoteLogFile: options.remoteLogFile,\n remoteSessionsDir: options.remoteSessionsDir,\n });\n\n const report = await runRemoteDoctor({ source, onProgress: logger.verbose });\n process.stdout.write(`${renderRemoteDoctorReport(report)}\\n`);\n return;\n }\n\n if (options.cursorUsageCsv) {\n logger.verbose('Inspecting local Cursor usage CSV audit readiness.');\n logger.verbose(`Using Cursor usage CSV: ${options.cursorUsageCsv}`);\n const report = await doctorCursorUsageCsv({\n cursorUsageCsv: options.cursorUsageCsv,\n onProgress: logger.verbose,\n });\n process.stdout.write(`${renderCursorDoctorReport(report)}\\n`);\n return;\n }\n\n logger.verbose(\n options.runtime\n ? `Inspecting local ${options.runtime === 'hermes' ? 'Hermes' : 'OpenClaw'} audit readiness.`\n : 'Inspecting local runtime audit readiness.',\n );\n if (options.logFile) {\n logger.verbose(`Using explicit local log file: ${options.logFile}`);\n }\n if (options.sessionsDir) {\n logger.verbose(`Using explicit local sessions directory: ${options.sessionsDir}`);\n }\n\n const report = await doctorAgentRuntime({\n runtime: options.runtime ?? 'auto',\n logFile: options.logFile,\n sessionsDir: options.sessionsDir,\n onProgress: logger.verbose,\n });\n\n process.stdout.write(`${renderDoctorReport(report, { commandPrefix: options.commandPrefix })}\\n`);\n}\n\nfunction validateRuntimeOption(runtime?: DoctorCommandOptions['runtime']) {\n if (!runtime) {\n return;\n }\n\n if (runtime !== 'openclaw' && runtime !== 'hermes') {\n throw new Error(\n `Unsupported runtime \"${runtime}\". Use --runtime openclaw or --runtime hermes.`,\n );\n }\n}\n\nfunction validateCursorUsageCsvOptions(options: DoctorCommandOptions) {\n if (!options.cursorUsageCsv) {\n return;\n }\n\n const conflicts = [\n options.runtime ? '--runtime' : null,\n options.logFile ? '--log-file' : null,\n options.sessionsDir ? '--sessions-dir' : null,\n options.remote ? '--remote' : null,\n options.remoteLogFile ? '--remote-log-file' : null,\n options.remoteSessionsDir ? '--remote-sessions-dir' : null,\n options.railway ? '--railway' : null,\n options.railwayProject ? '--project' : null,\n options.railwayEnvironment ? '--environment' : null,\n options.railwayService ? '--service' : null,\n ].filter((flag): flag is string => flag !== null);\n\n if (conflicts.length > 0) {\n throw new Error(`The --cursor-usage-csv flag cannot be combined with ${conflicts.join(', ')}.`);\n }\n}\n\nfunction validateHermesLocalOnly(options: DoctorCommandOptions) {\n if (options.runtime !== 'hermes') {\n return;\n }\n\n const conflicts = [\n options.remote ? '--remote' : null,\n options.remoteLogFile ? '--remote-log-file' : null,\n options.remoteSessionsDir ? '--remote-sessions-dir' : null,\n options.railway ? '--railway' : null,\n options.railwayProject ? '--project' : null,\n options.railwayEnvironment ? '--environment' : null,\n options.railwayService ? '--service' : null,\n ].filter((flag): flag is string => flag !== null);\n\n if (conflicts.length > 0) {\n throw new Error(\n `Hermes remote transport is not supported yet. Remove ${conflicts.join(', ')} or switch to --runtime openclaw.`,\n );\n }\n}\n\nfunction buildRailwayTarget(options: DoctorCommandOptions): RailwayTarget | undefined {\n if (options.railwayProject && options.railwayEnvironment && options.railwayService) {\n return {\n projectId: options.railwayProject,\n environmentId: options.railwayEnvironment,\n serviceId: options.railwayService,\n };\n }\n return undefined;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const value = bytes / 1024 ** i;\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n\nfunction renderRemoteDoctorReport(report: RemoteDoctorReport): string {\n const sections = [\n '# Xerg doctor [remote]',\n '',\n `Host: ${report.host}`,\n `SSH connectivity: ${report.sshConnectivity ? 'OK' : 'FAILED'}`,\n ];\n\n if (!report.sshConnectivity) {\n sections.push('', ...report.notes.map((n) => `[remote] ${n}`));\n return sections.join('\\n');\n }\n\n sections.push(\n `rsync (local): ${report.rsyncAvailableLocal ? 'available' : 'not found'}`,\n `rsync (remote): ${report.rsyncAvailableRemote ? 'available' : 'not found'}`,\n '',\n '## Default paths',\n `[remote] Gateway (${report.defaultPaths.gatewayPath}): ${\n report.defaultPaths.gatewayExists\n ? `${report.defaultPaths.gatewayFileCount} files, ${formatBytes(report.defaultPaths.gatewayTotalBytes)}`\n : 'not found'\n }`,\n `[remote] Sessions (${report.defaultPaths.sessionsPath}): ${\n report.defaultPaths.sessionsExists\n ? `${report.defaultPaths.sessionsFileCount} files, ${formatBytes(report.defaultPaths.sessionsTotalBytes)}`\n : 'not found'\n }`,\n );\n\n if (report.customPaths) {\n sections.push('', '## Custom paths');\n if (report.customPaths.logFilePath) {\n sections.push(\n `[remote] Log file (${report.customPaths.logFilePath}): ${\n report.customPaths.logFileExists\n ? formatBytes(report.customPaths.logFileBytes)\n : 'not found'\n }`,\n );\n }\n if (report.customPaths.sessionsDirPath) {\n sections.push(\n `[remote] Sessions dir (${report.customPaths.sessionsDirPath}): ${\n report.customPaths.sessionsDirExists\n ? `${report.customPaths.sessionsFileCount} files, ${formatBytes(report.customPaths.sessionsTotalBytes)}`\n : 'not found'\n }`,\n );\n }\n }\n\n sections.push('', '## Notes', ...report.notes.map((n) => `[remote] ${n}`));\n\n return sections.join('\\n');\n}\n\nfunction renderRailwayDoctorReport(report: RailwayDoctorReport): string {\n const sections = [\n '# Xerg doctor [railway]',\n '',\n `Source: ${report.name}`,\n `Railway CLI: ${report.railwayCliInstalled ? 'installed' : 'NOT INSTALLED'}`,\n ];\n\n if (!report.railwayCliInstalled) {\n sections.push('', ...report.notes.map((n) => `[railway] ${n}`));\n return sections.join('\\n');\n }\n\n sections.push(`Authentication: ${report.railwayAuthenticated ? 'OK' : 'NOT AUTHENTICATED'}`);\n\n if (!report.railwayAuthenticated) {\n sections.push('', ...report.notes.map((n) => `[railway] ${n}`));\n return sections.join('\\n');\n }\n\n if (report.railwayAuthUser) {\n sections.push(`User: ${report.railwayAuthUser}`);\n }\n\n sections.push(`Service reachable: ${report.serviceReachable ? 'OK' : 'FAILED'}`);\n\n if (!report.serviceReachable) {\n if (report.serviceError) {\n sections.push(`Error: ${report.serviceError}`);\n }\n sections.push('', ...report.notes.map((n) => `[railway] ${n}`));\n return sections.join('\\n');\n }\n\n sections.push(\n '',\n '## Default paths',\n `[railway] Gateway (${report.defaultPaths.gatewayPath}): ${\n report.defaultPaths.gatewayExists\n ? `${report.defaultPaths.gatewayFileCount} files, ${formatBytes(report.defaultPaths.gatewayTotalBytes)}`\n : 'not found'\n }`,\n `[railway] Sessions (${report.defaultPaths.sessionsPath}): ${\n report.defaultPaths.sessionsExists\n ? `${report.defaultPaths.sessionsFileCount} files, ${formatBytes(report.defaultPaths.sessionsTotalBytes)}`\n : 'not found'\n }`,\n );\n\n if (report.alternateSessionPaths.length > 0) {\n sections.push('', '## Alternate session paths');\n for (const alt of report.alternateSessionPaths) {\n sections.push(\n `[railway] ${alt.path}: ${\n alt.exists ? `${alt.fileCount} files, ${formatBytes(alt.totalBytes)}` : 'not found'\n }`,\n );\n }\n }\n\n if (report.customPaths) {\n sections.push('', '## Custom paths');\n if (report.customPaths.logFilePath) {\n sections.push(\n `[railway] Log file (${report.customPaths.logFilePath}): ${\n report.customPaths.logFileExists\n ? formatBytes(report.customPaths.logFileBytes)\n : 'not found'\n }`,\n );\n }\n if (report.customPaths.sessionsDirPath) {\n sections.push(\n `[railway] Sessions dir (${report.customPaths.sessionsDirPath}): ${\n report.customPaths.sessionsDirExists\n ? `${report.customPaths.sessionsFileCount} files, ${formatBytes(report.customPaths.sessionsTotalBytes)}`\n : 'not found'\n }`,\n );\n }\n }\n\n sections.push('', '## Notes', ...report.notes.map((n) => `[railway] ${n}`));\n\n return sections.join('\\n');\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nimport {\n authenticateAndLoadPushConfig,\n loadPushConfigOrNull,\n renderCloudDisclaimer,\n renderMcpCredentialSourceMessage,\n} from '../cloud.js';\nimport { formatCommand } from '../command-display.js';\nimport { hasPromptTty, promptConfirm, promptSelect } from '../prompts.js';\nimport type { PushConfig } from '../push/index.js';\n\nconst HOSTED_MCP_URL = 'https://mcp.xerg.ai/mcp';\n\ntype McpClient = 'cursor' | 'claude-code' | 'other';\n\nexport async function runMcpSetupCommand() {\n await runMcpSetupFlow();\n}\n\nexport async function runMcpSetupFlow() {\n let config = loadPushConfigOrNull();\n\n if (!config) {\n process.stderr.write(`${renderCloudDisclaimer()}\\n`);\n process.stderr.write('Hosted MCP requires Xerg Cloud authentication before client setup.\\n');\n }\n\n if (!hasPromptTty()) {\n process.stderr.write(\n `${formatCommand('mcp-setup')} needs an interactive terminal so it can ask which MCP client you want to configure.\\n`,\n );\n process.exitCode = 1;\n return;\n }\n\n if (!config) {\n const shouldLogin = await promptConfirm('Authenticate with Xerg Cloud now?', true);\n if (!shouldLogin) {\n process.stderr.write(\n `Skipped hosted MCP setup. Run ${formatCommand('mcp-setup')} when you're ready.\\n`,\n );\n return;\n }\n\n config = await authenticateAndLoadPushConfig();\n }\n\n process.stderr.write(`${renderMcpCredentialSourceMessage(config)}\\n`);\n\n const client = await promptSelect<McpClient>('Which MCP client do you want to configure?', [\n {\n name: 'Cursor',\n value: 'cursor',\n description: 'Project-scoped or global Cursor MCP config',\n },\n {\n name: 'Claude Code',\n value: 'claude-code',\n description: 'Project-scoped Claude Code MCP config',\n },\n {\n name: 'Other',\n value: 'other',\n description: 'Print the hosted HTTP MCP snippet for another client',\n },\n ]);\n\n const snippet = JSON.stringify(buildHostedMcpConfig(config), null, 2);\n\n if (client === 'cursor') {\n await handleCursorSetup(snippet, config);\n return;\n }\n\n process.stdout.write(`${snippet}\\n`);\n\n if (client === 'claude-code') {\n process.stderr.write(\n 'Add this to `.mcp.json` in your project root, or import the same `mcpServers.xerg` config through Claude Code MCP settings.\\n',\n );\n return;\n }\n\n process.stderr.write(\n `Add this as a remote HTTP MCP server in your client. Endpoint: ${HOSTED_MCP_URL}\\n`,\n );\n}\n\nasync function handleCursorSetup(snippet: string, config: PushConfig) {\n const cursorDir = join(process.cwd(), '.cursor');\n const cursorConfigPath = join(cursorDir, 'mcp.json');\n\n if (existsSync(cursorDir)) {\n const shouldWrite = await promptConfirm(\n 'Write a project-scoped Cursor MCP config to .cursor/mcp.json?',\n true,\n );\n\n if (shouldWrite) {\n writeCursorConfig(cursorConfigPath, config);\n process.stderr.write(`Wrote hosted MCP config to ${cursorConfigPath}.\\n`);\n return;\n }\n }\n\n process.stdout.write(`${snippet}\\n`);\n process.stderr.write(\n 'Add this to `.cursor/mcp.json` for a project-scoped Cursor config, or `~/.cursor/mcp.json` for a global Cursor config.\\n',\n );\n}\n\nfunction buildHostedMcpConfig(config: PushConfig) {\n return {\n mcpServers: {\n xerg: {\n type: 'http',\n url: HOSTED_MCP_URL,\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n },\n },\n },\n };\n}\n\nfunction writeCursorConfig(filePath: string, config: PushConfig) {\n mkdirSync(dirname(filePath), { recursive: true });\n\n let parsed: {\n mcpServers?: Record<string, unknown>;\n [key: string]: unknown;\n } = {};\n\n if (existsSync(filePath)) {\n try {\n parsed = JSON.parse(readFileSync(filePath, 'utf8')) as typeof parsed;\n } catch {\n throw new Error(`Cursor config is not valid JSON: ${filePath}`);\n }\n }\n\n const existingServers = parsed.mcpServers;\n if (existingServers && typeof existingServers !== 'object') {\n throw new Error(`Cursor config has an invalid \"mcpServers\" value: ${filePath}`);\n }\n\n parsed.mcpServers = {\n ...(existingServers ?? {}),\n xerg: buildHostedMcpConfig(config).mcpServers.xerg,\n };\n\n writeFileSync(filePath, `${JSON.stringify(parsed, null, 2)}\\n`);\n}\n","import {\n auditAgentRuntime,\n getRuntimeAdapter,\n renderTerminalSummary,\n resolveRuntimeCandidates,\n} from '@xergai/core';\nimport type { AgentRuntime } from '@xergai/core';\n\nimport { loadPushConfigOrNull, renderCloudDisclaimer } from '../cloud.js';\nimport { formatCommand } from '../command-display.js';\nimport { hasPromptTty, promptConfirm, promptSelect } from '../prompts.js';\nimport { runConnectFlow } from './connect.js';\nimport { runMcpSetupFlow } from './mcp-setup.js';\n\ntype RuntimeCandidate = Awaited<ReturnType<typeof resolveRuntimeCandidates>>[number];\n\nexport async function runInitCommand() {\n if (!hasPromptTty()) {\n process.stderr.write(\n `${formatCommand('init')} is interactive in this release. Run ${formatCommand('audit')} directly when you need a non-interactive audit.\\n`,\n );\n process.exitCode = 1;\n return;\n }\n\n const candidates = await resolveRuntimeCandidates({ runtime: 'auto' });\n const usable = candidates.filter((candidate) => candidate.usable);\n\n if (usable.length === 0) {\n renderNoDataGuidance();\n return;\n }\n\n const runtime = await chooseRuntime(usable);\n if (!runtime) {\n return;\n }\n\n try {\n const summary = await auditAgentRuntime({\n runtime,\n commandPrefix: formatCommand(''),\n });\n\n process.stdout.write(`${renderTerminalSummary(summary)}\\n`);\n process.stderr.write(\n `\\nNext: after you make a fix, run ${formatCommand('audit --compare')} to measure the delta.\\n`,\n );\n\n const existingAuth = loadPushConfigOrNull();\n process.stderr.write(\n `${\n existingAuth\n ? 'Xerg Cloud authentication is already configured. You can optionally push this audit and set up hosted MCP next.'\n : renderCloudDisclaimer()\n }\\n`,\n );\n\n const shouldConnect = await promptConfirm('Continue with optional Xerg Cloud setup?', true);\n if (!shouldConnect) {\n process.stderr.write(\n `Skipped Xerg Cloud setup. Run ${formatCommand('connect')} or ${formatCommand('mcp-setup')} whenever you want the hosted follow-up.\\n`,\n );\n return;\n }\n\n const connected = await runConnectFlow({\n skipDisclaimer: true,\n auditSummary: summary,\n });\n\n if (!connected) {\n return;\n }\n\n const shouldSetupMcp = await promptConfirm('Set up hosted MCP now?', true);\n if (!shouldSetupMcp) {\n process.stderr.write(\n `Skipped hosted MCP setup. Run ${formatCommand('mcp-setup')} when you're ready.\\n`,\n );\n return;\n }\n\n await runMcpSetupFlow();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n const productName = getRuntimeAdapter(runtime).productName;\n process.stderr.write(\n `${[\n `${productName} audit failed: ${message}`,\n `Try ${formatCommand(['doctor', '--runtime', runtime])} to inspect the detected paths first.`,\n `Re-run ${formatCommand('audit --verbose')} for more detail.`,\n ].join('\\n')}\\n`,\n );\n process.exitCode = 1;\n }\n}\n\nasync function chooseRuntime(candidates: RuntimeCandidate[]): Promise<AgentRuntime | null> {\n if (candidates.length === 1) {\n const candidate = candidates[0];\n process.stderr.write(`${describeCandidate(candidate)}\\n`);\n\n const shouldAudit = await promptConfirm(\n `Run your first ${candidate.adapter.productName} audit now?`,\n true,\n );\n if (!shouldAudit) {\n process.stderr.write(\n `Skipped the first audit. Run ${formatCommand(['audit', '--runtime', candidate.adapter.runtime])} when you're ready.\\n`,\n );\n return null;\n }\n\n return candidate.adapter.runtime;\n }\n\n return promptSelect<AgentRuntime>('Choose the local runtime to audit first.', [\n ...candidates.map((candidate) => ({\n name: candidate.adapter.productName,\n value: candidate.adapter.runtime,\n description: describeSources(candidate),\n })),\n ]);\n}\n\nfunction describeCandidate(candidate: RuntimeCandidate): string {\n return `Found local ${candidate.adapter.productName} data (${describeSources(candidate)}).`;\n}\n\nfunction describeSources(candidate: RuntimeCandidate): string {\n const kinds = new Set(candidate.sources.map((source) => source.kind));\n const details = [\n kinds.has('gateway') ? 'gateway logs' : null,\n kinds.has('sessions') ? 'session transcripts' : null,\n ].filter((detail): detail is string => detail !== null);\n\n return details.join(' and ');\n}\n\nfunction renderNoDataGuidance() {\n const openclawDefaults = getRuntimeAdapter('openclaw').defaultPaths();\n const hermesDefaults = getRuntimeAdapter('hermes').defaultPaths();\n\n process.stderr.write(\n `${[\n 'No local OpenClaw or Hermes data was detected in the default locations Xerg checked.',\n '',\n 'Checked defaults:',\n `- OpenClaw gateway logs: ${openclawDefaults.gatewayPattern}`,\n `- OpenClaw session transcripts: ${openclawDefaults.sessionsPattern}`,\n `- Hermes gateway logs: ${hermesDefaults.gatewayPattern}`,\n `- Hermes session transcripts: ${hermesDefaults.sessionsPattern}`,\n '',\n 'Next steps:',\n `- Local OpenClaw paths: ${formatCommand('audit --runtime openclaw --log-file /path/to/openclaw.log')} or ${formatCommand('audit --runtime openclaw --sessions-dir /path/to/sessions')}`,\n `- Local Hermes paths: ${formatCommand('audit --runtime hermes --log-file ~/.hermes/logs/agent.log')} or ${formatCommand('audit --runtime hermes --sessions-dir ~/.hermes/sessions')}`,\n `- Remote OpenClaw only: ${formatCommand('audit --remote user@host')}`,\n `- Railway OpenClaw only: ${formatCommand('audit --railway')}`,\n ].join('\\n')}\\n`,\n );\n}\n","import { clearCredentials, getCredentialsPath } from '../auth/credentials.js';\n\nexport function runLogoutCommand() {\n const removed = clearCredentials();\n\n if (removed) {\n process.stderr.write(`Credentials removed from ${getCredentialsPath()}.\\n`);\n } else {\n process.stderr.write('No stored credentials found. Already logged out.\\n');\n }\n}\n","import { type CommandDisplay, formatCommand } from './command-display.js';\n\nexport function renderRootHelp(version: string, display: CommandDisplay) {\n return `${display.name} ${version}\n\nWaste intelligence for OpenClaw and Hermes workflows.\n\nUsage:\n ${formatCommand('<command> [options]', display.prefix)}\n\nGetting started:\n init Detect local runtimes, run a first audit, and offer optional cloud follow-up.\n\nAudit and inspect:\n audit Analyze OpenClaw or Hermes logs, or a local Cursor usage CSV.\n doctor Inspect OpenClaw or Hermes sources, or a local Cursor usage CSV.\n\nCloud:\n connect Authenticate and optionally push your latest audit to Xerg Cloud.\n push Push a cached audit snapshot to the Xerg API.\n login Authenticate with the Xerg API via browser.\n logout Remove stored Xerg API credentials.\n mcp-setup Generate hosted MCP client configuration.\n\nGlobal options:\n -h, --help Show help\n -v, --version Show version\n`;\n}\n\nexport function renderInitHelp(commandPrefix: string) {\n return `${formatCommand('init', commandPrefix)}\n\nDetect local OpenClaw or Hermes runtimes, run a first audit, and offer optional cloud follow-up.\n\nUsage:\n ${formatCommand('init', commandPrefix)}\n\nNotes:\n - Interactive only in v1\n - Uses local runtime auto-detection\n - Runs a first local audit with snapshot persistence enabled\n - Offers optional Xerg Cloud connect and hosted MCP setup after a successful audit\n\n -h, --help Show help\n`;\n}\n\nexport function renderAuditHelp(commandPrefix: string) {\n return `${formatCommand('audit', commandPrefix)}\n\nAnalyze OpenClaw or Hermes logs, or a local Cursor usage CSV, and produce an audit report.\n\nUsage:\n ${formatCommand('audit [options]', commandPrefix)}\n\nOptions:\n --runtime <name> Local runtime to inspect: openclaw or hermes\n --log-file <path> Explicit local gateway log file to analyze\n --sessions-dir <path> Explicit local sessions directory to analyze\n --cursor-usage-csv <path> Local Cursor usage CSV export to analyze\n --since <duration> Look back window such as 24h, 7d, or 30m\n --compare Compare this audit to the newest compatible prior local snapshot\n --json Render the report as JSON\n --markdown Render the report as Markdown\n --db <path> Custom SQLite database path\n --no-db Skip local persistence\n\nRemote options (SSH, OpenClaw only):\n --remote <user@host> SSH target in user@host or user@host:port format\n --remote-log-file <path> Override the default gateway log path on the remote host\n --remote-sessions-dir <path> Override the default sessions directory on the remote host\n --remote-config <path> Path to a JSON file defining multiple remote sources\n --keep-remote-files Retain pulled files in ~/.xerg/remote-cache/ instead of using a temp directory\n\nPrerequisites:\n SSH remote audits require ssh and rsync on your PATH.\n\nRailway options (OpenClaw only):\n --railway Audit a Railway service (uses linked project by default)\n --project <id> Railway project ID\n --environment <id> Railway environment ID\n --service <id> Railway service ID\n\n Railway audits require the railway CLI on your PATH.\n\nPush options:\n --push Push the audit summary to the Xerg API after computing it\n --dry-run With --push: print the payload to stdout without sending it\n --verbose Print progress updates to stderr while the audit runs\n\nThreshold options:\n --fail-above-waste-rate <n> Exit with code 3 if structural waste rate exceeds threshold (e.g. 0.30)\n --fail-above-waste-usd <n> Exit with code 3 if waste spend exceeds threshold in USD (e.g. 50)\n\n -h, --help Show help\n`;\n}\n\nexport function renderPushHelp(commandPrefix: string) {\n return `${formatCommand('push', commandPrefix)}\n\nPush a cached audit snapshot to the Xerg API.\n\nUsage:\n ${formatCommand('push [options]', commandPrefix)}\n\nOptions:\n --file <path> Push a specific snapshot file instead of the most recent cached audit\n --dry-run Print the payload to stdout without sending it\n\n -h, --help Show help\n\nAuthentication:\n Set XERG_API_KEY in your environment, add \"apiKey\" to ~/.xerg/config.json,\n or run \\`${formatCommand('connect', commandPrefix)}\\` / \\`${formatCommand('login', commandPrefix)}\\` to authenticate via browser.\n Browser login stores a token at ~/.config/xerg/credentials.json by default.\n`;\n}\n\nexport function renderDoctorHelp(commandPrefix: string) {\n return `${formatCommand('doctor', commandPrefix)}\n\nInspect OpenClaw or Hermes sources, or a local Cursor usage CSV, before you audit.\n\nUsage:\n ${formatCommand('doctor [options]', commandPrefix)}\n\nOptions:\n --runtime <name> Local runtime to inspect: openclaw or hermes\n --log-file <path> Explicit local gateway log file to inspect\n --sessions-dir <path> Explicit local sessions directory to inspect\n --cursor-usage-csv <path> Local Cursor usage CSV export to inspect\n --verbose Print progress updates to stderr while doctor runs\n\nRemote options (SSH, OpenClaw only):\n --remote <user@host> SSH target in user@host or user@host:port format\n --remote-log-file <path> Override the default gateway log path on the remote host\n --remote-sessions-dir <path> Override the default sessions directory on the remote host\n\n SSH checks require ssh and rsync on your PATH.\n\nRailway options (OpenClaw only):\n --railway Check a Railway service (uses linked project by default)\n --project <id> Railway project ID\n --environment <id> Railway environment ID\n --service <id> Railway service ID\n\n Railway checks require the railway CLI on your PATH.\n\n -h, --help Show help\n`;\n}\n\nexport function renderConnectHelp(commandPrefix: string) {\n return `${formatCommand('connect', commandPrefix)}\n\nAuthenticate with Xerg Cloud and optionally push the latest audit.\n\nUsage:\n ${formatCommand('connect', commandPrefix)}\n\nNotes:\n - Shows paid-workspace disclosure before hosted setup\n - Reuses existing auth from XERG_API_KEY, ~/.xerg/config.json, or stored browser login\n - Standalone non-interactive mode reports auth status and skips the push prompt\n - When called after ${formatCommand('init', commandPrefix)}, it can push the in-memory audit directly\n\n -h, --help Show help\n`;\n}\n\nexport function renderMcpSetupHelp(commandPrefix: string) {\n return `${formatCommand('mcp-setup', commandPrefix)}\n\nGenerate hosted MCP client configuration for Cursor, Claude Code, or another MCP client.\n\nUsage:\n ${formatCommand('mcp-setup', commandPrefix)}\n\nNotes:\n - Interactive in v1 because client selection is prompt-driven\n - Uses the hosted MCP endpoint at https://mcp.xerg.ai/mcp\n - Can write a project-scoped Cursor config when .cursor/ already exists\n - Local audits and compare stay available even if you skip hosted MCP setup\n\n -h, --help Show help\n`;\n}\n"],"mappings":";;;AAEA,SAAS,aAAAA,kBAAiB;;;ACF1B,IAAM,eAAe;AACrB,IAAM,yBAAyB;AASxB,SAAS,sBAAsB,SAGnB;AACjB,QAAM,SAAS,sBAAsB,OAAO;AAC5C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,GAAG,MAAM,IAAI,YAAY;AAAA,IACjC,MAAM;AAAA,EACR;AACF;AAEO,SAAS,cACdC,UACA,gBAAgB,sBAAsB,EAAE,QAChC;AACR,QAAM,SAAS,MAAM,QAAQA,QAAO,IAAIA,SAAQ,KAAK,GAAG,IAAIA;AAC5D,SAAO,SAAS,GAAG,aAAa,IAAI,MAAM,KAAK;AACjD;AAEA,SAAS,sBAAsB,SAGJ;AACzB,QAAM,MAAM,SAAS,OAAO,QAAQ;AACpC,QAAMC,QAAO,SAAS,QAAQ,QAAQ;AAEtC,QAAM,YAAY,gBAAgB,IAAI,qBAAqB;AAC3D,QAAM,WAAW,gBAAgB,IAAI,YAAY;AACjD,QAAM,WAAW,gBAAgBA,MAAK,CAAC,CAAC;AAExC,QAAM,eAAe,yBAAyB,QAAQ;AACtD,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,MAAI,sBAAsB,QAAQ,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,uBAAuB,SAAS;AACtD,MAAI,eAAe;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,uBAAuB,QAAQ;AACpD,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,UAAU,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,SAAS,KAAK,SAAS,SAAS,OAAO,GAAG;AAC9D,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,UAAU,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,OAAO,KAAK,SAAS,SAAS,QAAQ,GAAG;AAC7D,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,UAAU;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,UAA0C;AAC1E,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,UAAU,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,SAAS,KAAK,SAAS,SAAS,OAAO,GAAG;AAC9D,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,UAAU,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,OAAO,KAAK,SAAS,SAAS,QAAQ,GAAG;AAC7D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,UAA2B;AACxD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,SAAS,WAAW,MAAM,GAAG;AAChD,SACE,WAAW,SAAS,yBAAyB,KAC7C,WAAW,SAAS,uCAAuC,KAC3D,WAAW,SAAS,WAAW;AAEnC;AAEA,SAAS,uBAAuB,QAAwC;AACtE,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,MAAM,YAAY,EAAE,OAAO,OAAO;AAExD,MAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAmC;AAC1D,SAAO,OAAO,KAAK,EAAE,YAAY,KAAK;AACxC;;;AC1JA,SAAS,UAAAC,eAAc;;;ACAvB,SAAS,cAAc,gBAAgB;AACvC,SAAS,eAAe;;;ACDxB,SAAS,kBAAkB;AAC3B,SAAS,WAAW,UAAU,gBAAgB;AAEvC,SAAS,KAAK,OAAe;AAClC,SAAO,WAAW,MAAM,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AACtD;AAEO,SAAS,SAAS,MAAc;AACrC,QAAM,OAAO,WAAW,MAAM;AAC9B,QAAM,KAAK,SAAS,MAAM,GAAG;AAC7B,QAAM,SAAS,OAAO,YAAY,KAAK,IAAI;AAE3C,MAAI;AACF,QAAI,YAAY;AAChB,OAAG;AACD,kBAAY,SAAS,IAAI,QAAQ,GAAG,OAAO,QAAQ,IAAI;AACvD,UAAI,YAAY,GAAG;AACjB,aAAK,OAAO,OAAO,SAAS,GAAG,SAAS,CAAC;AAAA,MAC3C;AAAA,IACF,SAAS,YAAY;AAAA,EACvB,UAAE;AACA,cAAU,EAAE;AAAA,EACd;AAEA,SAAO,KAAK,OAAO,KAAK;AAC1B;;;ACzBO,SAAS,WAAW,OAA+B;AACxD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,kBAAkB;AACnD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,0BAA0B,KAAK,sCAAsC;AAAA,EACvF;AAEA,QAAM,SAAS,OAAO,MAAM,CAAC,CAAC;AAC9B,QAAM,OAAO,MAAM,CAAC,EAAE,YAAY;AAClC,QAAM,cAAsC;AAAA,IAC1C,GAAG,KAAK;AAAA,IACR,GAAG,KAAK,KAAK;AAAA,IACb,GAAG,KAAK,KAAK,KAAK;AAAA,IAClB,GAAG,IAAI,KAAK,KAAK,KAAK;AAAA,EACxB;AAEA,SAAO,KAAK,IAAI,IAAI,SAAS,YAAY,IAAI;AAC/C;AAEO,SAAS,SAAS;AACvB,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAEO,SAAS,WAAW,OAAgB;AACzC,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,YAAY,IAAI,KAAK,KAAK;AAChC,QAAI,CAAC,OAAO,MAAM,UAAU,QAAQ,CAAC,GAAG;AACtC,aAAO,UAAU,YAAY;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,YAAY,IAAI,KAAK,KAAK;AAChC,QAAI,CAAC,OAAO,MAAM,UAAU,QAAQ,CAAC,GAAG;AACtC,aAAO,UAAU,YAAY;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;;;AF1BA,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA2CA,IAAM,uBAA2D;AAAA,EAC/D,iCAAiC;AAAA,IAC/B,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AAAA,EACA,qBAAqB;AAAA,IACnB,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AAAA,EACA,8BAA8B;AAAA,IAC5B,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AAAA,EACA,iCAAiC;AAAA,IAC/B,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AAAA,EACA,iBAAiB;AAAA,IACf,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AAAA,EACA,mBAAmB;AAAA,IACjB,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AAAA,EACA,SAAS;AAAA,IACP,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AACF;AAEA,SAAS,MAAM,OAAe;AAC5B,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEA,SAAS,aAAa,MAAwB;AAC5C,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AACd,MAAI,WAAW;AAEf,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,OAAO,KAAK,KAAK;AAEvB,QAAI,SAAS,KAAK;AAChB,YAAM,OAAO,KAAK,QAAQ,CAAC;AAC3B,UAAI,YAAY,SAAS,KAAK;AAC5B,mBAAW;AACX,iBAAS;AAAA,MACX,OAAO;AACL,mBAAW,CAAC;AAAA,MACd;AACA;AAAA,IACF;AAEA,QAAI,SAAS,OAAO,CAAC,UAAU;AAC7B,aAAO,KAAK,OAAO;AACnB,gBAAU;AACV;AAAA,IACF;AAEA,eAAW;AAAA,EACb;AAEA,SAAO,KAAK,OAAO;AACnB,SAAO,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAC3C;AAEA,SAAS,aAAa,KAAa,QAAwB,WAAmB;AAC5E,QAAM,SAAS,OAAO,SAAS,KAAK,EAAE;AACtC,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,GAAG;AAC1C,UAAM,IAAI,MAAM,WAAW,MAAM,WAAW,GAAG,YAAY,SAAS,GAAG;AAAA,EACzE;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,KAAa,WAAmB;AACtD,QAAM,SAAS,IAAI,KAAK,GAAG;AAC3B,MAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,GAAG;AAClC,UAAM,IAAI,MAAM,uBAAuB,GAAG,YAAY,SAAS,GAAG;AAAA,EACpE;AAEA,SAAO,OAAO,YAAY;AAC5B;AAEA,SAAS,aAAa,KAAa;AACjC,SAAO,IAAI,KAAK,EAAE,YAAY,MAAM;AACtC;AAEA,SAAS,kBAAkB,KAAa;AACtC,QAAM,QAAQ,IAAI,KAAK;AACvB,MAAI,MAAM,WAAW,KAAK,UAAU,OAAO,MAAM,YAAY,MAAM,YAAY;AAC7E,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,WAAW,KAAK;AACtC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,qBAAqB,MAAkC;AAC9D,QAAM,eAAe,QAAQ,IAAI;AAEjC,MAAI;AACF,UAAM,QAAQ,SAAS,YAAY;AACnC,QAAI,CAAC,MAAM,OAAO,GAAG;AACnB,YAAM,IAAI,MAAM,wCAAwC,YAAY,EAAE;AAAA,IACxE;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,MACjB,SAAS,MAAM;AAAA,IACjB;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,+BAA+B,IAAI;AAC5F,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AACF;AAEA,SAAS,gBAAgB,SAAmB;AAC1C,QAAM,UAAU,iBAAiB,OAAO,CAAC,WAAW,CAAC,QAAQ,SAAS,MAAM,CAAC;AAC7E,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI,MAAM,iDAAiD,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,EACxF;AACF;AAEA,SAAS,SAAS,QAAkB,SAAmB,WAAsC;AAC3F,QAAM,SAAS,OAAO,YAAY,QAAQ,IAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;AAC/F,QAAM,YAAY,OAAO,QAAQ;AAEjC,SAAO;AAAA,IACL,WAAW,eAAe,OAAO,QAAQ,IAAI,SAAS;AAAA,IACtD,MAAM,OAAO,QAAQ;AAAA,IACrB,YAAY,OAAO,SAAS;AAAA,IAC5B,SAAS,aAAa,OAAO,UAAU,KAAK,EAAE;AAAA,IAC9C,2BAA2B;AAAA,MACzB,OAAO,wBAAwB,KAAK;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AAAA,IACA,8BAA8B;AAAA,MAC5B,OAAO,yBAAyB,KAAK;AAAA,MACrC;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,aAAa,OAAO,YAAY,KAAK,IAAI,cAAc,SAAS;AAAA,IACjF,cAAc,aAAa,OAAO,eAAe,KAAK,IAAI,iBAAiB,SAAS;AAAA,IACpF,aAAa,aAAa,OAAO,cAAc,KAAK,IAAI,gBAAgB,SAAS;AAAA,IACjF;AAAA,IACA,iBAAiB,kBAAkB,SAAS;AAAA,EAC9C;AACF;AAEA,SAAS,UAAU,OAAiB,SAAmB;AACrD,QAAM,OAA4B,CAAC;AAEnC,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,CAAC,KAAK,KAAK,GAAG;AAChB;AAAA,IACF;AAEA,SAAK,KAAK,SAAS,aAAa,IAAI,GAAG,SAAS,QAAQ,CAAC,CAAC;AAAA,EAC5D;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,MAAkC;AACnE,QAAM,SAAS,qBAAqB,IAAI;AACxC,QAAM,UAAU,aAAa,OAAO,MAAM,MAAM;AAChD,QAAM,QAAQ,QACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAEjB,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM,8BAA8B,OAAO,IAAI,EAAE;AAAA,EAC7D;AAEA,QAAM,UAAU,aAAa,MAAM,CAAC,CAAC;AACrC,kBAAgB,OAAO;AAEvB,QAAM,OAAO,UAAU,MAAM,MAAM,CAAC,GAAG,OAAO;AAE9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB,KAAK,KAAK,CAAC,QAAQ,IAAI,oBAAoB,IAAI;AAAA,EACtE;AACF;AAEA,SAAS,kBAAkB,MAAc;AACvC,QAAM,aAAa,KAAK,KAAK,EAAE,YAAY;AAC3C,SACG,WAAW,SAAS,SAAS,KAAK,WAAW,SAAS,WAAW,KAClE,WAAW,SAAS,aAAa;AAErC;AAEA,SAAS,cAAc,YAAoB;AACzC,QAAM,aAAa,WAAW,KAAK,EAAE,YAAY;AAEjD,MAAI,WAAW,WAAW,SAAS,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,WAAW,MAAM,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,YAAoB,SAAoC;AAC7E,MAAI,SAAS;AACX,WAAO,GAAG,QAAQ,QAAQ,IAAI,QAAQ,cAAc;AAAA,EACtD;AAEA,SAAO,GAAG,cAAc,UAAU,CAAC,IAAI,UAAU;AACnD;AAEA,SAAS,eAAe,KAAwB;AAC9C,QAAM,OAAO,IAAI,KAAK,KAAK,EAAE,YAAY;AAEzC,MAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,WAAO,IAAI,UAAU,yBAAyB;AAAA,EAChD;AAEA,MAAI,KAAK,SAAS,UAAU,GAAG;AAC7B,WAAO,IAAI,UAAU,wBAAwB;AAAA,EAC/C;AAEA,MAAI,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,aAAa,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,UAAU,qBAAqB;AAC5C;AAEA,SAAS,sBACP,KACA,SAGuB;AACvB,QAAM,UAAU,qBAAqB,IAAI,WAAW,KAAK,EAAE,YAAY,CAAC,KAAK;AAE7E,MAAI,kBAAkB,IAAI,IAAI,GAAG;AAC/B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB;AAAA,MACA,mBAAmB,cAAc,IAAI,YAAY,OAAO;AAAA,IAC1D;AAAA,EACF;AAEA,MAAI,QAAQ,oBAAoB;AAC9B,QAAI,IAAI,oBAAoB,MAAM;AAChC,YAAMC,aACJ,IAAI,kBAAkB,KAAK,SAAS,qBAAqB,SACrD,MAAO,IAAI,kBAAkB,MAAa,QAAQ,gBAAgB,IAClE;AACN,YAAMC,kBACJ,IAAI,4BAA4B,KAAK,UACjC;AAAA,QACG,IAAI,4BAA4B,OAC9B,QAAQ,mBAAmB,QAAQ;AAAA,MACxC,IACA;AAEN,aAAO;AAAA,QACL,SAAS,IAAI;AAAA,QACb,YAAY;AAAA,QACZ,cAAcD;AAAA,QACd,mBAAmBC;AAAA,QACnB;AAAA,QACA,mBAAmB,cAAc,IAAI,YAAY,OAAO;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB;AAAA,MACA,mBAAmB,cAAc,IAAI,YAAY,OAAO;AAAA,IAC1D;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,SAAS;AAAA,MACT,mBAAmB,cAAc,IAAI,YAAY,OAAO;AAAA,IAC1D;AAAA,EACF;AAEA,MAAI,IAAI,kBAAkB,KAAK,QAAQ,qBAAqB,QAAW;AACrE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,SAAS;AAAA,MACT,mBAAmB,cAAc,IAAI,YAAY,OAAO;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,YAAa,IAAI,+BAA+B,MAAa,QAAQ;AAC3E,QAAM,iBACH,IAAI,4BAA4B,OAAc,QAAQ,mBAAmB,QAAQ;AACpF,QAAM,aAAc,IAAI,eAAe,MAAa,QAAQ;AAC5D,QAAM,YACJ,IAAI,kBAAkB,KAAK,QAAQ,qBAAqB,SACnD,IAAI,kBAAkB,MAAa,QAAQ,mBAC5C;AAEN,SAAO;AAAA,IACL,SAAS,MAAM,YAAY,iBAAiB,aAAa,SAAS;AAAA,IAClE,YAAY;AAAA,IACZ,cAAc,MAAM,SAAS;AAAA,IAC7B,mBAAmB,MAAM,cAAc;AAAA,IACvC;AAAA,IACA,mBAAmB,cAAc,IAAI,YAAY,OAAO;AAAA,EAC1D;AACF;AAEA,SAAS,UACP,KACA,QACA,OACA,OACA,SAGuD;AACvD,QAAM,OAAO,sBAAsB,KAAK,OAAO;AAC/C,QAAM,mBAAmB,KAAK,IAAI,IAAI,cAAc,IAAI,cAAc,CAAC;AAEvE,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,MACJ,IAAI,KAAK,GAAG,KAAK,IAAI,OAAO,IAAI,IAAI,KAAK,IAAI,IAAI,UAAU,IAAI,IAAI,SAAS,EAAE;AAAA,MAC9E;AAAA,MACA,WAAW,IAAI;AAAA,MACf,UAAU,KAAK,SAAS,YAAY,cAAc,IAAI,UAAU;AAAA,MAChE,OAAO,KAAK,SAAS,kBAAkB,IAAI;AAAA,MAC3C,aAAa;AAAA,MACb,cAAc,IAAI;AAAA,MAClB,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,MACjB,WAAW;AAAA,MACX,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ,kBAAkB,IAAI,IAAI,IAAI,UAAU;AAAA,MAChD,WAAW;AAAA,MACX,UAAU,IAAI,kBAAkB;AAAA,MAChC,cAAc,KAAK;AAAA,MACnB,UAAU;AAAA,QACR,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,YAAY,IAAI;AAAA,QAChB,WAAW,IAAI;AAAA,QACf,aAAa,IAAI;AAAA,QACjB,2BAA2B,IAAI;AAAA,QAC/B,8BAA8B,IAAI;AAAA,QAClC,iBAAiB,IAAI;AAAA,QACrB,iBAAiB,KAAK,SAAS,YAAY;AAAA,QAC3C,cAAc,KAAK,SAAS,kBAAkB;AAAA,QAC9C,mBAAmB,KAAK;AAAA,QACxB,iBAAiB,IAAI;AAAA,QACrB,mBAAmB,KAAK;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,OAStC;AACA,QAAM,SAAS,WAAW,MAAM,KAAK;AACrC,QAAM,OAAwB,CAAC;AAC/B,QAAM,gBAAgB,oBAAI,IAAwD;AAClF,QAAM,QAAQ,oBAAI,IAGhB;AACF,QAAM,SAAS,oBAAI,IASjB;AAEF,MAAI,kBAAkB;AACtB,MAAI,oBAAoB;AACxB,MAAI,mBAAmB;AACvB,MAAI,qBAAqB;AACzB,MAAI,cAAc;AAClB,MAAI,oBAAoB;AACxB,MAAI,uBAAuB;AAC3B,MAAI,iCAAiC;AACrC,MAAI,oCAAoC;AAExC,QAAM,KAAK,QAAQ,CAAC,KAAK,UAAU;AACjC,UAAM,cAAc,IAAI,KAAK,IAAI,SAAS,EAAE,QAAQ;AACpD,QAAI,UAAU,cAAc,QAAQ;AAClC;AAAA,IACF;AAEA,UAAM,WAAW,eAAe,GAAG;AACnC,UAAM,QAAQ,KAAK,GAAG,MAAM,OAAO,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,UAAU,IAAI,KAAK,EAAE;AACrF,UAAM,EAAE,MAAM,KAAK,IAAI,UAAU,KAAK,MAAM,QAAQ,OAAO,OAAO;AAAA,MAChE,oBAAoB,MAAM,uBAAuB;AAAA,IACnD,CAAC;AACD,UAAMC,OAAqB;AAAA,MACzB,IAAI;AAAA,MACJ,YAAY,MAAM,OAAO;AAAA,MACzB,YAAY,MAAM,OAAO;AAAA,MACzB,WAAW,IAAI;AAAA,MACf;AAAA,MACA,aAAa;AAAA,MACb,MAAM;AAAA,QACJ,YAAY,MAAM,OAAO;AAAA,QACzB,SAAS,IAAI;AAAA,QACb,MAAM,IAAI;AAAA,MACZ;AAAA,MACA,OAAO,CAAC,IAAI;AAAA,MACZ,cAAc,KAAK;AAAA,MACnB,aAAa,IAAI;AAAA,MACjB,iBAAiB,KAAK,eAAe,aAAa,KAAK,UAAU;AAAA,MACjE,kBAAkB,KAAK,eAAe,cAAc,KAAK,UAAU;AAAA,IACrE;AACA,SAAK,KAAKA,IAAG;AAEb,mBAAe,IAAI;AACnB,yBAAqB,IAAI;AACzB,4BAAwB,IAAI;AAC5B,sCAAkC,IAAI;AACtC,yCAAqC,IAAI;AAEzC,UAAM,iBAAiB,IAAI;AAC3B,QAAI,KAAK,eAAe,YAAY;AAClC,2BAAqB;AACrB,4BAAsB;AACtB,YAAM,UAAU,cAAc,IAAI,IAAI,UAAU,KAAK,EAAE,WAAW,GAAG,aAAa,EAAE;AACpF,cAAQ,aAAa;AACrB,cAAQ,eAAe;AACvB,oBAAc,IAAI,IAAI,YAAY,OAAO;AAAA,IAC3C,OAAO;AACL,yBAAmB;AACnB,0BAAoB;AAAA,IACtB;AAEA,UAAM,aAAa,MAAM,IAAI,QAAQ,KAAK;AAAA,MACxC,WAAW;AAAA,MACX,aAAa;AAAA,MACb,mBAAmB;AAAA,IACrB;AACA,eAAW,aAAa;AACxB,eAAW,eAAe;AAC1B,eAAW,oBAAoB,MAAM,WAAW,oBAAoB,KAAK,OAAO;AAChF,UAAM,IAAI,UAAU,UAAU;AAE9B,UAAM,cAAc,OAAO,IAAI,KAAK,iBAAiB,KAAK;AAAA,MACxD,WAAW;AAAA,MACX,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,IACrB;AACA,gBAAY,aAAa;AACzB,gBAAY,eAAe;AAC3B,gBAAY,oBAAoB,MAAM,YAAY,oBAAoB,KAAK,OAAO;AAClF,QAAI,KAAK,eAAe,YAAY;AAClC,kBAAY,qBAAqB;AAAA,IACnC,OAAO;AACL,kBAAY,mBAAmB;AAAA,IACjC;AACA,WAAO,IAAI,KAAK,mBAAmB,WAAW;AAAA,EAChD,CAAC;AAED,OAAK;AAAA,IACH,CAAC,MAAM,UAAU,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ;AAAA,EAC1F;AAEA,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB,MAAM,KAAK,cAAc,QAAQ,CAAC,EAClD,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,QACtB;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AAAA,MACrB,EAAE,EACD,KAAK,CAAC,MAAM,UAAU,MAAM,cAAc,KAAK,WAAW,EAC1D,MAAM,GAAG,CAAC;AAAA,IACf;AAAA,IACA,aAAa;AAAA,MACX;AAAA,MACA,kBAAkB,KAAK,IAAI,cAAc,mBAAmB,CAAC;AAAA,MAC7D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,MAAM,KAAK,MAAM,QAAQ,CAAC,EAC9B,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,QACtB;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AAAA,QACnB,mBAAmB,MAAM;AAAA,MAC3B,EAAE,EACD,KAAK,CAAC,MAAM,UAAU,MAAM,cAAc,KAAK,WAAW;AAAA,MAC7D,QAAQ,MAAM,KAAK,OAAO,QAAQ,CAAC,EAChC,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,QACtB;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AAAA,QACnB,mBAAmB,MAAM;AAAA,QACzB,iBAAiB,MAAM;AAAA,QACvB,mBAAmB,MAAM;AAAA,MAC3B,EAAE,EACD,KAAK,CAAC,MAAM,UAAU,MAAM,cAAc,KAAK,WAAW;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,QAAoC;AAC5D,QAAM,QAAQ,CAAC,qCAAqC;AAEpD,MAAI,OAAO,aAAa,GAAG;AACzB,UAAM,KAAK,iCAAiC;AAAA,EAC9C;AAEA,MAAI,OAAO,gBAAgB,oBAAoB,GAAG;AAChD,UAAM,UAAU,OAAO,gBAAgB,kBAAkB,IAAI,CAAC,UAAU,MAAM,GAAG,EAAE,KAAK,IAAI;AAC5F,UAAM;AAAA,MACJ,gEAAgE,WAAW,iBAAiB;AAAA,IAC9F;AAAA,EACF,OAAO;AACL,UAAM,KAAK,mDAAmD;AAAA,EAChE;AAEA,QAAM,KAAK,gFAAgF;AAE3F,SAAO;AACT;AAEA,eAAsB,sBACpB,SACqC;AACrC,QAAM,WAAW,QAAQ,iBAAiB,QAAQ,QAAQ,cAAc,IAAI;AAC5E,UAAQ,aAAa,gCAAgC;AAErD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,MACX,iBAAiB;AAAA,QACf,iBAAiB;AAAA,QACjB,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,QAClB,oBAAoB;AAAA,QACpB,mBAAmB,CAAC;AAAA,MACtB;AAAA,MACA,OAAO,CAAC,wCAAwC;AAAA,IAClD;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,mBAAmB,QAAQ;AAC1C,UAAM,aAAa,wBAAwB;AAAA,MACzC,QAAQ,OAAO;AAAA,MACf,MAAM,OAAO;AAAA,MACb,qBAAqB,OAAO;AAAA,IAC9B,CAAC;AACD,UAAM,YACJ,OAAO,KAAK,WAAW,IACnB,OACA;AAAA,MACE,OAAO,OAAO,KACX,IAAI,CAAC,QAAQ,IAAI,SAAS,EAC1B,KAAK,CAAC,MAAM,UAAU,IAAI,KAAK,IAAI,EAAE,QAAQ,IAAI,IAAI,KAAK,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,MAChF,KAAK,OAAO,KACT,IAAI,CAAC,QAAQ,IAAI,SAAS,EAC1B,KAAK,CAAC,MAAM,UAAU,IAAI,KAAK,IAAI,EAAE,QAAQ,IAAI,IAAI,KAAK,KAAK,EAAE,QAAQ,CAAC,EAC1E,GAAG,EAAE;AAAA,IACV;AAEN,UAAM,SAAqC;AAAA,MACzC,UAAU;AAAA,MACV,UAAU,OAAO,OAAO;AAAA,MACxB,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO,KAAK;AAAA,MACtB;AAAA,MACA,iBAAiB,WAAW;AAAA,MAC5B,OAAO,CAAC;AAAA,IACV;AACA,WAAO,QAAQ,iBAAiB,MAAM;AACtC,YAAQ;AAAA,MACN,8BAA8B,OAAO,QAAQ,OAAO,OAAO,aAAa,IAAI,KAAK,GAAG;AAAA,IACtF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,YAAQ,aAAa,kCAAkC,OAAO,EAAE;AAChE,WAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,MACX,iBAAiB;AAAA,QACf,iBAAiB;AAAA,QACjB,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,QAClB,oBAAoB;AAAA,QACpB,mBAAmB,CAAC;AAAA,MACtB;AAAA,MACA,OAAO,CAAC,OAAO;AAAA,IACjB;AAAA,EACF;AACF;;;AG/uBA,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AACxB,OAAO,cAAc;;;ACFd,IAAM,iBAAiB;AAEvB,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADUnB,SAAS,SAAS,MAAwB;AAC/C,YAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,QAAM,SAAS,IAAI,SAAS,IAAI;AAChC,QAAM,iBAAiB,OAAO,OAAO,gBAAgB,EAAE,QAAQ,KAAK,CAAC;AAErE,MAAI,iBAAiB,gBAAgB;AACnC,WAAO,MAAM;AACb,UAAM,IAAI;AAAA,MACR,4CAA4C,cAAc,+BAA+B,cAAc;AAAA,IACzG;AAAA,EACF;AAEA,SAAO,KAAK,UAAU;AACtB,MAAI,iBAAiB,gBAAgB;AACnC,WAAO,OAAO,kBAAkB,cAAc,EAAE;AAAA,EAClD;AAEA,SAAO,EAAE,OAAO;AAClB;;;AEzBO,SAAS,aAAa,OAAuB,QAAgB;AAClE,QAAM,EAAE,OAAO,IAAI,SAAS,MAAM;AAClC,QAAM,aAAa,OAAO;AAC1B,QAAM,cAAc,MAAM,eAAe,IAAI,CAAC,WAAW;AAAA,IACvD,GAAG;AAAA,IACH,kBAAkB,MAAM,oBAAoB;AAAA,EAC9C,EAAE;AACF,QAAM,iBAAiB,MAAM,QAAQ,YAAY,IAAI,CAAC,UAAU;AAAA,IAC9D,IAAI,KAAK,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK,SAAS,EAAE;AAAA,IACzD,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,UAAU,SAAS,KAAK,IAAI;AAAA,IAC5B,SAAS,KAAK,MAAM,KAAK,OAAO;AAAA,IAChC,WAAW,KAAK;AAAA,IAChB;AAAA,EACF,EAAE;AACF,QAAM,UAAU,MAAM,KAAK,IAAI,CAACC,UAAS;AAAA,IACvC,IAAIA,KAAI;AAAA,IACR,YAAYA,KAAI;AAAA,IAChB,YAAYA,KAAI;AAAA,IAChB,WAAWA,KAAI;AAAA,IACf,UAAUA,KAAI;AAAA,IACd,aAAaA,KAAI;AAAA,IACjB,UAAU,KAAK,UAAUA,KAAI,IAAI;AAAA,IACjC,cAAcA,KAAI;AAAA,IAClB,aAAaA,KAAI;AAAA,IACjB,iBAAiBA,KAAI;AAAA,IACrB,kBAAkBA,KAAI;AAAA,EACxB,EAAE;AACF,QAAM,WAAW,MAAM,KAAK;AAAA,IAAQ,CAACA,SACnCA,KAAI,MAAM,IAAI,CAAC,UAAU;AAAA,MACvB,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK,UAAU,KAAK,QAAQ;AAAA,IAC5C,EAAE;AAAA,EACJ;AACA,QAAM,cAAc,MAAM,QAAQ,SAAS,IAAI,CAAC,aAAa;AAAA,IAC3D,IAAI,QAAQ;AAAA,IACZ,SAAS,MAAM,QAAQ;AAAA,IACvB,gBAAgB,QAAQ;AAAA,IACxB,YAAY,QAAQ;AAAA,IACpB,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,eAAe,QAAQ;AAAA,IACvB,aAAa,KAAK,UAAU,QAAQ,OAAO;AAAA,EAC7C,EAAE;AACF,QAAM,qBAAqB,OAAO,YAAY,MAAM;AAClD;AAAA,MACE;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,YAAY,IAAI,CAAC,QAAQ;AAAA,QACvB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAEA;AAAA,MACE;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,eAAe,IAAI,CAAC,QAAQ;AAAA,QAC1B,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAEA;AAAA,MACE;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAeA,QAAQ,IAAI,CAAC,QAAQ;AAAA,QACnB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAEA;AAAA,MACE;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,SAAS,IAAI,CAAC,QAAQ;AAAA,QACpB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,aAAa;AAAA,QACjB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,WAAW;AAAA,QACf,IAAI,aAAa;AAAA,QACjB,IAAI,UAAU;AAAA,QACd,IAAI,aAAa;AAAA,QACjB,IAAI,WAAW,IAAI;AAAA,QACnB,IAAI,gBAAgB;AAAA,QACpB,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAEA;AAAA,MACE;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAeA,YAAY,IAAI,CAAC,QAAQ;AAAA,QACvB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAEA,WACG;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOF,EACC,IAAI,MAAM,QAAQ,SAAS,MAAM,QAAQ,aAAa,KAAK,UAAU,MAAM,OAAO,CAAC;AAAA,EACxF,CAAC;AAED,MAAI;AACF,uBAAmB;AAAA,EACrB,UAAE;AACA,WAAO,MAAM;AAAA,EACf;AACF;AAEA,SAAS,WAAW,QAA+C,KAAa,MAAmB;AACjG,MAAI,KAAK,WAAW,GAAG;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,QAAQ,GAAG;AAEpC,aAAW,OAAO,MAAM;AACtB,cAAU,IAAI,GAAG,GAAG;AAAA,EACtB;AACF;;;ACvPA,IAAM,sBAA8C;AAAA,EAClD,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,uBAAuB;AAAA,EACvB,cAAc;AAChB;AAEA,SAASC,OAAM,OAAe;AAC5B,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEA,SAAS,oBAAoB,OAAgB;AAC3C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MACX,KAAK,EACL,YAAY,EACZ,MAAM,iBAAiB;AAC1B,MAAI,CAAC,OAAO;AACV,WAAO,MAAM,KAAK,EAAE,YAAY;AAAA,EAClC;AAEA,SAAO,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AACvC;AAEA,SAAS,cAAc,MAAc;AACnC,SAAO,KAAK,QAAQ,OAAO,GAAG;AAChC;AAEA,SAAS,iBAAiB,MAAc;AACtC,QAAM,aAAa,cAAc,IAAI;AACrC,QAAM,SAAS;AACf,QAAM,QAAQ,WAAW,YAAY,MAAM;AAE3C,MAAI,SAAS,GAAG;AACd,WAAO,WAAW,MAAM,GAAG,QAAQ,OAAO,SAAS,CAAC;AAAA,EACtD;AAEA,SAAO,WAAW,MAAM,GAAG,WAAW,YAAY,GAAG,CAAC,KAAK;AAC7D;AAEA,SAAS,gBAAgB,MAAc;AACrC,QAAM,aAAa,cAAc,IAAI;AACrC,SAAO,WAAW,MAAM,GAAG,WAAW,YAAY,GAAG,CAAC,KAAK;AAC7D;AAEO,SAAS,oBAAoB,MAAc;AAChD,SAAO,oBAAoB,IAAI,KAAK;AACtC;AAEO,SAAS,wBAAwB,QAA4B;AAClE,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO,iBAAiB,OAAO,IAAI;AAAA,EACrC;AAEA,SAAO,gBAAgB,OAAO,IAAI;AACpC;AAEO,SAAS,mBAAmB,OAIhC;AACD,QAAM,QAAQ,MAAM,KAAK,IAAI,IAAI,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC,CAAC,EAAE,KAAK;AACnF,QAAM,QAAQ,MAAM;AAAA,IAClB,IAAI,IAAI,MAAM,QAAQ,IAAI,CAAC,WAAW,GAAG,OAAO,IAAI,IAAI,wBAAwB,MAAM,CAAC,EAAE,CAAC;AAAA,EAC5F,EAAE,KAAK;AAEP,SAAO;AAAA,IACL,KAAK,UAAU;AAAA,MACb,SAAS,MAAM;AAAA,MACf;AAAA,MACA;AAAA,MACA,OAAO,oBAAoB,MAAM,KAAK;AAAA,IACxC,CAAC;AAAA,EACH;AACF;AAEO,SAAS,qBACd,UACA,gBACyB;AACzB,QAAM,UAAU,oBAAI,IAAmC;AAEvD,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,mBAAmB,gBAAgB;AAC7C;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ,IAAI,QAAQ,IAAI,KAAK;AAAA,MAC3C,MAAM,QAAQ;AAAA,MACd,OAAO,oBAAoB,QAAQ,IAAI;AAAA,MACvC;AAAA,MACA,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAEA,YAAQ,WAAWA,OAAM,QAAQ,WAAW,QAAQ,aAAa;AACjE,YAAQ,gBAAgB;AACxB,YAAQ,IAAI,QAAQ,MAAM,OAAO;AAAA,EACnC;AAEA,SAAO,MAAM,KAAK,QAAQ,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,MAAM,WAAW,KAAK,QAAQ;AAC1F;AAEA,SAAS,WAAW,MAAwB;AAC1C,SAAO,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,QAAQ,CAAC,CAAC;AAC3D;AAEA,SAAS,oBAAoB,aAA+B,cAAgC;AAC1F,QAAM,aAAa,WAAW,WAAW;AACzC,QAAM,cAAc,WAAW,YAAY;AAC3C,QAAM,OAAO,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,WAAW,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC;AAE9E,SAAO,KACJ,IAAI,CAAC,QAAQ;AACZ,UAAM,mBAAmB,YAAY,IAAI,GAAG,KAAK;AACjD,UAAM,kBAAkB,WAAW,IAAI,GAAG,KAAK;AAE/C,WAAO;AAAA,MACL;AAAA,MACA,kBAAkBA,OAAM,gBAAgB;AAAA,MACxC,iBAAiBA,OAAM,eAAe;AAAA,MACtC,eAAeA,OAAM,kBAAkB,gBAAgB;AAAA,IACzD;AAAA,EACF,CAAC,EACA,OAAO,CAAC,QAAQ,IAAI,kBAAkB,CAAC,EACvC,KAAK,CAAC,MAAM,UAAU,KAAK,IAAI,MAAM,aAAa,IAAI,KAAK,IAAI,KAAK,aAAa,CAAC,EAClF,MAAM,GAAG,CAAC;AACf;AAEA,SAAS,mBAAmB,SAAkB;AAC5C,SAAO,GAAG,QAAQ,IAAI,IAAI,QAAQ,KAAK,IAAI,QAAQ,OAAO;AAC5D;AAEA,SAAS,mBAAmB,SAA0B;AACpD,SAAO,QAAQ;AAAA,IACb,CAAC,MAAM,UAAU,KAAK,IAAI,MAAM,kBAAkB,IAAI,KAAK,IAAI,KAAK,kBAAkB;AAAA,EACxF;AACF;AAEA,SAAS,oBAAoB,iBAA4B,kBAA6B;AACpF,QAAM,eAAe,gBAAgB;AAAA,IACnC,CAAC,YAAY,QAAQ,mBAAmB,WAAW,QAAQ,eAAe;AAAA,EAC5E;AACA,QAAM,gBAAgB,iBAAiB;AAAA,IACrC,CAAC,YAAY,QAAQ,mBAAmB,WAAW,QAAQ,eAAe;AAAA,EAC5E;AACA,QAAM,aAAa,IAAI,IAAI,aAAa,IAAI,CAAC,YAAY,CAAC,mBAAmB,OAAO,GAAG,OAAO,CAAC,CAAC;AAChG,QAAM,cAAc,IAAI;AAAA,IACtB,cAAc,IAAI,CAAC,YAAY,CAAC,mBAAmB,OAAO,GAAG,OAAO,CAAC;AAAA,EACvE;AAEA,QAAM,yBAA0C,CAAC;AACjD,QAAM,8BAA+C,CAAC;AACtD,QAAM,8BAA+C,CAAC;AAEtD,aAAW,CAAC,UAAU,OAAO,KAAK,WAAW,QAAQ,GAAG;AACtD,UAAM,WAAW,YAAY,IAAI,QAAQ;AAEzC,QAAI,CAAC,UAAU;AACb,6BAAuB,KAAK;AAAA,QAC1B,MAAM,QAAQ;AAAA,QACd,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,SAAS,QAAQ;AAAA,QACjB,sBAAsB,QAAQ;AAAA,QAC9B,oBAAoBA,OAAM,QAAQ,aAAa;AAAA,MACjD,CAAC;AACD;AAAA,IACF;AAEA,UAAM,qBAAqBA,OAAM,QAAQ,gBAAgB,SAAS,aAAa;AAC/E,QAAI,qBAAqB,GAAG;AAC1B,kCAA4B,KAAK;AAAA,QAC/B,MAAM,QAAQ;AAAA,QACd,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,SAAS,QAAQ;AAAA,QACjB,uBAAuB,SAAS;AAAA,QAChC,sBAAsB,QAAQ;AAAA,QAC9B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,CAAC,UAAU,QAAQ,KAAK,YAAY,QAAQ,GAAG;AACxD,QAAI,WAAW,IAAI,QAAQ,GAAG;AAC5B;AAAA,IACF;AAEA,gCAA4B,KAAK;AAAA,MAC/B,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,SAAS,SAAS;AAAA,MAClB,uBAAuB,SAAS;AAAA,MAChC,oBAAoBA,OAAM,CAAC,SAAS,aAAa;AAAA,IACnD,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,wBAAwB,mBAAmB,sBAAsB;AAAA,IACjE,6BAA6B,mBAAmB,2BAA2B;AAAA,IAC3E,6BAA6B,mBAAmB,2BAA2B;AAAA,EAC7E;AACF;AAEA,SAAS,oBAAoB,SAAqC;AAChE,MAAI,aAAa,WAAW,QAAQ,SAAS;AAC3C,WAAO,QAAQ;AAAA,EACjB;AAEA,MAAI,QAAQ,YAAY,KAAK,CAAC,WAAW,OAAO,SAAS,kBAAkB,GAAG;AAC5E,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,oBAAoB,SAAqC;AACvE,QAAM,UAAU,oBAAoB,OAAO;AAC3C,QAAM,6BACJ,EAAE,aAAa,YAAY,CAAC,QAAQ,WAAW,CAAC,QAAQ;AAC1D,QAAM,kBAAkB,QAAQ,YAAY,IAAI,CAAC,YAAY;AAAA,IAC3D,GAAG;AAAA,IACH,SACE,OAAO,YACN,OAAO,SAAS,qBAAqB,WAAW,YAAY,WAAW,aAAa;AAAA,EACzF,EAAE;AAEF,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,aAAa;AAAA,IACb,eAAe,6BACX,mBAAmB;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,IACjB,CAAC,IACD,QAAQ;AAAA,IACZ,YAAY,QAAQ,cAAc;AAAA,IAClC,aACE,QAAQ,aAAa,SAAS,IAC1B,QAAQ,cACR,qBAAqB,QAAQ,UAAU,OAAO;AAAA,IACpD,mBACE,QAAQ,mBAAmB,SAAS,IAChC,QAAQ,oBACR,qBAAqB,QAAQ,UAAU,aAAa;AAAA,IAC1D,YAAY,QAAQ,cAAc,CAAC;AAAA,IACnC,YAAY,QAAQ,cAAc,CAAC;AAAA,IACnC,iBAAiB,QAAQ,mBAAmB,CAAC;AAAA,IAC7C,OAAO,QAAQ,SAAS,CAAC;AAAA,IACzB,iBAAiB,QAAQ,mBAAmB;AAAA,IAC5C,aAAa,QAAQ,eAAe;AAAA,EACtC;AACF;AAEO,SAAS,qBACd,SACA,UACiB;AACjB,QAAM,iBAAiB,oBAAoB,QAAQ,iBAAiB,SAAS,eAAe;AAC5F,QAAM,cAAc,oBAAoB,QAAQ,cAAc,SAAS,YAAY;AAEnF,SAAO;AAAA,IACL,iBAAiB,SAAS;AAAA,IAC1B,qBAAqB,SAAS;AAAA,IAC9B,kBAAkB,SAAS;AAAA,IAC3B,mBAAmB,SAAS;AAAA,IAC5B,uBAAuB,SAAS;AAAA,IAChC,0BAA0B,SAAS;AAAA,IACnC,2BAA2B,SAAS;AAAA,IACpC,uBAAuB,SAAS;AAAA,IAChC,6BAA6B,SAAS;AAAA,IACtC,6BAA6B,SAAS;AAAA,IACtC,oBAAoBA,OAAM,QAAQ,gBAAgB,SAAS,aAAa;AAAA,IACxE,uBAAuBA,OAAM,QAAQ,mBAAmB,SAAS,gBAAgB;AAAA,IACjF,wBAAwBA,OAAM,QAAQ,oBAAoB,SAAS,iBAAiB;AAAA,IACpF,oBAAoBA,OAAM,QAAQ,gBAAgB,SAAS,aAAa;AAAA,IACxE,0BAA0BA,OAAM,QAAQ,sBAAsB,SAAS,mBAAmB;AAAA,IAC1F,0BAA0BA,OAAM,QAAQ,sBAAsB,SAAS,mBAAmB;AAAA,IAC1F,eAAe,QAAQ,WAAW,SAAS;AAAA,IAC3C,gBAAgB,QAAQ,YAAY,SAAS;AAAA,IAC7C;AAAA,IACA;AAAA,IACA,gBAAgB,oBAAoB,QAAQ,UAAU,SAAS,QAAQ;AAAA,EACzE;AACF;;;AC/SA,SAAS,kBAAkB,KAA0C;AACnE,MAAI;AACF,WAAO,oBAAoB,KAAK,MAAM,IAAI,WAAW,CAAiB;AAAA,EACxE,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,YAAQ,OAAO,MAAM,+CAA+C,IAAI,EAAE,KAAK,OAAO;AAAA,CAAI;AAC1F,WAAO;AAAA,EACT;AACF;AAEO,SAAS,yBAAyB,QAAgC;AACvE,QAAM,EAAE,OAAO,IAAI,SAAS,MAAM;AAElC,MAAI;AACF,UAAM,OAAO,OACV;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKF,EACC,IAAI;AAEP,WAAO,KACJ,IAAI,CAAC,QAAQ,kBAAkB,GAAG,CAAC,EACnC,OAAO,CAAC,YAAqC,YAAY,IAAI;AAAA,EAClE,UAAE;AACA,WAAO,MAAM;AAAA,EACf;AACF;AAEO,SAAS,iCAAiC,OAI9C;AACD,SAAO,yBAAyB,MAAM,MAAM,EAAE,KAAK,CAAC,YAAY;AAC9D,QAAI,MAAM,kBAAkB,QAAQ,YAAY,MAAM,gBAAgB;AACpE,aAAO;AAAA,IACT;AAEA,WAAO,QAAQ,kBAAkB,MAAM;AAAA,EACzC,CAAC;AACH;;;ACvCA,SAASC,OAAM,OAAe;AAC5B,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEA,SAAS,cAAc,OAAqC;AAC1D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI;AAAA,MACF,GAAG,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,MAAM,OAAO,IAAI,MAAM,KAAK,IAAI,MAAM,aAAa,IAAI,MAAM,OAAO;AAAA,IACtG;AAAA,EACF;AACF;AAEA,SAAS,SAAS,OAAgB;AAChC,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE;AAEA,SAAS,UAAU,OAAgB;AACjC,SAAO,UAAU;AACnB;AAEO,SAAS,yBAAyB,MAA2C;AAClF,QAAM,QAAQ,KAAK,QAAQ,CAACC,SAAQA,KAAI,KAAK;AAC7C,QAAM,gBAAgB,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC;AAC7D,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO,EAAE,UAAU,CAAC,GAAG,mBAAmB,CAAC,EAAE;AAAA,EAC/C;AAEA,QAAM,kBAAkB,cAAc,OAAO,CAAC,SAAS;AACrD,WAAO,SAAS,KAAK,SAAS,eAAe,IAAI;AAAA,EACnD,CAAC;AACD,MAAI,gBAAgB,WAAW,GAAG;AAChC,WAAO,EAAE,UAAU,CAAC,GAAG,mBAAmB,CAAC,EAAE;AAAA,EAC/C;AAEA,QAAM,gBAAgB,cAAc,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,CAAC;AAC/E,QAAM,mBAAmB,cAAc,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,aAAa,CAAC;AACtF,QAAM,uBAAuB,gBAAgB;AAAA,IAC3C,CAAC,KAAK,SAAS,MAAM,SAAS,KAAK,SAAS,eAAe;AAAA,IAC3D;AAAA,EACF;AACA,QAAM,wBAAwB,cAAc;AAAA,IAC1C,CAAC,KAAK,SAAS,MAAM,SAAS,KAAK,SAAS,yBAAyB;AAAA,IACrE;AAAA,EACF;AACA,QAAM,gBAAgB,gBAAgB,OAAO,CAAC,KAAK,SAAS,OAAO,KAAK,gBAAgB,IAAI,CAAC;AAC7F,QAAM,qBAAqB,cAAc;AAAA,IACvC,CAAC,KAAK,SAAS,MAAM,SAAS,KAAK,SAAS,iBAAiB;AAAA,IAC7D;AAAA,EACF;AACA,QAAM,kBAAkB,cACrB,OAAO,CAAC,SAAS,KAAK,iBAAiB,IAAI,EAC3C,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,CAAC;AAC9C,QAAM,kBAAkB,cACrB,OAAO,CAAC,SAAS,UAAU,KAAK,SAAS,OAAO,CAAC,EACjD,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,CAAC;AAC9C,QAAM,iBAAiB,qBAAqB,IAAI,IAAI,uBAAuB;AAC3E,QAAM,qBAAqB,kBAAkB,IAAI,IAAI,kBAAkB;AACvE,QAAM,oBAAoB,kBAAkB,IAAI,IAAI,kBAAkB;AACtE,QAAM,iBAAiBD,OAAM,gBAAgB,kBAAkB;AAE/D,QAAM,gBACJ,kBAAkB,MAClB,kBAAkB,OAClB,gBAAgB,UAAU,MAC1B,sBAAsB;AACxB,QAAM,sBACJ,kBAAkB,KAClB,kBAAkB,QAClB,gBAAgB,UAAU,MAC1B,sBAAsB;AAExB,MAAI,CAAC,iBAAiB,CAAC,qBAAqB;AAC1C,WAAO,EAAE,UAAU,CAAC,GAAG,mBAAmB,CAAC,EAAE;AAAA,EAC/C;AAEA,QAAM,iBAAwC,gBAAgB,UAAU;AAExE,QAAM,aACJ,kBAAkB,OAAO,gBAAgB,UAAU,MAAM,sBAAsB,MAC3E,SACA,kBAAkB,OAAO,gBAAgB,UAAU,KACjD,WACA;AAER,QAAM,UACJ,mBAAmB,UACf,kBAAkB,eAAe,QAAQ,CAAC,CAAC,iFAAiF,gBAAgB,MAAM,YAAY,gBAAgB,WAAW,IAAI,KAAK,GAAG,oFACrM,kBAAkB,eAAe,QAAQ,CAAC,CAAC,iEAAiE,gBAAgB,MAAM,YAAY,gBAAgB,WAAW,IAAI,KAAK,GAAG;AAE3L,QAAM,WAAsB;AAAA,IAC1B,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,OACE,mBAAmB,UACf,wDACA;AAAA,MACN;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,SAAS;AAAA,QACP,gBAAgBA,OAAM,cAAc;AAAA,QACpC,oBAAoBA,OAAM,kBAAkB;AAAA,QAC5C;AAAA,QACA;AAAA,QACA,mBAAmB,cAAc;AAAA,QACjC,qBAAqB,gBAAgB;AAAA,QACrC,mBAAmBA,OAAM,iBAAiB;AAAA,QAC1C,4BAA4BA,OAAM,aAAa;AAAA,QAC/C,6BAA6BA,OAAM,kBAAkB;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,cAAc,OAAO,CAAC,SAAS,UAAU,KAAK,SAAS,OAAO,CAAC;AACpF,QAAM,mBACJ,cAAc,WAAW,IAAI,IAAI,aAAa,SAAS,cAAc;AAEvE,MAAI,qBAAqB,OAAO,mBAAmB,MAAM,aAAa,UAAU,IAAI;AAClF,UAAM,oBACJ,qBAAqB,QAAQ,aAAa,UAAU,KAChD,SACA,qBAAqB,OAAO,aAAa,UAAU,KACjD,WACA;AAER,aAAS;AAAA,MACP,cAAc;AAAA,QACZ,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,SAAS,0BAA0B,oBAAoB,KAAK,QAAQ,CAAC,CAAC,4BAA4B,aAAa,MAAM,YAAY,aAAa,WAAW,IAAI,KAAK,GAAG;AAAA,QACrK,OAAO;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,eAAeA,OAAM,kBAAkB,GAAG;AAAA,QAC1C,SAAS;AAAA,UACP,iBAAiBA,OAAM,eAAe;AAAA,UACtC,mBAAmBA,OAAM,iBAAiB;AAAA,UAC1C,kBAAkB,aAAa;AAAA,UAC/B,kBAAkBA,OAAM,gBAAgB;AAAA,QAC1C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,oBACJ,mBAAmB,UACf,cACG,IAAI,CAAC,UAAU;AAAA,IACd,MAAM;AAAA,IACN,WAAW,KAAK;AAAA,IAChB,UAAUA,QAAO,KAAK,gBAAgB,KAAK,SAAS,KAAK,SAAS,iBAAiB,CAAC;AAAA,EACtF,EAAE,EACD,OAAO,CAAC,gBAAgB,YAAY,WAAW,CAAC,IACnD,CAAC;AAEP,SAAO;AAAA,IACL,UAAU,SAAS,KAAK,CAAC,MAAM,UAAU,MAAM,gBAAgB,KAAK,aAAa;AAAA,IACjF;AAAA,EACF;AACF;;;AC5KA,SAASE,eAAc,OAAqC;AAC1D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI;AAAA,MACF,GAAG,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,MAAM,OAAO,IAAI,MAAM,KAAK,IAAI,MAAM,aAAa,IAAI,MAAM,OAAO;AAAA,IACtG;AAAA,EACF;AACF;AAEA,SAASC,OAAM,OAAe;AAC5B,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEO,SAAS,cAAc,MAA2C;AACvE,QAAM,WAAsB,CAAC;AAC7B,QAAM,oBAAwC,CAAC;AAC/C,QAAM,WAAW,KAAK,QAAQ,CAACC,SAAQA,KAAI,MAAM,IAAI,CAAC,UAAU,EAAE,KAAAA,MAAK,KAAK,EAAE,CAAC;AAE/E,QAAM,kBAAkB,SAAS,OAAO,CAAC,EAAE,KAAK,MAAM;AACpD,UAAM,UAAU,KAAK,UAAU,IAAI,YAAY;AAC/C,WAAO,OAAO,SAAS,OAAO,KAAK,OAAO,SAAS,MAAM;AAAA,EAC3D,CAAC;AAED,QAAM,YAAY,gBAAgB,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,CAAC;AAClF,MAAI,YAAY,GAAG;AACjB,sBAAkB;AAAA,MAChB,GAAG,gBAAgB,IAAI,CAAC,EAAE,KAAK,OAAO;AAAA,QACpC,MAAM;AAAA,QACN,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,MACjB,EAAE;AAAA,IACJ;AACA,aAAS;AAAA,MACPF,eAAc;AAAA,QACZ,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,SAAS,GAAG,gBAAgB,MAAM,eAAe,gBAAgB,WAAW,IAAI,KAAK,GAAG;AAAA,QACxF,OAAO;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,eAAeC,OAAM,SAAS;AAAA,QAC9B,SAAS;AAAA,UACP,iBAAiB,gBAAgB;AAAA,QACnC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAWC,QAAO,MAAM;AACtB,UAAM,eAAe,KAAK,IAAI,GAAGA,KAAI,MAAM,IAAI,CAAC,SAAS,KAAK,aAAa,CAAC,CAAC;AAC7E,QAAI,gBAAgB,GAAG;AACrB,YAAM,YAAYA,KAAI,MAAM,OAAO,CAAC,UAAU,KAAK,aAAa,KAAK,CAAC;AACtE,YAAM,WAAW,UAAU,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,CAAC;AACtE,wBAAkB;AAAA,QAChB,GAAG,UAAU,IAAI,CAAC,UAAU;AAAA,UAC1B,MAAM;AAAA,UACN,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,QACjB,EAAE;AAAA,MACJ;AACA,eAAS;AAAA,QACPF,eAAc;AAAA,UACZ,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,MAAM;AAAA,UACN,OAAO,aAAaE,KAAI,QAAQ;AAAA,UAChC,SAAS,oBAAoB,YAAY;AAAA,UACzC,OAAO;AAAA,UACP,SAASA,KAAI;AAAA,UACb,YAAYA,KAAI;AAAA,UAChB,eAAeD,OAAM,QAAQ;AAAA,UAC7B,SAAS;AAAA,YACP,UAAUC,KAAI;AAAA,YACd;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,oBAAI,IAA6B;AACxD,aAAWA,QAAO,MAAM;AACtB,UAAM,SAAS,eAAe,IAAIA,KAAI,QAAQ,KAAK,CAAC;AACpD,WAAO,KAAKA,IAAG;AACf,mBAAe,IAAIA,KAAI,UAAU,MAAM;AAAA,EACzC;AAEA,aAAW,CAAC,UAAU,YAAY,KAAK,eAAe,QAAQ,GAAG;AAC/D,QAAI,aAAa,UAAU,GAAG;AAC5B,YAAM,cAAc,aAAa;AAAA,QAAI,CAACA,SACpCA,KAAI,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,aAAa,CAAC;AAAA,MAC3D;AACA,YAAM,UAAU,YAAY,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,YAAY;AACjF,YAAM,cAAc,aAAa,OAAO,CAACA,SAAQ;AAC/C,cAAM,SAASA,KAAI,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,aAAa,CAAC;AACxE,eAAO,SAAS,UAAU,QAAQ,SAAS;AAAA,MAC7C,CAAC;AAED,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,cAAc,YAAY,OAAO,CAAC,KAAKA,SAAQ,MAAMA,KAAI,cAAc,CAAC;AAC9E,iBAAS;AAAA,UACPF,eAAc;AAAA,YACZ,gBAAgB;AAAA,YAChB,YAAY;AAAA,YACZ,MAAM;AAAA,YACN,OAAO,qBAAqB,QAAQ;AAAA,YACpC,SAAS,cAAc,YAAY,MAAM,OAAO,YAAY,WAAW,IAAI,KAAK,GAAG;AAAA,YACnF,OAAO;AAAA,YACP,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,eAAeC,OAAM,WAAW;AAAA,YAChC,SAAS;AAAA,cACP;AAAA,cACA,oBAAoBA,OAAM,OAAO;AAAA,cACjC,iBAAiB,YAAY;AAAA,YAC/B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,aAAa;AAAA,MAAO,CAACC,SACpC,iCAAiC,KAAKA,KAAI,QAAQ;AAAA,IACpD;AACA,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,WAAW,SAAS,OAAO,CAAC,KAAKA,SAAQ,MAAMA,KAAI,cAAc,CAAC;AACxE,eAAS;AAAA,QACPF,eAAc;AAAA,UACZ,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,MAAM;AAAA,UACN,OAAO,yCAAyC,QAAQ;AAAA,UACxD,SACE;AAAA,UACF,OAAO;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,eAAeC,OAAM,QAAQ;AAAA,UAC7B,SAAS;AAAA,YACP;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,iBAAiB,aACpB,QAAQ,CAACC,SAAQA,KAAI,KAAK,EAC1B,OAAO,CAAC,SAAS;AAChB,aACE,wBAAwB,KAAK,KAAK,KAAK,KACvC,+CAA+C,KAAK,KAAK,aAAa,QAAQ;AAAA,IAElF,CAAC;AAEH,QAAI,eAAe,SAAS,GAAG;AAC7B,YAAM,QAAQ,eAAe,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,CAAC;AACxE,eAAS;AAAA,QACPF,eAAc;AAAA,UACZ,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,MAAM;AAAA,UACN,OAAO,6CAA6C,QAAQ;AAAA,UAC5D,SACE;AAAA,UACF,OAAO;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,eAAeC,OAAM,QAAQ,GAAG;AAAA,UAChC,SAAS;AAAA,YACP;AAAA,YACA,oBAAoB,eAAe;AAAA,YACnC,mBAAmBA,OAAM,KAAK;AAAA,UAChC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU,SAAS,KAAK,CAAC,MAAM,UAAU,MAAM,gBAAgB,KAAK,aAAa;AAAA,IACjF;AAAA,EACF;AACF;;;ACzLO,IAAM,kBAAkC;AAAA,EAC7C;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,IACP,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,IACP,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,IACP,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,IACP,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,IACP,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,IACP,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,IACP,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AACF;AAEO,SAAS,gBAAgB,UAAkB,OAAyC;AACzF,QAAM,qBAAqB,SAAS,KAAK,EAAE,YAAY;AACvD,QAAM,kBAAkB,MAAM,KAAK,EAAE,YAAY;AAEjD,SAAO,gBAAgB,KAAK,CAAC,UAAU;AACrC,WACE,MAAM,SAAS,YAAY,MAAM,sBACjC,MAAM,MAAM,YAAY,MAAM;AAAA,EAElC,CAAC;AACH;AAEO,SAAS,gBACd,UACA,OACA,aACA,cACA;AACA,QAAM,QAAQ,gBAAgB,UAAU,KAAK;AAE7C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,YAAa,KAAK,IAAI,aAAa,CAAC,IAAI,MAAa,MAAM;AACjE,QAAM,aAAc,KAAK,IAAI,cAAc,CAAC,IAAI,MAAa,MAAM;AAEnE,SAAO,QAAQ,YAAY,YAAY,QAAQ,CAAC,CAAC;AACnD;;;AChEA,IAAM,gBAAkE;AAAA,EACtE,SAAS;AAAA,EACT,WAAW;AAAA,EACX,OAAO;AACT;AAEA,IAAM,kBAAoE;AAAA,EACxE,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AACP;AAEA,SAAS,cAAc,OAAe;AACpC,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEA,SAAS,SAAS,OAAe;AAC/B,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEA,SAAS,iBAAiB,SAAkB;AAC1C,MAAI,QAAQ,UAAU,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,YAAY,KAAK,KAAK,QAAQ;AAC/C;AAEA,SAAS,6BAA6B,SAA+C;AACnF,MAAI,QAAQ,UAAU,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAkB;AAClD,MAAI,QAAQ,UAAU,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ;AACjB;AAEA,SAAS,eAAe,SAAkB,OAAoC;AAC5E,SAAO,UAAU,cAAc,cAAc,yBAAyB,OAAO;AAC/E;AAEA,SAAS,mBAAmB,SAAkB;AAC5C,QAAM,QAAQ,6BAA6B,OAAO;AAClD,SAAO,GAAG,QAAQ,IAAI,IAAI,KAAK,IAAI,yBAAyB,OAAO,CAAC;AACtE;AAEA,SAAS,2BACP,SACA,uBACA;AACA,QAAM,QAAQ,6BAA6B,OAAO;AAClD,SAAO;AAAA,IACL,UAAU,QAAQ,IAAI,IAAI,KAAK,IAAI,yBAAyB,OAAO,CAAC,IAAI,qBAAqB;AAAA,EAC/F;AACF;AAEA,SAAS,uBAAuB,MAA0B,OAA2B;AACnF,QAAM,gBAAgB,cAAc,MAAM,cAAc,IAAI,cAAc,KAAK,cAAc;AAC7F,MAAI,kBAAkB,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,wBAAwB,KAAK,qBAAqB;AAC1D,WAAO,MAAM,sBAAsB,KAAK;AAAA,EAC1C;AAEA,QAAM,kBAAkB,gBAAgB,MAAM,UAAU,IAAI,gBAAgB,KAAK,UAAU;AAC3F,MAAI,oBAAoB,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,cAAc,MAAM,KAAK;AAC7C;AAEA,IAAM,kBAA0D;AAAA,EAC9D,eAAe;AAAA,IACb,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS,CAAC,YAAY,yBAAyB,iBAAiB,OAAO,CAAC;AAAA,IACxE,WAAW,CAAC,YACV,GAAG,QAAQ,OAAO;AAAA,IACpB,iBAAiB,CAAC,YAChB,sEAAsE,iBAAiB,OAAO,CAAC;AAAA,IACjG,kBAAkB,MAChB;AAAA,IACF,WAAW,MAAM;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS,CAAC,YAAY,qBAAqB,iBAAiB,OAAO,CAAC;AAAA,IACpE,WAAW,CAAC,YACV,GAAG,QAAQ,OAAO;AAAA,IACpB,iBAAiB,CAAC,YAChB,6EAA6E,iBAAiB,OAAO,CAAC;AAAA,IACxG,kBAAkB,MAChB;AAAA,IACF,WAAW,MAAM;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS,CAAC,YAAY,mBAAmB,iBAAiB,OAAO,CAAC;AAAA,IAClE,WAAW,CAAC,YACV,GAAG,QAAQ,OAAO;AAAA,IACpB,iBAAiB,CAAC,YAChB,gDAAgD,iBAAiB,OAAO,CAAC;AAAA,IAC3E,kBAAkB,MAChB;AAAA,IACF,WAAW,MAAM;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS,CAAC,YAAY,sBAAsB,iBAAiB,OAAO,CAAC;AAAA,IACrE,WAAW,CAAC,YACV,GAAG,QAAQ,OAAO;AAAA,IACpB,iBAAiB,CAAC,YAChB,sDAAsD,iBAAiB,OAAO,CAAC;AAAA,IACjF,kBAAkB,MAChB;AAAA,IACF,WAAW,MAAM;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,uBAAuB;AAAA,IACrB,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS,CAAC,YAAY,gCAAgC,iBAAiB,OAAO,CAAC;AAAA,IAC/E,WAAW,CAAC,YACV,GAAG,QAAQ,OAAO;AAAA,IACpB,iBAAiB,CAAC,YAChB,UAAU,iBAAiB,OAAO,CAAC;AAAA,IACrC,kBAAkB,MAChB;AAAA,IACF,WAAW,MAAM;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS,MAAM;AAAA,IACf,WAAW,CAAC,YACV,GAAG,QAAQ,OAAO;AAAA,IACpB,iBAAiB,MACf;AAAA,IACF,kBAAkB,MAChB;AAAA,IACF,WAAW,MAAM;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,0BAA0B;AAAA,IACxB,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS,MAAM;AAAA,IACf,WAAW,CAAC,YACV,GAAG,QAAQ,OAAO;AAAA,IACpB,iBAAiB,MACf;AAAA,IACF,kBAAkB,MAChB;AAAA,IACF,WAAW,MAAM;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,kBAA0C;AAAA,EAC9C,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS,CAAC,YAAY,UAAU,QAAQ,KAAK;AAAA,EAC7C,WAAW,CAAC,YAAY,QAAQ;AAAA,EAChC,iBAAiB,CAAC,YAAY,UAAU,iBAAiB,OAAO,CAAC;AAAA,EACjE,kBAAkB,MAChB;AAAA,EACF,WAAW,MAAM;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,SAAuB,SAAsC;AAC9F,QAAM,WAAW,gBAAgB,QAAQ,IAAI,KAAK;AAClD,QAAM,QAAQ,6BAA6B,OAAO;AAClD,QAAM,UAAU,eAAe,SAAS,KAAK;AAC7C,QAAM,aAAa,iBAAiB,OAAO;AAC3C,QAAM,sBACJ,QAAQ,kBAAkB,IACtB,IACA,SAAS,KAAK,IAAI,KAAK,IAAI,QAAQ,gBAAgB,QAAQ,eAAe,CAAC,GAAG,CAAC,CAAC;AAEtF,SAAO;AAAA,IACL,IAAI,2BAA2B,SAAS,SAAS,qBAAqB;AAAA,IACtE,WAAW,QAAQ;AAAA,IACnB,MAAM,QAAQ;AAAA,IACd,OAAO,SAAS,QAAQ,OAAO;AAAA,IAC/B,SAAS,SAAS,UAAU,OAAO;AAAA,IACnC,gBAAgB,SAAS;AAAA,IACzB,kBAAkB;AAAA,IAClB,uBAAuB,SAAS;AAAA,IAChC,UAAU,SAAS;AAAA,IACnB,UAAU,SAAS;AAAA,IACnB,qBAAqB,cAAc,QAAQ,aAAa;AAAA,IACxD;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,QAAQ,SAAS;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,SAAS,gBAAgB,OAAO;AAAA,IAC/C,gBAAgB,SAAS,iBAAiB,OAAO;AAAA,IACjD,SAAS,SAAS,UAAU,OAAO;AAAA,EACrC;AACF;AAEO,SAAS,qBAAqB,SAA6C;AAChF,QAAM,UAAU,oBAAI,IAAgC;AAEpD,aAAW,WAAW,QAAQ,UAAU;AACtC,UAAM,iBAAiB,0BAA0B,SAAS,OAAO;AACjE,UAAM,MAAM,mBAAmB,OAAO;AACtC,UAAM,WAAW,QAAQ,IAAI,GAAG;AAEhC,QAAI,CAAC,UAAU;AACb,cAAQ,IAAI,KAAK,cAAc;AAC/B;AAAA,IACF;AAEA,QACE,eAAe,sBAAsB,SAAS,uBAC7C,eAAe,wBAAwB,SAAS,uBAC/C,gBAAgB,eAAe,UAAU,IAAI,gBAAgB,SAAS,UAAU,GAClF;AACA,cAAQ,IAAI,KAAK,cAAc;AAAA,IACjC;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,KAAK,sBAAsB,EAAE,IAAI,CAAC,gBAAgB,WAAW;AAAA,IACxF,GAAG;AAAA,IACH,kBAAkB,QAAQ;AAAA,EAC5B,EAAE;AACJ;;;ACzTA,SAASE,OAAM,OAAe;AAC5B,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEA,SAAS,SAAS,WAAkC;AAClD,QAAM,YAAY,IAAI,KAAK,SAAS;AACpC,MAAI,OAAO,MAAM,UAAU,QAAQ,CAAC,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE;AAC5C;AAEA,SAAS,gBAAgB,MAAc;AACrC,QAAM,YAAY,oBAAI,KAAK,GAAG,IAAI,gBAAgB;AAClD,YAAU,WAAW,UAAU,WAAW,IAAI,CAAC;AAC/C,SAAO,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE;AAC5C;AAEO,SAAS,yBAAyB,MAAiC;AACxE,QAAM,OAAO,KACV,QAAQ,CAACC,SAAQA,KAAI,KAAK,EAC1B,IAAI,CAAC,SAAS,SAAS,KAAK,SAAS,CAAC,EACtC,OAAO,CAAC,QAAuB,QAAQ,IAAI,EAC3C,KAAK;AAER,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAkB,CAAC;AACzB,MAAI,UAAU,KAAK,CAAC;AACpB,QAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AAEjC,SAAO,WAAW,MAAM;AACtB,UAAM,KAAK,OAAO;AAClB,cAAU,gBAAgB,OAAO;AAAA,EACnC;AAEA,SAAO;AACT;AAEA,SAAS,oBACP,MACA,KACA,UACA;AACA,MAAI,KAAK,WAAW,GAAG;AACrB;AAAA,EACF;AAEA,QAAM,SAASD;AAAA,IACb,KAAK,OAAO,CAAC,KAAK,QAAQ,OAAO,OAAO,IAAI,GAAG,MAAM,WAAY,IAAI,GAAG,IAAe,IAAI,CAAC;AAAA,EAC9F;AACA,QAAM,QAAQA,OAAM,WAAW,MAAM;AAErC,MAAI,UAAU,GAAG;AACf;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,QAAM,UAAU,KAAK,GAAG;AACxB,MAAI,OAAO,YAAY,UAAU;AAC/B,SAAK,GAAG,IAAIA,OAAM,UAAU,KAAK;AAAA,EACnC;AACF;AAEO,SAAS,gBAAgB,MAA8C;AAC5E,QAAM,OAAO,yBAAyB,IAAI;AAC1C,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,IAAI;AAAA,IAChB,KAAK,IAAI,CAAC,QAAQ;AAAA,MAChB;AAAA,MACA,EAAE,MAAM,KAAK,kBAAkB,GAAG,mBAAmB,GAAG,WAAW,EAAE;AAAA,IACvE,CAAC;AAAA,EACH;AAEA,aAAWC,QAAO,MAAM;AACtB,eAAW,QAAQA,KAAI,OAAO;AAC5B,YAAM,MAAM,SAAS,KAAK,SAAS;AACnC,UAAI,CAAC,KAAK;AACR;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,IAAI,GAAG;AAC5B,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AAEA,aAAO,aAAa;AACpB,UAAI,KAAK,eAAe,YAAY;AAClC,eAAO,oBAAoB,KAAK;AAAA,MAClC,WAAW,KAAK,eAAe,aAAa;AAC1C,eAAO,qBAAqB,KAAK;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,IAAI,CAAC,QAAQ;AAC7B,UAAM,SAAS,MAAM,IAAI,GAAG;AAC5B,UAAM,mBAAmBD,OAAM,QAAQ,oBAAoB,CAAC;AAC5D,UAAM,oBAAoBA,OAAM,QAAQ,qBAAqB,CAAC;AAE9D,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,UAAUA,OAAM,mBAAmB,iBAAiB;AAAA,MACpD,WAAW,QAAQ,aAAa;AAAA,IAClC;AAAA,EACF,CAAC;AAED;AAAA,IACE;AAAA,IACA;AAAA,IACAA,OAAM,KAAK,OAAO,CAAC,KAAKC,SAAQ,MAAMA,KAAI,iBAAiB,CAAC,CAAC;AAAA,EAC/D;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACAD,OAAM,KAAK,OAAO,CAAC,KAAKC,SAAQ,MAAMA,KAAI,kBAAkB,CAAC,CAAC;AAAA,EAChE;AAEA,aAAW,OAAO,MAAM;AACtB,QAAI,WAAWD,OAAM,IAAI,mBAAmB,IAAI,iBAAiB;AAAA,EACnE;AAEA,SAAO;AACT;AAEO,SAAS,gBACd,mBACA,MACA,kBACuB;AACvB,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAEjD,aAAW,eAAe,mBAAmB;AAC3C,UAAM,MAAM,SAAS,YAAY,SAAS;AAC1C,QAAI,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,MAAM,IAAI,GAAG,KAAK,KAAK,YAAY,QAAQ;AAAA,EAC7D;AAEA,QAAM,OAAO,KAAK,IAAI,CAAC,SAAS;AAAA,IAC9B,MAAM;AAAA,IACN,UAAUA,OAAM,MAAM,IAAI,GAAG,KAAK,CAAC;AAAA,EACrC,EAAE;AAEF,sBAAoB,MAAM,YAAYA,OAAM,gBAAgB,CAAC;AAE7D,SAAO;AACT;;;ACzJA,SAAS,eACP,OACkB;AAClB,QAAM,UAAU,oBAAI,IAGlB;AAEF,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,QAAQ,IAAI,KAAK,GAAG,KAAK,EAAE,UAAU,GAAG,kBAAkB,GAAG,WAAW,EAAE;AAC1F,YAAQ,YAAY,KAAK;AACzB,YAAQ,oBAAoB,KAAK;AACjC,YAAQ,aAAa;AACrB,YAAQ,IAAI,KAAK,KAAK,OAAO;AAAA,EAC/B;AAEA,SAAO,MAAM,KAAK,QAAQ,QAAQ,CAAC,EAChC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,UAAM,gBAAgB,MAAM,aAAa,IAAI,IAAI,MAAM,mBAAmB,MAAM;AAChF,WAAO;AAAA,MACL;AAAA,MACA,UAAU,OAAO,MAAM,SAAS,QAAQ,CAAC,CAAC;AAAA,MAC1C,WAAW,MAAM;AAAA,MACjB,eAAe,OAAO,cAAc,QAAQ,CAAC,CAAC;AAAA,IAChD;AAAA,EACF,CAAC,EACA,KAAK,CAAC,MAAM,UAAU,MAAM,WAAW,KAAK,QAAQ;AACzD;AAEO,SAAS,kBAAkB,OASjB;AACf,QAAM,YAAY,MAAM,KAAK,OAAO,CAAC,KAAKE,SAAQ,MAAMA,KAAI,MAAM,QAAQ,CAAC;AAC3E,QAAM,gBAAgB,MAAM,KAAK,OAAO,CAAC,KAAKA,SAAQ,MAAMA,KAAI,cAAc,CAAC;AAC/E,QAAM,mBAAmB,MAAM,KAAK,OAAO,CAAC,KAAKA,SAAQ,MAAMA,KAAI,iBAAiB,CAAC;AACrF,QAAM,oBAAoB,MAAM,KAAK,OAAO,CAAC,KAAKA,SAAQ,MAAMA,KAAI,kBAAkB,CAAC;AACvF,QAAM,gBAAgB,MAAM,SACzB,OAAO,CAAC,YAAY,QAAQ,mBAAmB,OAAO,EACtD,OAAO,CAAC,KAAK,YAAY,MAAM,QAAQ,eAAe,CAAC;AAC1D,QAAM,sBAAsB,MAAM,SAC/B,OAAO,CAAC,YAAY,QAAQ,mBAAmB,aAAa,EAC5D,OAAO,CAAC,KAAK,YAAY,MAAM,QAAQ,eAAe,CAAC;AAC1D,QAAM,cAAc,OAAO;AAC3B,QAAM,aAAa,gBAAgB,MAAM,IAAI;AAC7C,QAAM,eAAe,yBAAyB,MAAM,IAAI;AACxD,QAAM,UAAwB;AAAA,IAC5B,SAAS;AAAA,MACP,GAAG,WAAW,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,EAAE,KAAK,GAAG,CAAC;AAAA,IAC7F;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AAAA,IACf,eACE,MAAM,yBACN,mBAAmB;AAAA,MACjB,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,IACH,YAAY;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,UAAU,MAAM,KAAK;AAAA,IACrB;AAAA,IACA,eAAe,OAAO,cAAc,QAAQ,CAAC,CAAC;AAAA,IAC9C,kBAAkB,OAAO,iBAAiB,QAAQ,CAAC,CAAC;AAAA,IACpD,mBAAmB,OAAO,kBAAkB,QAAQ,CAAC,CAAC;AAAA,IACtD,eAAe,OAAO,cAAc,QAAQ,CAAC,CAAC;AAAA,IAC9C,qBAAqB,OAAO,oBAAoB,QAAQ,CAAC,CAAC;AAAA,IAC1D,qBAAqB;AAAA,OAClB,kBAAkB,IAAI,IAAI,gBAAgB,eAAe,QAAQ,CAAC;AAAA,IACrE;AAAA,IACA,aAAa,qBAAqB,MAAM,UAAU,OAAO;AAAA,IACzD,mBAAmB,qBAAqB,MAAM,UAAU,aAAa;AAAA,IACrE,iBAAiB;AAAA,MACf,MAAM,KAAK,IAAI,CAACA,UAAS;AAAA,QACvB,KAAKA,KAAI;AAAA,QACT,UAAUA,KAAI;AAAA,QACd,kBAAkBA,KAAI;AAAA,MACxB,EAAE;AAAA,IACJ;AAAA,IACA,cAAc;AAAA,MACZ,MAAM,KAAK;AAAA,QAAQ,CAACA,SAClBA,KAAI,MAAM,IAAI,CAAC,UAAU;AAAA,UACvB,KAAK,GAAG,KAAK,QAAQ,IAAI,KAAK,KAAK;AAAA,UACnC,UAAU,KAAK;AAAA,UACf,kBAAkB,KAAK,eAAe,aAAa,KAAK,UAAU;AAAA,QACpE,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,IACA;AAAA,IACA,YAAY,gBAAgB,MAAM,mBAAmB,cAAc,aAAa;AAAA,IAChF,UAAU,MAAM;AAAA,IAChB,iBAAiB,CAAC;AAAA,IAClB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,IACA,aAAa,MAAM;AAAA,IACnB,QAAQ,MAAM;AAAA,EAChB;AAEA,UAAQ,kBAAkB,qBAAqB,OAAO;AAEtD,SAAO;AACT;;;AC7HA,SAAS,YAAAC,iBAAgB;;;ACAzB,SAAS,WAAAC,gBAAe;AACxB,SAAS,YAAAC,WAAU,QAAAC,aAAY;;;ACD/B,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,gBAAgB;;;ACDlB,SAAS,eAAe,OAAgB,OAA4B;AACzE,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AAEf,aAAW,QAAQ,OAAO;AACxB,QAAI,UAAmB;AAEvB,eAAW,WAAW,MAAM;AAC1B,UAAI,CAAC,WAAW,OAAO,YAAY,YAAY,EAAE,WAAW,UAAU;AACpE,kBAAU;AACV;AAAA,MACF;AAEA,gBAAW,QAAoC,OAAO;AAAA,IACxD;AAEA,QAAI,YAAY,QAAW;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAASC,UAAS,OAA+B;AACtD,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,UAAM,UAAU,OAAO,KAAK;AAC5B,WAAO,OAAO,SAAS,OAAO,IAAI,UAAU;AAAA,EAC9C;AAEA,SAAO;AACT;AAEO,SAAS,SAAS,OAA+B;AACtD,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,WAAO,MAAM,KAAK;AAAA,EACpB;AAEA,SAAO;AACT;AAEO,SAASC,WAAU,OAAyB;AACjD,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,SAAS,MAAM,KAAK,EAAE,YAAY,CAAC;AAAA,EACjE;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,QAAQ;AAAA,EACjB;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,OAAgC,MAAgB;AAC3E,QAAM,SAA2D,CAAC;AAElE,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AACxF,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;;;ADhEA,IAAM,4BAA4B,oBAAI,IAAI,CAAC,aAAa,UAAU,UAAU,MAAM,CAAC;AAEnF,SAAS,cAAc,MAAiC;AACtD,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AAAA,EAAC;AAET,QAAM,YAAY,QAAQ,QAAQ,GAAG;AACrC,QAAM,UAAU,QAAQ,YAAY,GAAG;AACvC,MAAI,YAAY,KAAK,WAAW,WAAW;AACzC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,QAAQ,MAAM,WAAW,UAAU,CAAC,CAAC;AAAA,EACzD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,MAAc;AACpC,QAAM,UAAUC,cAAa,MAAM,MAAM;AACzC,QAAM,QAAQ,QACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAEjB,QAAM,UAAwB,CAAC;AAE/B,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,cAAc,IAAI;AACjC,QAAI,QAAQ;AACV,cAAQ,KAAK,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,QAA4B;AACxD,QAAM,UAAU,eAAe,OAAO,IAAI;AAE1C,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,QAAQ,CAAC,WAAW,oBAAoB,MAAM,CAAC;AAChE;AAEA,SAAS,oBAAoB,QAAkC;AAC7D,QAAM,WAAW,eAAe,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC;AACtD,MAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,WAAO,CAAC,MAAM;AAAA,EAChB;AAEA,SAAO,SACJ,OAAO,CAAC,YAAmC,QAAQ,OAAO,KAAK,OAAO,YAAY,QAAQ,EAC1F,IAAI,CAAC,SAAS,WAAW;AAAA,IACxB,GAAG;AAAA,IACH;AAAA,IACA,WACE;AAAA,MACE,eAAe,SAAS,CAAC,CAAC,WAAW,GAAG,CAAC,YAAY,GAAG,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,CAAC;AAAA,IAClF,KACA;AAAA,MACE,eAAe,QAAQ,CAAC,CAAC,WAAW,GAAG,CAAC,YAAY,GAAG,CAAC,WAAW,GAAG,CAAC,YAAY,CAAC,CAAC;AAAA,IACvF,KACA,GAAG,oBAAoB,MAAM,CAAC,IAAI,KAAK;AAAA,EAC3C,EAAE;AACN;AAEA,SAAS,oBAAoB,QAAoB;AAC/C,SACE,SAAS,eAAe,QAAQ,CAAC,CAAC,YAAY,GAAG,CAAC,YAAY,GAAG,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KACxF;AAEJ;AAEA,SAAS,0BAA0B,QAAoB;AACrD,QAAM,cACJ;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,UAAU;AAAA,MACX,CAAC,eAAe;AAAA,MAChB,CAAC,WAAW,UAAU;AAAA,MACtB,CAAC,SAAS,UAAU;AAAA,MACpB,CAAC,eAAe,UAAU;AAAA,MAC1B,CAAC,WAAW,UAAU;AAAA,MACtB,CAAC,WAAW,SAAS,UAAU;AAAA,IACjC,CAAC;AAAA,EACH,KAAK;AAEP,QAAM,WACJ;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,OAAO;AAAA,MACR,CAAC,YAAY;AAAA,MACb,CAAC,WAAW,OAAO;AAAA,MACnB,CAAC,SAAS,OAAO;AAAA,MACjB,CAAC,eAAe,OAAO;AAAA,MACvB,CAAC,WAAW,OAAO;AAAA,MACnB,CAAC,WAAW,SAAS,OAAO;AAAA,IAC9B,CAAC;AAAA,EACH,KAAK;AAEP,MAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,UAAM,CAAC,gBAAgB,GAAG,IAAI,IAAI,SAAS,MAAM,GAAG;AACpD,QAAI,0BAA0B,IAAI,eAAe,YAAY,CAAC,KAAK,KAAK,SAAS,GAAG;AAClF,aAAO;AAAA,QACL,UAAU,eAAe,YAAY;AAAA,QACrC,OAAO,KAAK,KAAK,GAAG;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU,YAAY,YAAY;AAAA,IAClC,OAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,QAAoB,YAAoB;AAC7D,SACE;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,UAAU;AAAA,MACX,CAAC,UAAU;AAAA,MACX,CAAC,YAAY;AAAA,MACb,CAAC,WAAW;AAAA,MACZ,CAAC,YAAY;AAAA,MACb,CAAC,SAAS,MAAM;AAAA,MAChB,CAAC,QAAQ;AAAA,MACT,CAAC,WAAW,QAAQ;AAAA,MACpB,CAAC,aAAa;AAAA,MACd,CAAC,YAAY;AAAA,MACb,CAAC,WAAW;AAAA,MACZ,CAAC,OAAO;AAAA,IACV,CAAC;AAAA,EACH,KAAK,SAAS,UAAU,EAAE,QAAQ,gCAAgC,EAAE;AAExE;AAEA,SAAS,iBAAiB,QAAoB;AAC5C,SACE,SAAS,eAAe,QAAQ,CAAC,CAAC,aAAa,GAAG,CAAC,KAAK,GAAG,CAAC,YAAY,aAAa,CAAC,CAAC,CAAC,KACxF;AAEJ;AAEA,SAAS,YAAY,QAAoB,UAAkB,OAAe,YAAoB;AAC5F,SACE;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,QAAQ;AAAA,MACT,CAAC,OAAO;AAAA,MACR,CAAC,YAAY;AAAA,MACb,CAAC,WAAW;AAAA,MACZ,CAAC,aAAa;AAAA,MACd,CAAC,WAAW;AAAA,MACZ,CAAC,UAAU;AAAA,MACX,CAAC,UAAU;AAAA,MACX,CAAC,SAAS;AAAA,MACV,CAAC,iBAAiB;AAAA,MAClB,CAAC,gBAAgB;AAAA,MACjB,CAAC,IAAI;AAAA,IACP,CAAC;AAAA,EACH,KAAK,GAAG,UAAU,IAAI,QAAQ,IAAI,KAAK;AAE3C;AAEA,SAAS,eAAe,QAAoB,UAAkB;AAC5D,SACE;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,YAAY;AAAA,MACb,CAAC,WAAW;AAAA,MACZ,CAAC,OAAO;AAAA,MACR,CAAC,QAAQ;AAAA,MACT,CAAC,WAAW,QAAQ;AAAA,IACtB,CAAC;AAAA,EACH,KAAK,SAAS,YAAY;AAE9B;AAEA,SAAS,eAAe,QAAoB;AAC1C,QAAM,SACJC;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,YAAY;AAAA,MACb,CAAC,WAAW;AAAA,MACZ,CAAC,SAAS,YAAY;AAAA,MACtB,CAAC,WAAW,SAAS,YAAY;AAAA,IACnC,CAAC;AAAA,EACH,KAAK;AAEP,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,eAAe,QAAQ;AAAA,IACvC,CAAC,YAAY;AAAA,IACb,CAAC,WAAW;AAAA,IACZ,CAAC,WAAW,YAAY;AAAA,EAC1B,CAAC;AACD,SAAO,MAAM,QAAQ,SAAS,IAAI,UAAU,SAAS;AACvD;AAEA,SAAS,aAAa,QAAoB;AACxC,QAAM,cACJA;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,cAAc;AAAA,MACf,CAAC,aAAa;AAAA,MACd,CAAC,SAAS,cAAc;AAAA,MACxB,CAAC,SAAS,aAAa;AAAA,MACvB,CAAC,SAAS,eAAe;AAAA,MACzB,CAAC,eAAe,cAAc;AAAA,MAC9B,CAAC,eAAe,eAAe;AAAA,MAC/B,CAAC,eAAe,OAAO;AAAA,MACvB,CAAC,WAAW,SAAS,cAAc;AAAA,MACnC,CAAC,WAAW,SAAS,eAAe;AAAA,MACpC,CAAC,WAAW,eAAe,cAAc;AAAA,IAC3C,CAAC;AAAA,EACH,KAAK;AAEP,QAAM,eACJA;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,eAAe;AAAA,MAChB,CAAC,cAAc;AAAA,MACf,CAAC,SAAS,eAAe;AAAA,MACzB,CAAC,SAAS,cAAc;AAAA,MACxB,CAAC,SAAS,mBAAmB;AAAA,MAC7B,CAAC,eAAe,eAAe;AAAA,MAC/B,CAAC,eAAe,mBAAmB;AAAA,MACnC,CAAC,eAAe,QAAQ;AAAA,MACxB,CAAC,WAAW,SAAS,eAAe;AAAA,MACpC,CAAC,WAAW,SAAS,mBAAmB;AAAA,MACxC,CAAC,WAAW,eAAe,eAAe;AAAA,IAC5C,CAAC;AAAA,EACH,KAAK;AAEP,QAAM,eACJA;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,UAAU;AAAA,MACX,CAAC,SAAS;AAAA,MACV,CAAC,oBAAoB;AAAA,MACrB,CAAC,kBAAkB;AAAA,MACnB,CAAC,gBAAgB;AAAA,MACjB,CAAC,SAAS,UAAU;AAAA,MACpB,CAAC,SAAS,SAAS;AAAA,MACnB,CAAC,SAAS,oBAAoB;AAAA,MAC9B,CAAC,SAAS,gBAAgB;AAAA,MAC1B,CAAC,eAAe,UAAU;AAAA,MAC1B,CAAC,eAAe,gBAAgB;AAAA,MAChC,CAAC,QAAQ,KAAK;AAAA,MACd,CAAC,QAAQ,WAAW;AAAA,MACpB,CAAC,WAAW,WAAW;AAAA,MACvB,CAAC,WAAW,SAAS,UAAU;AAAA,MAC/B,CAAC,WAAW,UAAU;AAAA,IACxB,CAAC;AAAA,EACH,KAAK;AAEP,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,QAAoB;AAC7C,QAAM,EAAE,aAAa,cAAc,aAAa,IAAI,aAAa,MAAM;AACvE,SAAO,cAAc,KAAK,eAAe,KAAK,iBAAiB;AACjE;AAEA,SAASC,WACP,QACA,QACA,OACA,OACgB;AAChB,QAAM,EAAE,UAAU,MAAM,IAAI,0BAA0B,MAAM;AAC5D,QAAM,WAAW,cAAc,QAAQ,OAAO,IAAI;AAClD,QAAM,EAAE,aAAa,cAAc,aAAa,IAAI,aAAa,MAAM;AACvE,QAAM,gBAAgB,gBAAgB,UAAU,OAAO,aAAa,YAAY;AAChF,QAAM,YAAY;AAAA,IAChB,eAAe,QAAQ;AAAA,MACrB,CAAC,WAAW;AAAA,MACZ,CAAC,WAAW;AAAA,MACZ,CAAC,YAAY;AAAA,MACb,CAAC,MAAM;AAAA,MACP,CAAC,YAAY;AAAA,IACf,CAAC;AAAA,EACH;AACA,QAAM,UACJD;AAAA,IACE,eAAe,QAAQ,CAAC,CAAC,SAAS,GAAG,CAAC,SAAS,SAAS,GAAG,CAAC,YAAY,SAAS,CAAC,CAAC;AAAA,EACrF,KAAK;AACP,QAAM,YACJA;AAAA,IACE,eAAe,QAAQ,CAAC,CAAC,WAAW,GAAG,CAAC,gBAAgB,GAAG,CAAC,YAAY,WAAW,CAAC,CAAC;AAAA,EACvF,KAAK;AACP,QAAM,UACJA,UAAS,eAAe,QAAQ,CAAC,CAAC,SAAS,GAAG,CAAC,aAAa,GAAG,CAAC,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK;AAC/F,QAAM,UAAU,gBAAgB,iBAAiB;AAEjD,SAAO;AAAA,IACL,IAAI,KAAK,GAAG,KAAK,IAAI,OAAO,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,SAAS,IAAI,OAAO,EAAE;AAAA,IAC5E;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YACE,iBAAiB,OAAO,aAAa,kBAAkB,OAAO,cAAc;AAAA,IAC9E,WACEA,UAAS,eAAe,QAAQ,CAAC,CAAC,YAAY,GAAG,CAAC,WAAW,GAAG,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,KACzF;AAAA,IACF,WAAW,eAAe,MAAM;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA,QACE,SAAS,eAAe,QAAQ,CAAC,CAAC,QAAQ,GAAG,CAAC,OAAO,GAAG,CAAC,QAAQ,GAAG,CAAC,SAAS,MAAM,CAAC,CAAC,CAAC,KACvF;AAAA,IACF,WAAW,eAAe,QAAQ,QAAQ;AAAA,IAC1C,UAAUE;AAAA,MACR,eAAe,QAAQ,CAAC,CAAC,WAAW,GAAG,CAAC,UAAU,GAAG,CAAC,SAAS,WAAW,CAAC,CAAC;AAAA,IAC9E;AAAA,IACA,cACEF;AAAA,MACE,eAAe,QAAQ,CAAC,CAAC,gBAAgB,GAAG,CAAC,cAAc,GAAG,CAAC,SAAS,gBAAgB,CAAC,CAAC;AAAA,IAC5F,KAAK;AAAA,IACP,UAAU,aAAa,QAAQ;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEO,SAAS,0BAA0B,MAAc;AACtD,SAAO,qBAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,IACT;AAAA,IACA,WAAW;AAAA,IACX,SAAS;AAAA,EACX,CAAC,EAAE,KAAK,CAAC,WAAW,kBAAkB,MAAM,CAAC;AAC/C;AAEO,SAAS,uBACd,SACA,OACiB;AACjB,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,WAAW,oBAAI,IAA2B;AAEhD,aAAW,UAAU,SAAS;AAC5B,UAAM,UAAU,qBAAqB,MAAM;AAE3C,YAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,UAAI,CAAC,kBAAkB,MAAM,GAAG;AAC9B;AAAA,MACF;AAEA,YAAM,WAAW,cAAc,QAAQ,OAAO,IAAI;AAClD,YAAM,YAAY;AAAA,QAChB,eAAe,QAAQ;AAAA,UACrB,CAAC,WAAW;AAAA,UACZ,CAAC,WAAW;AAAA,UACZ,CAAC,YAAY;AAAA,UACb,CAAC,MAAM;AAAA,UACP,CAAC,YAAY;AAAA,QACf,CAAC;AAAA,MACH;AACA,UAAI,UAAU,IAAI,KAAK,SAAS,EAAE,QAAQ,IAAI,QAAQ;AACpD;AAAA,MACF;AAEA,YAAM,SAAS,YAAY,QAAQ,UAAU,OAAO,OAAO,IAAI;AAC/D,YAAM,QAAQ,KAAK,GAAG,OAAO,IAAI,IAAI,MAAM,EAAE;AAC7C,YAAM,OAAOC,WAAU,QAAQ,QAAQ,OAAO,KAAK;AACnD,YAAM,WAAW,SAAS,IAAI,KAAK;AAEnC,UAAI,CAAC,UAAU;AACb,iBAAS,IAAI,OAAO;AAAA,UAClB,IAAI;AAAA,UACJ,YAAY,OAAO;AAAA,UACnB,YAAY,OAAO;AAAA,UACnB;AAAA,UACA;AAAA,UACA,aAAa,iBAAiB,MAAM;AAAA,UACpC,MAAM;AAAA,YACJ,YAAY,OAAO;AAAA,UACrB;AAAA,UACA,OAAO,CAAC,IAAI;AAAA,UACZ,cAAc,KAAK;AAAA,UACnB,aAAa,KAAK,cAAc,KAAK;AAAA,UACrC,iBAAiB,KAAK,eAAe,aAAa,KAAK,UAAU;AAAA,UACjE,kBAAkB,KAAK,eAAe,cAAc,KAAK,UAAU;AAAA,QACrE,CAAC;AACD;AAAA,MACF;AAEA,eAAS,MAAM,KAAK,IAAI;AACxB,eAAS,eAAe,QAAQ,SAAS,eAAe,KAAK,SAAS,QAAQ,CAAC,CAAC;AAChF,eAAS,eAAe,KAAK,cAAc,KAAK;AAChD,eAAS,mBAAmB,KAAK,eAAe,aAAa,KAAK,UAAU;AAC5E,eAAS,oBAAoB,KAAK,eAAe,cAAc,KAAK,UAAU;AAC9E,UAAI,YAAY,SAAS,WAAW;AAClC,iBAAS,YAAY;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,MAAM,UAC/C,KAAK,YAAY,MAAM,YAAY,KAAK;AAAA,EAC1C;AACF;;;AE1bA,SAAS,aAAAE,kBAAiB;AAC1B,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,gBAAgB;AAEzB,SAAS,cAAc;AACrB,SAAO,QAAQ,IAAI,QAAQ,QAAQ;AACrC;AAEO,SAAS,cAAc;AAC5B,QAAM,OAAO,YAAY;AACzB,SAAO,aAAa,WAChB;AAAA,IACE,MAAM,KAAK,MAAM,WAAW,uBAAuB,MAAM;AAAA,IACzD,QAAQ,KAAK,MAAM,WAAW,eAAe,MAAM;AAAA,IACnD,OAAO,KAAK,MAAM,WAAW,UAAU,MAAM;AAAA,EAC/C,IACA,aAAa,UACX;AAAA,IACE,MAAM,KAAK,QAAQ,IAAI,gBAAgB,KAAK,MAAM,WAAW,OAAO,GAAG,QAAQ,MAAM;AAAA,IACrF,QAAQ,KAAK,QAAQ,IAAI,WAAW,KAAK,MAAM,WAAW,SAAS,GAAG,QAAQ,QAAQ;AAAA,IACtF,OAAO,KAAK,QAAQ,IAAI,gBAAgB,KAAK,MAAM,WAAW,OAAO,GAAG,QAAQ,OAAO;AAAA,EACzF,IACA;AAAA,IACE,MAAM,KAAK,QAAQ,IAAI,iBAAiB,KAAK,MAAM,UAAU,OAAO,GAAG,MAAM;AAAA,IAC7E,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,MAAM,SAAS,GAAG,MAAM;AAAA,IACzE,OAAO,KAAK,QAAQ,IAAI,kBAAkB,KAAK,MAAM,QAAQ,GAAG,MAAM;AAAA,EACxE;AACR;AAWO,SAAS,mBAAmB;AACjC,SAAO,KAAK,YAAY,EAAE,MAAM,SAAS;AAC3C;AAEO,SAAS,oCAAoC;AAClD,SAAO,KAAK,YAAY,GAAG,aAAa,UAAU,KAAK,YAAY,SAAS;AAC9E;AAEO,SAAS,mCAAmC;AACjD,SAAO;AACT;AAEO,SAAS,kCAAkC;AAChD,SAAO,KAAK,YAAY,GAAG,WAAW,YAAY,MAAM,gBAAgB;AAC1E;AAEO,SAAS,iCAAiC;AAC/C,SAAO,KAAK,YAAY,GAAG,WAAW,QAAQ,qCAAqC;AACrF;;;ACzDA,SAAS,aAAa,YAAAC,iBAAgB;AACtC,SAAS,YAAY,QAAAC,OAAM,WAAAC,UAAS,WAAW;AAIxC,SAAS,WACd,MACA,MACA,SAC2B;AAC3B,MAAI;AACF,UAAM,QAAQF,UAAS,IAAI;AAC3B,QAAI,CAAC,MAAM,OAAO,GAAG;AACnB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,SAAS,MAAM;AAAA,IACjB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,mBACpB,SACA,SAIA;AACA,QAAM,UAAU,SAAS,MAAME,SAAQ,QAAQ,GAAG,IAAI,WAAW,OAAO,IAAI,MAAM,QAAQ,IAAI;AAC9F,QAAM,kBAAkB,SAAS,MAC7B,UACA,WAAW,OAAO,IAChB,QAAQ,MAAM,QAAQ,MAAM,IAC5B;AACN,QAAM,WAAW,gBAAgB,MAAM,GAAG,EAAE,OAAO,OAAO;AAC1D,QAAM,UAAU,2BAA2B,SAAS,QAAQ;AAE5D,SAAO,QAAQ;AAAA,IAAI,CAAC,UAClB,SAAS,cAAcA,SAAQ,QAAQ,aAAa,KAAK,IAAI;AAAA,EAC/D;AACF;AAEA,SAAS,2BAA2B,aAAqB,UAA8B;AACrF,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC,WAAW;AAAA,EACrB;AAEA,QAAM,CAAC,SAAS,GAAG,IAAI,IAAI;AAE3B,MAAI,YAAY,MAAM;AACpB,UAAMC,WAAU,2BAA2B,aAAa,IAAI;AAE5D,eAAW,SAAS,YAAY,WAAW,GAAG;AAC5C,UAAI,MAAM,YAAY,GAAG;AACvB,QAAAA,SAAQ,KAAK,GAAG,2BAA2BF,MAAK,aAAa,MAAM,IAAI,GAAG,QAAQ,CAAC;AAAA,MACrF;AAAA,IACF;AAEA,WAAOE;AAAA,EACT;AAEA,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAU,gBAAgB,OAAO;AAEvC,aAAW,SAAS,YAAY,WAAW,GAAG;AAC5C,QAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,GAAG;AAC7B;AAAA,IACF;AAEA,UAAM,WAAWF,MAAK,aAAa,MAAM,IAAI;AAC7C,QAAI,KAAK,WAAW,GAAG;AACrB,cAAQ,KAAK,QAAQ;AACrB;AAAA,IACF;AAEA,QAAI,MAAM,YAAY,GAAG;AACvB,cAAQ,KAAK,GAAG,2BAA2B,UAAU,IAAI,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,MAAc;AACjC,MAAI;AACF,WAAO,YAAY,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EAClD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,gBAAgB,SAAiB;AACxC,QAAM,UAAU,QAAQ,WAAW,sBAAsB,MAAM,EAAE,WAAW,KAAK,IAAI;AACrF,SAAO,IAAI,OAAO,IAAI,OAAO,GAAG;AAClC;;;AJ7FA,SAAS,4BAA4B;AACnC,SAAOG,MAAK,QAAQ,IAAI,QAAQC,SAAQ,GAAG,WAAW,QAAQ,YAAY;AAC5E;AAEA,SAAS,8BAA8B;AACrC,SAAOD,MAAK,QAAQ,IAAI,QAAQC,SAAQ,GAAG,WAAW,QAAQ,cAAc;AAC9E;AAEA,SAAS,+BAA+B;AACtC,SAAOD,MAAK,QAAQ,IAAI,QAAQC,SAAQ,GAAG,WAAW,YAAY,MAAM,GAAG;AAC7E;AAEA,SAAS,0BAA0B,MAAc;AAC/C,QAAM,YAAYC,UAAS,IAAI,EAAE,YAAY;AAC7C,MAAI,cAAc,iBAAiB;AACjC,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,SAAS,QAAQ,KAAK,UAAU,SAAS,OAAO;AACnE;AAEA,eAAe,4BAA4B,SAAiB;AAC1D,QAAM,UAAU,MAAM,mBAAmB,QAAQ;AAAA,IAC/C,KAAK;AAAA,IACL,aAAa;AAAA,EACf,CAAC;AAED,SAAO,QAAQ,OAAO,CAAC,UAAU,0BAA0B,KAAK,CAAC;AACnE;AAEA,eAAe,yBAAyB;AACtC,QAAM,CAAC,cAAc,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvD,mBAAmB,0BAA0B,CAAC;AAAA,IAC9C,mBAAmB,4BAA4B,CAAC;AAAA,EAClD,CAAC;AAED,MAAI,aAAa,KAAK,CAAC,SAAS,0BAA0B,IAAI,CAAC,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,KAAK,CAAC,SAAS,0BAA0B,IAAI,CAAC,GAAG;AAClE,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,GAAG,cAAc,GAAG,cAAc;AAC5C;AAEA,eAAsB,oBAAoB,SAAsD;AAC9F,QAAM,kBAAwC,CAAC;AAE/C,MAAI,QAAQ,SAAS;AACnB,UAAMC,YAAW,WAAW,QAAQ,SAAS,WAAW,QAAQ;AAChE,QAAIA,WAAU;AACZ,sBAAgB,KAAKA,SAAQ;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa;AACvB,UAAM,UAAU,MAAM,4BAA4B,QAAQ,WAAW;AAErE,eAAW,SAAS,SAAS;AAC3B,YAAMA,YAAW,WAAW,OAAO,YAAY,QAAQ;AACvD,UAAIA,WAAU;AACZ,wBAAgB,KAAKA,SAAQ;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,WAAO,gBAAgB,KAAK,CAAC,MAAM,UAAU,MAAM,UAAU,KAAK,OAAO;AAAA,EAC3E;AAEA,QAAM,CAAC,gBAAgB,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,IACzD,uBAAuB;AAAA,IACvB,mBAAmB,6BAA6B,CAAC;AAAA,EACnD,CAAC;AAED,QAAM,WAAW;AAAA,IACf,GAAG,eAAe,IAAI,CAAC,SAAS,WAAW,MAAM,WAAW,QAAQ,CAAC,EAAE,OAAO,OAAO;AAAA,IACrF,GAAG,eACA,OAAO,CAAC,SAAS,0BAA0B,IAAI,CAAC,EAChD,IAAI,CAAC,SAAS,WAAW,MAAM,YAAY,QAAQ,CAAC,EACpD,OAAO,OAAO;AAAA,EACnB;AAEA,SAAO,SAAS,KAAK,CAAC,MAAM,UAAU,MAAM,UAAU,KAAK,OAAO;AACpE;;;AKvFA,eAAsB,sBAAsB,SAAsD;AAChG,QAAM,kBAAwC,CAAC;AAE/C,MAAI,QAAQ,SAAS;AACnB,UAAMC,YAAW,WAAW,QAAQ,SAAS,WAAW,UAAU;AAClE,QAAIA,WAAU;AACZ,sBAAgB,KAAKA,SAAQ;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa;AACvB,UAAM,UAAU,MAAM,mBAAmB,cAAc;AAAA,MACrD,KAAK,QAAQ;AAAA,MACb,aAAa,QAAQ;AAAA,IACvB,CAAC;AAED,eAAW,SAAS,SAAS;AAC3B,YAAMA,YAAW,WAAW,OAAO,YAAY,UAAU;AACzD,UAAIA,WAAU;AACZ,wBAAgB,KAAKA,SAAQ;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,WAAO,gBAAgB,KAAK,CAAC,MAAM,UAAU,MAAM,UAAU,KAAK,OAAO;AAAA,EAC3E;AAEA,QAAM,CAAC,gBAAgB,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,IACzD,mBAAmB,iCAAiC,CAAC;AAAA,IACrD,mBAAmB,kCAAkC,CAAC;AAAA,EACxD,CAAC;AAED,QAAM,WAAW;AAAA,IACf,GAAG,eAAe,IAAI,CAAC,SAAS,WAAW,MAAM,WAAW,UAAU,CAAC,EAAE,OAAO,OAAO;AAAA,IACvF,GAAG,eAAe,IAAI,CAAC,SAAS,WAAW,MAAM,YAAY,UAAU,CAAC,EAAE,OAAO,OAAO;AAAA,EAC1F;AAEA,SAAO,SAAS,KAAK,CAAC,MAAM,UAAU,MAAM,UAAU,KAAK,OAAO;AACpE;;;AC9CA,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,YAAAC,iBAAgB;AAUzB,SAASC,gBAAe,MAAc;AACpC,QAAM,UAAUC,cAAa,MAAM,MAAM;AACzC,QAAM,QAAQ,QACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAEjB,QAAM,UAAwB,CAAC;AAE/B,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,cAAQ,KAAK,MAAM;AAAA,IACrB,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,SAAO;AACT;AAEA,SAASC,eAAc,QAAoB;AACzC,SACE;AAAA,IACE,eAAe,QAAQ,CAAC,CAAC,UAAU,GAAG,CAAC,WAAW,UAAU,GAAG,CAAC,SAAS,UAAU,CAAC,CAAC;AAAA,EACvF,KAAK;AAET;AAEA,SAAS,WAAW,QAAoB;AACtC,SACE,SAAS,eAAe,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,WAAW,OAAO,GAAG,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,KACtF;AAEJ;AAEA,SAASC,eAAc,QAAoB,YAAoB;AAC7D,SACE;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,UAAU;AAAA,MACX,CAAC,WAAW,UAAU;AAAA,MACtB,CAAC,YAAY,UAAU;AAAA,MACvB,CAAC,SAAS,MAAM;AAAA,MAChB,CAAC,SAAS;AAAA,MACV,CAAC,WAAW;AAAA,IACd,CAAC;AAAA,EACH,KAAKC,UAAS,YAAY,QAAQ;AAEtC;AAEA,SAASC,kBAAiB,QAAoB;AAC5C,SACE,SAAS,eAAe,QAAQ,CAAC,CAAC,aAAa,GAAG,CAAC,KAAK,GAAG,CAAC,YAAY,aAAa,CAAC,CAAC,CAAC,KACxF;AAEJ;AAEA,SAASC,aAAY,QAAoB,UAAkB,OAAe,YAAoB;AAC5F,SACE;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,QAAQ;AAAA,MACT,CAAC,OAAO;AAAA,MACR,CAAC,UAAU;AAAA,MACX,CAAC,SAAS;AAAA,MACV,CAAC,WAAW;AAAA,MACZ,CAAC,WAAW;AAAA,IACd,CAAC;AAAA,EACH,KAAK,GAAG,UAAU,IAAI,QAAQ,IAAI,KAAK;AAE3C;AAEA,SAASC,gBAAe,QAAoB,UAAkB;AAC5D,SACE,SAAS,eAAe,QAAQ,CAAC,CAAC,YAAY,GAAG,CAAC,WAAW,GAAG,CAAC,YAAY,WAAW,CAAC,CAAC,CAAC,KAC3F,SAAS,YAAY;AAEzB;AAEA,SAASC,cAAa,QAAoB;AACxC,QAAM,cACJC;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,cAAc;AAAA,MACf,CAAC,aAAa;AAAA,MACd,CAAC,SAAS,cAAc;AAAA,MACxB,CAAC,SAAS,aAAa;AAAA,MACvB,CAAC,WAAW,SAAS,cAAc;AAAA,MACnC,CAAC,WAAW,SAAS,aAAa;AAAA,MAClC,CAAC,SAAS,eAAe;AAAA,MACzB,CAAC,WAAW,SAAS,eAAe;AAAA,IACtC,CAAC;AAAA,EACH,KAAK;AAEP,QAAM,eACJA;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,eAAe;AAAA,MAChB,CAAC,cAAc;AAAA,MACf,CAAC,SAAS,eAAe;AAAA,MACzB,CAAC,SAAS,cAAc;AAAA,MACxB,CAAC,WAAW,SAAS,eAAe;AAAA,MACpC,CAAC,WAAW,SAAS,cAAc;AAAA,MACnC,CAAC,SAAS,mBAAmB;AAAA,MAC7B,CAAC,WAAW,SAAS,mBAAmB;AAAA,IAC1C,CAAC;AAAA,EACH,KAAK;AAEP,QAAM,eACJA;AAAA,IACE,eAAe,QAAQ;AAAA,MACrB,CAAC,UAAU;AAAA,MACX,CAAC,SAAS;AAAA,MACV,CAAC,SAAS,UAAU;AAAA,MACpB,CAAC,SAAS,SAAS;AAAA,MACnB,CAAC,SAAS,QAAQ,OAAO;AAAA,MACzB,CAAC,WAAW,SAAS,QAAQ,OAAO;AAAA,MACpC,CAAC,WAAW,SAAS,UAAU;AAAA,MAC/B,CAAC,WAAW,WAAW;AAAA,IACzB,CAAC;AAAA,EACH,KAAK;AAEP,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAASC,WACP,QACA,QACA,OACA,OACgB;AAChB,QAAM,WAAWR,eAAc,MAAM;AACrC,QAAM,QAAQ,WAAW,MAAM;AAC/B,QAAM,WAAWC,eAAc,QAAQ,OAAO,IAAI;AAClD,QAAM,EAAE,aAAa,cAAc,aAAa,IAAIK,cAAa,MAAM;AACvE,QAAM,gBAAgB,gBAAgB,UAAU,OAAO,aAAa,YAAY;AAChF,QAAM,YAAY;AAAA,IAChB,eAAe,QAAQ,CAAC,CAAC,WAAW,GAAG,CAAC,WAAW,GAAG,CAAC,YAAY,CAAC,CAAC;AAAA,EACvE;AACA,QAAM,UACJC;AAAA,IACE,eAAe,QAAQ,CAAC,CAAC,SAAS,GAAG,CAAC,SAAS,SAAS,GAAG,CAAC,YAAY,SAAS,CAAC,CAAC;AAAA,EACrF,KAAK;AACP,QAAM,YACJA;AAAA,IACE,eAAe,QAAQ,CAAC,CAAC,WAAW,GAAG,CAAC,gBAAgB,GAAG,CAAC,YAAY,WAAW,CAAC,CAAC;AAAA,EACvF,KAAK;AACP,QAAM,UACJA,UAAS,eAAe,QAAQ,CAAC,CAAC,SAAS,GAAG,CAAC,aAAa,GAAG,CAAC,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK;AAC/F,QAAM,UAAU,gBAAgB,iBAAiB;AAEjD,SAAO;AAAA,IACL,IAAI,KAAK,GAAG,KAAK,IAAI,OAAO,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,SAAS,IAAI,OAAO,EAAE;AAAA,IAC5E;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,iBAAiB,OAAO,aAAa;AAAA,IACjD,WACEA,UAAS,eAAe,QAAQ,CAAC,CAAC,YAAY,GAAG,CAAC,WAAW,GAAG,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,KACzF;AAAA,IACF,WACEA,UAAS,eAAe,QAAQ,CAAC,CAAC,YAAY,GAAG,CAAC,WAAW,GAAG,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,KACzF;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA,QACE,SAAS,eAAe,QAAQ,CAAC,CAAC,QAAQ,GAAG,CAAC,OAAO,GAAG,CAAC,QAAQ,GAAG,CAAC,SAAS,MAAM,CAAC,CAAC,CAAC,KACvF;AAAA,IACF,WAAWF,gBAAe,QAAQ,QAAQ;AAAA,IAC1C,UAAUI;AAAA,MACR,eAAe,QAAQ,CAAC,CAAC,WAAW,GAAG,CAAC,UAAU,GAAG,CAAC,SAAS,WAAW,CAAC,CAAC;AAAA,IAC9E;AAAA,IACA,cACEF;AAAA,MACE,eAAe,QAAQ,CAAC,CAAC,gBAAgB,GAAG,CAAC,cAAc,GAAG,CAAC,SAAS,gBAAgB,CAAC,CAAC;AAAA,IAC5F,KAAK;AAAA,IACP,UAAU,aAAa,QAAQ,CAAC,SAAS,QAAQ,aAAa,SAAS,CAAC;AAAA,EAC1E;AACF;AAEA,SAASG,mBAAkB,QAAoB;AAC7C,QAAM,WACJJ,cAAa,MAAM,EAAE,cAAc,KACnCA,cAAa,MAAM,EAAE,eAAe,KACpCA,cAAa,MAAM,EAAE,iBAAiB;AAExC,SAAO;AACT;AAEO,SAAS,yBACd,SACA,OACiB;AACjB,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,WAAW,oBAAI,IAA2B;AAEhD,aAAW,UAAU,SAAS;AAC5B,UAAM,UAAUR,gBAAe,OAAO,IAAI;AAE1C,YAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,UAAI,CAACY,mBAAkB,MAAM,GAAG;AAC9B;AAAA,MACF;AAEA,YAAM,WAAWT,eAAc,QAAQ,OAAO,IAAI;AAClD,YAAM,YAAY;AAAA,QAChB,eAAe,QAAQ,CAAC,CAAC,WAAW,GAAG,CAAC,WAAW,GAAG,CAAC,YAAY,CAAC,CAAC;AAAA,MACvE;AACA,UAAI,UAAU,IAAI,KAAK,SAAS,EAAE,QAAQ,IAAI,QAAQ;AACpD;AAAA,MACF;AAEA,YAAM,SAASG,aAAY,QAAQ,UAAU,OAAO,OAAO,IAAI;AAC/D,YAAM,QAAQ,KAAK,GAAG,OAAO,IAAI,IAAI,MAAM,EAAE;AAC7C,YAAM,OAAOI,WAAU,QAAQ,QAAQ,OAAO,KAAK;AACnD,YAAM,WAAW,SAAS,IAAI,KAAK;AAEnC,UAAI,CAAC,UAAU;AACb,iBAAS,IAAI,OAAO;AAAA,UAClB,IAAI;AAAA,UACJ,YAAY,OAAO;AAAA,UACnB,YAAY,OAAO;AAAA,UACnB;AAAA,UACA;AAAA,UACA,aAAaL,kBAAiB,MAAM;AAAA,UACpC,MAAM;AAAA,YACJ,YAAY,OAAO;AAAA,UACrB;AAAA,UACA,OAAO,CAAC,IAAI;AAAA,UACZ,cAAc,KAAK;AAAA,UACnB,aAAa,KAAK,cAAc,KAAK;AAAA,UACrC,iBAAiB,KAAK,eAAe,aAAa,KAAK,UAAU;AAAA,UACjE,kBAAkB,KAAK,eAAe,cAAc,KAAK,UAAU;AAAA,QACrE,CAAC;AACD;AAAA,MACF;AAEA,eAAS,MAAM,KAAK,IAAI;AACxB,eAAS,eAAe,QAAQ,SAAS,eAAe,KAAK,SAAS,QAAQ,CAAC,CAAC;AAChF,eAAS,eAAe,KAAK,cAAc,KAAK;AAChD,eAAS,mBAAmB,KAAK,eAAe,aAAa,KAAK,UAAU;AAC5E,eAAS,oBAAoB,KAAK,eAAe,cAAc,KAAK,UAAU;AAAA,IAChF,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU;AACzD,WAAO,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ;AAAA,EAChF,CAAC;AACH;;;AP7OA,IAAM,mBAAyD;AAAA,EAC7D,UAAU;AAAA,IACR,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,CAAC,kBACZ,4CAA4C,aAAa;AAAA,IAC3D,cAAc,OAAO;AAAA,MACnB,SAAS;AAAA,MACT,gBAAgB,iCAAiC;AAAA,MACjD,iBAAiB,kCAAkC;AAAA,IACrD;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,aACE;AAAA,IACF,aAAa;AAAA,IACb,aAAa,CAAC,kBACZ,0CAA0C,aAAa;AAAA,IACzD,cAAc,OAAO;AAAA,MACnB,SAAS;AAAA,MACT,gBAAgB,+BAA+B;AAAA,MAC/C,iBAAiB,gCAAgC;AAAA,IACnD;AAAA,EACF;AACF;AAQO,SAAS,kBAAkB,SAAuB;AACvD,SAAO,iBAAiB,OAAO;AACjC;AAEA,SAAS,sBAAsB,SAAuB;AACpD,SAAO,QAAQ,QAAQ,WAAW,QAAQ,WAAW;AACvD;AAEA,SAAS,8BAA8B,SAA4C;AACjF,QAAM,QAAQ,CAAC,QAAQ,SAAS,QAAQ,WAAW,EAChD,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,IAAI,CAAC,SAAS,KAAK,QAAQ,OAAO,GAAG,EAAE,YAAY,CAAC;AAEvD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,oBAAI,IAAkB;AAEpC,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAOQ,UAAS,IAAI,EAAE,YAAY;AAExC,QACE,KAAK,SAAS,aAAa,KAC3B,KAAK,SAAS,YAAY,KAC1B,KAAK,SAAS,eAAe,KAC7B,KAAK,SAAS,UAAU,GACxB;AACA,YAAM,IAAI,UAAU;AAAA,IACtB;AAEA,QACE,KAAK,SAAS,WAAW,KACzB,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,QAAQ,KACtB,KAAK,WAAW,WAAW,GAC3B;AACA,YAAM,IAAI,QAAQ;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC,IAAI;AACnD;AAEA,eAAe,sBACb,SACA,SAC2B;AAC3B,QAAM,UAAU,MAAM,QAAQ,cAAc,OAAO;AACnD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,QAAQ,SAAS;AAAA,EAC3B;AACF;AAEA,SAAS,yBAAyB,SAAyB,SAA+B;AACxF,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,SAAS,GAAG;AACvD,UAAM,KAAK,QAAQ,WAAW;AAAA,EAChC;AACA,MAAI,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,UAAU,GAAG;AACxD,UAAM,KAAK,QAAQ,WAAW;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,0BACP,SACA,SACc;AACd,SAAO;AAAA,IACL,UAAU,QAAQ,SAAS;AAAA,IAC3B,MAAM,QAAQ,SAAS,IAAI,aAAa;AAAA,IACxC,SAAS,QAAQ,SAAS,IAAI,QAAQ,UAAU;AAAA,IAChD;AAAA,IACA,UAAU,CAAC,QAAQ,aAAa,CAAC;AAAA,IACjC,OAAO,yBAAyB,SAAS,OAAO;AAAA,EAClD;AACF;AAEA,SAAS,4BAA4B,YAA8C;AACjF,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,WAAW,QAAQ,CAAC,cAAc,UAAU,OAAO;AAAA,IAC5D,UAAU,OAAO,OAAO,gBAAgB,EAAE,IAAI,CAAC,YAAY,QAAQ,aAAa,CAAC;AAAA,IACjF,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,+BAA+B,YAA8C;AACpF,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,WAAW,QAAQ,CAAC,cAAc,UAAU,OAAO;AAAA,IAC5D,UAAU,OAAO,OAAO,gBAAgB,EAAE,IAAI,CAAC,YAAY,QAAQ,aAAa,CAAC;AAAA,IACjF,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,yBACP,SACA,eACQ;AACR,QAAM,gBAAgB,QAAQ,iBAAiB;AAE/C,MAAI,eAAe;AACjB,WAAO,kBAAkB,aAAa,EAAE,YAAY,aAAa;AAAA,EACnE;AAEA,SAAO,2DAA2D,aAAa;AACjF;AAEA,SAAS,gCACP,YACA,eACc;AACd,MAAI,eAAe;AACjB,UAAM,UAAU,kBAAkB,aAAa;AAC/C,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC;AAAA,MACV,UAAU,CAAC,QAAQ,aAAa,CAAC;AAAA,MACjC,OAAO;AAAA,QACL,MAAM,QAAQ,WAAW;AAAA,QACzB,uEAAuE,QAAQ,OAAO;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,WAAW,QAAQ,CAAC,cAAc,UAAU,OAAO;AAAA,IAC5D,UAAU,OAAO,OAAO,gBAAgB,EAAE,IAAI,CAAC,YAAY,QAAQ,aAAa,CAAC;AAAA,IACjF,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,SAAuB;AAC3D,SAAO,kBAAkB,OAAO,EAAE;AACpC;AAEA,eAAsB,yBAAyB,SAAuB;AACpE,SAAO,QAAQ;AAAA,IACZ,OAAO,OAAO,gBAAgB,EAAuB;AAAA,MAAI,CAAC,YACzD,sBAAsB,SAAS,OAAO;AAAA,IACxC;AAAA,EACF;AACF;AAEA,eAAsB,yBAAyB,SAAuB;AACpE,QAAM,mBAAmB,QAAQ,WAAW;AAE5C,MAAI,qBAAqB,QAAQ;AAC/B,UAAM,UAAU,kBAAkB,gBAAgB;AAClD,UAAM,UAAU,MAAM,QAAQ,cAAc,OAAO;AACnD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,yBAAyB,OAAO;AACzD,QAAM,mBAAmB,WAAW,OAAO,CAAC,cAAc,UAAU,MAAM;AAE1E,MAAI,sBAAsB,OAAO,GAAG;AAClC,UAAM,gBAAgB,8BAA8B,OAAO;AAC3D,QAAI,eAAe;AACjB,YAAM,kBAAkB,iBAAiB;AAAA,QACvC,CAAC,cAAc,UAAU,QAAQ,YAAY;AAAA,MAC/C;AACA,UAAI,iBAAiB;AACnB,eAAO;AAAA,UACL,SAAS,gBAAgB;AAAA,UACzB,SAAS,gBAAgB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,iBAAiB,WAAW,GAAG;AACjC,YAAM,IAAI,MAAM,yBAAyB,SAAS,aAAa,CAAC;AAAA,IAClE;AAEA,QAAI,iBAAiB,WAAW,GAAG;AACjC,aAAO;AAAA,QACL,SAAS,iBAAiB,CAAC,EAAE;AAAA,QAC7B,SAAS,iBAAiB,CAAC,EAAE;AAAA,MAC/B;AAAA,IACF;AAEA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iBAAiB,WAAW,GAAG;AACjC,UAAM,IAAI;AAAA,MACR,2DAA2D,QAAQ,iBAAiB,MAAM;AAAA,IAC5F;AAAA,EACF;AAEA,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,iBAAiB,CAAC,EAAE;AAAA,IAC7B,SAAS,iBAAiB,CAAC,EAAE;AAAA,EAC/B;AACF;AAEA,eAAsB,mBAAmB,SAA8C;AACrF,QAAM,mBAAmB,QAAQ,WAAW;AAE5C,MAAI,qBAAqB,QAAQ;AAC/B,YAAQ,aAAa,kBAAkB,sBAAsB,gBAAgB,CAAC,cAAc;AAC5F,UAAM,UAAU,kBAAkB,gBAAgB;AAClD,UAAM,UAAU,MAAM,QAAQ,cAAc,OAAO;AACnD,YAAQ;AAAA,MACN,QAAQ,SAAS,IACb,YAAY,QAAQ,MAAM,qBAAqB,QAAQ,WAAW,IAAI,KAAK,GAAG,MAC9E,YAAY,QAAQ,WAAW;AAAA,IACrC;AACA,WAAO,0BAA0B,SAAS,OAAO;AAAA,EACnD;AAEA,UAAQ,aAAa,oCAAoC;AACzD,QAAM,aAAa,MAAM,yBAAyB,OAAO;AACzD,QAAM,mBAAmB,WAAW,OAAO,CAAC,cAAc,UAAU,MAAM;AAC1E,QAAM,gBAAgB,WAAW,OAAO,CAAC,KAAK,cAAc,MAAM,UAAU,QAAQ,QAAQ,CAAC;AAC7F,UAAQ;AAAA,IACN,gBAAgB,IACZ,YAAY,aAAa,qBAAqB,kBAAkB,IAAI,KAAK,GAAG,gCAC5E;AAAA,EACN;AAEA,MAAI,sBAAsB,OAAO,GAAG;AAClC,UAAM,gBAAgB,8BAA8B,OAAO;AAC3D,QAAI,eAAe;AACjB,YAAM,kBAAkB,iBAAiB;AAAA,QACvC,CAAC,cAAc,UAAU,QAAQ,YAAY;AAAA,MAC/C;AACA,UAAI,iBAAiB;AACnB,eAAO,0BAA0B,gBAAgB,SAAS,gBAAgB,OAAO;AAAA,MACnF;AAAA,IACF;AAEA,QAAI,iBAAiB,WAAW,GAAG;AACjC,aAAO,gCAAgC,YAAY,aAAa;AAAA,IAClE;AAEA,QAAI,iBAAiB,WAAW,GAAG;AACjC,aAAO,0BAA0B,iBAAiB,CAAC,EAAE,SAAS,iBAAiB,CAAC,EAAE,OAAO;AAAA,IAC3F;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,WAAW,QAAQ,CAAC,cAAc,UAAU,OAAO;AAAA,MAC5D,UAAU,OAAO,OAAO,gBAAgB,EAAE,IAAI,CAAC,YAAY,QAAQ,aAAa,CAAC;AAAA,MACjF,OAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iBAAiB,WAAW,GAAG;AACjC,WAAO,4BAA4B,UAAU;AAAA,EAC/C;AAEA,MAAI,iBAAiB,SAAS,GAAG;AAC/B,WAAO,+BAA+B,gBAAgB;AAAA,EACxD;AAEA,SAAO,0BAA0B,iBAAiB,CAAC,EAAE,SAAS,iBAAiB,CAAC,EAAE,OAAO;AAC3F;;;AQhVA,eAAsB,qBAAqB,SAAuB;AAChE,SAAO,sBAAsB,OAAO;AACtC;AAEA,SAAS,uBAAuB,SAAuB;AACrD,MAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,sBACP,SACA,QACA,SACA;AACA,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ;AAC/B;AAAA,EACF;AAEA,UAAQ,aAAa,4CAA4C;AACjE,QAAM,WAAW,iCAAiC;AAAA,IAChD;AAAA,IACA,eAAe,QAAQ;AAAA,IACvB,gBAAgB,QAAQ;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,UAAU;AACb,YAAQ,QAAQ;AAAA,MACd,GAAG,QAAQ;AAAA,MACX;AAAA,IACF;AACA;AAAA,EACF;AAEA,UAAQ,aAAa,qBAAqB,SAAS,QAAQ;AAE3D,MAAI,yBAAyB,QAAQ,iBAAiB,SAAS,eAAe,GAAG;AAC/E,YAAQ,QAAQ;AAAA,MACd,GAAG,QAAQ;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBACP,SACA,MACA,QACA,YACA;AACA,MAAI,CAAC,QAAQ;AACX,iBAAa,gDAAgD;AAC7D;AAAA,EACF;AAEA,eAAa,gCAAgC,MAAM,KAAK;AACxD;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACA,eAAa,wBAAwB;AACvC;AAEA,SAAS,yBACP,SACA,UACA;AACA,MAAI,CAAC,WAAW,CAAC,UAAU;AACzB,WAAO;AAAA,EACT;AAEA,UACG,SAAS,mBAAmB,QAAQ,UAAU,mBAAmB,OACjE,SAAS,qBAAqB,QAAQ,UAAU,qBAAqB,OACrE,SAAS,oBAAoB,QAAQ,UAAU,oBAAoB,OACnE,SAAS,sBAAsB,QAAQ,UAAU,sBAAsB;AAE5E;AAEA,eAAe,qBACb,SACA,SACA,iBACA;AACA,QAAM,UAAU,kBAAkB,OAAO;AACzC,UAAQ,aAAa,gBAAgB,QAAQ,WAAW,kBAAkB;AAC1E,yBAAuB,OAAO;AAE9B,QAAM,UAAU,mBAAoB,MAAM,QAAQ,cAAc,OAAO;AACvE,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,aAAa,MAAM,QAAQ,WAAW,8BAA8B;AAC5E,UAAM,IAAI,MAAM,QAAQ,YAAY,QAAQ,iBAAiB,MAAM,CAAC;AAAA,EACtE;AACA,UAAQ,aAAa,YAAY,QAAQ,MAAM,eAAe,QAAQ,WAAW,IAAI,KAAK,GAAG,GAAG;AAEhG,UAAQ,aAAa,eAAe,QAAQ,WAAW,kBAAkB;AACzE,QAAM,OAAO,QAAQ,iBAAiB,SAAS,QAAQ,KAAK;AAC5D,UAAQ,aAAa,cAAc,KAAK,MAAM,OAAO,KAAK,WAAW,IAAI,KAAK,GAAG,GAAG;AACpF,UAAQ,aAAa,yCAAyC;AAC9D,QAAM,EAAE,UAAU,kBAAkB,IAAI,cAAc,IAAI;AAC1D,QAAM,SAAS,QAAQ,OAAO,SAAa,QAAQ,UAAU,iBAAiB;AAC9E,UAAQ,aAAa,2BAA2B;AAChD,QAAM,UAAU,kBAAkB;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AAAA,IACf;AAAA,IACA,uBAAuB,QAAQ;AAAA,EACjC,CAAC;AAED,wBAAsB,SAAS,QAAQ,OAAO;AAC9C,uBAAqB,SAAS,MAAM,QAAQ,QAAQ,UAAU;AAE9D,SAAO;AACT;AAEA,eAAsB,kBAAkB,SAAuB;AAC7D,QAAM,UAAU,QAAQ,WAAW;AAEnC,MAAI,YAAY,QAAQ;AACtB,WAAO,qBAAqB,SAAS,OAAO;AAAA,EAC9C;AAEA,QAAM,WAAW,MAAM,yBAAyB,OAAO;AACvD,SAAO,qBAAqB,SAAS,QAAQ,SAAS,SAAS,SAAS,OAAO;AACjF;AAEA,eAAsB,oBAAoB,SAAuB;AAC/D,UAAQ,aAAa,6BAA6B;AAClD,yBAAuB,OAAO;AAE9B,MAAI,CAAC,QAAQ,gBAAgB;AAC3B,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AAEA,QAAM,SAAS,mBAAmB,QAAQ,cAAc;AACxD,UAAQ,aAAa,4BAA4B,OAAO,OAAO,IAAI,EAAE;AACrE,UAAQ,aAAa,kCAAkC;AACvD,QAAM,aAAa,wBAAwB;AAAA,IACzC,QAAQ,OAAO;AAAA,IACf,MAAM,OAAO;AAAA,IACb,qBAAqB,OAAO;AAAA,IAC5B,OAAO,QAAQ;AAAA,EACjB,CAAC;AACD,UAAQ;AAAA,IACN,cAAc,WAAW,KAAK,MAAM,aAAa,WAAW,KAAK,WAAW,IAAI,KAAK,GAAG;AAAA,EAC1F;AACA,UAAQ,aAAa,uCAAuC;AAC5D,QAAM,EAAE,UAAU,kBAAkB,IAAI,yBAAyB,WAAW,IAAI;AAChF,QAAM,SAAS,QAAQ,OAAO,SAAa,QAAQ,UAAU,iBAAiB;AAC9E,UAAQ,aAAa,2BAA2B;AAChD,QAAM,UAAU,kBAAkB;AAAA,IAChC,SAAS;AAAA,IACT,MAAM,WAAW;AAAA,IACjB;AAAA,IACA;AAAA,IACA,SAAS,CAAC,OAAO,MAAM;AAAA,IACvB,OAAO,QAAQ;AAAA,IACf;AAAA,IACA,uBAAuB,QAAQ;AAAA,EACjC,CAAC;AAED,UAAQ,kBAAkB,WAAW;AACrC,UAAQ,cAAc,WAAW;AACjC,UAAQ,QAAQ;AAAA,IACd;AAAA,IACA;AAAA,IACA,OAAO,sBACH,yHACA;AAAA,EACN;AAEA,MAAI,OAAO,KAAK,SAAS,KAAK,WAAW,KAAK,WAAW,KAAK,QAAQ,OAAO;AAC3E,YAAQ,QAAQ;AAAA,MACd,GAAG,QAAQ;AAAA,MACX,oDAAoD,QAAQ,KAAK;AAAA,IACnE;AAAA,EACF;AAEA,MAAI,WAAW,gBAAgB,oBAAoB,GAAG;AACpD,UAAM,UAAU,WAAW,gBAAgB,kBACxC,IAAI,CAAC,UAAU,MAAM,GAAG,EACxB,KAAK,IAAI;AACZ,YAAQ,QAAQ;AAAA,MACd,GAAG,QAAQ;AAAA,MACX,gEAAgE,WAAW,iBAAiB;AAAA,IAC9F;AAAA,EACF;AAEA,wBAAsB,SAAS,QAAQ,OAAO;AAC9C,uBAAqB,SAAS,WAAW,MAAM,QAAQ,QAAQ,UAAU;AAEzE,SAAO;AACT;;;ACxOA,SAAS,UAAU,OAAe;AAChC,SAAO,IAAI,KAAK,aAAa,SAAS;AAAA,IACpC,OAAO;AAAA,IACP,UAAU;AAAA,IACV,uBAAuB,SAAS,IAAI,IAAI;AAAA,IACxC,uBAAuB;AAAA,EACzB,CAAC,EAAE,OAAO,KAAK;AACjB;AAEA,SAAS,cAAc,OAAe;AACpC,SAAO,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACpC;AAEA,SAAS,mBAAmB,OAAe;AACzC,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,SAAS,IAAI,MAAM;AAChC,SAAO,GAAG,IAAI,GAAG,OAAO,QAAQ,CAAC,CAAC;AACpC;AAEA,SAAS,YAAY,OAAe;AAClC,SAAO,IAAI,KAAK,aAAa,OAAO,EAAE,OAAO,KAAK;AACpD;AAEA,SAAS,eAAe,OAAe;AACrC,QAAM,OAAO,QAAQ,IAAI,MAAM;AAC/B,SAAO,GAAG,IAAI,GAAG,UAAU,KAAK,CAAC;AACnC;AAEA,SAAS,qBAAqB,SAAuB;AACnD,SAAO,QAAQ,YAAY,KAAK,CAAC,WAAW,OAAO,SAAS,kBAAkB;AAChF;AAEA,SAAS,QAAQ,MAAwB,QAAQ,GAAG;AAClD,SAAO,KAAK,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,QAAQ;AACvC,WAAO,KAAK,IAAI,GAAG,KAAK,UAAU,IAAI,QAAQ,CAAC,KAAK,cAAc,IAAI,aAAa,CAAC;AAAA,EACtF,CAAC;AACH;AAEA,SAAS,mBAAmB,MAA+B,YAAoB,QAAiB;AAC9F,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,CAAC,KAAK,UAAU,EAAE;AAAA,EAC3B;AAEA,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,UAAM,aAAa,GAAG,IAAI,YAAY,WAAW,IAAI,iBAAiB,IAAI,KAAK,GAAG;AAClF,UAAM,SAAS,SAAS,IAAI,MAAM,KAAK;AACvC,WAAO,KAAK,IAAI,KAAK,KAAK,UAAU,IAAI,QAAQ,CAAC,WAAW,UAAU,GAAG,MAAM;AAAA,EACjF,CAAC;AACH;AAEA,SAAS,oBAAoB,SAAuB;AAClD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAG,mBAAmB,QAAQ,aAAa,sCAAsC;AAAA,IACjF;AAAA,IACA,GAAG;AAAA,MACD,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,SAAuB,gBAAyC;AAClF,SAAO,QAAQ,SACZ,OAAO,CAAC,YAAY,QAAQ,mBAAmB,cAAc,EAC7D,KAAK,CAAC,MAAM,UAAU,MAAM,gBAAgB,KAAK,aAAa,EAAE,CAAC;AACtE;AAEA,SAAS,kBAAkB,UAAqB,YAAoB;AAClE,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC,KAAK,UAAU,EAAE;AAAA,EAC3B;AAEA,SAAO,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY;AAC3C,WAAO,KAAK,QAAQ,KAAK,KAAK,UAAU,QAAQ,aAAa,CAAC,KAAK,QAAQ,UAAU;AAAA,EACvF,CAAC;AACH;AAEA,SAAS,qBAAqB,OAAe,gBAAqC;AAChF,MAAI,CAAC,gBAAgB;AACnB,WAAO,CAAC,GAAG,KAAK,IAAI,QAAQ;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL;AAAA,IACA,KAAK,eAAe,KAAK,KAAK,eAAe,UAAU,MAAM,UAAU,eAAe,mBAAmB,CAAC,KAAK,eAAe,QAAQ;AAAA,EACxI;AACF;AAEA,SAAS,kBAAkB,SAAuB;AAChD,QAAM,SAAS,QAAQ,gBAAgB;AAAA,IACrC,CAAC,mBAAmB,eAAe,mBAAmB;AAAA,EACxD;AACA,QAAM,WAAW,QAAQ,gBAAgB;AAAA,IACvC,CAAC,mBAAmB,eAAe,mBAAmB;AAAA,EACxD;AACA,QAAM,QAAQ,QAAQ,gBAAgB;AAAA,IACpC,CAAC,mBAAmB,eAAe,mBAAmB;AAAA,EACxD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,GAAG,qBAAqB,WAAW,MAAM;AAAA,IACzC,GAAG,qBAAqB,aAAa,QAAQ;AAAA,IAC7C,GAAG,qBAAqB,SAAS,KAAK;AAAA,IACtC;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAAmB;AAC7C,SAAO,GAAG,MAAM,GAAG,KAAK,eAAe,MAAM,aAAa,CAAC;AAC7D;AAEA,SAAS,uBAAuB,QAAsB;AACpD,SAAO,OACJ,OAAO,CAAC,UAAU,MAAM,gBAAgB,CAAC,EACzC,KAAK,CAAC,MAAM,UAAU,KAAK,gBAAgB,MAAM,aAAa,EAAE,CAAC;AACtE;AAEA,SAAS,sBAAsB,QAAsB;AACnD,SAAO,OACJ,OAAO,CAAC,UAAU,MAAM,gBAAgB,CAAC,EACzC,KAAK,CAAC,MAAM,UAAU,MAAM,gBAAgB,KAAK,aAAa,EAAE,CAAC;AACtE;AAEA,SAAS,oBAAoB,QAAuB,OAAwC;AAC1F,MAAI,UAAU,YAAY;AACxB,WAAO,eAAe,OAAO,KAAK,KAAK,UAAU,OAAO,yBAAyB,CAAC,CAAC;AAAA,EACrF;AAEA,MAAI,UAAU,YAAY;AACxB,WAAO,eAAe,OAAO,KAAK,KAAK,eAAe,OAAO,kBAAkB,CAAC;AAAA,EAClF;AAEA,SAAO,UAAU,OAAO,KAAK,KAAK,UAAU,OAAO,wBAAwB,CAAC,CAAC;AAC/E;AAEA,SAAS,mBAAmB,SAAuB;AACjD,MAAI,CAAC,QAAQ,YAAY;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,QAAQ;AAC3B,QAAM,qBAAqB,uBAAuB,WAAW,cAAc;AAC3E,QAAM,oBAAoB,sBAAsB,WAAW,cAAc;AACzE,QAAM,yBAAyB,mBAAmB,OAAO,QAAQ,gBAAgB,CAAC,GAAG,OAAO;AAC5F,QAAM,iBAAiB;AAAA,IACrB,GAAG,WAAW,eAAe,uBAAuB;AAAA,MAAI,CAAC,WACvD,oBAAoB,QAAQ,KAAK;AAAA,IACnC;AAAA,IACA,GAAG,WAAW,eAAe,4BAA4B;AAAA,MAAI,CAAC,WAC5D,oBAAoB,QAAQ,UAAU;AAAA,IACxC;AAAA,IACA,GAAG,WAAW,eAAe,4BAA4B;AAAA,MAAI,CAAC,WAC5D,oBAAoB,QAAQ,UAAU;AAAA,IACxC;AAAA,EACF,EAAE,MAAM,GAAG,CAAC;AAEZ,SAAO;AAAA,IACL;AAAA,IACA,oBAAoB,WAAW,mBAAmB;AAAA,IAClD,kBAAkB,UAAU,WAAW,qBAAqB,CAAC,OAAO,UAAU,QAAQ,aAAa,CAAC,KAAK,eAAe,WAAW,kBAAkB,CAAC;AAAA,IACtJ,uBAAuB,UAAU,WAAW,qBAAqB,CAAC,OAAO,UAAU,QAAQ,aAAa,CAAC,KAAK,eAAe,WAAW,kBAAkB,CAAC;AAAA,IAC3J,iBAAiB,cAAc,WAAW,2BAA2B,CAAC,OAAO,cAAc,QAAQ,mBAAmB,CAAC,KAAK,mBAAmB,WAAW,wBAAwB,CAAC;AAAA,IACnL,oBAAoB,WAAW,gBAAgB,OAAO,QAAQ,QAAQ,KAAK,WAAW,gBAAgB,IAAI,MAAM,EAAE,GAAG,WAAW,aAAa;AAAA,IAC7I,kBAAkB,WAAW,iBAAiB,OAAO,QAAQ,SAAS,KAAK,WAAW,iBAAiB,IAAI,MAAM,EAAE,GAAG,WAAW,cAAc;AAAA,IAC/I,qBACI,0BAA0B,mBAAmB,kBAAkB,CAAC,KAChE;AAAA,IACJ,oBACI,yBAAyB,mBAAmB,iBAAiB,CAAC,KAC9D;AAAA,IACJ,yBACI,oCAAoC,sBAAsB,KAC1D;AAAA,IACJ,GAAI,WAAW,YAAY,SAAS,IAChC,CAAC,6BAA6B,mBAAmB,WAAW,YAAY,CAAC,CAAC,CAAC,EAAE,IAC7E,CAAC,gCAAgC;AAAA,IACrC,GAAI,eAAe,SAAS,IAAI,iBAAiB,CAAC,uCAAuC;AAAA,EAC3F;AACF;AAEA,SAAS,qBACP,YACA,YACA;AACA,MAAI,WAAW,UAAU,GAAG;AAC1B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAAc,IAAI,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC;AAE7E,SAAO;AAAA,IACL;AAAA,IACA,GAAG,WAAW,IAAI,CAAC,QAAQ;AACzB,YAAM,WAAW,YAAY,IAAI,IAAI,IAAI,KAAK;AAC9C,aAAO,KAAK,IAAI,IAAI,KAAK,UAAU,IAAI,QAAQ,CAAC,WAAW,UAAU,QAAQ,CAAC;AAAA,IAChF,CAAC;AAAA,EACH;AACF;AAEO,SAAS,mBAAmB,QAAsB,SAAsC;AAC7F,QAAM,gBAAgB,SAAS,iBAAiB;AAChD,QAAM,SACJ,OAAO,SAAS,cAAc,OAAO,UACjC,GAAG,OAAO,YAAY,WAAW,WAAW,UAAU,uBACtD,OAAO,SAAS,cACd,gDACA;AACR,QAAM,YAAY,OAAO,WACrB,CAAC,IACD,OAAO,SAAS,cACd;AAAA,IACE;AAAA,IACA;AAAA,IACA,4BAA4B,aAAa;AAAA,IACzC,0BAA0B,aAAa;AAAA,IACvC,+BAA+B,aAAa;AAAA,EAC9C,IACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,+BAA+B,aAAa;AAAA,IAC5C,6BAA6B,aAAa;AAAA,IAC1C,+BAA+B,aAAa;AAAA,IAC5C,uCAAuC,aAAa;AAAA,IACpD,6CAA6C,aAAa;AAAA,IAC1D;AAAA,EACF;AAEN,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,OAAO,SAAS,QAAQ,CAAC,aAAa;AAAA,MACvC,KAAK,SAAS,YAAY,WAAW,WAAW,UAAU,kBAAkB,SAAS,cAAc;AAAA,MACnG,KAAK,SAAS,YAAY,WAAW,WAAW,UAAU,mBAAmB,SAAS,eAAe;AAAA,IACvG,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA,GAAI,OAAO,QAAQ,SAAS,IACxB,OAAO,QAAQ,IAAI,CAAC,WAAW,MAAM,OAAO,OAAO,IAAI,OAAO,IAAI,KAAK,OAAO,IAAI,EAAE,IACpF,CAAC,QAAQ;AAAA,IACb;AAAA,IACA;AAAA,IACA,GAAG,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AAAA,IACzC,GAAG;AAAA,EACL;AAEA,SAAO,SAAS,KAAK,IAAI;AAC3B;AAEO,SAAS,yBAAyB,QAAoC;AAC3E,QAAM,SAAS,OAAO,WAAW,+BAA+B;AAEhE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,OAAO,YAAY,gBAAgB;AAAA,IAC5C,SAAS,YAAY,OAAO,QAAQ,CAAC;AAAA,IACrC,eAAe,OAAO,YAAY,GAAG,OAAO,UAAU,KAAK,OAAO,OAAO,UAAU,GAAG,KAAK,aAAa;AAAA,IACxG;AAAA,IACA;AAAA,IACA,kBAAkB,YAAY,OAAO,gBAAgB,eAAe,CAAC;AAAA,IACrE,oBAAoB,YAAY,OAAO,gBAAgB,iBAAiB,CAAC;AAAA,IACzE,oBAAoB,YAAY,OAAO,gBAAgB,gBAAgB,CAAC;AAAA,IACxE,sBAAsB,YAAY,OAAO,gBAAgB,kBAAkB,CAAC;AAAA,IAC5E,GAAI,OAAO,gBAAgB,kBAAkB,SAAS,IAClD,OAAO,gBAAgB,kBAAkB;AAAA,MACvC,CAAC,UACC,qBAAqB,MAAM,GAAG,KAAK,YAAY,MAAM,WAAW,CAAC,kBAAkB,YAAY,MAAM,SAAS,CAAC,OAAO,MAAM,cAAc,IAAI,KAAK,GAAG;AAAA,IAC1J,IACA,CAAC,wBAAwB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,GAAG,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AAAA,EAC3C,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,qBAAqB,MAAkC;AAC9D,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,CAAC,QAAQ;AAAA,EAClB;AAEA,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,WAAO,KAAK,IAAI,GAAG,KAAK,YAAY,IAAI,SAAS,CAAC,OAAO,IAAI,cAAc,IAAI,KAAK,GAAG,KAAK,YAAY,IAAI,WAAW,CAAC,YAAY,UAAU,IAAI,iBAAiB,CAAC;AAAA,EACtK,CAAC;AACH;AAEA,SAAS,sBAAsB,MAAmC;AAChE,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,CAAC,QAAQ;AAAA,EAClB;AAEA,SAAO,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ;AACnC,UAAM,WACJ,IAAI,sBAAsB,IACtB,GAAG,UAAU,IAAI,iBAAiB,CAAC,WACnC,IAAI,oBAAoB,IACtB,aACA,GAAG,UAAU,IAAI,iBAAiB,CAAC,WAAW,YAAY,IAAI,iBAAiB,CAAC,gBAAgB,IAAI,sBAAsB,IAAI,KAAK,GAAG;AAE9I,WAAO,KAAK,IAAI,GAAG,KAAK,YAAY,IAAI,SAAS,CAAC,OAAO,IAAI,cAAc,IAAI,KAAK,GAAG,KAAK,YAAY,IAAI,WAAW,CAAC,YAAY,QAAQ;AAAA,EAC9I,CAAC;AACH;AAEA,SAAS,4BAA4B,SAAuB;AAC1D,QAAM,WAAW,QAAQ;AACzB,MAAI,CAAC,UAAU;AACb,WAAO,CAAC,gCAAgC;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,kBAAkB,YAAY,SAAS,eAAe,CAAC;AAAA,IACvD,oBAAoB,YAAY,SAAS,iBAAiB,CAAC;AAAA,IAC3D,oBAAoB,YAAY,SAAS,gBAAgB,CAAC;AAAA,IAC1D,sBAAsB,YAAY,SAAS,kBAAkB,CAAC;AAAA,IAC9D,GAAI,SAAS,kBAAkB,SAAS,IACpC,SAAS,kBAAkB;AAAA,MACzB,CAAC,UACC,qBAAqB,MAAM,GAAG,KAAK,YAAY,MAAM,WAAW,CAAC,kBAAkB,YAAY,MAAM,SAAS,CAAC,OAAO,MAAM,cAAc,IAAI,KAAK,GAAG;AAAA,IAC1J,IACA,CAAC,wBAAwB;AAAA,EAC/B;AACF;AAEA,SAAS,yBAAyB,SAAuB;AACvD,MAAI,CAAC,QAAQ,YAAY;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,QAAQ;AAC3B,QAAM,YAAY,WAAW,eAAe,CAAC;AAC7C,QAAM,aAAa,WAAW,YAAY,CAAC;AAE3C,SAAO;AAAA,IACL;AAAA,IACA,oBAAoB,WAAW,mBAAmB;AAAA,IAClD,kBAAkB,UAAU,WAAW,qBAAqB,CAAC,OAAO,UAAU,QAAQ,aAAa,CAAC,KAAK,eAAe,WAAW,kBAAkB,CAAC;AAAA,IACtJ,oBAAoB,YAAY,WAAW,gBAAgB,CAAC,OAAO,YAAY,QAAQ,QAAQ,CAAC,KAAK,WAAW,gBAAgB,IAAI,MAAM,EAAE,GAAG,WAAW,aAAa;AAAA,IACvK,8BAA8B,YAAY,QAAQ,iBAAiB,mBAAmB,CAAC,CAAC;AAAA,IACxF,YACI,4BAA4B,mBAAmB,SAAS,CAAC,KACzD;AAAA,IACJ,aACI,6BAA6B,mBAAmB,UAAU,CAAC,KAC3D;AAAA,EACN;AACF;AAEA,SAAS,4BAA4B,SAAuB;AAC1D,QAAM,QAAQ,QAAQ;AAEtB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB,UAAU,QAAQ,aAAa,CAAC;AAAA,IAChD,mBAAmB,UAAU,QAAQ,gBAAgB,CAAC;AAAA,IACtD,oBAAoB,UAAU,QAAQ,iBAAiB,CAAC;AAAA,IACxD,kBAAkB,YAAY,QAAQ,QAAQ,CAAC;AAAA,IAC/C,4BAA4B,YAAY,QAAQ,iBAAiB,mBAAmB,CAAC,CAAC,MAAM,YAAY,QAAQ,QAAQ,CAAC;AAAA,IACzH,iBAAiB,YAAY,OAAO,eAAe,CAAC,CAAC;AAAA,IACrD,gCAAgC,UAAU,QAAQ,aAAa,CAAC,KAAK,cAAc,QAAQ,mBAAmB,CAAC;AAAA,IAC/G,8BAA8B,UAAU,QAAQ,mBAAmB,CAAC;AAAA,IACpE;AAAA,IACA;AAAA,IACA,mBAAmB,YAAY,OAAO,oBAAoB,CAAC,CAAC;AAAA,IAC5D,oBAAoB,YAAY,OAAO,qBAAqB,CAAC,CAAC;AAAA,IAC9D,wBAAwB,YAAY,OAAO,wBAAwB,CAAC,CAAC;AAAA,IACrE,0BAA0B,YAAY,OAAO,kCAAkC,CAAC,CAAC;AAAA,IACjF,6BAA6B,YAAY,OAAO,qCAAqC,CAAC,CAAC;AAAA,IACvF;AAAA,IACA;AAAA,IACA,GAAG,qBAAqB,OAAO,SAAS,CAAC,CAAC;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,GAAG,sBAAsB,OAAO,UAAU,CAAC,CAAC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,GAAG,4BAA4B,OAAO;AAAA,IACtC;AAAA,IACA,GAAG,qBAAqB,QAAQ,YAAY,QAAQ,UAAU;AAAA,IAC9D,GAAI,QAAQ,WAAW,SAAS,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,GAAG,mBAAmB,QAAQ,aAAa,sCAAsC;AAAA,IACjF;AAAA,IACA,GAAG;AAAA,MACD,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,kBAAkB,QAAQ,UAAU,eAAe;AAAA,IACtD;AAAA,IACA,GAAG,kBAAkB,OAAO;AAAA,IAC5B;AAAA,IACA,GAAG,yBAAyB,OAAO;AAAA,IACnC,GAAI,QAAQ,aAAa,CAAC,EAAE,IAAI,CAAC;AAAA,IACjC;AAAA,IACA,GAAG,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AAAA,EAC5C,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,4BAA4B,SAAuB;AAC1D,QAAM,QAAQ,QAAQ;AAEtB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB,QAAQ,WAAW;AAAA,IACnC,kBAAkB,UAAU,QAAQ,aAAa,CAAC;AAAA,IAClD,qBAAqB,UAAU,QAAQ,gBAAgB,CAAC;AAAA,IACxD,sBAAsB,UAAU,QAAQ,iBAAiB,CAAC;AAAA,IAC1D,kCAAkC,UAAU,QAAQ,aAAa,CAAC,KAAK,cAAc,QAAQ,mBAAmB,CAAC;AAAA,IACjH,gCAAgC,UAAU,QAAQ,mBAAmB,CAAC;AAAA,IACtE,oBAAoB,YAAY,QAAQ,QAAQ,CAAC;AAAA,IACjD,8BAA8B,YAAY,QAAQ,iBAAiB,mBAAmB,CAAC,CAAC,MAAM,YAAY,QAAQ,QAAQ,CAAC;AAAA,IAC3H,mBAAmB,YAAY,OAAO,eAAe,CAAC,CAAC;AAAA,IACvD;AAAA,IACA;AAAA,IACA,mBAAmB,YAAY,OAAO,oBAAoB,CAAC,CAAC;AAAA,IAC5D,oBAAoB,YAAY,OAAO,qBAAqB,CAAC,CAAC;AAAA,IAC9D,wBAAwB,YAAY,OAAO,wBAAwB,CAAC,CAAC;AAAA,IACrE;AAAA,IACA;AAAA,IACA,GAAG,qBAAqB,OAAO,SAAS,CAAC,CAAC;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,GAAG,sBAAsB,OAAO,UAAU,CAAC,CAAC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,GAAG,4BAA4B,OAAO;AAAA,IACtC;AAAA,IACA,GAAG,qBAAqB,QAAQ,YAAY,QAAQ,UAAU;AAAA,IAC9D,GAAI,QAAQ,WAAW,SAAS,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IAC5C,GAAG,oBAAoB,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,SAAS,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,YAAY;AAChD,aAAO,OAAO,QAAQ,KAAK,OAAO,QAAQ,cAAc,KAAK,QAAQ,UAAU,YAAO,QAAQ,OAAO,sBAAsB,UAAU,QAAQ,aAAa,CAAC;AAAA,IAC7J,CAAC;AAAA,IACD;AAAA,IACA,GAAG,kBAAkB,OAAO;AAAA,IAC5B,GAAI,QAAQ,aAAa,CAAC,IAAI,GAAG,yBAAyB,OAAO,CAAC,IAAI,CAAC;AAAA,IACvE;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AAAA,EAC5C,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,sBAAsB,SAAuB;AAC3D,MAAI,qBAAqB,OAAO,GAAG;AACjC,WAAO,4BAA4B,OAAO;AAAA,EAC5C;AAEA,QAAM,gBAAgB,QAAQ,SAAS,OAAO,CAAC,YAAY,QAAQ,mBAAmB,OAAO;AAC7F,QAAM,sBAAsB,QAAQ,SAAS;AAAA,IAC3C,CAAC,YAAY,QAAQ,mBAAmB;AAAA,EAC1C;AACA,QAAM,WAAW,WAAW,SAAS,OAAO;AAE5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB,UAAU,QAAQ,aAAa,CAAC;AAAA,IAChD,mBAAmB,UAAU,QAAQ,gBAAgB,CAAC;AAAA,IACtD,oBAAoB,UAAU,QAAQ,iBAAiB,CAAC;AAAA,IACxD,kBAAkB,QAAQ,QAAQ;AAAA,IAClC,gBAAgB,QAAQ,SAAS;AAAA,IACjC,gCAAgC,UAAU,QAAQ,aAAa,CAAC,KAAK,cAAc,QAAQ,mBAAmB,CAAC;AAAA,IAC/G,8BAA8B,UAAU,QAAQ,mBAAmB,CAAC;AAAA,IACpE;AAAA,IACA,GAAG,oBAAoB,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,QAAQ,eAAe;AAAA,IAClC;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,QAAQ,YAAY;AAAA,IAC/B;AAAA,IACA,GAAG,qBAAqB,QAAQ,YAAY,QAAQ,UAAU;AAAA,IAC9D,GAAI,QAAQ,WAAW,SAAS,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IAC5C;AAAA,IACA,GAAG,kBAAkB,eAAe,eAAe;AAAA,IACnD;AAAA,IACA;AAAA,IACA,GAAG,kBAAkB,qBAAqB,eAAe;AAAA,IACzD;AAAA,IACA,GAAG,kBAAkB,OAAO;AAAA,IAC5B;AAAA,IACA,GAAI,WACA,CAAC,oCAAoC,SAAS,KAAK,EAAE,IACrD,CAAC,uCAAuC;AAAA,IAC5C,GAAI,QAAQ,gBAAgB,CAAC,IACzB,CAAC,gCAAgC,QAAQ,gBAAgB,CAAC,EAAE,GAAG,EAAE,IACjE,CAAC,mCAAmC;AAAA,IACxC;AAAA,IACA,GAAG,mBAAmB,OAAO;AAAA,IAC7B,GAAI,QAAQ,aAAa,CAAC,EAAE,IAAI,CAAC;AAAA,IACjC;AAAA,IACA,GAAG,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AAAA,EAC5C,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,sBAAsB,SAAuB;AAC3D,MAAI,qBAAqB,OAAO,GAAG;AACjC,WAAO,4BAA4B,OAAO;AAAA,EAC5C;AAEA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,gBAAgB,QAAQ,WAAW;AAAA,IACnC,kBAAkB,UAAU,QAAQ,aAAa,CAAC;AAAA,IAClD,qBAAqB,UAAU,QAAQ,gBAAgB,CAAC;AAAA,IACxD,sBAAsB,UAAU,QAAQ,iBAAiB,CAAC;AAAA,IAC1D,kCAAkC,UAAU,QAAQ,aAAa,CAAC,KAAK,cAAc,QAAQ,mBAAmB,CAAC;AAAA,IACjH,gCAAgC,UAAU,QAAQ,mBAAmB,CAAC;AAAA,IACtE,oBAAoB,QAAQ,QAAQ;AAAA,IACpC,kBAAkB,QAAQ,SAAS;AAAA,IACnC;AAAA,IACA,GAAG,oBAAoB,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,QAAQ,eAAe;AAAA,IAClC;AAAA,IACA,GAAG,qBAAqB,QAAQ,YAAY,QAAQ,UAAU;AAAA,IAC9D,GAAI,QAAQ,WAAW,SAAS,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,SAAS,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,YAAY;AAChD,aAAO,OAAO,QAAQ,KAAK,OAAO,QAAQ,cAAc,KAAK,QAAQ,UAAU,YAAO,QAAQ,OAAO,sBAAsB,UAAU,QAAQ,aAAa,CAAC;AAAA,IAC7J,CAAC;AAAA,IACD;AAAA,IACA,GAAG,kBAAkB,OAAO;AAAA,EAC9B;AAEA,MAAI,QAAQ,YAAY;AACtB,UAAM,aAAa,QAAQ;AAC3B,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,uBAAuB,WAAW,mBAAmB;AAAA,MACrD,kBAAkB,UAAU,WAAW,qBAAqB,CAAC,OAAO,UAAU,QAAQ,aAAa,CAAC,KAAK,eAAe,WAAW,kBAAkB,CAAC;AAAA,MACtJ,uBAAuB,UAAU,WAAW,qBAAqB,CAAC,OAAO,UAAU,QAAQ,aAAa,CAAC,KAAK,eAAe,WAAW,kBAAkB,CAAC;AAAA,MAC3J,iBAAiB,cAAc,WAAW,2BAA2B,CAAC,OAAO,cAAc,QAAQ,mBAAmB,CAAC,KAAK,mBAAmB,WAAW,wBAAwB,CAAC;AAAA,IACrL;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC7jBA,IAAI,6BAA6B;;;ACSjC,SAAS,cAAc,SAA+B;AACpD,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,gBAAgB,QAAQ;AAAA,IACxB,YAAY,QAAQ;AAAA,IACpB,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,eAAe,QAAQ;AAAA,EACzB;AACF;AAEA,SAAS,iBAAiB,YAA6C;AACrE,SAAO;AAAA,IACL,iBAAiB,WAAW;AAAA,IAC5B,qBAAqB,WAAW;AAAA,IAChC,uBAAuB,WAAW;AAAA,IAClC,uBAAuB,WAAW;AAAA,IAClC,6BAA6B,WAAW;AAAA,IACxC,oBAAoB,WAAW;AAAA,IAC/B,oBAAoB,WAAW;AAAA,IAC/B,0BAA0B,WAAW;AAAA,IACrC,eAAe,WAAW;AAAA,IAC1B,gBAAgB,WAAW;AAAA,EAC7B;AACF;AAEO,SAAS,cAAc,SAAuB,MAAyC;AAC5F,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,MACP,SAAS,QAAQ;AAAA,MACjB,aAAa,QAAQ;AAAA,MACrB,eAAe,QAAQ;AAAA,MACvB,UAAU,QAAQ;AAAA,MAClB,WAAW,QAAQ;AAAA,MACnB,eAAe,QAAQ;AAAA,MACvB,kBAAkB,QAAQ;AAAA,MAC1B,mBAAmB,QAAQ;AAAA,MAC3B,eAAe,QAAQ;AAAA,MACvB,qBAAqB,QAAQ;AAAA,MAC7B,qBAAqB,QAAQ;AAAA,MAC7B,aAAa,QAAQ;AAAA,MACrB,mBAAmB,QAAQ;AAAA,MAC3B,iBAAiB,QAAQ;AAAA,MACzB,cAAc,QAAQ;AAAA,MACtB,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ,SAAS,IAAI,aAAa;AAAA,MAC5C,iBAAiB,QAAQ;AAAA,MACzB,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ,aAAa,iBAAiB,QAAQ,UAAU,IAAI;AAAA,IAC1E;AAAA,IACA,MAAM;AAAA,MACJ,YAAY,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,UAAU,OAAO;AAAA,IACnB;AAAA,EACF;AACF;;;ACzEO,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ACAO,SAAS,gBAAgB,SAA2C;AACzE,SAAO;AAAA,IACL,KAAK,SAAiB;AACpB,cAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,IACrC;AAAA,IACA,QAAQ,SAAiB;AACvB,UAAI,CAAC,QAAQ,SAAS;AACpB;AAAA,MACF;AAEA,cAAQ,OAAO,MAAM,aAAa,OAAO;AAAA,CAAI;AAAA,IAC/C;AAAA,EACF;AACF;;;ACDA,eAAsB,UACpB,SACA,QACqB;AACrB,QAAM,MAAM,GAAG,OAAO,MAAM;AAC5B,QAAM,OAAO,KAAK,UAAU,OAAO;AAEnC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,KAAK;AAAA,MAC1B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,OAAO,MAAM;AAAA,MACxC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,WAAO,EAAE,IAAI,OAAO,QAAQ,GAAG,SAAS,mBAAmB,OAAO,MAAM,KAAK,OAAO,GAAG;AAAA,EACzF;AAEA,MAAI,SAAS,WAAW,KAAK;AAC3B,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,WAAO,EAAE,IAAI,MAAM,SAAS,KAAK,MAAM,QAAQ,QAAQ,QAAQ;AAAA,EACjE;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,mBAAe,KAAK,SAAS,KAAK,WAAW,SAAS;AAAA,EACxD,QAAQ;AACN,mBAAe,SAAS,cAAc,QAAQ,SAAS,MAAM;AAAA,EAC/D;AAEA,SAAO,EAAE,IAAI,OAAO,QAAQ,SAAS,QAAQ,SAAS,aAAa;AACrE;;;ACrDA,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;;;ACFrB,SAAS,YAAY,aAAAC,YAAW,gBAAAC,eAAc,QAAQ,qBAAqB;AAC3E,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAOvB,SAAS,qBAA6B;AAC3C,QAAM,YAAY,QAAQ,IAAI,mBAAmBA,MAAKF,SAAQ,GAAG,SAAS;AAC1E,SAAOE,MAAK,WAAW,QAAQ,kBAAkB;AACnD;AAEO,SAAS,iBAAiB,OAAqB;AACpD,QAAM,WAAW,mBAAmB;AACpC,QAAM,MAAMD,SAAQ,QAAQ;AAC5B,EAAAH,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,QAAM,OAA0B,EAAE,OAAO,WAAU,oBAAI,KAAK,GAAE,YAAY,EAAE;AAC5E,gBAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AACxE;AAEO,SAAS,wBAAuC;AACrD,QAAM,WAAW,mBAAmB;AACpC,MAAI;AACF,QAAI,CAAC,WAAW,QAAQ,EAAG,QAAO;AAClC,UAAM,MAAMC,cAAa,UAAU,MAAM;AACzC,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,OAAO,SAAS;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAA4B;AAC1C,QAAM,WAAW,mBAAmB;AACpC,MAAI;AACF,QAAI,CAAC,WAAW,QAAQ,EAAG,QAAO;AAClC,WAAO,QAAQ;AACf,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AD9BA,IAAM,kBAAkB;AACxB,IAAM,cAAcI,MAAKC,SAAQ,GAAG,SAAS,aAAa;AAEnD,SAAS,iBAA6B;AAC3C,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,SAAS,QAAQ,IAAI;AAE3B,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,UAAU;AAAA,MAClB,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI;AACF,UAAM,MAAMC,cAAa,aAAa,MAAM;AAC5C,UAAM,SAAS,KAAK,MAAM,GAAG;AAE7B,QAAI,OAAO,QAAQ;AACjB,aAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,QAAQ,UAAU,OAAO,UAAU;AAAA,QACnC,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,cAAc,sBAAsB;AAC1C,MAAI,aAAa;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,UAAU;AAAA,MAClB,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,4DAA4D,WAAW,cAAc,cAAc,OAAO,CAAC;AAAA;AAAA,EAC7G;AACF;;;AEvDA,SAAS,gBAAgB;;;ACAzB,SAAS,UAAU,iBAAiB;AACpC,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,aAAAC,YAAW,UAAAC,eAAc;AAClC,SAAS,WAAAC,UAAS,cAAc;AAChC,SAAS,QAAAC,aAAY;AAIrB,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAE7B,SAAS,WAAW,OAAuB;AACzC,SAAOJ,YAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACrE;AAEA,SAAS,QAAQ,QAAgC;AAC/C,QAAM,OAAiB,CAAC;AACxB,MAAI,OAAO,cAAc;AACvB,UAAM,WAAW,OAAO,aAAa,QAAQ,MAAMG,SAAQ,CAAC;AAC5D,SAAK,KAAK,MAAM,QAAQ;AAAA,EAC1B;AACA,OAAK,KAAK,MAAM,iBAAiB,MAAM,mBAAmB;AAC1D,SAAO;AACT;AAEA,SAAS,gBAAgB,QAA8B;AACrD,QAAM,QAAQ,CAAC,KAAK;AACpB,MAAI,OAAO,cAAc;AACvB,UAAM,WAAW,OAAO,aAAa,QAAQ,MAAMA,SAAQ,CAAC;AAC5D,UAAM,KAAK,OAAO,QAAQ,GAAG;AAAA,EAC/B;AACA,QAAM,KAAK,oBAAoB,sBAAsB;AACrD,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,mBAA4B;AACnC,MAAI;AACF,cAAU,SAAS,CAAC,WAAW,GAAG,EAAE,OAAO,OAAO,CAAC;AACnD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,QAA+B;AAC7D,MAAI;AACF,UAAM,SAAS,UAAU,OAAO,CAAC,GAAG,QAAQ,MAAM,GAAG,OAAO,MAAM,aAAa,GAAG;AAAA,MAChF,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AACD,WAAO,OAAO,WAAW;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,QAAuD;AAClF,QAAM,SAAS,UAAU,OAAO,CAAC,GAAG,QAAQ,MAAM,GAAG,OAAO,MAAM,SAAS,GAAG;AAAA,IAC5E,OAAO;AAAA,IACP,SAAS;AAAA,EACX,CAAC;AAED,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,IAAI,KAAK;AAAA,EACpB;AAEA,QAAM,SAAS,OAAO,QAAQ,SAAS,EAAE,KAAK,KAAK;AACnD,SAAO,EAAE,IAAI,OAAO,OAAO,OAAO;AACpC;AAEA,SAAS,QAAQ,QAAsBE,UAAqD;AAC1F,QAAM,SAAS,UAAU,OAAO,CAAC,GAAG,QAAQ,MAAM,GAAG,OAAO,MAAMA,QAAO,GAAG;AAAA,IAC1E,OAAO;AAAA,IACP,SAAS;AAAA,EACX,CAAC;AACD,SAAO;AAAA,IACL,QAAQ,OAAO,QAAQ,SAAS,EAAE,KAAK,KAAK;AAAA,IAC5C,QAAQ,OAAO,UAAU;AAAA,EAC3B;AACF;AAEA,SAAS,eAAe,OAAmC;AACzD,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ,MACX,KAAK,EACL,YAAY,EACZ,MAAM,iBAAiB;AAC1B,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ,OAAO,MAAM,CAAC,CAAC;AAC7B,QAAM,OAAO,MAAM,CAAC;AAEpB,MAAI;AACJ,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,gBAAU;AACV;AAAA,IACF,KAAK;AACH,gBAAU,QAAQ;AAClB;AAAA,IACF,KAAK;AACH,gBAAU,QAAQ,KAAK;AACvB;AAAA,IACF,KAAK;AACH,gBAAU,QAAQ,KAAK,KAAK;AAC5B;AAAA,IACF;AACE,aAAO;AAAA,EACX;AAEA,SAAO,UAAU,OAAO;AAC1B;AAEA,SAAS,UAAU,MAMP;AACV,EAAAJ,WAAU,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AAE5C,QAAM,OAAO,CAAC,QAAQ,gBAAgB,MAAM,gBAAgB,KAAK,MAAM,CAAC;AAExE,MAAI,KAAK,UAAU;AACjB,eAAW,WAAW,KAAK,UAAU;AACnC,WAAK,KAAK,aAAa,OAAO;AAAA,IAChC;AACA,SAAK,KAAK,aAAa,GAAG;AAAA,EAC5B;AAEA,MAAI,KAAK,OAAO;AACd,UAAM,WAAW,eAAe,KAAK,KAAK;AAC1C,QAAI,UAAU;AACZ,YAAM,cAAc,QAAQ,KAAK,UAAU,YAAY,QAAQ;AAC/D,YAAM,EAAE,QAAQ,OAAO,IAAI,QAAQ,KAAK,QAAQ,WAAW;AAC3D,UAAI,WAAW,KAAK,CAAC,OAAQ,QAAO;AAEpC,YAAM,QAAQ,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO;AAC/C,UAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,YAAM,UAAUG,MAAK,OAAO,GAAG,iBAAiB,WAAW,KAAK,UAAU,CAAC,EAAE;AAC7E,YAAM,gBAAgB,MAAM;AAAA,QAAI,CAAC,MAC/B,EAAE,WAAW,KAAK,UAAU,IAAI,EAAE,MAAM,KAAK,WAAW,MAAM,EAAE,QAAQ,OAAO,EAAE,IAAI;AAAA,MACvF;AACA,eAAS,SAAS,OAAO;AAAA,EAAkB,cAAc,KAAK,IAAI,CAAC;AAAA,QAAW;AAC9E,WAAK,KAAK,gBAAgB,OAAO;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,YAAY,KAAK,WAAW,SAAS,GAAG,IAC1C,GAAG,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,KACtC,GAAG,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU;AAE1C,OAAK,KAAK,WAAW,GAAG,KAAK,QAAQ,GAAG;AAExC,QAAM,SAAS,UAAU,SAAS,MAAM,EAAE,OAAO,QAAQ,SAAS,KAAQ,CAAC;AAC3E,SAAO,OAAO,WAAW;AAC3B;AAEA,SAAS,WAAW,MAIR;AACV,EAAAH,WAAU,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AAE5C,QAAM,SAAS,iBAAiB,KAAK,UAAU;AAC/C,QAAM,cAAc,QAAQ,KAAK,MAAM;AACvC,QAAM,UAAU,OAAO,YAAY,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,MAAM,qBAAqB,KAAK,QAAQ;AAElI,MAAI;AACF,aAAS,SAAS,EAAE,OAAO,QAAQ,SAAS,KAAQ,CAAC;AACrD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,MAOX;AACV,MAAI,KAAK,UAAU;AACjB,UAAM,KAAK,UAAU;AAAA,MACnB,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,IACd,CAAC;AACD,QAAI,GAAI,QAAO;AAAA,EACjB;AAEA,UAAQ,OAAO;AAAA,IACb,KAAK,WACD,0DACA;AAAA,EACN;AAEA,SAAO,WAAW;AAAA,IAChB,QAAQ,KAAK;AAAA,IACb,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK;AAAA,EACjB,CAAC;AACH;AAEA,SAAS,iBAAiB,QAAsB,WAA4B;AAC1E,MAAI,WAAW;AACb,UAAM,WAAWG,MAAKD,SAAQ,GAAG,SAAS,gBAAgB,OAAO,IAAI;AACrE,IAAAF,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,WAAW,GAAG,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE;AACtD,QAAM,UAAUG,MAAK,OAAO,GAAG,eAAe,IAAI,EAAE;AACpD,EAAAH,WAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,SAAO;AACT;AAEO,SAAS,kBAAkB,QAA+D;AAC/F,QAAM,YAAY,OAAO,MAAM,cAAc;AAC7C,MAAI,WAAW;AACb,UAAM,WAAW,UAAU,CAAC;AAC5B,UAAM,OAAO,UAAU,CAAC;AACxB,UAAMK,WAAU,SAAS,QAAQ,GAAG;AACpC,WAAO;AAAA,MACL,MAAMA,YAAW,IAAI,SAAS,MAAM,GAAGA,QAAO,IAAI;AAAA,MAClD,MAAMA,YAAW,IAAI,SAAS,MAAMA,WAAU,CAAC,IAAI;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,OAAO,QAAQ,GAAG;AAClC,SAAO;AAAA,IACL,MAAM,WAAW,IAAI,OAAO,MAAM,GAAG,OAAO,IAAI;AAAA,IAChD,MAAM,WAAW,IAAI,OAAO,MAAM,UAAU,CAAC,IAAI;AAAA,EACnD;AACF;AAEO,SAAS,qBAAqB,MAIpB;AACf,QAAM,SAAS,kBAAkB,KAAK,MAAM;AAC5C,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,WAAW;AAAA,IACX,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,EACpB;AACF;AAEO,SAAS,4BAA4B,QAA8B;AACxE,QAAM,UAAU,OAAO,WAAW;AAClC,QAAM,WAAW,OAAO,eAAe;AACvC,SAAO,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI,QAAQ;AAC9C;AAEA,eAAsB,gBAAgB,MAKd;AACtB,QAAM,EAAE,QAAQ,OAAO,YAAY,OAAO,WAAW,IAAI;AAEzD,eAAa,+BAA+B,OAAO,IAAI,KAAK;AAC5D,QAAM,eAAe,oBAAoB,MAAM;AAC/C,MAAI,CAAC,aAAa,IAAI;AACpB,UAAM,IAAI;AAAA,MACR,qBAAqB,OAAO,IAAI,qCAAqC,aAAa,QAAQ,KAAK,aAAa,KAAK,MAAM,EAAE;AAAA,IAC3H;AAAA,EACF;AACA,eAAa,sBAAsB;AAEnC,QAAM,WAAW,iBAAiB;AAClC;AAAA,IACE,WACI,0FACA;AAAA,EACN;AACA,QAAM,YAAY,iBAAiB,QAAQ,SAAS;AACpD,QAAM,aAAaF,MAAK,WAAW,SAAS;AAC5C,QAAM,cAAcA,MAAK,WAAW,UAAU;AAE9C,QAAM,gBAAgB,OAAO,WAAW;AACxC,QAAM,qBAAqB,OAAO,eAAe;AAEjD,QAAM,EAAE,QAAQ,iBAAiB,IAAI,QAAQ,QAAQ,aAAa,kBAAkB,EAAE;AACtF,QAAM,uBAAuB,oBAAoB;AACjD,eAAa,gEAAgE;AAE7E,QAAM,EAAE,QAAQ,cAAc,IAAI,QAAQ,QAAQ,WAAW,aAAa,iBAAiB;AAC3F,QAAM,EAAE,QAAQ,eAAe,IAAI;AAAA,IACjC;AAAA,IACA,WAAW,oBAAoB;AAAA,EACjC;AAEA,MAAI,YAAY;AAChB,MAAI,iBAAiB;AAErB,MAAI,kBAAkB,GAAG;AACvB,iBAAa,6BAA6B,aAAa,KAAK;AAC5D,UAAM,EAAE,QAAQ,OAAO,IAAI,QAAQ,QAAQ,WAAW,aAAa,eAAe;AAClF,QAAI,WAAW,QAAQ;AACrB,YAAM,YAAY,cAAc,MAAM,GAAG,cAAc,YAAY,GAAG,CAAC,KAAK;AAC5E,YAAM,WAAW,cAAc,MAAM,cAAc,YAAY,GAAG,IAAI,CAAC;AACvE,kBAAY,cAAc;AAAA,QACxB;AAAA,QACA,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU,CAAC,QAAQ;AAAA,QACnB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,kBAAY,cAAc;AAAA,QACxB;AAAA,QACA,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU,CAAC,kBAAkB,OAAO;AAAA,QACpC;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,mBAAmB,GAAG;AACxB,iBAAa,8BAA8B,oBAAoB,KAAK;AACpE,qBAAiB,cAAc;AAAA,MAC7B;AAAA,MACA,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU,CAAC,OAAO,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,aAAa,CAAC,gBAAgB;AACjC,QAAI,WAAW;AACb,MAAAF,QAAO,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AACA,UAAM,IAAI;AAAA,MACR,8CAA8C,OAAO,IAAI;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,SAAqB;AAAA,IACzB,WAAW;AAAA,IACX;AAAA,EACF;AAEA,MAAI,UAAW,QAAO,UAAU;AAChC,MAAI,eAAgB,QAAO,cAAc;AACzC,eAAa,mCAAmC;AAEhD,SAAO;AACT;AAEA,eAAsB,gBAAgB,MAGN;AAC9B,QAAM,EAAE,QAAQ,WAAW,IAAI;AAC/B,QAAM,QAAkB,CAAC;AAEzB,eAAa,+BAA+B,OAAO,IAAI,KAAK;AAC5D,QAAM,eAAe,oBAAoB,MAAM;AAC/C,MAAI,CAAC,aAAa,IAAI;AACpB,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,iBAAiB;AAAA,MACjB,UAAU,aAAa;AAAA,MACvB,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,cAAc;AAAA,QACZ,eAAe;AAAA,QACf,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,mBAAmB;AAAA,QACnB,oBAAoB;AAAA,MACtB;AAAA,MACA,OAAO;AAAA,QACL,qBAAqB,OAAO,IAAI,qCAAqC,aAAa,QAAQ,KAAK,aAAa,KAAK,MAAM,EAAE;AAAA,MAC3H;AAAA,IACF;AAAA,EACF;AAEA,eAAa,sBAAsB;AACnC,QAAM,KAAK,sBAAsB;AAEjC,eAAa,+DAA+D;AAC5E,QAAM,aAAa,iBAAiB;AACpC,QAAM,cAAc,uBAAuB,MAAM;AACjD,QAAM,KAAK,4BAA4B,aAAa,QAAQ,IAAI,EAAE;AAClE,QAAM,KAAK,8BAA8B,cAAc,QAAQ,IAAI,EAAE;AACrE,MAAI,CAAC,cAAc,CAAC,aAAa;AAC/B,UAAM,KAAK,sDAAsD;AAAA,EACnE;AAEA,WAAS,UAAU,YAAoB;AACrC,UAAM,EAAE,QAAQ,SAAS,IAAI,QAAQ,QAAQ,aAAa,UAAU,EAAE;AACtE,UAAM,WAAW,YAAY;AAC7B,UAAM,EAAE,QAAQ,OAAO,IAAI,QAAQ,QAAQ,WAAW,QAAQ,iBAAiB;AAC/E,QAAI,WAAW,GAAG;AAChB,aAAO,EAAE,QAAQ,OAAO,MAAM,UAAU,WAAW,GAAG,YAAY,EAAE;AAAA,IACtE;AACA,UAAM,EAAE,QAAQ,SAAS,IAAI,QAAQ,QAAQ,QAAQ,QAAQ,8BAA8B;AAC3F,UAAM,EAAE,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,UAAU,QAAQ,wBAAwB;AACtF,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,WAAW,OAAO,SAAS,UAAU,EAAE,KAAK;AAAA,MAC5C,YAAY,OAAO,SAAS,SAAS,EAAE,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,eAAa,oCAAoC;AACjD,QAAM,UAAU,UAAU,mBAAmB;AAC7C,QAAM,WAAW,UAAU,oBAAoB;AAE/C,MAAI,QAAQ,QAAQ;AAClB,UAAM;AAAA,MACJ,yBAAyB,QAAQ,IAAI,KAAK,QAAQ,SAAS,WAAW,YAAY,QAAQ,UAAU,CAAC;AAAA,IACvG;AAAA,EACF,OAAO;AACL,UAAM,KAAK,sBAAsB,QAAQ,IAAI,EAAE;AAAA,EACjD;AAEA,MAAI,SAAS,QAAQ;AACnB,UAAM;AAAA,MACJ,qBAAqB,SAAS,IAAI,KAAK,SAAS,SAAS,WAAW,YAAY,SAAS,UAAU,CAAC;AAAA,IACtG;AAAA,EACF,OAAO;AACL,UAAM,KAAK,kBAAkB,SAAS,IAAI,EAAE;AAAA,EAC9C;AAEA,QAAM,SAA6B;AAAA,IACjC,MAAM,OAAO;AAAA,IACb,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,cAAc;AAAA,MACZ,eAAe,QAAQ;AAAA,MACvB,aAAa,QAAQ;AAAA,MACrB,kBAAkB,QAAQ;AAAA,MAC1B,mBAAmB,QAAQ;AAAA,MAC3B,gBAAgB,SAAS;AAAA,MACzB,cAAc,SAAS;AAAA,MACvB,mBAAmB,SAAS;AAAA,MAC5B,oBAAoB,SAAS;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,OAAO,aAAa;AACxC,UAAM,WAAW,OAAO,UAAU,UAAU,OAAO,OAAO,IAAI;AAC9D,UAAM,YAAY,OAAO,cAAc,UAAU,OAAO,WAAW,IAAI;AAEvE,WAAO,cAAc;AAAA,MACnB,eAAe,UAAU,UAAU;AAAA,MACnC,aAAa,OAAO,WAAW;AAAA,MAC/B,cAAc,UAAU,cAAc;AAAA,MACtC,mBAAmB,WAAW,UAAU;AAAA,MACxC,iBAAiB,OAAO,eAAe;AAAA,MACvC,mBAAmB,WAAW,aAAa;AAAA,MAC3C,oBAAoB,WAAW,cAAc;AAAA,IAC/C;AAEA,QAAI,UAAU,QAAQ;AACpB,YAAM,KAAK,mBAAmB,OAAO,OAAO,KAAK,YAAY,SAAS,UAAU,CAAC,EAAE;AAAA,IACrF,WAAW,OAAO,SAAS;AACzB,YAAM,KAAK,mBAAmB,OAAO,OAAO,aAAa;AAAA,IAC3D;AAEA,QAAI,WAAW,QAAQ;AACrB,YAAM;AAAA,QACJ,wBAAwB,OAAO,WAAW,KAAK,UAAU,SAAS,WAAW,YAAY,UAAU,UAAU,CAAC;AAAA,MAChH;AAAA,IACF,WAAW,OAAO,aAAa;AAC7B,YAAM,KAAK,wBAAwB,OAAO,WAAW,aAAa;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;AACrD,QAAM,QAAQ,QAAQ,QAAQ;AAC9B,SAAO,GAAG,MAAM,QAAQ,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AACtD;;;ACzfA,SAAS,YAAAK,WAAU,aAAAC,kBAAiB;AACpC,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,aAAAC,YAAW,UAAAC,eAAc;AAClC,SAAS,WAAAC,UAAS,UAAAC,eAAc;AAChC,SAAS,QAAAC,aAAY;AAIrB,IAAMC,uBAAsB;AAC5B,IAAMC,wBAAuB;AAE7B,IAAM,0BAA0B,CAAC,sCAAsC;AAEvE,SAASC,YAAW,OAAuB;AACzC,SAAOR,YAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACrE;AAEA,SAAS,eAAe,QAAkC;AACxD,QAAM,OAAO,CAAC,KAAK;AACnB,MAAI,QAAQ;AACV,SAAK,KAAK,aAAa,OAAO,SAAS,EAAE;AACzC,SAAK,KAAK,iBAAiB,OAAO,aAAa,EAAE;AACjD,SAAK,KAAK,aAAa,OAAO,SAAS,EAAE;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,SAAS,YAAYS,UAAiB,QAA4D;AAChG,QAAM,OAAO,CAAC,GAAG,eAAe,MAAM,GAAGA,QAAO;AAChD,QAAM,SAASV,WAAU,WAAW,MAAM,EAAE,OAAO,QAAQ,SAAS,IAAO,CAAC;AAC5E,SAAO;AAAA,IACL,QAAQ,OAAO,QAAQ,SAAS,EAAE,KAAK,KAAK;AAAA,IAC5C,QAAQ,OAAO,UAAU;AAAA,EAC3B;AACF;AAEA,SAASW,gBAAe,OAAmC;AACzD,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ,MACX,KAAK,EACL,YAAY,EACZ,MAAM,iBAAiB;AAC1B,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ,OAAO,MAAM,CAAC,CAAC;AAC7B,QAAM,OAAO,MAAM,CAAC;AAEpB,MAAI;AACJ,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,gBAAU;AACV;AAAA,IACF,KAAK;AACH,gBAAU,QAAQ;AAClB;AAAA,IACF,KAAK;AACH,gBAAU,QAAQ,KAAK;AACvB;AAAA,IACF,KAAK;AACH,gBAAU,QAAQ,KAAK,KAAK;AAC5B;AAAA,IACF;AACE,aAAO;AAAA,EACX;AAEA,SAAO,UAAU,OAAO;AAC1B;AAEA,SAAS,eAAe,MAKZ;AACV,EAAAT,WAAU,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AAI5C,MAAI;AACJ,MAAI,KAAK,OAAO;AACd,UAAM,WAAWS,gBAAe,KAAK,KAAK;AAC1C,QAAI,UAAU;AACZ,eAAS,QAAQ,KAAK,UAAU,YAAY,QAAQ;AAAA,IACtD,OAAO;AACL,eAAS,iBAAiB,KAAK,UAAU;AAAA,IAC3C;AAAA,EACF,OAAO;AACL,aAAS,iBAAiB,KAAK,UAAU;AAAA,EAC3C;AAEA,QAAMC,WAAU,eAAe,KAAK,MAAM,EAAE,KAAK,GAAG;AACpD,QAAM,UAAU,WAAWA,QAAO,KAAK,MAAM,iCAAiC,KAAK,QAAQ;AAE3F,MAAI;AACF,IAAAb,UAAS,SAAS,EAAE,OAAO,QAAQ,SAAS,KAAQ,CAAC;AACrD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASc,kBAAiB,QAAsB,WAA4B;AAC1E,MAAI,WAAW;AACb,UAAM,WAAWP,MAAKF,SAAQ,GAAG,SAAS,gBAAgB,OAAO,IAAI;AACrE,IAAAF,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,UACpB,WAAW,OAAO,QAAQ,SAAS,IAAI,KAAK,IAAI,CAAC,KACjD,GAAG,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC;AAChC,QAAM,OAAOO,YAAW,QAAQ;AAChC,QAAM,UAAUH,MAAKD,QAAO,GAAG,eAAe,IAAI,EAAE;AACpD,EAAAH,WAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,SAAO;AACT;AAEA,SAAS,gBAAgB,YAAoB,QAAwB;AACnE,QAAM,EAAE,QAAQ,OAAO,IAAI,YAAY,WAAW,UAAU,mBAAmB,MAAM;AACrF,MAAI,WAAW,GAAG;AAChB,WAAO,EAAE,QAAQ,OAAO,MAAM,YAAY,WAAW,GAAG,YAAY,EAAE;AAAA,EACxE;AACA,QAAM,EAAE,QAAQ,SAAS,IAAI;AAAA,IAC3B,QAAQ,UAAU;AAAA,IAClB;AAAA,EACF;AACA,QAAM,EAAE,QAAQ,QAAQ,IAAI,YAAY,UAAU,UAAU,0BAA0B,MAAM;AAC5F,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WAAW,OAAO,SAAS,UAAU,EAAE,KAAK;AAAA,IAC5C,YAAY,OAAO,SAAS,SAAS,EAAE,KAAK;AAAA,EAC9C;AACF;AAEA,SAAS,iBAAiB,QAAwB,YAAoC;AACpF,MAAI,YAAY;AACd,UAAM,QAAQ,gBAAgB,YAAY,MAAM;AAChD,WAAO,MAAM,SAAS,aAAa;AAAA,EACrC;AAEA,QAAM,EAAE,QAAQ,gBAAgB,IAAI,YAAY,aAAaM,qBAAoB,IAAI,MAAM;AAC3F,QAAM,cAAc,mBAAmBA;AACvC,QAAM,eAAe,gBAAgB,aAAa,MAAM;AACxD,MAAI,aAAa,UAAU,aAAa,YAAY,GAAG;AACrD,WAAO;AAAA,EACT;AAEA,aAAW,WAAW,yBAAyB;AAC7C,UAAM,QAAQ,gBAAgB,SAAS,MAAM;AAC7C,QAAI,MAAM,UAAU,MAAM,YAAY,GAAG;AACvC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,4BAA4B,MAI3B;AAGf,QAAM,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,UAAU,MAAM,GAAG,CAAC,CAAC,KAAK;AAC9E,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,MAAM;AAAA,IACN,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,EAChB;AACF;AAEO,SAAS,6BAA6B,QAA8B;AACzE,QAAM,UAAU,OAAO,WAAWD;AAClC,QAAM,WAAW,OAAO,eAAeC;AACvC,MAAI,OAAO,SAAS;AAClB,WAAO,WAAW,OAAO,QAAQ,SAAS,IAAI,OAAO,QAAQ,aAAa,IAAI,OAAO,QAAQ,SAAS,IAAI,OAAO,IAAI,QAAQ;AAAA,EAC/H;AACA,SAAO,kBAAkB,OAAO,IAAI,QAAQ;AAC9C;AAEA,eAAsB,uBAAuB,MAKrB;AACtB,QAAM,EAAE,QAAQ,OAAO,YAAY,OAAO,WAAW,IAAI;AACzD,QAAM,SAAS,OAAO;AAEtB,eAAa,yCAAyC;AACtD,QAAM,EAAE,OAAO,IAAI,YAAY,WAAW,MAAM;AAChD,MAAI,WAAW,GAAG;AAChB,UAAM,IAAI;AAAA,MACR,SACI,gCAAgC,OAAO,SAAS,cAAc,OAAO,SAAS,2HAC9E;AAAA,IACN;AAAA,EACF;AACA,eAAa,4BAA4B;AAEzC,QAAM,YAAYK,kBAAiB,QAAQ,SAAS;AACpD,QAAM,aAAaP,MAAK,WAAW,SAAS;AAC5C,QAAM,cAAcA,MAAK,WAAW,UAAU;AAE9C,QAAM,gBAAgB,OAAO,WAAWC;AAExC,eAAa,iEAAiE;AAC9E,QAAM,WAAW,gBAAgB,eAAe,MAAM;AACtD,QAAM,uBAAuB,iBAAiB,QAAQ,OAAO,WAAW;AAExE,MAAI,YAAY;AAChB,MAAI,iBAAiB;AAErB,MAAI,SAAS,YAAY,GAAG;AAC1B,iBAAa,6BAA6B,aAAa,KAAK;AAC5D,UAAM,EAAE,QAAQ,OAAO,IAAI,YAAY,WAAW,aAAa,iBAAiB,MAAM;AACtF,QAAI,WAAW,QAAQ;AACrB,YAAM,YAAY,cAAc,MAAM,GAAG,cAAc,YAAY,GAAG,CAAC,KAAK;AAC5E,kBAAY,eAAe;AAAA,QACzB;AAAA,QACA,YAAY;AAAA,QACZ,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,kBAAY,eAAe;AAAA,QACzB;AAAA,QACA,YAAY;AAAA,QACZ,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,sBAAsB;AACxB,iBAAa,8BAA8B,oBAAoB,KAAK;AACpE,qBAAiB,eAAe;AAAA,MAC9B;AAAA,MACA,YAAY;AAAA,MACZ,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,aAAa,CAAC,gBAAgB;AACjC,QAAI,WAAW;AACb,MAAAJ,QAAO,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AACA,UAAM,eAAe,CAAC,eAAeK,uBAAsB,GAAG,uBAAuB,EAAE;AAAA,MACrF;AAAA,IACF;AACA,UAAM,mBAAmB,SACrB,8HACA;AACJ,UAAM,IAAI;AAAA,MACR,uDAAuD,YAAY,4EAA4E,gBAAgB;AAAA,IACjK;AAAA,EACF;AAEA,QAAM,SAAqB;AAAA,IACzB,WAAW;AAAA,IACX;AAAA,EACF;AAEA,MAAI,UAAW,QAAO,UAAU;AAChC,MAAI,eAAgB,QAAO,cAAc;AACzC,eAAa,oCAAoC;AAEjD,SAAO;AACT;AAEA,eAAsB,iBAAiB,MAGN;AAC/B,QAAM,EAAE,QAAQ,WAAW,IAAI;AAC/B,QAAM,SAAS,OAAO;AACtB,QAAM,QAAkB,CAAC;AAEzB,eAAa,kDAAkD;AAC/D,QAAM,aAAaR,WAAU,SAAS,CAAC,SAAS,GAAG,EAAE,OAAO,QAAQ,SAAS,IAAM,CAAC;AACpF,QAAM,sBAAsB,WAAW,WAAW;AAElD,MAAI,CAAC,qBAAqB;AACxB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM,OAAO;AAAA,MACb,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,kBAAkB;AAAA,MAClB,cAAc,kBAAkB;AAAA,MAChC,uBAAuB,CAAC;AAAA,MACxB,OAAO,CAAC,iEAAiE;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,cAAc,WAAW,QAAQ,SAAS,EAAE,KAAK,KAAK;AAC5D,eAAa,wCAAwC;AACrD,QAAM,eAAeA,WAAU,WAAW,CAAC,SAAS,GAAG,EAAE,OAAO,QAAQ,SAAS,IAAO,CAAC;AACzF,QAAM,aACJ,aAAa,WAAW,IAAI,aAAa,QAAQ,SAAS,EAAE,KAAK,IAAI;AACvE,QAAM,KAAK,2BAA2B,UAAU,GAAG;AAEnD,QAAM,SAASA,WAAU,WAAW,CAAC,QAAQ,GAAG,EAAE,OAAO,QAAQ,SAAS,IAAO,CAAC;AAClF,QAAM,uBAAuB,OAAO,WAAW;AAC/C,QAAM,kBAAkB,uBAAuB,OAAO,QAAQ,SAAS,EAAE,KAAK,IAAI;AAElF,MAAI,CAAC,sBAAsB;AACzB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM,OAAO;AAAA,MACb,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,kBAAkB;AAAA,MAClB,cAAc,kBAAkB;AAAA,MAChC,uBAAuB,CAAC;AAAA,MACxB,OAAO,CAAC,GAAG,OAAO,uCAAuC;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,KAAK,qBAAqB,eAAe,EAAE;AAEjD,eAAa,yCAAyC;AACtD,QAAM,EAAE,QAAQ,YAAY,IAAI,YAAY,WAAW,MAAM;AAC7D,QAAM,mBAAmB,gBAAgB;AAEzC,MAAI,CAAC,kBAAkB;AACrB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM,OAAO;AAAA,MACb,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB;AAAA,MACA,kBAAkB;AAAA,MAClB,cAAc,SACV,wBAAwB,OAAO,SAAS,eAAe,OAAO,SAAS,KACvE;AAAA,MACJ,cAAc,kBAAkB;AAAA,MAChC,uBAAuB,CAAC;AAAA,MACxB,OAAO;AAAA,QACL,GAAG;AAAA,QACH,SACI,iCAAiC,OAAO,SAAS,cAAc,OAAO,SAAS,0EAC/E;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,0BAA0B;AAErC,eAAa,qCAAqC;AAClD,QAAM,UAAU,gBAAgBO,sBAAqB,MAAM;AAC3D,QAAM,EAAE,QAAQ,gBAAgB,IAAI,YAAY,aAAaC,qBAAoB,IAAI,MAAM;AAC3F,QAAM,kBAAkB,mBAAmBA;AAC3C,QAAM,WAAW,gBAAgB,iBAAiB,MAAM;AAExD,MAAI,QAAQ,QAAQ;AAClB,UAAM;AAAA,MACJ,mBAAmB,QAAQ,IAAI,KAAK,QAAQ,SAAS,WAAWM,aAAY,QAAQ,UAAU,CAAC;AAAA,IACjG;AAAA,EACF,OAAO;AACL,UAAM,KAAK,sBAAsBP,oBAAmB,EAAE;AAAA,EACxD;AAEA,MAAI,SAAS,QAAQ;AACnB,UAAM;AAAA,MACJ,eAAe,SAAS,IAAI,KAAK,SAAS,SAAS,WAAWO,aAAY,SAAS,UAAU,CAAC;AAAA,IAChG;AAAA,EACF,OAAO;AACL,UAAM,KAAK,kBAAkB,eAAe,EAAE;AAAA,EAChD;AAEA,QAAM,wBAAwB,wBAAwB,IAAI,CAAC,YAAY;AACrE,UAAM,QAAQ,gBAAgB,SAAS,MAAM;AAC7C,QAAI,MAAM,QAAQ;AAChB,YAAM;AAAA,QACJ,yBAAyB,OAAO,KAAK,MAAM,SAAS,WAAWA,aAAY,MAAM,UAAU,CAAC;AAAA,MAC9F;AAAA,IACF,OAAO;AACL,YAAM,KAAK,4BAA4B,OAAO,EAAE;AAAA,IAClD;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,IACpB;AAAA,EACF,CAAC;AAED,QAAM,SAA8B;AAAA,IAClC,WAAW;AAAA,IACX,MAAM,OAAO;AAAA,IACb,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB;AAAA,IACA,kBAAkB;AAAA,IAClB,cAAc;AAAA,MACZ,eAAe,QAAQ;AAAA,MACvB,aAAa,QAAQ;AAAA,MACrB,kBAAkB,QAAQ;AAAA,MAC1B,mBAAmB,QAAQ;AAAA,MAC3B,gBAAgB,SAAS;AAAA,MACzB,cAAc,SAAS;AAAA,MACvB,mBAAmB,SAAS;AAAA,MAC5B,oBAAoB,SAAS;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,WAAsD;AAC1D,MAAI,YAAuD;AAE3D,MAAI,OAAO,WAAW,OAAO,aAAa;AACxC,eAAW,OAAO,UAAU,gBAAgB,OAAO,SAAS,MAAM,IAAI;AACtE,gBAAY,OAAO,cAAc,gBAAgB,OAAO,aAAa,MAAM,IAAI;AAE/E,WAAO,cAAc;AAAA,MACnB,eAAe,UAAU,UAAU;AAAA,MACnC,aAAa,OAAO,WAAW;AAAA,MAC/B,cAAc,UAAU,cAAc;AAAA,MACtC,mBAAmB,WAAW,UAAU;AAAA,MACxC,iBAAiB,OAAO,eAAe;AAAA,MACvC,mBAAmB,WAAW,aAAa;AAAA,MAC3C,oBAAoB,WAAW,cAAc;AAAA,IAC/C;AAEA,QAAI,UAAU,QAAQ;AACpB,YAAM,KAAK,mBAAmB,OAAO,OAAO,KAAKA,aAAY,SAAS,UAAU,CAAC,EAAE;AAAA,IACrF,WAAW,OAAO,SAAS;AACzB,YAAM,KAAK,mBAAmB,OAAO,OAAO,aAAa;AAAA,IAC3D;AAEA,QAAI,WAAW,QAAQ;AACrB,YAAM;AAAA,QACJ,wBAAwB,OAAO,WAAW,KAAK,UAAU,SAAS,WAAWA,aAAY,UAAU,UAAU,CAAC;AAAA,MAChH;AAAA,IACF,WAAW,OAAO,aAAa;AAC7B,YAAM,KAAK,wBAAwB,OAAO,WAAW,aAAa;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,oBACJ,QAAQ,YAAY,KACpB,SAAS,YAAY,KACrB,sBAAsB,KAAK,CAAC,SAAS,KAAK,YAAY,CAAC,MACtD,UAAU,aAAa,KAAK,MAC5B,WAAW,aAAa,KAAK;AAEhC,MAAI,CAAC,mBAAmB;AACtB,UAAM;AAAA,MACJ,SACI,iLACA;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB;AAC3B,SAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAaP;AAAA,IACb,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,cAAcC;AAAA,IACd,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,EACtB;AACF;AAEA,SAASM,aAAY,OAAuB;AAC1C,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;AACrD,QAAM,QAAQ,QAAQ,QAAQ;AAC9B,SAAO,GAAG,MAAM,QAAQ,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AACtD;;;ACreA,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,WAAAC,gBAAe;AAIjB,SAAS,iBAAiB,YAAoC;AACnE,QAAM,WAAWA,SAAQ,UAAU;AACnC,MAAI;AAEJ,MAAI;AACF,UAAMD,cAAa,UAAU,MAAM;AAAA,EACrC,QAAQ;AACN,UAAM,IAAI,MAAM,gCAAgC,QAAQ,EAAE;AAAA,EAC5D;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,oCAAoC,QAAQ,EAAE;AAAA,EAChE;AAEA,QAAM,SAAS;AACf,MAAI,CAAC,OAAO,WAAW,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG;AACrD,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,MAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAEA,SAAO,OAAO,QAAQ,IAAI,CAAC,UAAU,qBAAqB,KAAK,CAAC;AAClE;AAEA,SAAS,qBAAqB,OAAwC;AACpE,MAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AACjD,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAEA,QAAM,YAAY,MAAM,aAAa;AAErC,MAAI,cAAc,SAAS,cAAc,WAAW;AAClD,UAAM,IAAI;AAAA,MACR,WAAW,MAAM,IAAI,4BAA4B,SAAS;AAAA,IAC5D;AAAA,EACF;AAEA,MAAI,cAAc,WAAW;AAC3B,WAAO,qBAAqB,KAAK;AAAA,EACnC;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAEA,SAAS,iBAAiB,OAAwC;AAChE,MAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AACjD,UAAM,IAAI,MAAM,WAAW,MAAM,IAAI,6BAA6B;AAAA,EACpE;AAEA,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,WAAW;AAAA,IACX,MAAM,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,IACf,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,EACtB;AACF;AAEA,SAAS,qBAAqB,OAAwC;AACpE,MAAI,CAAC,MAAM,WAAW,OAAO,MAAM,YAAY,UAAU;AACvD,UAAM,IAAI,MAAM,WAAW,MAAM,IAAI,yDAAyD;AAAA,EAChG;AAEA,QAAM,EAAE,WAAW,eAAe,UAAU,IAAI,MAAM;AAEtD,MAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,UAAM,IAAI,MAAM,WAAW,MAAM,IAAI,iDAAiD;AAAA,EACxF;AACA,MAAI,CAAC,iBAAiB,OAAO,kBAAkB,UAAU;AACvD,UAAM,IAAI,MAAM,WAAW,MAAM,IAAI,sDAAsD;AAAA,EAC7F;AACA,MAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,UAAM,IAAI,MAAM,WAAW,MAAM,IAAI,iDAAiD;AAAA,EACxF;AAEA,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,WAAW;AAAA,IACX,MAAM,WAAW,UAAU,MAAM,GAAG,CAAC,CAAC;AAAA,IACtC,SAAS,MAAM;AAAA,IACf,aAAa,MAAM;AAAA,IACnB,SAAS,EAAE,WAAW,eAAe,UAAU;AAAA,EACjD;AACF;;;AHtFA,IAAM,oBAAoB;AAEnB,SAAS,yBACd,MACA,YAAY,SAAS,GACL;AAChB,QAAM,cAAc,SAAS,WAAW,WAAW,SAAS,WAAW,WAAW;AAElF,SAAO;AAAA,IACL,aAAa;AAAA,IACb,UAAU,GAAG,WAAW,MAAM,SAAS;AAAA,IACvC,YAAY;AAAA,EACd;AACF;AAEO,SAAS,0BAA0B,QAAsC;AAC9E,MAAI,OAAO,cAAc,WAAW;AAClC,WAAO;AAAA,MACL,aAAa;AAAA,MACb,UAAU,uBAAuB,OAAO,IAAI,IACxC,oBACA,cAAc,OAAO,IAAI;AAAA,MAC7B,YAAY,uBAAuB,OAAO,IAAI,IAAI,YAAY,OAAO;AAAA,IACvE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa;AAAA,IACb,UAAU,cAAc,OAAO,IAAI;AAAA,IACnC,YAAY,kBAAkB,OAAO,IAAI;AAAA,EAC3C;AACF;AAEO,SAAS,0BACd,SACA,YAAY,SAAS,GACL;AAChB,MAAI,QAAQ,YAAY,UAAU;AAChC,WAAO,yBAAyB,UAAU,SAAS;AAAA,EACrD;AAEA,QAAM,cAAc,QAAQ,eAAe,CAAC;AAC5C,QAAM,gBAAgB,QAAQ,iBAAiB;AAE/C,MAAI,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,kBAAkB,GAAG;AAC5E,WAAO,yBAAyB,UAAU,SAAS;AAAA,EACrD;AAEA,MAAI,uBAAuB,aAAa,GAAG;AACzC,WAAO;AAAA,MACL,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,aAAa,iCAAiC,aAAa;AACjE,MAAI,YAAY;AACd,WAAO;AAAA,MACL,aAAa;AAAA,MACb,UAAU,cAAc,UAAU;AAAA,MAClC,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,QAAQ,YAAY,UAAU;AAChC,WAAO,yBAAyB,UAAU,SAAS;AAAA,EACrD;AAEA,SAAO,yBAAyB,YAAY,SAAS;AACvD;AAEA,SAAS,uBAAuB,MAAuB;AACrD,SAAO,SAAS,oBAAoB,yBAAyB,KAAK,IAAI;AACxE;AAEA,SAAS,uBAAuB,eAAgC;AAC9D,SAAO,cAAc,WAAW,UAAU,KAAK,cAAc,WAAW,iBAAiB;AAC3F;AAEA,SAAS,iCAAiC,eAAsC;AAC9E,QAAM,QAAQ,cAAc,MAAM,GAAG;AACrC,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AAC1C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SAAO,kBAAkB,MAAM;AACjC;AAEA,SAAS,kBAAkB,QAAwB;AACjD,QAAM,SAAS,kBAAkB,MAAM;AACvC,SAAO,OAAO,QAAQ;AACxB;;;AIzGA,SAAS,gBAAAE,qBAAoB;AAEtB,SAAS,gBAAwB;AACtC,MAAI;AACF,UAAM,kBAAkB,IAAI,IAAI,mBAAmB,YAAY,GAAG;AAClE,UAAM,cAAc,KAAK,MAAMA,cAAa,iBAAiB,MAAM,CAAC;AAGpE,WAAO,YAAY,WAAW;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ApC0CA,IAAM,kBAAkB;AAExB,eAAe,iBACV,MACmC;AACtC,MAAI;AACF,WAAO,MAAM,kBAAkB,GAAG,IAAI;AAAA,EACxC,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,gBAAgB,KAAK,IAAI,OAAO,GAAG;AAC7D,YAAM,IAAI,YAAY,IAAI,OAAO;AAAA,IACnC;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,gBAAgB,SAA8B;AAClE,QAAM,SAAS,gBAAgB,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAE3D,MAAI,QAAQ,UAAU,CAAC,QAAQ,MAAM;AACnC,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,wBAAsB,QAAQ,OAAO;AACrC,gCAA8B,OAAO;AACrC,0BAAwB,OAAO;AAE/B,QAAM,cAAc,CAAC,QAAQ,QAAQ,QAAQ,cAAc,QAAQ,OAAO,EAAE;AAAA,IAC1E;AAAA,EACF,EAAE;AACF,MAAI,cAAc,GAAG;AACnB,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAEA,MAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,gBAAgB,CAAC,QAAQ,SAAS;AAChE,WAAO,cAAc,SAAS,MAAM;AAAA,EACtC;AAEA,MAAI,QAAQ,SAAS;AACnB,UAAM,gBAAgB,mBAAmB,OAAO;AAChD,UAAMC,UAAS,4BAA4B;AAAA,MACzC,SAAS;AAAA,MACT,eAAe,QAAQ;AAAA,MACvB,mBAAmB,QAAQ;AAAA,IAC7B,CAAC;AACD,WAAO,qBAAqBA,SAAQ,SAAS,MAAM;AAAA,EACrD;AAEA,MAAI,QAAQ,cAAc;AACxB,UAAM,UAAU,iBAAiB,QAAQ,YAAY;AACrD,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO,qBAAqB,QAAQ,CAAC,GAAG,SAAS,MAAM;AAAA,IACzD;AACA,WAAO,oBAAoB,SAAS,SAAS,MAAM;AAAA,EACrD;AAEA,QAAM,SAAS,QAAQ;AACvB,QAAM,SAAS,qBAAqB;AAAA,IAClC;AAAA,IACA,eAAe,QAAQ;AAAA,IACvB,mBAAmB,QAAQ;AAAA,EAC7B,CAAC;AACD,SAAO,qBAAqB,QAAQ,SAAS,MAAM;AACrD;AAEA,SAAS,mBAAmB,SAAyD;AACnF,MAAI,QAAQ,kBAAkB,QAAQ,sBAAsB,QAAQ,gBAAgB;AAClF,WAAO;AAAA,MACL,WAAW,QAAQ;AAAA,MACnB,eAAe,QAAQ;AAAA,MACvB,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,cACb,SACA,QACA;AACA,MAAI,QAAQ,gBAAgB;AAC1B,WAAO,QAAQ,yCAAyC;AACxD,WAAO,QAAQ,2BAA2B,QAAQ,cAAc,EAAE;AAElE,UAAMC,WAAU,MAAM,oBAAoB;AAAA,MACxC,gBAAgB,QAAQ;AAAA,MACxB,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,MAAM,QAAQ;AAAA,MACd,eAAe,QAAQ;AAAA,MACvB,YAAY,OAAO;AAAA,IACrB,CAAC;AAED,iBAAaA,UAAS,OAAO;AAE7B,QAAI,QAAQ,MAAM;AAChB,YAAM,OAAO,UAAU,yBAAyB,QAAQ,CAAC;AACzD,YAAM,WAAWA,UAAS,MAAM,OAAO;AAAA,IACzC;AAEA,oBAAgBA,UAAS,OAAO;AAChC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,UACJ,mBAAmB,QAAQ,YAAY,WAAW,WAAW,UAAU,YACvE;AAAA,EACN;AACA,MAAI,QAAQ,SAAS;AACnB,WAAO,QAAQ,kCAAkC,QAAQ,OAAO,EAAE;AAAA,EACpE;AACA,MAAI,QAAQ,aAAa;AACvB,WAAO,QAAQ,4CAA4C,QAAQ,WAAW,EAAE;AAAA,EAClF;AAEA,QAAM,UAAU,MAAM,cAAc;AAAA,IAClC,SAAS,QAAQ,WAAW;AAAA,IAC5B,SAAS,QAAQ;AAAA,IACjB,aAAa,QAAQ;AAAA,IACrB,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,eAAe,QAAQ;AAAA,IACvB,YAAY,OAAO;AAAA,EACrB,CAAC;AAED,eAAa,SAAS,OAAO;AAE7B,MAAI,QAAQ,MAAM;AAChB,UAAM,OAAO,UAAU,yBAAyB,QAAQ,OAAO,CAAC;AAChE,UAAM,WAAW,SAAS,MAAM,OAAO;AAAA,EACzC;AAEA,kBAAgB,SAAS,OAAO;AAClC;AAEA,SAAS,sBAAsB,SAA0C;AACvE,MAAI,CAAC,SAAS;AACZ;AAAA,EACF;AAEA,MAAI,YAAY,cAAc,YAAY,UAAU;AAClD,UAAM,IAAI;AAAA,MACR,wBAAwB,OAAO;AAAA,IACjC;AAAA,EACF;AACF;AAEA,SAAS,8BAA8B,SAA8B;AACnE,MAAI,CAAC,QAAQ,gBAAgB;AAC3B;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,QAAQ,UAAU,cAAc;AAAA,IAChC,QAAQ,UAAU,eAAe;AAAA,IACjC,QAAQ,cAAc,mBAAmB;AAAA,IACzC,QAAQ,SAAS,aAAa;AAAA,IAC9B,QAAQ,gBAAgB,sBAAsB;AAAA,IAC9C,QAAQ,oBAAoB,0BAA0B;AAAA,IACtD,QAAQ,eAAe,oBAAoB;AAAA,IAC3C,QAAQ,kBAAkB,wBAAwB;AAAA,IAClD,QAAQ,UAAU,cAAc;AAAA,IAChC,QAAQ,iBAAiB,cAAc;AAAA,IACvC,QAAQ,qBAAqB,kBAAkB;AAAA,IAC/C,QAAQ,iBAAiB,cAAc;AAAA,EACzC,EAAE,OAAO,CAAC,SAAyB,SAAS,IAAI;AAEhD,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,IAAI,MAAM,uDAAuD,UAAU,KAAK,IAAI,CAAC,GAAG;AAAA,EAChG;AACF;AAEA,SAAS,wBAAwB,SAA8B;AAC7D,MAAI,QAAQ,YAAY,UAAU;AAChC;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,QAAQ,SAAS,aAAa;AAAA,IAC9B,QAAQ,gBAAgB,sBAAsB;AAAA,IAC9C,QAAQ,oBAAoB,0BAA0B;AAAA,IACtD,QAAQ,eAAe,oBAAoB;AAAA,IAC3C,QAAQ,kBAAkB,wBAAwB;AAAA,IAClD,QAAQ,UAAU,cAAc;AAAA,IAChC,QAAQ,iBAAiB,cAAc;AAAA,IACvC,QAAQ,qBAAqB,kBAAkB;AAAA,IAC/C,QAAQ,iBAAiB,cAAc;AAAA,EACzC,EAAE,OAAO,CAAC,SAAyB,SAAS,IAAI;AAEhD,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,wDAAwD,UAAU,KAAK,IAAI,CAAC;AAAA,IAC9E;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,QAA8B;AACtD,MAAI,OAAO,cAAc,WAAW;AAClC,WAAO,6BAA6B,MAAM;AAAA,EAC5C;AACA,SAAO,4BAA4B,MAAM;AAC3C;AAEA,SAAS,UACP,QACA,OACA,WACA,YACqB;AACrB,MAAI,OAAO,cAAc,WAAW;AAClC,WAAO,uBAAuB,EAAE,QAAQ,OAAO,WAAW,WAAW,CAAC;AAAA,EACxE;AACA,SAAO,gBAAgB,EAAE,QAAQ,OAAO,WAAW,WAAW,CAAC;AACjE;AAEA,SAAS,eAAe,QAA8B;AACpD,MAAI,OAAO,cAAc,WAAW;AAClC,WAAO,OAAO,UACV,GAAG,OAAO,IAAI,qBAAqB,OAAO,QAAQ,UAAU,MAAM,GAAG,CAAC,CAAC,MACvE,GAAG,OAAO,IAAI;AAAA,EACpB;AACA,SAAO,OAAO;AAChB;AAEA,eAAe,qBACb,QACA,SACA,QACA;AACA,SAAO,KAAK,sBAAsB,eAAe,MAAM,CAAC,KAAK;AAE7D,QAAM,aAAa,MAAM;AAAA,IACvB;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACA,SAAO,QAAQ,mBAAmB,WAAW,SAAS,GAAG;AAEzD,MAAI;AACF,UAAM,wBAAwB,iBAAiB,MAAM;AACrD,UAAM,UAAU,MAAM,cAAc;AAAA,MAClC,SAAS;AAAA,MACT,SAAS,WAAW;AAAA,MACpB,aAAa,WAAW;AAAA,MACxB,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,MAAM,QAAQ;AAAA,MACd;AAAA,MACA,eAAe,QAAQ;AAAA,MACvB,YAAY,OAAO;AAAA,IACrB,CAAC;AAED,iBAAa,SAAS,OAAO;AAE7B,QAAI,QAAQ,MAAM;AAChB,YAAM,OAAO,UAAU,0BAA0B,MAAM,CAAC;AACxD,YAAM,WAAW,SAAS,MAAM,OAAO;AAAA,IACzC;AAEA,oBAAgB,SAAS,OAAO;AAAA,EAClC,UAAE;AACA,sBAAkB,YAAY,QAAQ,eAAe;AAAA,EACvD;AACF;AAEA,eAAe,oBACb,SACA,SACA,QACA;AACA,QAAM,UAA8D,CAAC;AACrE,QAAM,SAAoD,CAAC;AAE3D,aAAW,UAAU,SAAS;AAC5B,WAAO,KAAK,sBAAsB,OAAO,IAAI,KAAK,eAAe,MAAM,CAAC,MAAM;AAC9E,QAAI;AACF,YAAM,aAAa,MAAM;AAAA,QACvB;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AACA,cAAQ,KAAK,EAAE,QAAQ,WAAW,CAAC;AAAA,IACrC,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,aAAO,KAAK,EAAE,QAAQ,OAAO,QAAQ,CAAC;AACtC,cAAQ,OAAO,MAAM,cAAc,OAAO;AAAA,CAAI;AAAA,IAChD;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,gBAAgB,OAAO,IAAI,CAAC,MAAM,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI;AACnF,UAAM,IAAI,MAAM;AAAA,EAAgC,aAAa,EAAE;AAAA,EACjE;AAEA,MAAI;AACF,UAAM,YAA6E,CAAC;AACpF,eAAW,EAAE,QAAQ,WAAW,KAAK,SAAS;AAC5C,YAAM,wBAAwB,iBAAiB,MAAM;AACrD,YAAM,UAAU,MAAM,cAAc;AAAA,QAClC,SAAS;AAAA,QACT,SAAS,WAAW;AAAA,QACpB,aAAa,WAAW;AAAA,QACxB,OAAO,QAAQ;AAAA,QACf,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB,MAAM,QAAQ;AAAA,QACd;AAAA,QACA,eAAe,QAAQ;AAAA,QACvB,YAAY,OAAO;AAAA,MACrB,CAAC;AACD,gBAAU,KAAK,EAAE,MAAM,OAAO,MAAM,QAAQ,QAAQ,CAAC;AAAA,IACvD;AAEA,QAAI,QAAQ,MAAM;AAChB,YAAM,SACJ,UAAU,WAAW,IACjB,UAAU,CAAC,EAAE,UACb;AAAA,QACE,SAAS,UAAU,IAAI,CAAC,OAAO;AAAA,UAC7B,MAAM,EAAE;AAAA,UACR,GAAG,EAAE;AAAA,QACP,EAAE;AAAA,MACJ;AACN,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC7D,OAAO;AACL,iBAAW,EAAE,MAAM,QAAQ,KAAK,WAAW;AACzC,YAAI,UAAU,SAAS,GAAG;AACxB,kBAAQ,OAAO,MAAM;AAAA,EAAK,SAAI,OAAO,EAAE,CAAC;AAAA,YAAe,IAAI;AAAA,EAAK,SAAI,OAAO,EAAE,CAAC;AAAA;AAAA,CAAM;AAAA,QACtF;AAEA,YAAI,QAAQ,UAAU;AACpB,kBAAQ,OAAO,MAAM,GAAG,sBAAsB,OAAO,CAAC;AAAA,CAAI;AAAA,QAC5D,OAAO;AACL,kBAAQ,OAAO,MAAM,GAAG,sBAAsB,OAAO,CAAC;AAAA,CAAI;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,OAAO,MAAM,wCAAwC;AAC7D,iBAAW,EAAE,QAAQ,MAAM,KAAK,QAAQ;AACtC,gBAAQ,OAAO,MAAM,KAAK,OAAO,IAAI,KAAK,KAAK;AAAA,CAAI;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM;AAChB,iBAAW,EAAE,QAAQ,QAAQ,KAAK,WAAW;AAC3C,cAAM,OAAO,UAAU,0BAA0B,MAAM,CAAC;AACxD,cAAM,WAAW,SAAS,MAAM,OAAO;AAAA,MACzC;AAAA,IACF;AAEA,eAAW,EAAE,QAAQ,KAAK,WAAW;AACnC,sBAAgB,SAAS,OAAO;AAAA,IAClC;AAAA,EACF,UAAE;AACA,eAAW,EAAE,WAAW,KAAK,SAAS;AACpC,wBAAkB,YAAY,QAAQ,eAAe;AAAA,IACvD;AAAA,EACF;AACF;AAEA,SAAS,UAAU,OAIC;AAClB,SAAO;AAAA,IACL,YAAY,cAAc;AAAA,IAC1B,UAAU,MAAM;AAAA,IAChB,YAAY,MAAM;AAAA,IAClB,aAAa,MAAM;AAAA,EACrB;AACF;AAEA,eAAe,WACb,SACA,MACA,SACA;AACA,QAAM,UAAU,cAAc,SAAS,IAAI;AAE3C,MAAI,QAAQ,QAAQ;AAClB,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5D;AAAA,EACF;AAEA,QAAM,SAAS,eAAe;AAC9B,UAAQ,OAAO,MAAM,iBAAiB,QAAQ,OAAO,OAAO,OAAO,MAAM;AAAA,CAAO;AAEhF,QAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAE9C,MAAI,OAAO,IAAI;AACb,YAAQ,OAAO,MAAM,+BAA+B,OAAO,OAAO;AAAA,CAAM;AAAA,EAC1E,OAAO;AACL,UAAM,aAAa,OAAO,SAAS,IAAI,UAAU,OAAO,MAAM,MAAM;AACpE,UAAM,IAAI,MAAM,cAAc,UAAU,KAAK,OAAO,OAAO,EAAE;AAAA,EAC/D;AACF;AAEA,SAAS,aAAa,SAAuB,SAA8B;AACzE,MAAI,QAAQ,QAAQ,QAAQ,QAAQ;AAClC;AAAA,EACF;AAEA,MAAI,QAAQ,MAAM;AAChB,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5D;AAAA,EACF;AAEA,MAAI,QAAQ,UAAU;AACpB,YAAQ,OAAO,MAAM,GAAG,sBAAsB,OAAO,CAAC;AAAA,CAAI;AAC1D;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,GAAG,sBAAsB,OAAO,CAAC;AAAA,CAAI;AAC5D;AAEA,SAAS,gBAAgB,SAAuB,SAA8B;AAC5E,QAAM,WAAqB,CAAC;AAE5B,MACE,QAAQ,uBAAuB,UAC/B,QAAQ,sBAAsB,QAAQ,oBACtC;AACA,aAAS;AAAA,MACP,0BAA0B,QAAQ,sBAAsB,KAAK,QAAQ,CAAC,CAAC,wBAAwB,QAAQ,qBAAqB,KAAK,QAAQ,CAAC,CAAC;AAAA,IAC7I;AAAA,EACF;AAEA,MACE,QAAQ,sBAAsB,UAC9B,QAAQ,gBAAgB,QAAQ,mBAChC;AACA,aAAS;AAAA,MACP,gBAAgB,QAAQ,cAAc,QAAQ,CAAC,CAAC,uBAAuB,QAAQ,kBAAkB,QAAQ,CAAC,CAAC;AAAA,IAC7G;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,YAAQ,OAAO,MAAM;AAAA;AAAA,EAA0B,SAAS,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,CAAI;AAC3F,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,kBAAkB,YAAwB,WAAqB;AACtE,MAAI,UAAW;AACf,MAAI;AACF,IAAAC,QAAO,WAAW,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAC/D,QAAQ;AAAA,EAER;AACF;;;AqChgBA,SAAS,iBAAiB;AAS1B,IAAM,mBAAmB;AACzB,IAAMC,mBAAkB;AACxB,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AAExB,eAAsB,kBAAkB;AACtC,QAAM,WAAW,sBAAsB;AACvC,MAAI,UAAU;AACZ,YAAQ,OAAO;AAAA,MACb,4CAA4C,mBAAmB,CAAC;AAAA,MAAU,UAAU,cAAc,QAAQ,CAAC,CAAC;AAAA;AAAA,IAC9G;AACA;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,mBAAmB;AACtC,mBAAiB,KAAK,KAAK;AAC3B,QAAM,WAAW,KAAK,WAAW,WAAW,KAAK,QAAQ,MAAM;AAC/D,UAAQ,OAAO;AAAA,IACb;AAAA,EAAK,aAAa,4BAA4B,CAAC,GAAG,QAAQ;AAAA,uBAA2B,mBAAmB,CAAC;AAAA;AAAA,EAC3G;AACF;AAEA,eAAsB,qBAAoE;AACxF,QAAM,SAAS,QAAQ,IAAI,gBAAgBA;AAC3C,QAAM,gBAAgB,GAAG,MAAM;AAE/B,MAAI;AAMJ,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,eAAe,EAAE,QAAQ,OAAO,CAAC;AACzD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,KAAK,IAAI,UAAU,EAAE;AAAA,IACzD;AACA,qBAAkB,MAAM,IAAI,KAAK;AAAA,EACnC,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,UAAM,IAAI;AAAA,MACR,qCAAqC,GAAG;AAAA;AAAA,oCAA2C,gBAAgB;AAAA;AAAA,IACrG;AAAA,EACF;AAEA,QAAM,YAAY,eAAe,mBAAmB;AACpD,QAAM,gBAAgB,eAAe,YAAY,KAAK;AAEtD,UAAQ,OAAO;AAAA,IACb;AAAA;AAAA;AAAA,IAAyD,UAAU,SAAS,CAAC;AAAA;AAAA;AAAA,EAC/E;AACA,MAAI,eAAe,UAAU;AAC3B,YAAQ,OAAO,MAAM,cAAc,UAAU,eAAe,QAAQ,CAAC;AAAA;AAAA,CAAM;AAAA,EAC7E;AACA,UAAQ,OAAO,MAAM,iCAAiC;AAEtD,QAAM,YAAY,SAAS;AAE3B,QAAM,WAAW,GAAG,MAAM;AAC1B,QAAM,YAAY,KAAK,IAAI;AAE3B,SAAO,KAAK,IAAI,IAAI,YAAY,iBAAiB;AAC/C,UAAM,MAAM,KAAK,IAAI,cAAc,gBAAgB,CAAC;AAEpD,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,UAAU;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,YAAY,eAAe,WAAW,CAAC;AAAA,MAChE,CAAC;AAED,UAAI,IAAI,WAAW,KAAK;AACtB,eAAQ,MAAM,IAAI,KAAK;AAAA,MACzB;AAEA,UAAI,IAAI,WAAW,KAAK;AAEtB;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,KAAK;AACtB,cAAM,IAAI,MAAM,qCAAqC,cAAc,OAAO,CAAC,WAAW;AAAA,MACxF;AAEA,YAAM,OAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC/C,YAAM,IAAI,MAAM,KAAK,SAAS,6BAA6B,IAAI,MAAM,EAAE;AAAA,IACzE,SAAS,KAAK;AACZ,UACE,eAAe,UACd,IAAI,QAAQ,SAAS,SAAS,KAAK,IAAI,QAAQ,SAAS,YAAY,IACrE;AACA,cAAM;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,0CAA0C,cAAc,OAAO,CAAC,WAAW;AAC7F;AAEA,eAAe,YAAY,KAA4B;AACrD,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,eAAoB;AAClD,QAAM,EAAE,UAAAC,UAAS,IAAI,MAAM,OAAO,IAAS;AAE3C,QAAM,WAAmC;AAAA,IACvC,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAEA,QAAM,MAAM,SAASA,UAAS,CAAC;AAC/B,MAAI,CAAC,IAAK;AAEV,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,SAAK,GAAG,GAAG,IAAI,KAAK,UAAU,GAAG,CAAC,IAAI,MAAMA,SAAQ,CAAC;AAAA,EACvD,CAAC;AACH;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAACA,aAAY,WAAWA,UAAS,EAAE,CAAC;AACzD;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,QAAQ,OAAO,QAAQ,UAAU,QAAQ,IAAI,IAAI;AAC1D;AAEA,SAAS,aAAa,MAAsB;AAC1C,SAAO,QAAQ,OAAO,QAAQ,UAAU,SAAS,IAAI,IAAI;AAC3D;;;ACpIO,SAAS,uBAA0C;AACxD,MAAI;AACF,WAAO,eAAe;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,gCAAqD;AACzE,QAAM,OAAO,MAAM,mBAAmB;AACtC,mBAAiB,KAAK,KAAK;AAE3B,QAAM,WAAW,KAAK,WAAW,WAAW,KAAK,QAAQ,MAAM;AAC/D,UAAQ,OAAO;AAAA,IACb;AAAA,4BAA+B,QAAQ;AAAA,uBAA2B,mBAAmB,CAAC;AAAA;AAAA,EACxF;AAEA,SAAO,eAAe;AACxB;AAEO,SAAS,wBAAgC;AAC9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,iCAAiC,QAA4B;AAC3E,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACtCA,SAAS,SAAS,cAAc;AAQzB,SAAS,eAAwB;AACtC,SAAO,QAAQ,QAAQ,MAAM,SAAS,QAAQ,OAAO,KAAK;AAC5D;AAEA,eAAsB,cAAc,SAAiB,eAAe,MAAwB;AAC1F,SAAO,QAAQ;AAAA,IACb;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;AAEA,eAAsB,aAAgB,SAAiB,SAAwC;AAC7F,SAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;ACxBA,SAAS,gBAAAC,qBAAoB;AAgB7B,eAAsB,eAAe,SAA6B;AAChE,QAAM,UAAU,QAAQ,OAAO,oBAAoB,QAAQ,IAAI,IAAI,6BAA6B;AAEhG,MAAI,QAAQ,QAAQ;AAClB,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5D;AAAA,EACF;AAEA,QAAM,SAAS,eAAe;AAC9B,QAAM,UAAU,QAAQ,QAAQ;AAChC,UAAQ,OAAO,MAAM,iBAAiB,OAAO,OAAO,OAAO,MAAM;AAAA,CAAO;AAExE,QAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAE9C,MAAI,OAAO,IAAI;AACb,YAAQ,OAAO,MAAM,+BAA+B,OAAO,OAAO;AAAA,CAAM;AAAA,EAC1E,OAAO;AACL,UAAM,aAAa,OAAO,SAAS,IAAI,UAAU,OAAO,MAAM,MAAM;AACpE,UAAM,IAAI,MAAM,cAAc,UAAU,KAAK,OAAO,OAAO,EAAE;AAAA,EAC/D;AACF;AAEA,SAAS,oBAAoB,UAAoC;AAC/D,MAAI;AACJ,MAAI;AACF,UAAMC,cAAa,UAAU,MAAM;AAAA,EACrC,QAAQ;AACN,UAAM,IAAI,MAAM,qBAAqB,QAAQ,EAAE;AAAA,EACjD;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,2BAA2B,QAAQ,EAAE;AAAA,EACvD;AAEA,QAAM,UAAU;AAChB,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,WAAW,CAAC,QAAQ,MAAM;AACzD,UAAM,IAAI;AAAA,MACR,oFAAoF,QAAQ;AAAA,IAC9F;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,+BAAiD;AAC/D,QAAM,SAAS,iBAAiB;AAChC,MAAI;AAEJ,MAAI;AACF,gBAAY,yBAAyB,MAAM;AAAA,EAC7C,QAAQ;AACN,UAAM,IAAI;AAAA,MACR,wCAAwC,cAAc,OAAO,CAAC,sBAAsB,cAAc,oBAAoB,CAAC;AAAA,IACzH;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR,0CAA0C,cAAc,OAAO,CAAC,sBAAsB,cAAc,oBAAoB,CAAC;AAAA,IAC3H;AAAA,EACF;AAEA,QAAM,SAAS,UAAU,CAAC;AAC1B,QAAM,OAAOC,WAAU,MAAM;AAE7B,UAAQ,OAAO;AAAA,IACb,mCAAmC,OAAO,OAAO,KAAK,OAAO,WAAW;AAAA;AAAA,EAC1E;AAEA,SAAO,cAAc,QAAQ,IAAI;AACnC;AAEA,SAASA,WAAU,SAA2E;AAC5F,QAAM,aAAa,0BAA0B,OAAO;AACpD,SAAO;AAAA,IACL,YAAY,cAAc;AAAA,IAC1B,UAAU,WAAW;AAAA,IACrB,YAAY,WAAW;AAAA,IACvB,aAAa,WAAW;AAAA,EAC1B;AACF;;;ACnFA,eAAsB,oBAAoB;AACxC,QAAM,eAAe;AACvB;AAEA,eAAsB,eAAe,SAGhB;AACnB,MAAI,CAAC,SAAS,gBAAgB;AAC5B,YAAQ,OAAO,MAAM,GAAG,sBAAsB,CAAC;AAAA,CAAI;AAAA,EACrD;AAEA,MAAI,SAAS,qBAAqB;AAClC,MAAI,QAAQ;AACV,YAAQ,OAAO,MAAM,iCAAiC;AAAA,EACxD,OAAO;AACL,QAAI,CAAC,aAAa,GAAG;AACnB,cAAQ,OAAO;AAAA,QACb,6CAA6C,cAAc,SAAS,CAAC;AAAA,MAA0E,cAAc,OAAO,CAAC;AAAA;AAAA,MACvK;AACA,cAAQ,WAAW;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,MAAM,cAAc,8BAA8B,IAAI;AAC1E,QAAI,CAAC,aAAa;AAChB,cAAQ,OAAO;AAAA,QACb;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,aAAS,MAAM,8BAA8B;AAAA,EAC/C;AAEA,MAAI,CAAC,aAAa,GAAG;AACnB,QAAI,CAAC,SAAS,cAAc;AAC1B,cAAQ,OAAO;AAAA,QACb,mDAAmD,cAAc,MAAM,CAAC;AAAA;AAAA,MAC1E;AAAA,IACF,OAAO;AACL,cAAQ,OAAO;AAAA,QACb,gCAAgC,cAAc,MAAM,CAAC;AAAA;AAAA,MACvD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM;AAAA,IACvB,SAAS,eACL,mCACA;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,CAAC,YAAY;AACf,YAAQ,OAAO;AAAA,MACb,SAAS,eACL,qBAAqB,cAAc,MAAM,CAAC;AAAA,IAC1C,qBAAqB,cAAc,MAAM,CAAC;AAAA;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,eACrB,cAAc,QAAQ,cAAc,eAAe,QAAQ,YAAY,CAAC,IACxE,sBAAsB;AAE1B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,SAAS,UAAU,eAAe,CAAC;AAC7D,SAAO;AACT;AAEA,SAAS,eAAe,SAAwC;AAC9D,QAAM,aAAa,yBAAyB,QAAQ,OAAO;AAC3D,SAAO;AAAA,IACL,YAAY,cAAc;AAAA,IAC1B,UAAU,WAAW;AAAA,IACrB,YAAY,WAAW;AAAA,IACvB,aAAa,WAAW;AAAA,EAC1B;AACF;AAEA,SAAS,wBAAwB;AAC/B,MAAI;AACF,WAAO,6BAA6B;AAAA,EACtC,SAAS,OAAO;AACd,QAAI,iBAAiB,eAAgB,iBAAiB,SAAS,MAAM,SAAS,eAAgB;AAC5F,cAAQ,OAAO;AAAA,QACb,GAAG,iBAAiB,QAAQ,MAAM,UAAU,kCAAkC;AAAA;AAAA,MAChF;AACA,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,oBACb,SACA,QACA;AACA,UAAQ,OAAO,MAAM,iBAAiB,QAAQ,QAAQ,OAAO,OAAO,OAAO,MAAM;AAAA,CAAO;AACxF,QAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAE9C,MAAI,OAAO,IAAI;AACb,YAAQ,OAAO,MAAM,+BAA+B,OAAO,OAAO;AAAA,CAAM;AACxE;AAAA,EACF;AAEA,QAAM,aAAa,OAAO,SAAS,IAAI,UAAU,OAAO,MAAM,MAAM;AACpE,QAAM,IAAI,MAAM,cAAc,UAAU,KAAK,OAAO,OAAO,EAAE;AAC/D;;;AClGA,eAAsB,iBAAiB,SAA+B;AACpE,QAAM,SAAS,gBAAgB,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAC3D,EAAAC,uBAAsB,QAAQ,OAAO;AACrC,EAAAC,+BAA8B,OAAO;AACrC,EAAAC,yBAAwB,OAAO;AAE/B,MAAI,QAAQ,SAAS;AACnB,WAAO,QAAQ,qCAAqC;AACpD,UAAM,gBAAgBC,oBAAmB,OAAO;AAChD,UAAM,SAAS,4BAA4B;AAAA,MACzC,SAAS;AAAA,MACT,eAAe,QAAQ;AAAA,MACvB,mBAAmB,QAAQ;AAAA,IAC7B,CAAC;AAED,UAAMC,UAAS,MAAM,iBAAiB,EAAE,QAAQ,YAAY,OAAO,QAAQ,CAAC;AAC5E,YAAQ,OAAO,MAAM,GAAG,0BAA0BA,OAAM,CAAC;AAAA,CAAI;AAC7D;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,WAAO,QAAQ,sCAAsC,QAAQ,MAAM,GAAG;AACtE,UAAM,SAAS,qBAAqB;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,eAAe,QAAQ;AAAA,MACvB,mBAAmB,QAAQ;AAAA,IAC7B,CAAC;AAED,UAAMA,UAAS,MAAM,gBAAgB,EAAE,QAAQ,YAAY,OAAO,QAAQ,CAAC;AAC3E,YAAQ,OAAO,MAAM,GAAG,yBAAyBA,OAAM,CAAC;AAAA,CAAI;AAC5D;AAAA,EACF;AAEA,MAAI,QAAQ,gBAAgB;AAC1B,WAAO,QAAQ,oDAAoD;AACnE,WAAO,QAAQ,2BAA2B,QAAQ,cAAc,EAAE;AAClE,UAAMA,UAAS,MAAM,qBAAqB;AAAA,MACxC,gBAAgB,QAAQ;AAAA,MACxB,YAAY,OAAO;AAAA,IACrB,CAAC;AACD,YAAQ,OAAO,MAAM,GAAG,yBAAyBA,OAAM,CAAC;AAAA,CAAI;AAC5D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,UACJ,oBAAoB,QAAQ,YAAY,WAAW,WAAW,UAAU,sBACxE;AAAA,EACN;AACA,MAAI,QAAQ,SAAS;AACnB,WAAO,QAAQ,kCAAkC,QAAQ,OAAO,EAAE;AAAA,EACpE;AACA,MAAI,QAAQ,aAAa;AACvB,WAAO,QAAQ,4CAA4C,QAAQ,WAAW,EAAE;AAAA,EAClF;AAEA,QAAM,SAAS,MAAM,mBAAmB;AAAA,IACtC,SAAS,QAAQ,WAAW;AAAA,IAC5B,SAAS,QAAQ;AAAA,IACjB,aAAa,QAAQ;AAAA,IACrB,YAAY,OAAO;AAAA,EACrB,CAAC;AAED,UAAQ,OAAO,MAAM,GAAG,mBAAmB,QAAQ,EAAE,eAAe,QAAQ,cAAc,CAAC,CAAC;AAAA,CAAI;AAClG;AAEA,SAASJ,uBAAsB,SAA2C;AACxE,MAAI,CAAC,SAAS;AACZ;AAAA,EACF;AAEA,MAAI,YAAY,cAAc,YAAY,UAAU;AAClD,UAAM,IAAI;AAAA,MACR,wBAAwB,OAAO;AAAA,IACjC;AAAA,EACF;AACF;AAEA,SAASC,+BAA8B,SAA+B;AACpE,MAAI,CAAC,QAAQ,gBAAgB;AAC3B;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,QAAQ,UAAU,cAAc;AAAA,IAChC,QAAQ,UAAU,eAAe;AAAA,IACjC,QAAQ,cAAc,mBAAmB;AAAA,IACzC,QAAQ,SAAS,aAAa;AAAA,IAC9B,QAAQ,gBAAgB,sBAAsB;AAAA,IAC9C,QAAQ,oBAAoB,0BAA0B;AAAA,IACtD,QAAQ,UAAU,cAAc;AAAA,IAChC,QAAQ,iBAAiB,cAAc;AAAA,IACvC,QAAQ,qBAAqB,kBAAkB;AAAA,IAC/C,QAAQ,iBAAiB,cAAc;AAAA,EACzC,EAAE,OAAO,CAAC,SAAyB,SAAS,IAAI;AAEhD,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,IAAI,MAAM,uDAAuD,UAAU,KAAK,IAAI,CAAC,GAAG;AAAA,EAChG;AACF;AAEA,SAASC,yBAAwB,SAA+B;AAC9D,MAAI,QAAQ,YAAY,UAAU;AAChC;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,QAAQ,SAAS,aAAa;AAAA,IAC9B,QAAQ,gBAAgB,sBAAsB;AAAA,IAC9C,QAAQ,oBAAoB,0BAA0B;AAAA,IACtD,QAAQ,UAAU,cAAc;AAAA,IAChC,QAAQ,iBAAiB,cAAc;AAAA,IACvC,QAAQ,qBAAqB,kBAAkB;AAAA,IAC/C,QAAQ,iBAAiB,cAAc;AAAA,EACzC,EAAE,OAAO,CAAC,SAAyB,SAAS,IAAI;AAEhD,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,wDAAwD,UAAU,KAAK,IAAI,CAAC;AAAA,IAC9E;AAAA,EACF;AACF;AAEA,SAASC,oBAAmB,SAA0D;AACpF,MAAI,QAAQ,kBAAkB,QAAQ,sBAAsB,QAAQ,gBAAgB;AAClF,WAAO;AAAA,MACL,WAAW,QAAQ;AAAA,MACnB,eAAe,QAAQ;AAAA,MACvB,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASE,aAAY,OAAuB;AAC1C,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;AACrD,QAAM,QAAQ,QAAQ,QAAQ;AAC9B,SAAO,GAAG,MAAM,QAAQ,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AACtD;AAEA,SAAS,yBAAyB,QAAoC;AACpE,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,SAAS,OAAO,IAAI;AAAA,IACpB,qBAAqB,OAAO,kBAAkB,OAAO,QAAQ;AAAA,EAC/D;AAEA,MAAI,CAAC,OAAO,iBAAiB;AAC3B,aAAS,KAAK,IAAI,GAAG,OAAO,MAAM,IAAI,CAAC,MAAM,YAAY,CAAC,EAAE,CAAC;AAC7D,WAAO,SAAS,KAAK,IAAI;AAAA,EAC3B;AAEA,WAAS;AAAA,IACP,kBAAkB,OAAO,sBAAsB,cAAc,WAAW;AAAA,IACxE,mBAAmB,OAAO,uBAAuB,cAAc,WAAW;AAAA,IAC1E;AAAA,IACA;AAAA,IACA,qBAAqB,OAAO,aAAa,WAAW,MAClD,OAAO,aAAa,gBAChB,GAAG,OAAO,aAAa,gBAAgB,WAAWA,aAAY,OAAO,aAAa,iBAAiB,CAAC,KACpG,WACN;AAAA,IACA,sBAAsB,OAAO,aAAa,YAAY,MACpD,OAAO,aAAa,iBAChB,GAAG,OAAO,aAAa,iBAAiB,WAAWA,aAAY,OAAO,aAAa,kBAAkB,CAAC,KACtG,WACN;AAAA,EACF;AAEA,MAAI,OAAO,aAAa;AACtB,aAAS,KAAK,IAAI,iBAAiB;AACnC,QAAI,OAAO,YAAY,aAAa;AAClC,eAAS;AAAA,QACP,sBAAsB,OAAO,YAAY,WAAW,MAClD,OAAO,YAAY,gBACfA,aAAY,OAAO,YAAY,YAAY,IAC3C,WACN;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY,iBAAiB;AACtC,eAAS;AAAA,QACP,0BAA0B,OAAO,YAAY,eAAe,MAC1D,OAAO,YAAY,oBACf,GAAG,OAAO,YAAY,iBAAiB,WAAWA,aAAY,OAAO,YAAY,kBAAkB,CAAC,KACpG,WACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,KAAK,IAAI,YAAY,GAAG,OAAO,MAAM,IAAI,CAAC,MAAM,YAAY,CAAC,EAAE,CAAC;AAEzE,SAAO,SAAS,KAAK,IAAI;AAC3B;AAEA,SAAS,0BAA0B,QAAqC;AACtE,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,WAAW,OAAO,IAAI;AAAA,IACtB,gBAAgB,OAAO,sBAAsB,cAAc,eAAe;AAAA,EAC5E;AAEA,MAAI,CAAC,OAAO,qBAAqB;AAC/B,aAAS,KAAK,IAAI,GAAG,OAAO,MAAM,IAAI,CAAC,MAAM,aAAa,CAAC,EAAE,CAAC;AAC9D,WAAO,SAAS,KAAK,IAAI;AAAA,EAC3B;AAEA,WAAS,KAAK,mBAAmB,OAAO,uBAAuB,OAAO,mBAAmB,EAAE;AAE3F,MAAI,CAAC,OAAO,sBAAsB;AAChC,aAAS,KAAK,IAAI,GAAG,OAAO,MAAM,IAAI,CAAC,MAAM,aAAa,CAAC,EAAE,CAAC;AAC9D,WAAO,SAAS,KAAK,IAAI;AAAA,EAC3B;AAEA,MAAI,OAAO,iBAAiB;AAC1B,aAAS,KAAK,SAAS,OAAO,eAAe,EAAE;AAAA,EACjD;AAEA,WAAS,KAAK,sBAAsB,OAAO,mBAAmB,OAAO,QAAQ,EAAE;AAE/E,MAAI,CAAC,OAAO,kBAAkB;AAC5B,QAAI,OAAO,cAAc;AACvB,eAAS,KAAK,UAAU,OAAO,YAAY,EAAE;AAAA,IAC/C;AACA,aAAS,KAAK,IAAI,GAAG,OAAO,MAAM,IAAI,CAAC,MAAM,aAAa,CAAC,EAAE,CAAC;AAC9D,WAAO,SAAS,KAAK,IAAI;AAAA,EAC3B;AAEA,WAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA,sBAAsB,OAAO,aAAa,WAAW,MACnD,OAAO,aAAa,gBAChB,GAAG,OAAO,aAAa,gBAAgB,WAAWA,aAAY,OAAO,aAAa,iBAAiB,CAAC,KACpG,WACN;AAAA,IACA,uBAAuB,OAAO,aAAa,YAAY,MACrD,OAAO,aAAa,iBAChB,GAAG,OAAO,aAAa,iBAAiB,WAAWA,aAAY,OAAO,aAAa,kBAAkB,CAAC,KACtG,WACN;AAAA,EACF;AAEA,MAAI,OAAO,sBAAsB,SAAS,GAAG;AAC3C,aAAS,KAAK,IAAI,4BAA4B;AAC9C,eAAW,OAAO,OAAO,uBAAuB;AAC9C,eAAS;AAAA,QACP,aAAa,IAAI,IAAI,KACnB,IAAI,SAAS,GAAG,IAAI,SAAS,WAAWA,aAAY,IAAI,UAAU,CAAC,KAAK,WAC1E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,aAAa;AACtB,aAAS,KAAK,IAAI,iBAAiB;AACnC,QAAI,OAAO,YAAY,aAAa;AAClC,eAAS;AAAA,QACP,uBAAuB,OAAO,YAAY,WAAW,MACnD,OAAO,YAAY,gBACfA,aAAY,OAAO,YAAY,YAAY,IAC3C,WACN;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY,iBAAiB;AACtC,eAAS;AAAA,QACP,2BAA2B,OAAO,YAAY,eAAe,MAC3D,OAAO,YAAY,oBACf,GAAG,OAAO,YAAY,iBAAiB,WAAWA,aAAY,OAAO,YAAY,kBAAkB,CAAC,KACpG,WACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,KAAK,IAAI,YAAY,GAAG,OAAO,MAAM,IAAI,CAAC,MAAM,aAAa,CAAC,EAAE,CAAC;AAE1E,SAAO,SAAS,KAAK,IAAI;AAC3B;;;AC5TA,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAY9B,IAAM,iBAAiB;AAIvB,eAAsB,qBAAqB;AACzC,QAAM,gBAAgB;AACxB;AAEA,eAAsB,kBAAkB;AACtC,MAAI,SAAS,qBAAqB;AAElC,MAAI,CAAC,QAAQ;AACX,YAAQ,OAAO,MAAM,GAAG,sBAAsB,CAAC;AAAA,CAAI;AACnD,YAAQ,OAAO,MAAM,sEAAsE;AAAA,EAC7F;AAEA,MAAI,CAAC,aAAa,GAAG;AACnB,YAAQ,OAAO;AAAA,MACb,GAAG,cAAc,WAAW,CAAC;AAAA;AAAA,IAC/B;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AACX,UAAM,cAAc,MAAM,cAAc,qCAAqC,IAAI;AACjF,QAAI,CAAC,aAAa;AAChB,cAAQ,OAAO;AAAA,QACb,iCAAiC,cAAc,WAAW,CAAC;AAAA;AAAA,MAC7D;AACA;AAAA,IACF;AAEA,aAAS,MAAM,8BAA8B;AAAA,EAC/C;AAEA,UAAQ,OAAO,MAAM,GAAG,iCAAiC,MAAM,CAAC;AAAA,CAAI;AAEpE,QAAM,SAAS,MAAM,aAAwB,8CAA8C;AAAA,IACzF;AAAA,MACE,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF,CAAC;AAED,QAAM,UAAU,KAAK,UAAU,qBAAqB,MAAM,GAAG,MAAM,CAAC;AAEpE,MAAI,WAAW,UAAU;AACvB,UAAM,kBAAkB,SAAS,MAAM;AACvC;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAEnC,MAAI,WAAW,eAAe;AAC5B,YAAQ,OAAO;AAAA,MACb;AAAA,IACF;AACA;AAAA,EACF;AAEA,UAAQ,OAAO;AAAA,IACb,kEAAkE,cAAc;AAAA;AAAA,EAClF;AACF;AAEA,eAAe,kBAAkB,SAAiB,QAAoB;AACpE,QAAM,YAAYC,MAAK,QAAQ,IAAI,GAAG,SAAS;AAC/C,QAAM,mBAAmBA,MAAK,WAAW,UAAU;AAEnD,MAAIC,YAAW,SAAS,GAAG;AACzB,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAEA,QAAI,aAAa;AACf,wBAAkB,kBAAkB,MAAM;AAC1C,cAAQ,OAAO,MAAM,8BAA8B,gBAAgB;AAAA,CAAK;AACxE;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AACnC,UAAQ,OAAO;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,QAAoB;AAChD,SAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,KAAK;AAAA,QACL,SAAS;AAAA,UACP,eAAe,UAAU,OAAO,MAAM;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,UAAkB,QAAoB;AAC/D,EAAAC,WAAUC,SAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAEhD,MAAI,SAGA,CAAC;AAEL,MAAIF,YAAW,QAAQ,GAAG;AACxB,QAAI;AACF,eAAS,KAAK,MAAMG,cAAa,UAAU,MAAM,CAAC;AAAA,IACpD,QAAQ;AACN,YAAM,IAAI,MAAM,oCAAoC,QAAQ,EAAE;AAAA,IAChE;AAAA,EACF;AAEA,QAAM,kBAAkB,OAAO;AAC/B,MAAI,mBAAmB,OAAO,oBAAoB,UAAU;AAC1D,UAAM,IAAI,MAAM,oDAAoD,QAAQ,EAAE;AAAA,EAChF;AAEA,SAAO,aAAa;AAAA,IAClB,GAAI,mBAAmB,CAAC;AAAA,IACxB,MAAM,qBAAqB,MAAM,EAAE,WAAW;AAAA,EAChD;AAEA,EAAAC,eAAc,UAAU,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAChE;;;AC1IA,eAAsB,iBAAiB;AACrC,MAAI,CAAC,aAAa,GAAG;AACnB,YAAQ,OAAO;AAAA,MACb,GAAG,cAAc,MAAM,CAAC,wCAAwC,cAAc,OAAO,CAAC;AAAA;AAAA,IACxF;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,yBAAyB,EAAE,SAAS,OAAO,CAAC;AACrE,QAAM,SAAS,WAAW,OAAO,CAAC,cAAc,UAAU,MAAM;AAEhE,MAAI,OAAO,WAAW,GAAG;AACvB,yBAAqB;AACrB;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,cAAc,MAAM;AAC1C,MAAI,CAAC,SAAS;AACZ;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,kBAAkB;AAAA,MACtC;AAAA,MACA,eAAe,cAAc,EAAE;AAAA,IACjC,CAAC;AAED,YAAQ,OAAO,MAAM,GAAG,sBAAsB,OAAO,CAAC;AAAA,CAAI;AAC1D,YAAQ,OAAO;AAAA,MACb;AAAA,kCAAqC,cAAc,iBAAiB,CAAC;AAAA;AAAA,IACvE;AAEA,UAAM,eAAe,qBAAqB;AAC1C,YAAQ,OAAO;AAAA,MACb,GACE,eACI,oHACA,sBAAsB,CAC5B;AAAA;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM,cAAc,4CAA4C,IAAI;AAC1F,QAAI,CAAC,eAAe;AAClB,cAAQ,OAAO;AAAA,QACb,iCAAiC,cAAc,SAAS,CAAC,OAAO,cAAc,WAAW,CAAC;AAAA;AAAA,MAC5F;AACA;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,eAAe;AAAA,MACrC,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB,CAAC;AAED,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,cAAc,0BAA0B,IAAI;AACzE,QAAI,CAAC,gBAAgB;AACnB,cAAQ,OAAO;AAAA,QACb,iCAAiC,cAAc,WAAW,CAAC;AAAA;AAAA,MAC7D;AACA;AAAA,IACF;AAEA,UAAM,gBAAgB;AAAA,EACxB,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,UAAM,cAAc,kBAAkB,OAAO,EAAE;AAC/C,YAAQ,OAAO;AAAA,MACb,GAAG;AAAA,QACD,GAAG,WAAW,kBAAkB,OAAO;AAAA,QACvC,OAAO,cAAc,CAAC,UAAU,aAAa,OAAO,CAAC,CAAC;AAAA,QACtD,UAAU,cAAc,iBAAiB,CAAC;AAAA,MAC5C,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,IACd;AACA,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,eAAe,cAAc,YAA8D;AACzF,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,YAAY,WAAW,CAAC;AAC9B,YAAQ,OAAO,MAAM,GAAG,kBAAkB,SAAS,CAAC;AAAA,CAAI;AAExD,UAAM,cAAc,MAAM;AAAA,MACxB,kBAAkB,UAAU,QAAQ,WAAW;AAAA,MAC/C;AAAA,IACF;AACA,QAAI,CAAC,aAAa;AAChB,cAAQ,OAAO;AAAA,QACb,gCAAgC,cAAc,CAAC,SAAS,aAAa,UAAU,QAAQ,OAAO,CAAC,CAAC;AAAA;AAAA,MAClG;AACA,aAAO;AAAA,IACT;AAEA,WAAO,UAAU,QAAQ;AAAA,EAC3B;AAEA,SAAO,aAA2B,4CAA4C;AAAA,IAC5E,GAAG,WAAW,IAAI,CAAC,eAAe;AAAA,MAChC,MAAM,UAAU,QAAQ;AAAA,MACxB,OAAO,UAAU,QAAQ;AAAA,MACzB,aAAa,gBAAgB,SAAS;AAAA,IACxC,EAAE;AAAA,EACJ,CAAC;AACH;AAEA,SAAS,kBAAkB,WAAqC;AAC9D,SAAO,eAAe,UAAU,QAAQ,WAAW,UAAU,gBAAgB,SAAS,CAAC;AACzF;AAEA,SAAS,gBAAgB,WAAqC;AAC5D,QAAM,QAAQ,IAAI,IAAI,UAAU,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC;AACpE,QAAM,UAAU;AAAA,IACd,MAAM,IAAI,SAAS,IAAI,iBAAiB;AAAA,IACxC,MAAM,IAAI,UAAU,IAAI,wBAAwB;AAAA,EAClD,EAAE,OAAO,CAAC,WAA6B,WAAW,IAAI;AAEtD,SAAO,QAAQ,KAAK,OAAO;AAC7B;AAEA,SAAS,uBAAuB;AAC9B,QAAM,mBAAmB,kBAAkB,UAAU,EAAE,aAAa;AACpE,QAAM,iBAAiB,kBAAkB,QAAQ,EAAE,aAAa;AAEhE,UAAQ,OAAO;AAAA,IACb,GAAG;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,MACA,4BAA4B,iBAAiB,cAAc;AAAA,MAC3D,mCAAmC,iBAAiB,eAAe;AAAA,MACnE,0BAA0B,eAAe,cAAc;AAAA,MACvD,iCAAiC,eAAe,eAAe;AAAA,MAC/D;AAAA,MACA;AAAA,MACA,2BAA2B,cAAc,2DAA2D,CAAC,OAAO,cAAc,2DAA2D,CAAC;AAAA,MACtL,yBAAyB,cAAc,4DAA4D,CAAC,OAAO,cAAc,0DAA0D,CAAC;AAAA,MACpL,2BAA2B,cAAc,0BAA0B,CAAC;AAAA,MACpE,4BAA4B,cAAc,iBAAiB,CAAC;AAAA,IAC9D,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,EACd;AACF;;;AC/JO,SAAS,mBAAmB;AACjC,QAAM,UAAU,iBAAiB;AAEjC,MAAI,SAAS;AACX,YAAQ,OAAO,MAAM,4BAA4B,mBAAmB,CAAC;AAAA,CAAK;AAAA,EAC5E,OAAO;AACL,YAAQ,OAAO,MAAM,oDAAoD;AAAA,EAC3E;AACF;;;ACRO,SAAS,eAAe,SAAiB,SAAyB;AACvE,SAAO,GAAG,QAAQ,IAAI,IAAI,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAK/B,cAAc,uBAAuB,QAAQ,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBxD;AAEO,SAAS,eAAe,eAAuB;AACpD,SAAO,GAAG,cAAc,QAAQ,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK5C,cAAc,QAAQ,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUxC;AAEO,SAAS,gBAAgB,eAAuB;AACrD,SAAO,GAAG,cAAc,SAAS,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK7C,cAAc,mBAAmB,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CnD;AAEO,SAAS,eAAe,eAAuB;AACpD,SAAO,GAAG,cAAc,QAAQ,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK5C,cAAc,kBAAkB,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAUrC,cAAc,WAAW,aAAa,CAAC,UAAU,cAAc,SAAS,aAAa,CAAC;AAAA;AAAA;AAGnG;AAEO,SAAS,iBAAiB,eAAuB;AACtD,SAAO,GAAG,cAAc,UAAU,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK9C,cAAc,oBAAoB,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BpD;AAEO,SAAS,kBAAkB,eAAuB;AACvD,SAAO,GAAG,cAAc,WAAW,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK/C,cAAc,WAAW,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMnB,cAAc,QAAQ,aAAa,CAAC;AAAA;AAAA;AAAA;AAI5D;AAEO,SAAS,mBAAmB,eAAuB;AACxD,SAAO,GAAG,cAAc,aAAa,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKjD,cAAc,aAAa,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAU7C;;;AhDpHA,IAAM,UAAU,cAAc;AAC9B,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAM,iBAAiB,sBAAsB;AAE7C,IAAM,UAAU,KAAK,CAAC;AAEtB,IAAI,CAAC,WAAW,YAAY,YAAY,YAAY,QAAQ,YAAY,QAAQ;AAC9E,UAAQ,OAAO,MAAM,eAAe,SAAS,cAAc,CAAC;AAC5D,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAI,YAAY,eAAe,YAAY,QAAQ,YAAY,WAAW;AACxE,UAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AACnC,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAI,EAAE,MAAM,CAAC,UAAmB;AAC9B,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,UAAQ,OAAO,MAAM,GAAG,WAAW,GAAG,eAAe,IAAI,YAAY,OAAO,EAAE,CAAC;AAAA,CAAI;AACnF,UAAQ,WAAW,iBAAiB,cAAc,IAAI;AACxD,CAAC;AAED,eAAe,MAAM;AACnB,MAAI,YAAY,SAAS;AACvB,UAAM,UAAU,kBAAkB,KAAK,MAAM,CAAC,CAAC;AAC/C,QAAI,QAAQ,QAAQ,QAAQ,UAAU;AACpC,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAEA,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,eAAe,eAAe;AAAA,IAChC,CAAC;AACD;AAAA,EACF;AAEA,MAAI,YAAY,QAAQ;AACtB,4BAAwB,KAAK,MAAM,CAAC,GAAG,eAAe,eAAe,MAAM,GAAG,MAAM;AACpF,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,MAAI,YAAY,UAAU;AACxB,UAAM,UAAU,mBAAmB,KAAK,MAAM,CAAC,CAAC;AAChD,UAAM,iBAAiB;AAAA,MACrB,GAAG;AAAA,MACH,eAAe,eAAe;AAAA,IAChC,CAAC;AACD;AAAA,EACF;AAEA,MAAI,YAAY,QAAQ;AACtB,UAAM,UAAU,iBAAiB,KAAK,MAAM,CAAC,CAAC;AAC9C,UAAM,eAAe,OAAO;AAC5B;AAAA,EACF;AAEA,MAAI,YAAY,WAAW;AACzB,4BAAwB,KAAK,MAAM,CAAC,GAAG,kBAAkB,eAAe,MAAM,GAAG,SAAS;AAC1F,UAAM,kBAAkB;AACxB;AAAA,EACF;AAEA,MAAI,YAAY,SAAS;AACvB,UAAM,gBAAgB;AACtB;AAAA,EACF;AAEA,MAAI,YAAY,UAAU;AACxB,qBAAiB;AACjB;AAAA,EACF;AAEA,MAAI,YAAY,aAAa;AAC3B,4BAAwB,KAAK,MAAM,CAAC,GAAG,mBAAmB,eAAe,MAAM,GAAG,WAAW;AAC7F,UAAM,mBAAmB;AACzB;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,oBAAoB,OAAO,YAAY,cAAc,UAAU,eAAe,MAAM,CAAC;AAAA,EACvF;AACF;AAEA,SAAS,wBAAwB,KAAe,UAAkB,aAAqB;AACrF,QAAMC,QAAO,iBAAiB,GAAG;AAEjC,aAAW,OAAOA,OAAM;AACtB,YAAQ,KAAK;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ,OAAO,MAAM,QAAQ;AAC7B,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF;AACE,cAAM,IAAI;AAAA,UACR,WAAW,WAAW,YAAY,GAAG,YAAY,cAAc,CAAC,aAAa,QAAQ,GAAG,eAAe,MAAM,CAAC;AAAA,QAChH;AAAA,IACJ;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,KAAe;AACxC,QAAMA,QAAO,iBAAiB,GAAG;AACjC,QAAM,UAA2B,CAAC;AAElC,WAAS,QAAQ,GAAG,QAAQA,MAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAMA,MAAK,KAAK;AAEtB,YAAQ,KAAK;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ,OAAO,MAAM,gBAAgB,eAAe,MAAM,CAAC;AAC3D,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF,KAAK;AACH,gBAAQ,UAAU,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAChD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,UAAU,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAChD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,cAAc,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AACpD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,iBAAiB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AACvD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,QAAQ,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAC9C,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAC3C,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,UAAU;AAClB;AAAA,MACF,KAAK;AACH,gBAAQ,OAAO;AACf;AAAA,MACF,KAAK;AACH,gBAAQ,WAAW;AACnB;AAAA,MACF,KAAK;AACH,gBAAQ,OAAO;AACf;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAC/C,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,gBAAgB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AACtD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,oBAAoB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAC1D,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,eAAe,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AACrD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,kBAAkB;AAC1B;AAAA,MACF,KAAK;AACH,gBAAQ,UAAU;AAClB;AAAA,MACF,KAAK;AACH,gBAAQ,iBAAiB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AACvD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,qBAAqB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAC3D,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,iBAAiB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AACvD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,OAAO;AACf;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS;AACjB;AAAA,MACF,KAAK;AACH,gBAAQ,UAAU;AAClB;AAAA,MACF,KAAK;AACH,gBAAQ,qBAAqB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAC3D,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,oBAAoB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAC1D,iBAAS;AACT;AAAA,MACF;AACE,cAAM,IAAI;AAAA,UACR,yBAAyB,GAAG,YAAY,cAAc,CAAC,SAAS,QAAQ,GAAG,eAAe,MAAM,CAAC;AAAA,QACnG;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAe;AACvC,QAAMA,QAAO,iBAAiB,GAAG;AACjC,QAAM,UAA0B,CAAC;AAEjC,WAAS,QAAQ,GAAG,QAAQA,MAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAMA,MAAK,KAAK;AAEtB,YAAQ,KAAK;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ,OAAO,MAAM,eAAe,eAAe,MAAM,CAAC;AAC1D,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF,KAAK;AACH,gBAAQ,OAAO,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAC7C,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS;AACjB;AAAA,MACF;AACE,cAAM,IAAI;AAAA,UACR,wBAAwB,GAAG,YAAY,cAAc,CAAC,QAAQ,QAAQ,GAAG,eAAe,MAAM,CAAC;AAAA,QACjG;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAe;AACzC,QAAMA,QAAO,iBAAiB,GAAG;AACjC,QAAM,UAA4B,CAAC;AAEnC,WAAS,QAAQ,GAAG,QAAQA,MAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAMA,MAAK,KAAK;AAEtB,YAAQ,KAAK;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ,OAAO,MAAM,iBAAiB,eAAe,MAAM,CAAC;AAC5D,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF,KAAK;AACH,gBAAQ,UAAU,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAChD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,UAAU,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAChD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,cAAc,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AACpD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,iBAAiB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AACvD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAC/C,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,gBAAgB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AACtD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,oBAAoB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAC1D,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,UAAU;AAClB;AAAA,MACF,KAAK;AACH,gBAAQ,iBAAiB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AACvD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,qBAAqB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AAC3D,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,iBAAiB,UAAU,KAAKA,MAAK,QAAQ,CAAC,CAAC;AACvD,iBAAS;AACT;AAAA,MACF,KAAK;AACH,gBAAQ,UAAU;AAClB;AAAA,MACF;AACE,cAAM,IAAI;AAAA,UACR,0BAA0B,GAAG,YAAY,cAAc,CAAC,UAAU,QAAQ,GAAG,eAAe,MAAM,CAAC;AAAA,QACrG;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiBA,OAA0B;AAClD,QAAM,SAAmB,CAAC;AAC1B,aAAW,OAAOA,OAAM;AACtB,UAAM,UAAU,IAAI,QAAQ,GAAG;AAC/B,QAAI,UAAU,KAAK,IAAI,WAAW,IAAI,GAAG;AACvC,aAAO,KAAK,IAAI,MAAM,GAAG,OAAO,GAAG,IAAI,MAAM,UAAU,CAAC,CAAC;AAAA,IAC3D,OAAO;AACL,aAAO,KAAK,GAAG;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAc,OAA2B;AAC1D,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG,GAAG;AACnC,UAAM,IAAI,MAAM,OAAO,IAAI,sBAAsB;AAAA,EACnD;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,MAAc,OAAmC;AAClE,QAAM,MAAM,UAAU,MAAM,KAAK;AACjC,QAAM,MAAM,OAAO,WAAW,GAAG;AACjC,MAAI,OAAO,MAAM,GAAG,GAAG;AACrB,UAAM,IAAI,MAAM,OAAO,IAAI,wCAAwC,GAAG,IAAI;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,WAAW,SAAiB;AACnC,SAAO,QAAQ,OAAO,QAAQC,WAAU,OAAO,OAAO,IAAI;AAC5D;","names":["styleText","command","argv","rmSync","cacheCost","cacheWriteCost","run","run","round","round","run","createFinding","round","run","round","run","run","basename","homedir","basename","join","readFileSync","asNumber","asBoolean","readFileSync","asNumber","buildCall","asBoolean","mkdirSync","statSync","join","resolve","matches","join","homedir","basename","detected","detected","readFileSync","basename","parseJsonLines","readFileSync","inferProvider","inferWorkflow","basename","inferEnvironment","inferRunKey","inferTaskClass","extractUsage","asNumber","buildCall","asBoolean","shouldTreatAsCall","basename","readFileSync","homedir","join","mkdirSync","readFileSync","homedir","dirname","join","join","homedir","readFileSync","createHash","mkdirSync","rmSync","homedir","join","command","atIndex","execSync","spawnSync","createHash","mkdirSync","rmSync","homedir","tmpdir","join","DEFAULT_GATEWAY_DIR","DEFAULT_SESSIONS_DIR","hashString","command","buildSinceFind","sshArgs","resolveLocalPath","formatBytes","readFileSync","resolve","readFileSync","source","summary","rmSync","DEFAULT_API_URL","platform","resolve","readFileSync","readFileSync","buildMeta","validateRuntimeOption","validateCursorUsageCsvOptions","validateHermesLocalOnly","buildRailwayTarget","report","formatBytes","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","join","existsSync","mkdirSync","dirname","readFileSync","writeFileSync","argv","styleText"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/command-display.ts","../src/commands/audit.ts","../../core/src/cursor/usage-csv.ts","../../core/src/utils/hash.ts","../../core/src/utils/time.ts","../../core/src/db/client.ts","../../core/src/db/schema.ts","../../core/src/db/persist.ts","../../core/src/report/comparison.ts","../../core/src/db/read.ts","../../core/src/findings/cursor.ts","../../core/src/findings/engine.ts","../../core/src/pricing-catalog.ts","../../core/src/recommendations.ts","../../core/src/report/timeseries.ts","../../core/src/report/summary.ts","../../core/src/runtime.ts","../../core/src/detect/hermes.ts","../../core/src/normalize/hermes.ts","../../core/src/utils/records.ts","../../core/src/utils/paths.ts","../../core/src/detect/shared.ts","../../core/src/detect/openclaw.ts","../../core/src/normalize/openclaw.ts","../../core/src/audit.ts","../../core/src/report/render.ts","../../schemas/dist/index.js","../../core/src/wire.ts","../src/errors.ts","../src/log.ts","../src/push/client.ts","../src/push/config.ts","../src/auth/credentials.ts","../src/source-meta.ts","../src/transport/ssh.ts","../src/transport/railway.ts","../src/transport/config.ts","../src/version.ts","../src/commands/login.ts","../src/cloud.ts","../src/prompts.ts","../src/commands/push.ts","../src/commands/connect.ts","../src/commands/doctor.ts","../src/commands/mcp-setup.ts","../src/commands/init.ts","../src/commands/logout.ts","../src/help.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { styleText } from 'node:util';\n\nimport { formatCommand, resolveCommandDisplay } from './command-display.js';\nimport { runAuditCommand } from './commands/audit.js';\nimport { runConnectCommand } from './commands/connect.js';\nimport { runDoctorCommand } from './commands/doctor.js';\nimport { runInitCommand } from './commands/init.js';\nimport { runLoginCommand } from './commands/login.js';\nimport { runLogoutCommand } from './commands/logout.js';\nimport { runMcpSetupCommand } from './commands/mcp-setup.js';\nimport { runPushCommand } from './commands/push.js';\nimport { NoDataError } from './errors.js';\nimport {\n renderAuditHelp,\n renderConnectHelp,\n renderDoctorHelp,\n renderInitHelp,\n renderMcpSetupHelp,\n renderPushHelp,\n renderRootHelp,\n} from './help.js';\nimport { getCliVersion } from './version.js';\n\ntype AuditCliOptions = {\n runtime?: 'openclaw' | 'hermes';\n logFile?: string;\n sessionsDir?: string;\n cursorUsageCsv?: string;\n since?: string;\n compare?: boolean;\n json?: boolean;\n markdown?: boolean;\n db?: string;\n noDb?: boolean;\n remote?: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n remoteConfig?: string;\n keepRemoteFiles?: boolean;\n railway?: boolean;\n railwayProject?: string;\n railwayEnvironment?: string;\n railwayService?: string;\n push?: boolean;\n dryRun?: boolean;\n failAboveWasteRate?: number;\n failAboveWasteUsd?: number;\n verbose?: boolean;\n};\n\ntype PushCliOptions = {\n file?: string;\n dryRun?: boolean;\n};\n\ntype DoctorCliOptions = {\n runtime?: 'openclaw' | 'hermes';\n logFile?: string;\n sessionsDir?: string;\n cursorUsageCsv?: string;\n remote?: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n railway?: boolean;\n railwayProject?: string;\n railwayEnvironment?: string;\n railwayService?: string;\n verbose?: boolean;\n};\n\nconst VERSION = getCliVersion();\nconst argv = process.argv.slice(2);\nconst commandDisplay = resolveCommandDisplay();\n\nconst command = argv[0];\n\nif (!command || command === '--help' || command === '-h' || command === 'help') {\n process.stdout.write(renderRootHelp(VERSION, commandDisplay));\n process.exit(0);\n}\n\nif (command === '--version' || command === '-v' || command === 'version') {\n process.stdout.write(`${VERSION}\\n`);\n process.exit(0);\n}\n\nrun().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : 'Unknown error';\n process.stderr.write(`${colorError(`${commandDisplay.name} failed: ${message}`)}\\n`);\n process.exitCode = error instanceof NoDataError ? 2 : 1;\n});\n\nasync function run() {\n if (command === 'audit') {\n const options = parseAuditOptions(argv.slice(1));\n if (options.json && options.markdown) {\n throw new Error('Use either --json or --markdown, not both.');\n }\n\n await runAuditCommand({\n ...options,\n commandPrefix: commandDisplay.prefix,\n });\n return;\n }\n\n if (command === 'init') {\n parseBareCommandOptions(argv.slice(1), renderInitHelp(commandDisplay.prefix), 'init');\n await runInitCommand();\n return;\n }\n\n if (command === 'doctor') {\n const options = parseDoctorOptions(argv.slice(1));\n await runDoctorCommand({\n ...options,\n commandPrefix: commandDisplay.prefix,\n });\n return;\n }\n\n if (command === 'push') {\n const options = parsePushOptions(argv.slice(1));\n await runPushCommand(options);\n return;\n }\n\n if (command === 'connect') {\n parseBareCommandOptions(argv.slice(1), renderConnectHelp(commandDisplay.prefix), 'connect');\n await runConnectCommand();\n return;\n }\n\n if (command === 'login') {\n await runLoginCommand();\n return;\n }\n\n if (command === 'logout') {\n runLogoutCommand();\n return;\n }\n\n if (command === 'mcp-setup') {\n parseBareCommandOptions(argv.slice(1), renderMcpSetupHelp(commandDisplay.prefix), 'mcp-setup');\n await runMcpSetupCommand();\n return;\n }\n\n throw new Error(\n `Unknown command \"${command}\". Run \\`${formatCommand('--help', commandDisplay.prefix)}\\` to see available commands.`,\n );\n}\n\nfunction parseBareCommandOptions(raw: string[], helpText: string, commandName: string) {\n const argv = expandEqualsArgs(raw);\n\n for (const arg of argv) {\n switch (arg) {\n case '--help':\n case '-h':\n process.stdout.write(helpText);\n process.exit(0);\n break;\n default:\n throw new Error(\n `Unknown ${commandName} option \"${arg}\". Run \\`${formatCommand([commandName, '--help'], commandDisplay.prefix)}\\` for usage.`,\n );\n }\n }\n}\n\nfunction parseAuditOptions(raw: string[]) {\n const argv = expandEqualsArgs(raw);\n const options: AuditCliOptions = {};\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n\n switch (arg) {\n case '--help':\n case '-h':\n process.stdout.write(renderAuditHelp(commandDisplay.prefix));\n process.exit(0);\n break;\n case '--log-file':\n options.logFile = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--runtime':\n options.runtime = readValue(arg, argv[index + 1]) as AuditCliOptions['runtime'];\n index += 1;\n break;\n case '--sessions-dir':\n options.sessionsDir = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--cursor-usage-csv':\n options.cursorUsageCsv = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--since':\n options.since = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--db':\n options.db = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--compare':\n options.compare = true;\n break;\n case '--json':\n options.json = true;\n break;\n case '--markdown':\n options.markdown = true;\n break;\n case '--no-db':\n options.noDb = true;\n break;\n case '--remote':\n options.remote = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote-log-file':\n options.remoteLogFile = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote-sessions-dir':\n options.remoteSessionsDir = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote-config':\n options.remoteConfig = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--keep-remote-files':\n options.keepRemoteFiles = true;\n break;\n case '--railway':\n options.railway = true;\n break;\n case '--project':\n options.railwayProject = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--environment':\n options.railwayEnvironment = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--service':\n options.railwayService = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--push':\n options.push = true;\n break;\n case '--dry-run':\n options.dryRun = true;\n break;\n case '--verbose':\n options.verbose = true;\n break;\n case '--fail-above-waste-rate':\n options.failAboveWasteRate = readFloat(arg, argv[index + 1]);\n index += 1;\n break;\n case '--fail-above-waste-usd':\n options.failAboveWasteUsd = readFloat(arg, argv[index + 1]);\n index += 1;\n break;\n default:\n throw new Error(\n `Unknown audit option \"${arg}\". Run \\`${formatCommand(['audit', '--help'], commandDisplay.prefix)}\\` for usage.`,\n );\n }\n }\n\n return options;\n}\n\nfunction parsePushOptions(raw: string[]) {\n const argv = expandEqualsArgs(raw);\n const options: PushCliOptions = {};\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n\n switch (arg) {\n case '--help':\n case '-h':\n process.stdout.write(renderPushHelp(commandDisplay.prefix));\n process.exit(0);\n break;\n case '--file':\n options.file = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--dry-run':\n options.dryRun = true;\n break;\n default:\n throw new Error(\n `Unknown push option \"${arg}\". Run \\`${formatCommand(['push', '--help'], commandDisplay.prefix)}\\` for usage.`,\n );\n }\n }\n\n return options;\n}\n\nfunction parseDoctorOptions(raw: string[]) {\n const argv = expandEqualsArgs(raw);\n const options: DoctorCliOptions = {};\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n\n switch (arg) {\n case '--help':\n case '-h':\n process.stdout.write(renderDoctorHelp(commandDisplay.prefix));\n process.exit(0);\n break;\n case '--log-file':\n options.logFile = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--runtime':\n options.runtime = readValue(arg, argv[index + 1]) as DoctorCliOptions['runtime'];\n index += 1;\n break;\n case '--sessions-dir':\n options.sessionsDir = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--cursor-usage-csv':\n options.cursorUsageCsv = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote':\n options.remote = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote-log-file':\n options.remoteLogFile = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--remote-sessions-dir':\n options.remoteSessionsDir = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--railway':\n options.railway = true;\n break;\n case '--project':\n options.railwayProject = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--environment':\n options.railwayEnvironment = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--service':\n options.railwayService = readValue(arg, argv[index + 1]);\n index += 1;\n break;\n case '--verbose':\n options.verbose = true;\n break;\n default:\n throw new Error(\n `Unknown doctor option \"${arg}\". Run \\`${formatCommand(['doctor', '--help'], commandDisplay.prefix)}\\` for usage.`,\n );\n }\n }\n\n return options;\n}\n\nfunction expandEqualsArgs(argv: string[]): string[] {\n const result: string[] = [];\n for (const arg of argv) {\n const eqIndex = arg.indexOf('=');\n if (eqIndex > 0 && arg.startsWith('--')) {\n result.push(arg.slice(0, eqIndex), arg.slice(eqIndex + 1));\n } else {\n result.push(arg);\n }\n }\n return result;\n}\n\nfunction readValue(flag: string, value: string | undefined) {\n if (!value || value.startsWith('-')) {\n throw new Error(`The ${flag} flag needs a value.`);\n }\n\n return value;\n}\n\nfunction readFloat(flag: string, value: string | undefined): number {\n const raw = readValue(flag, value);\n const num = Number.parseFloat(raw);\n if (Number.isNaN(num)) {\n throw new Error(`The ${flag} flag requires a numeric value, got \"${raw}\".`);\n }\n return num;\n}\n\nfunction colorError(message: string) {\n return process.stderr.isTTY ? styleText('red', message) : message;\n}\n","const PACKAGE_NAME = '@xerg/cli';\nconst DEFAULT_COMMAND_PREFIX = 'xerg';\n\ntype PackageExecutor = 'npx' | 'pnpm dlx' | 'yarn dlx' | 'bunx';\n\nexport interface CommandDisplay {\n prefix: string;\n name: string;\n}\n\nexport function resolveCommandDisplay(context?: {\n argv?: string[];\n env?: NodeJS.ProcessEnv;\n}): CommandDisplay {\n const runner = detectPackageExecutor(context);\n if (!runner) {\n return {\n prefix: DEFAULT_COMMAND_PREFIX,\n name: DEFAULT_COMMAND_PREFIX,\n };\n }\n\n return {\n prefix: `${runner} ${PACKAGE_NAME}`,\n name: PACKAGE_NAME,\n };\n}\n\nexport function formatCommand(\n command: string | string[],\n commandPrefix = resolveCommandDisplay().prefix,\n): string {\n const suffix = Array.isArray(command) ? command.join(' ') : command;\n return suffix ? `${commandPrefix} ${suffix}` : commandPrefix;\n}\n\nfunction detectPackageExecutor(context?: {\n argv?: string[];\n env?: NodeJS.ProcessEnv;\n}): PackageExecutor | null {\n const env = context?.env ?? process.env;\n const argv = context?.argv ?? process.argv;\n\n const userAgent = normalizeSignal(env.npm_config_user_agent);\n const execPath = normalizeSignal(env.npm_execpath);\n const argvPath = normalizeSignal(argv[1]);\n\n const fromArgvPath = detectRunnerFromArgvPath(argvPath);\n if (fromArgvPath) {\n return fromArgvPath;\n }\n\n if (looksLikeInstalledCli(argvPath)) {\n return null;\n }\n\n const fromUserAgent = detectRunnerFromSignal(userAgent);\n if (fromUserAgent) {\n return fromUserAgent;\n }\n\n const fromExecPath = detectRunnerFromSignal(execPath);\n if (fromExecPath) {\n return fromExecPath;\n }\n\n if (argvPath.includes('/_npx/') || argvPath.includes('\\\\_npx\\\\')) {\n return 'npx';\n }\n\n if (argvPath.includes('/.yarn/') && argvPath.includes('/dlx/')) {\n return 'yarn dlx';\n }\n\n if (argvPath.includes('/bunx/') || argvPath.includes('\\\\bunx\\\\')) {\n return 'bunx';\n }\n\n if (argvPath.includes('/dlx-') || argvPath.includes('\\\\dlx-')) {\n return 'pnpm dlx';\n }\n\n if (userAgent || execPath) {\n return 'npx';\n }\n\n return null;\n}\n\nfunction detectRunnerFromArgvPath(argvPath: string): PackageExecutor | null {\n if (!argvPath) {\n return null;\n }\n\n if (argvPath.includes('/_npx/') || argvPath.includes('\\\\_npx\\\\')) {\n return 'npx';\n }\n\n if (argvPath.includes('/.yarn/') && argvPath.includes('/dlx/')) {\n return 'yarn dlx';\n }\n\n if (argvPath.includes('/bunx/') || argvPath.includes('\\\\bunx\\\\')) {\n return 'bunx';\n }\n\n if (argvPath.includes('/dlx-') || argvPath.includes('\\\\dlx-')) {\n return 'pnpm dlx';\n }\n\n return null;\n}\n\nfunction looksLikeInstalledCli(argvPath: string): boolean {\n if (!argvPath) {\n return false;\n }\n\n const normalized = argvPath.replaceAll('\\\\', '/');\n return (\n normalized.endsWith('/node_modules/.bin/xerg') ||\n normalized.includes('/node_modules/@xerg/cli/dist/index.js') ||\n normalized.endsWith('/bin/xerg')\n );\n}\n\nfunction detectRunnerFromSignal(signal: string): PackageExecutor | null {\n if (!signal) {\n return null;\n }\n\n const tokens = signal.split(/[^a-z0-9]+/).filter(Boolean);\n\n if (tokens.includes('pnpm')) {\n return 'pnpm dlx';\n }\n\n if (tokens.includes('yarn')) {\n return 'yarn dlx';\n }\n\n if (tokens.includes('bun')) {\n return 'bunx';\n }\n\n if (tokens.includes('npm')) {\n return 'npx';\n }\n\n return null;\n}\n\nfunction normalizeSignal(value: string | undefined): string {\n return value?.trim().toLowerCase() ?? '';\n}\n","import { rmSync } from 'node:fs';\nimport {\n auditAgentRuntime,\n auditCursorUsageCsv,\n renderMarkdownSummary,\n renderTerminalSummary,\n toWirePayload,\n} from '@xergai/core';\nimport type { AuditSummary, WirePayloadMeta } from '@xergai/core';\n\nimport { NoDataError } from '../errors.js';\nimport { createCliLogger } from '../log.js';\nimport { loadPushConfig, pushAudit } from '../push/index.js';\nimport { buildLocalPushSourceMeta, buildRemotePushSourceMeta } from '../source-meta.js';\nimport {\n buildComparisonKeyForRailway,\n buildComparisonKeyForRemote,\n buildRailwaySourceFromFlags,\n buildSourceFromFlags,\n loadRemoteConfig,\n pullRemoteFiles,\n pullRemoteFilesRailway,\n} from '../transport/index.js';\nimport type { PullResult, RailwayTarget, RemoteSource } from '../transport/index.js';\nimport { getCliVersion } from '../version.js';\n\nexport interface AuditCommandOptions {\n runtime?: 'openclaw' | 'hermes';\n logFile?: string;\n sessionsDir?: string;\n cursorUsageCsv?: string;\n since?: string;\n compare?: boolean;\n json?: boolean;\n markdown?: boolean;\n db?: string;\n noDb?: boolean;\n remote?: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n remoteConfig?: string;\n keepRemoteFiles?: boolean;\n railway?: boolean;\n railwayProject?: string;\n railwayEnvironment?: string;\n railwayService?: string;\n push?: boolean;\n dryRun?: boolean;\n failAboveWasteRate?: number;\n failAboveWasteUsd?: number;\n verbose?: boolean;\n commandPrefix?: string;\n}\n\nconst NO_DATA_PATTERN = /no (openclaw|hermes|supported local runtime) sources? were detected/i;\n\nasync function auditOrNoData(\n ...args: Parameters<typeof auditAgentRuntime>\n): ReturnType<typeof auditAgentRuntime> {\n try {\n return await auditAgentRuntime(...args);\n } catch (err) {\n if (err instanceof Error && NO_DATA_PATTERN.test(err.message)) {\n throw new NoDataError(err.message);\n }\n throw err;\n }\n}\n\nexport async function runAuditCommand(options: AuditCommandOptions) {\n const logger = createCliLogger({ verbose: options.verbose });\n\n if (options.dryRun && !options.push) {\n throw new Error('--dry-run requires --push.');\n }\n\n validateRuntimeOption(options.runtime);\n validateCursorUsageCsvOptions(options);\n validateHermesLocalOnly(options);\n\n const remoteFlags = [options.remote, options.remoteConfig, options.railway].filter(\n Boolean,\n ).length;\n if (remoteFlags > 1) {\n throw new Error('Use only one of --remote, --remote-config, or --railway.');\n }\n\n if (!options.remote && !options.remoteConfig && !options.railway) {\n return runLocalAudit(options, logger);\n }\n\n if (options.railway) {\n const railwayTarget = buildRailwayTarget(options);\n const source = buildRailwaySourceFromFlags({\n railway: railwayTarget,\n remoteLogFile: options.remoteLogFile,\n remoteSessionsDir: options.remoteSessionsDir,\n });\n return runSingleRemoteAudit(source, options, logger);\n }\n\n if (options.remoteConfig) {\n const sources = loadRemoteConfig(options.remoteConfig);\n if (sources.length === 1) {\n return runSingleRemoteAudit(sources[0], options, logger);\n }\n return runMultiRemoteAudit(sources, options, logger);\n }\n\n const remote = options.remote as string;\n const source = buildSourceFromFlags({\n remote,\n remoteLogFile: options.remoteLogFile,\n remoteSessionsDir: options.remoteSessionsDir,\n });\n return runSingleRemoteAudit(source, options, logger);\n}\n\nfunction buildRailwayTarget(options: AuditCommandOptions): RailwayTarget | undefined {\n if (options.railwayProject && options.railwayEnvironment && options.railwayService) {\n return {\n projectId: options.railwayProject,\n environmentId: options.railwayEnvironment,\n serviceId: options.railwayService,\n };\n }\n return undefined;\n}\n\nasync function runLocalAudit(\n options: AuditCommandOptions,\n logger: ReturnType<typeof createCliLogger>,\n) {\n if (options.cursorUsageCsv) {\n logger.verbose('Running a local Cursor usage CSV audit.');\n logger.verbose(`Using Cursor usage CSV: ${options.cursorUsageCsv}`);\n\n const summary = await auditCursorUsageCsv({\n cursorUsageCsv: options.cursorUsageCsv,\n since: options.since,\n compare: options.compare,\n dbPath: options.db,\n noDb: options.noDb,\n commandPrefix: options.commandPrefix,\n onProgress: logger.verbose,\n });\n\n renderOutput(summary, options);\n\n if (options.push) {\n const meta = buildMeta(buildLocalPushSourceMeta('cursor'));\n await handlePush(summary, meta, options);\n }\n\n checkThresholds(summary, options);\n return;\n }\n\n logger.verbose(\n options.runtime\n ? `Running a local ${options.runtime === 'hermes' ? 'Hermes' : 'OpenClaw'} audit.`\n : 'Running a local runtime audit with auto-detection.',\n );\n if (options.logFile) {\n logger.verbose(`Using explicit local log file: ${options.logFile}`);\n }\n if (options.sessionsDir) {\n logger.verbose(`Using explicit local sessions directory: ${options.sessionsDir}`);\n }\n\n const summary = await auditOrNoData({\n runtime: options.runtime ?? 'auto',\n logFile: options.logFile,\n sessionsDir: options.sessionsDir,\n since: options.since,\n compare: options.compare,\n dbPath: options.db,\n noDb: options.noDb,\n commandPrefix: options.commandPrefix,\n onProgress: logger.verbose,\n });\n\n renderOutput(summary, options);\n\n if (options.push) {\n const meta = buildMeta(buildLocalPushSourceMeta(summary.runtime));\n await handlePush(summary, meta, options);\n }\n\n checkThresholds(summary, options);\n}\n\nfunction validateRuntimeOption(runtime?: AuditCommandOptions['runtime']) {\n if (!runtime) {\n return;\n }\n\n if (runtime !== 'openclaw' && runtime !== 'hermes') {\n throw new Error(\n `Unsupported runtime \"${runtime}\". Use --runtime openclaw or --runtime hermes.`,\n );\n }\n}\n\nfunction validateCursorUsageCsvOptions(options: AuditCommandOptions) {\n if (!options.cursorUsageCsv) {\n return;\n }\n\n const conflicts = [\n options.runtime ? '--runtime' : null,\n options.logFile ? '--log-file' : null,\n options.sessionsDir ? '--sessions-dir' : null,\n options.remote ? '--remote' : null,\n options.remoteLogFile ? '--remote-log-file' : null,\n options.remoteSessionsDir ? '--remote-sessions-dir' : null,\n options.remoteConfig ? '--remote-config' : null,\n options.keepRemoteFiles ? '--keep-remote-files' : null,\n options.railway ? '--railway' : null,\n options.railwayProject ? '--project' : null,\n options.railwayEnvironment ? '--environment' : null,\n options.railwayService ? '--service' : null,\n ].filter((flag): flag is string => flag !== null);\n\n if (conflicts.length > 0) {\n throw new Error(`The --cursor-usage-csv flag cannot be combined with ${conflicts.join(', ')}.`);\n }\n}\n\nfunction validateHermesLocalOnly(options: AuditCommandOptions) {\n if (options.runtime !== 'hermes') {\n return;\n }\n\n const conflicts = [\n options.remote ? '--remote' : null,\n options.remoteLogFile ? '--remote-log-file' : null,\n options.remoteSessionsDir ? '--remote-sessions-dir' : null,\n options.remoteConfig ? '--remote-config' : null,\n options.keepRemoteFiles ? '--keep-remote-files' : null,\n options.railway ? '--railway' : null,\n options.railwayProject ? '--project' : null,\n options.railwayEnvironment ? '--environment' : null,\n options.railwayService ? '--service' : null,\n ].filter((flag): flag is string => flag !== null);\n\n if (conflicts.length > 0) {\n throw new Error(\n `Hermes remote transport is not supported yet. Remove ${conflicts.join(', ')} or switch to --runtime openclaw.`,\n );\n }\n}\n\nfunction getComparisonKey(source: RemoteSource): string {\n if (source.transport === 'railway') {\n return buildComparisonKeyForRailway(source);\n }\n return buildComparisonKeyForRemote(source);\n}\n\nfunction pullFiles(\n source: RemoteSource,\n since?: string,\n keepFiles?: boolean,\n onProgress?: (message: string) => void,\n): Promise<PullResult> {\n if (source.transport === 'railway') {\n return pullRemoteFilesRailway({ source, since, keepFiles, onProgress });\n }\n return pullRemoteFiles({ source, since, keepFiles, onProgress });\n}\n\nfunction describeSource(source: RemoteSource): string {\n if (source.transport === 'railway') {\n return source.railway\n ? `${source.name} (Railway service ${source.railway.serviceId.slice(0, 8)})`\n : `${source.name} (Railway linked project)`;\n }\n return source.host;\n}\n\nasync function runSingleRemoteAudit(\n source: RemoteSource,\n options: AuditCommandOptions,\n logger: ReturnType<typeof createCliLogger>,\n) {\n logger.info(`Pulling files from ${describeSource(source)}...`);\n\n const pullResult = await pullFiles(\n source,\n options.since,\n options.keepRemoteFiles,\n logger.verbose,\n );\n logger.verbose(`Files staged at ${pullResult.localPath}.`);\n\n try {\n const comparisonKeyOverride = getComparisonKey(source);\n const summary = await auditOrNoData({\n runtime: 'openclaw',\n logFile: pullResult.logFile,\n sessionsDir: pullResult.sessionsDir,\n since: options.since,\n compare: options.compare,\n dbPath: options.db,\n noDb: options.noDb,\n comparisonKeyOverride,\n commandPrefix: options.commandPrefix,\n onProgress: logger.verbose,\n });\n\n renderOutput(summary, options);\n\n if (options.push) {\n const meta = buildMeta(buildRemotePushSourceMeta(source));\n await handlePush(summary, meta, options);\n }\n\n checkThresholds(summary, options);\n } finally {\n cleanupPullResult(pullResult, options.keepRemoteFiles);\n }\n}\n\nasync function runMultiRemoteAudit(\n sources: RemoteSource[],\n options: AuditCommandOptions,\n logger: ReturnType<typeof createCliLogger>,\n) {\n const results: { source: RemoteSource; pullResult: PullResult }[] = [];\n const errors: { source: RemoteSource; error: string }[] = [];\n\n for (const source of sources) {\n logger.info(`Pulling files from ${source.name} (${describeSource(source)})...`);\n try {\n const pullResult = await pullFiles(\n source,\n options.since,\n options.keepRemoteFiles,\n logger.verbose,\n );\n results.push({ source, pullResult });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n errors.push({ source, error: message });\n process.stderr.write(` Warning: ${message}\\n`);\n }\n }\n\n if (results.length === 0) {\n const errorMessages = errors.map((e) => ` ${e.source.name}: ${e.error}`).join('\\n');\n throw new Error(`No sources could be pulled:\\n${errorMessages}`);\n }\n\n try {\n const summaries: { name: string; source: RemoteSource; summary: AuditSummary }[] = [];\n for (const { source, pullResult } of results) {\n const comparisonKeyOverride = getComparisonKey(source);\n const summary = await auditOrNoData({\n runtime: 'openclaw',\n logFile: pullResult.logFile,\n sessionsDir: pullResult.sessionsDir,\n since: options.since,\n compare: options.compare,\n dbPath: options.db,\n noDb: options.noDb,\n comparisonKeyOverride,\n commandPrefix: options.commandPrefix,\n onProgress: logger.verbose,\n });\n summaries.push({ name: source.name, source, summary });\n }\n\n if (options.json) {\n const output =\n summaries.length === 1\n ? summaries[0].summary\n : {\n sources: summaries.map((s) => ({\n name: s.name,\n ...s.summary,\n })),\n };\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`);\n } else {\n for (const { name, summary } of summaries) {\n if (summaries.length > 1) {\n process.stdout.write(`\\n${'═'.repeat(60)}\\n Source: ${name}\\n${'═'.repeat(60)}\\n\\n`);\n }\n\n if (options.markdown) {\n process.stdout.write(`${renderMarkdownSummary(summary)}\\n`);\n } else {\n process.stdout.write(`${renderTerminalSummary(summary)}\\n`);\n }\n }\n }\n\n if (errors.length > 0) {\n process.stderr.write('\\nSources that could not be reached:\\n');\n for (const { source, error } of errors) {\n process.stderr.write(` ${source.name}: ${error}\\n`);\n }\n }\n\n if (options.push) {\n for (const { source, summary } of summaries) {\n const meta = buildMeta(buildRemotePushSourceMeta(source));\n await handlePush(summary, meta, options);\n }\n }\n\n for (const { summary } of summaries) {\n checkThresholds(summary, options);\n }\n } finally {\n for (const { pullResult } of results) {\n cleanupPullResult(pullResult, options.keepRemoteFiles);\n }\n }\n}\n\nfunction buildMeta(input: {\n environment: WirePayloadMeta['environment'];\n sourceId: string;\n sourceHost: string;\n}): WirePayloadMeta {\n return {\n cliVersion: getCliVersion(),\n sourceId: input.sourceId,\n sourceHost: input.sourceHost,\n environment: input.environment,\n };\n}\n\nasync function handlePush(\n summary: AuditSummary,\n meta: WirePayloadMeta,\n options: AuditCommandOptions,\n) {\n const payload = toWirePayload(summary, meta);\n\n if (options.dryRun) {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n return;\n }\n\n const config = loadPushConfig();\n process.stderr.write(`Pushing audit ${summary.auditId} to ${config.apiUrl}...\\n`);\n\n const result = await pushAudit(payload, config);\n\n if (result.ok) {\n process.stderr.write(`Pushed successfully (audit: ${result.auditId}).\\n`);\n } else {\n const statusInfo = result.status > 0 ? ` (HTTP ${result.status})` : '';\n throw new Error(`Push failed${statusInfo}: ${result.message}`);\n }\n}\n\nfunction renderOutput(summary: AuditSummary, options: AuditCommandOptions) {\n if (options.push && options.dryRun) {\n return;\n }\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify(summary, null, 2)}\\n`);\n return;\n }\n\n if (options.markdown) {\n process.stdout.write(`${renderMarkdownSummary(summary)}\\n`);\n return;\n }\n\n process.stdout.write(`${renderTerminalSummary(summary)}\\n`);\n}\n\nfunction checkThresholds(summary: AuditSummary, options: AuditCommandOptions) {\n const breaches: string[] = [];\n\n if (\n options.failAboveWasteRate !== undefined &&\n summary.structuralWasteRate > options.failAboveWasteRate\n ) {\n breaches.push(\n `Structural waste rate ${(summary.structuralWasteRate * 100).toFixed(1)}% exceeds threshold ${(options.failAboveWasteRate * 100).toFixed(1)}%`,\n );\n }\n\n if (\n options.failAboveWasteUsd !== undefined &&\n summary.wasteSpendUsd > options.failAboveWasteUsd\n ) {\n breaches.push(\n `Waste spend $${summary.wasteSpendUsd.toFixed(2)} exceeds threshold $${options.failAboveWasteUsd.toFixed(2)}`,\n );\n }\n\n if (breaches.length > 0) {\n process.stderr.write(`\\nThreshold exceeded:\\n${breaches.map((b) => ` ${b}`).join('\\n')}\\n`);\n process.exitCode = 3;\n }\n}\n\nfunction cleanupPullResult(pullResult: PullResult, keepFiles?: boolean) {\n if (keepFiles) return;\n try {\n rmSync(pullResult.localPath, { recursive: true, force: true });\n } catch {\n // best-effort cleanup\n }\n}\n","import { readFileSync, statSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport type {\n AuditOptions,\n CostSource,\n CursorUsageCsvDoctorReport,\n CursorUsageInsights,\n DetectedSourceFile,\n NormalizedCall,\n NormalizedRun,\n PricingCoverage,\n} from '../types.js';\nimport { sha1 } from '../utils/hash.js';\nimport { parseSince } from '../utils/time.js';\n\nconst REQUIRED_HEADERS = [\n 'Date',\n 'Kind',\n 'Model',\n 'Max Mode',\n 'Input (w/ Cache Write)',\n 'Input (w/o Cache Write)',\n 'Cache Read',\n 'Output Tokens',\n 'Total Tokens',\n 'Cost',\n] as const;\n\ntype RequiredHeader = (typeof REQUIRED_HEADERS)[number];\n\ninterface CursorAliasPricing {\n provider: string;\n canonicalModel: string;\n inputPer1m: number;\n outputPer1m: number;\n cacheWritePer1m?: number;\n cachedInputPer1m?: number;\n}\n\ninterface CursorUsageCsvRow {\n timestamp: string;\n kind: string;\n modelAlias: string;\n maxMode: boolean;\n inputWithCacheWriteTokens: number;\n inputWithoutCacheWriteTokens: number;\n cacheReadTokens: number;\n outputTokens: number;\n totalTokens: number;\n costLabel: string;\n observedCostUsd: number | null;\n}\n\ninterface CursorUsageCsvFile {\n source: DetectedSourceFile;\n rows: CursorUsageCsvRow[];\n headers: string[];\n hasObservedCostRows: boolean;\n}\n\ninterface CursorRowCostEstimate {\n costUsd: number;\n costSource: CostSource;\n cacheCostUsd: number | null;\n cacheWriteCostUsd: number | null;\n pricing: CursorAliasPricing | null;\n canonicalModelKey: string;\n}\n\nconst CURSOR_ALIAS_PRICING: Record<string, CursorAliasPricing> = {\n 'claude-4.6-opus-high-thinking': {\n provider: 'anthropic',\n canonicalModel: 'claude-opus-4',\n inputPer1m: 15,\n outputPer1m: 75,\n cacheWritePer1m: 18.75,\n cachedInputPer1m: 1.5,\n },\n 'claude-4.5-sonnet': {\n provider: 'anthropic',\n canonicalModel: 'claude-sonnet-4-5',\n inputPer1m: 3,\n outputPer1m: 15,\n cacheWritePer1m: 3.75,\n cachedInputPer1m: 0.3,\n },\n 'claude-4.5-sonnet-thinking': {\n provider: 'anthropic',\n canonicalModel: 'claude-sonnet-4-5',\n inputPer1m: 3,\n outputPer1m: 15,\n cacheWritePer1m: 3.75,\n cachedInputPer1m: 0.3,\n },\n 'claude-4.5-opus-high-thinking': {\n provider: 'anthropic',\n canonicalModel: 'claude-opus-4-5',\n inputPer1m: 5,\n outputPer1m: 25,\n cacheWritePer1m: 6.25,\n cachedInputPer1m: 0.5,\n },\n 'gpt-5.1-codex': {\n provider: 'openai',\n canonicalModel: 'gpt-5.1-codex',\n inputPer1m: 1.25,\n outputPer1m: 10,\n cacheWritePer1m: 1.25,\n cachedInputPer1m: 0.125,\n },\n 'gpt-5-high-fast': {\n provider: 'openai',\n canonicalModel: 'gpt-5-high-fast',\n inputPer1m: 1.25,\n outputPer1m: 10,\n cacheWritePer1m: 1.25,\n cachedInputPer1m: 0.125,\n },\n 'gpt-5': {\n provider: 'openai',\n canonicalModel: 'gpt-5',\n inputPer1m: 1.25,\n outputPer1m: 10,\n cacheWritePer1m: 1.25,\n cachedInputPer1m: 0.125,\n },\n};\n\nfunction round(value: number) {\n return Number(value.toFixed(6));\n}\n\nfunction parseCsvLine(line: string): string[] {\n const values: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let index = 0; index < line.length; index += 1) {\n const char = line[index];\n\n if (char === '\"') {\n const next = line[index + 1];\n if (inQuotes && next === '\"') {\n current += '\"';\n index += 1;\n } else {\n inQuotes = !inQuotes;\n }\n continue;\n }\n\n if (char === ',' && !inQuotes) {\n values.push(current);\n current = '';\n continue;\n }\n\n current += char;\n }\n\n values.push(current);\n return values.map((value) => value.trim());\n}\n\nfunction parseInteger(raw: string, column: RequiredHeader, rowNumber: number) {\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new Error(`Invalid ${column} value \"${raw}\" on row ${rowNumber}.`);\n }\n\n return parsed;\n}\n\nfunction parseTimestamp(raw: string, rowNumber: number) {\n const parsed = new Date(raw);\n if (Number.isNaN(parsed.getTime())) {\n throw new Error(`Invalid Date value \"${raw}\" on row ${rowNumber}.`);\n }\n\n return parsed.toISOString();\n}\n\nfunction parseMaxMode(raw: string) {\n return raw.trim().toLowerCase() === 'yes';\n}\n\nfunction parseObservedCost(raw: string) {\n const value = raw.trim();\n if (value.length === 0 || value === '-' || value.toLowerCase() === 'included') {\n return null;\n }\n\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction createDetectedSource(path: string): DetectedSourceFile {\n const resolvedPath = resolve(path);\n\n try {\n const stats = statSync(resolvedPath);\n if (!stats.isFile()) {\n throw new Error(`Cursor usage CSV path is not a file: ${resolvedPath}`);\n }\n\n return {\n kind: 'cursor-usage-csv',\n runtime: 'cursor',\n path: resolvedPath,\n sizeBytes: stats.size,\n mtimeMs: stats.mtimeMs,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : `Cursor usage CSV not found: ${path}`;\n throw new Error(message);\n }\n}\n\nfunction validateHeaders(headers: string[]) {\n const missing = REQUIRED_HEADERS.filter((header) => !headers.includes(header));\n if (missing.length > 0) {\n throw new Error(`Cursor usage CSV is missing required headers: ${missing.join(', ')}.`);\n }\n}\n\nfunction parseRow(values: string[], headers: string[], rowNumber: number): CursorUsageCsvRow {\n const record = Object.fromEntries(headers.map((header, index) => [header, values[index] ?? '']));\n const costLabel = record.Cost ?? '';\n\n return {\n timestamp: parseTimestamp(record.Date ?? '', rowNumber),\n kind: record.Kind ?? '',\n modelAlias: record.Model ?? '',\n maxMode: parseMaxMode(record['Max Mode'] ?? ''),\n inputWithCacheWriteTokens: parseInteger(\n record['Input (w/ Cache Write)'] ?? '',\n 'Input (w/ Cache Write)',\n rowNumber,\n ),\n inputWithoutCacheWriteTokens: parseInteger(\n record['Input (w/o Cache Write)'] ?? '',\n 'Input (w/o Cache Write)',\n rowNumber,\n ),\n cacheReadTokens: parseInteger(record['Cache Read'] ?? '', 'Cache Read', rowNumber),\n outputTokens: parseInteger(record['Output Tokens'] ?? '', 'Output Tokens', rowNumber),\n totalTokens: parseInteger(record['Total Tokens'] ?? '', 'Total Tokens', rowNumber),\n costLabel,\n observedCostUsd: parseObservedCost(costLabel),\n };\n}\n\nfunction parseRows(lines: string[], headers: string[]) {\n const rows: CursorUsageCsvRow[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n if (!line.trim()) {\n continue;\n }\n\n rows.push(parseRow(parseCsvLine(line), headers, index + 2));\n }\n\n return rows;\n}\n\nexport function readCursorUsageCsv(path: string): CursorUsageCsvFile {\n const source = createDetectedSource(path);\n const content = readFileSync(source.path, 'utf8');\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (lines.length === 0) {\n throw new Error(`Cursor usage CSV is empty: ${source.path}`);\n }\n\n const headers = parseCsvLine(lines[0]);\n validateHeaders(headers);\n\n const rows = parseRows(lines.slice(1), headers);\n\n return {\n source,\n rows,\n headers,\n hasObservedCostRows: rows.some((row) => row.observedCostUsd !== null),\n };\n}\n\nfunction isErroredNoCharge(kind: string) {\n const normalized = kind.trim().toLowerCase();\n return (\n (normalized.includes('errored') && normalized.includes('no charge')) ||\n normalized.includes('not charged')\n );\n}\n\nfunction inferProvider(modelAlias: string) {\n const normalized = modelAlias.trim().toLowerCase();\n\n if (normalized.startsWith('claude-')) {\n return 'anthropic';\n }\n\n if (normalized.startsWith('gpt-')) {\n return 'openai';\n }\n\n return 'cursor';\n}\n\nfunction buildModelKey(modelAlias: string, pricing: CursorAliasPricing | null) {\n if (pricing) {\n return `${pricing.provider}/${pricing.canonicalModel}`;\n }\n\n return `${inferProvider(modelAlias)}/${modelAlias}`;\n}\n\nfunction getWorkflowKey(row: CursorUsageCsvRow) {\n const kind = row.kind.trim().toLowerCase();\n\n if (kind.includes('on-demand')) {\n return row.maxMode ? 'on-demand / max mode' : 'on-demand / standard mode';\n }\n\n if (kind.includes('included')) {\n return row.maxMode ? 'included / max mode' : 'included / standard mode';\n }\n\n if (kind.includes('error') || kind.includes('not charged')) {\n return 'not charged / failed or aborted';\n }\n\n return row.maxMode ? 'other / max mode' : 'other / standard mode';\n}\n\nfunction estimateCursorRowCost(\n row: CursorUsageCsvRow,\n options: {\n preferObservedCost: boolean;\n },\n): CursorRowCostEstimate {\n const pricing = CURSOR_ALIAS_PRICING[row.modelAlias.trim().toLowerCase()] ?? null;\n\n if (isErroredNoCharge(row.kind)) {\n return {\n costUsd: 0,\n costSource: 'observed',\n cacheCostUsd: 0,\n cacheWriteCostUsd: 0,\n pricing,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n }\n\n if (options.preferObservedCost) {\n if (row.observedCostUsd !== null) {\n const cacheCost =\n row.cacheReadTokens > 0 && pricing?.cachedInputPer1m !== undefined\n ? round((row.cacheReadTokens / 1_000_000) * pricing.cachedInputPer1m)\n : null;\n const cacheWriteCost =\n row.inputWithCacheWriteTokens > 0 && pricing\n ? round(\n (row.inputWithCacheWriteTokens / 1_000_000) *\n (pricing.cacheWritePer1m ?? pricing.inputPer1m),\n )\n : null;\n\n return {\n costUsd: row.observedCostUsd,\n costSource: 'observed',\n cacheCostUsd: cacheCost,\n cacheWriteCostUsd: cacheWriteCost,\n pricing,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n }\n\n return {\n costUsd: 0,\n costSource: 'observed',\n cacheCostUsd: 0,\n cacheWriteCostUsd: 0,\n pricing,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n }\n\n if (!pricing) {\n return {\n costUsd: 0,\n costSource: 'unpriced',\n cacheCostUsd: null,\n cacheWriteCostUsd: null,\n pricing: null,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n }\n\n if (row.cacheReadTokens > 0 && pricing.cachedInputPer1m === undefined) {\n return {\n costUsd: 0,\n costSource: 'unpriced',\n cacheCostUsd: null,\n cacheWriteCostUsd: null,\n pricing: null,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n }\n\n const inputCost = (row.inputWithoutCacheWriteTokens / 1_000_000) * pricing.inputPer1m;\n const cacheWriteCost =\n (row.inputWithCacheWriteTokens / 1_000_000) * (pricing.cacheWritePer1m ?? pricing.inputPer1m);\n const outputCost = (row.outputTokens / 1_000_000) * pricing.outputPer1m;\n const cacheCost =\n row.cacheReadTokens > 0 && pricing.cachedInputPer1m !== undefined\n ? (row.cacheReadTokens / 1_000_000) * pricing.cachedInputPer1m\n : 0;\n\n return {\n costUsd: round(inputCost + cacheWriteCost + outputCost + cacheCost),\n costSource: 'estimated',\n cacheCostUsd: round(cacheCost),\n cacheWriteCostUsd: round(cacheWriteCost),\n pricing,\n canonicalModelKey: buildModelKey(row.modelAlias, pricing),\n };\n}\n\nfunction buildCall(\n row: CursorUsageCsvRow,\n source: DetectedSourceFile,\n runId: string,\n index: number,\n options: {\n preferObservedCost: boolean;\n },\n): { call: NormalizedCall; cost: CursorRowCostEstimate } {\n const cost = estimateCursorRowCost(row, options);\n const totalInputTokens = Math.max(row.totalTokens - row.outputTokens, 0);\n\n return {\n cost,\n call: {\n id: sha1(`${runId}:${source.path}:${index}:${row.modelAlias}:${row.timestamp}`),\n runId,\n timestamp: row.timestamp,\n provider: cost.pricing?.provider ?? inferProvider(row.modelAlias),\n model: cost.pricing?.canonicalModel ?? row.modelAlias,\n inputTokens: totalInputTokens,\n outputTokens: row.outputTokens,\n costUsd: cost.costUsd,\n costSource: cost.costSource,\n latencyMs: null,\n toolCalls: 0,\n retries: 0,\n attempt: null,\n iteration: null,\n status: isErroredNoCharge(row.kind) ? 'error' : null,\n taskClass: null,\n cacheHit: row.cacheReadTokens > 0,\n cacheCostUsd: cost.cacheCostUsd,\n metadata: {\n source: 'cursor-usage-csv',\n kind: row.kind,\n maxMode: row.maxMode,\n modelAlias: row.modelAlias,\n costLabel: row.costLabel,\n totalTokens: row.totalTokens,\n inputWithCacheWriteTokens: row.inputWithCacheWriteTokens,\n inputWithoutCacheWriteTokens: row.inputWithoutCacheWriteTokens,\n cacheReadTokens: row.cacheReadTokens,\n pricingProvider: cost.pricing?.provider ?? null,\n pricingModel: cost.pricing?.canonicalModel ?? null,\n canonicalModelKey: cost.canonicalModelKey,\n observedCostUsd: row.observedCostUsd,\n cacheWriteCostUsd: cost.cacheWriteCostUsd,\n },\n },\n };\n}\n\nexport function normalizeCursorUsageCsv(input: {\n source: DetectedSourceFile;\n rows: CursorUsageCsvRow[];\n hasObservedCostRows?: boolean;\n since?: string;\n}): {\n runs: NormalizedRun[];\n pricingCoverage: PricingCoverage;\n cursorUsage: CursorUsageInsights;\n} {\n const cutoff = parseSince(input.since);\n const runs: NormalizedRun[] = [];\n const modelCoverage = new Map<string, { callCount: number; totalTokens: number }>();\n const modes = new Map<\n string,\n { callCount: number; totalTokens: number; estimatedSpendUsd: number }\n >();\n const models = new Map<\n string,\n {\n callCount: number;\n totalTokens: number;\n estimatedSpendUsd: number;\n pricedCallCount: number;\n unpricedCallCount: number;\n }\n >();\n\n let pricedCallCount = 0;\n let unpricedCallCount = 0;\n let pricedTokenCount = 0;\n let unpricedTokenCount = 0;\n let totalTokens = 0;\n let totalOutputTokens = 0;\n let totalCacheReadTokens = 0;\n let totalInputWithCacheWriteTokens = 0;\n let totalInputWithoutCacheWriteTokens = 0;\n\n input.rows.forEach((row, index) => {\n const timestampMs = new Date(row.timestamp).getTime();\n if (cutoff && timestampMs < cutoff) {\n return;\n }\n\n const workflow = getWorkflowKey(row);\n const runId = sha1(`${input.source.path}:${row.timestamp}:${row.modelAlias}:${index}`);\n const { call, cost } = buildCall(row, input.source, runId, index, {\n preferObservedCost: input.hasObservedCostRows ?? false,\n });\n const run: NormalizedRun = {\n id: runId,\n sourceKind: input.source.kind,\n sourcePath: input.source.path,\n timestamp: row.timestamp,\n workflow,\n environment: 'local',\n tags: {\n sourceKind: input.source.kind,\n maxMode: row.maxMode,\n kind: row.kind,\n },\n calls: [call],\n totalCostUsd: call.costUsd,\n totalTokens: row.totalTokens,\n observedCostUsd: call.costSource === 'observed' ? call.costUsd : 0,\n estimatedCostUsd: call.costSource === 'estimated' ? call.costUsd : 0,\n };\n runs.push(run);\n\n totalTokens += row.totalTokens;\n totalOutputTokens += row.outputTokens;\n totalCacheReadTokens += row.cacheReadTokens;\n totalInputWithCacheWriteTokens += row.inputWithCacheWriteTokens;\n totalInputWithoutCacheWriteTokens += row.inputWithoutCacheWriteTokens;\n\n const totalRowTokens = row.totalTokens;\n if (cost.costSource === 'unpriced') {\n unpricedCallCount += 1;\n unpricedTokenCount += totalRowTokens;\n const current = modelCoverage.get(row.modelAlias) ?? { callCount: 0, totalTokens: 0 };\n current.callCount += 1;\n current.totalTokens += totalRowTokens;\n modelCoverage.set(row.modelAlias, current);\n } else {\n pricedCallCount += 1;\n pricedTokenCount += totalRowTokens;\n }\n\n const modeBucket = modes.get(workflow) ?? {\n callCount: 0,\n totalTokens: 0,\n estimatedSpendUsd: 0,\n };\n modeBucket.callCount += 1;\n modeBucket.totalTokens += totalRowTokens;\n modeBucket.estimatedSpendUsd = round(modeBucket.estimatedSpendUsd + call.costUsd);\n modes.set(workflow, modeBucket);\n\n const modelBucket = models.get(cost.canonicalModelKey) ?? {\n callCount: 0,\n totalTokens: 0,\n estimatedSpendUsd: 0,\n pricedCallCount: 0,\n unpricedCallCount: 0,\n };\n modelBucket.callCount += 1;\n modelBucket.totalTokens += totalRowTokens;\n modelBucket.estimatedSpendUsd = round(modelBucket.estimatedSpendUsd + call.costUsd);\n if (cost.costSource === 'unpriced') {\n modelBucket.unpricedCallCount += 1;\n } else {\n modelBucket.pricedCallCount += 1;\n }\n models.set(cost.canonicalModelKey, modelBucket);\n });\n\n runs.sort(\n (left, right) => new Date(left.timestamp).getTime() - new Date(right.timestamp).getTime(),\n );\n\n return {\n runs,\n pricingCoverage: {\n pricedCallCount,\n unpricedCallCount,\n pricedTokenCount,\n unpricedTokenCount,\n topUnpricedModels: Array.from(modelCoverage.entries())\n .map(([key, value]) => ({\n key,\n callCount: value.callCount,\n totalTokens: value.totalTokens,\n }))\n .sort((left, right) => right.totalTokens - left.totalTokens)\n .slice(0, 5),\n },\n cursorUsage: {\n totalTokens,\n totalInputTokens: Math.max(totalTokens - totalOutputTokens, 0),\n totalOutputTokens,\n totalCacheReadTokens,\n totalInputWithCacheWriteTokens,\n totalInputWithoutCacheWriteTokens,\n modes: Array.from(modes.entries())\n .map(([key, value]) => ({\n key,\n callCount: value.callCount,\n totalTokens: value.totalTokens,\n estimatedSpendUsd: value.estimatedSpendUsd,\n }))\n .sort((left, right) => right.totalTokens - left.totalTokens),\n models: Array.from(models.entries())\n .map(([key, value]) => ({\n key,\n callCount: value.callCount,\n totalTokens: value.totalTokens,\n estimatedSpendUsd: value.estimatedSpendUsd,\n pricedCallCount: value.pricedCallCount,\n unpricedCallCount: value.unpricedCallCount,\n }))\n .sort((left, right) => right.totalTokens - left.totalTokens),\n },\n };\n}\n\nfunction buildDoctorNotes(report: CursorUsageCsvDoctorReport) {\n const notes = ['Cursor usage CSV headers validated.'];\n\n if (report.rowCount === 0) {\n notes.push('The CSV contains no usage rows.');\n }\n\n if (report.pricingCoverage.unpricedCallCount > 0) {\n const aliases = report.pricingCoverage.topUnpricedModels.map((model) => model.key).join(', ');\n notes.push(\n `Some Cursor aliases do not have full local pricing coverage: ${aliases || 'unknown aliases'}.`,\n );\n } else {\n notes.push('All rows in this CSV have local pricing coverage.');\n }\n\n notes.push('Cursor CSV audits use exported usage rows rather than raw session transcripts.');\n\n return notes;\n}\n\nexport async function inspectCursorUsageCsv(\n options: AuditOptions,\n): Promise<CursorUsageCsvDoctorReport> {\n const filePath = options.cursorUsageCsv ? resolve(options.cursorUsageCsv) : '';\n options.onProgress?.('Inspecting Cursor usage CSV...');\n\n if (!filePath) {\n return {\n canAudit: false,\n filePath,\n source: null,\n rowCount: 0,\n dateRange: null,\n pricingCoverage: {\n pricedCallCount: 0,\n unpricedCallCount: 0,\n pricedTokenCount: 0,\n unpricedTokenCount: 0,\n topUnpricedModels: [],\n },\n notes: ['No Cursor usage CSV path was provided.'],\n };\n }\n\n try {\n const parsed = readCursorUsageCsv(filePath);\n const normalized = normalizeCursorUsageCsv({\n source: parsed.source,\n rows: parsed.rows,\n hasObservedCostRows: parsed.hasObservedCostRows,\n });\n const dateRange =\n parsed.rows.length === 0\n ? null\n : {\n start: parsed.rows\n .map((row) => row.timestamp)\n .sort((left, right) => new Date(left).getTime() - new Date(right).getTime())[0],\n end: parsed.rows\n .map((row) => row.timestamp)\n .sort((left, right) => new Date(left).getTime() - new Date(right).getTime())\n .at(-1) as string,\n };\n\n const report: CursorUsageCsvDoctorReport = {\n canAudit: true,\n filePath: parsed.source.path,\n source: parsed.source,\n rowCount: parsed.rows.length,\n dateRange,\n pricingCoverage: normalized.pricingCoverage,\n notes: [],\n };\n report.notes = buildDoctorNotes(report);\n options.onProgress?.(\n `Cursor usage CSV is ready (${report.rowCount} row${report.rowCount === 1 ? '' : 's'}).`,\n );\n return report;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n options.onProgress?.(`Cursor usage CSV is not ready: ${message}`);\n return {\n canAudit: false,\n filePath,\n source: null,\n rowCount: 0,\n dateRange: null,\n pricingCoverage: {\n pricedCallCount: 0,\n unpricedCallCount: 0,\n pricedTokenCount: 0,\n unpricedTokenCount: 0,\n topUnpricedModels: [],\n },\n notes: [message],\n };\n }\n}\n","import { createHash } from 'node:crypto';\nimport { closeSync, openSync, readSync } from 'node:fs';\n\nexport function sha1(input: string) {\n return createHash('sha1').update(input).digest('hex');\n}\n\nexport function sha1File(path: string) {\n const hash = createHash('sha1');\n const fd = openSync(path, 'r');\n const buffer = Buffer.allocUnsafe(64 * 1024);\n\n try {\n let bytesRead = 0;\n do {\n bytesRead = readSync(fd, buffer, 0, buffer.length, null);\n if (bytesRead > 0) {\n hash.update(buffer.subarray(0, bytesRead));\n }\n } while (bytesRead > 0);\n } finally {\n closeSync(fd);\n }\n\n return hash.digest('hex');\n}\n","export function parseSince(value?: string): number | null {\n if (!value) {\n return null;\n }\n\n const match = value.trim().match(/^(\\d+)([mhdw])$/i);\n if (!match) {\n throw new Error(`Invalid --since value \"${value}\". Use values like 30m, 24h, 7d, 2w.`);\n }\n\n const amount = Number(match[1]);\n const unit = match[2].toLowerCase();\n const multipliers: Record<string, number> = {\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n w: 7 * 24 * 60 * 60 * 1000,\n };\n\n return Date.now() - amount * multipliers[unit];\n}\n\nexport function isoNow() {\n return new Date().toISOString();\n}\n\nexport function toIsoOrNow(value: unknown) {\n if (typeof value === 'string') {\n const candidate = new Date(value);\n if (!Number.isNaN(candidate.getTime())) {\n return candidate.toISOString();\n }\n }\n\n if (typeof value === 'number') {\n const candidate = new Date(value);\n if (!Number.isNaN(candidate.getTime())) {\n return candidate.toISOString();\n }\n }\n\n return isoNow();\n}\n","import { mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport Database from 'better-sqlite3';\n\nimport { SCHEMA_SQL, SCHEMA_VERSION } from './schema.js';\n\ntype SqliteDatabase = InstanceType<typeof Database>;\n\nexport interface DbClient {\n sqlite: SqliteDatabase;\n}\n\nexport function createDb(path: string): DbClient {\n mkdirSync(dirname(path), { recursive: true });\n const sqlite = new Database(path);\n const currentVersion = sqlite.pragma('user_version', { simple: true }) as number;\n\n if (currentVersion > SCHEMA_VERSION) {\n sqlite.close();\n throw new Error(\n `Unsupported Xerg database schema version ${currentVersion}. This build supports up to ${SCHEMA_VERSION}.`,\n );\n }\n\n sqlite.exec(SCHEMA_SQL);\n if (currentVersion < SCHEMA_VERSION) {\n sqlite.pragma(`user_version = ${SCHEMA_VERSION}`);\n }\n\n return { sqlite };\n}\n","export const SCHEMA_VERSION = 1;\n\nexport const SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS source_files (\n id TEXT PRIMARY KEY,\n path TEXT NOT NULL,\n kind TEXT NOT NULL,\n file_hash TEXT NOT NULL,\n mtime_ms INTEGER NOT NULL,\n size_bytes INTEGER NOT NULL,\n imported_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS runs (\n id TEXT PRIMARY KEY,\n source_path TEXT NOT NULL,\n source_kind TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n workflow TEXT NOT NULL,\n environment TEXT NOT NULL,\n tags_json TEXT NOT NULL,\n total_cost_usd REAL NOT NULL,\n total_tokens INTEGER NOT NULL,\n observed_cost_usd REAL NOT NULL,\n estimated_cost_usd REAL NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS calls (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n provider TEXT NOT NULL,\n model TEXT NOT NULL,\n input_tokens INTEGER NOT NULL,\n output_tokens INTEGER NOT NULL,\n cost_usd REAL NOT NULL,\n cost_source TEXT NOT NULL,\n latency_ms INTEGER,\n tool_calls INTEGER NOT NULL,\n retries INTEGER NOT NULL,\n attempt INTEGER,\n iteration INTEGER,\n status TEXT,\n task_class TEXT,\n cache_hit INTEGER NOT NULL,\n cache_cost_usd REAL,\n metadata_json TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS findings (\n id TEXT PRIMARY KEY,\n audit_id TEXT NOT NULL,\n classification TEXT NOT NULL,\n confidence TEXT NOT NULL,\n kind TEXT NOT NULL,\n title TEXT NOT NULL,\n summary TEXT NOT NULL,\n scope TEXT NOT NULL,\n scope_id TEXT NOT NULL,\n cost_impact_usd REAL NOT NULL,\n details_json TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS pricing_catalog (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL,\n model TEXT NOT NULL,\n effective_date TEXT NOT NULL,\n input_per_1m REAL NOT NULL,\n output_per_1m REAL NOT NULL,\n cached_input_per_1m REAL\n);\n\nCREATE TABLE IF NOT EXISTS audit_snapshots (\n id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n summary_json TEXT NOT NULL\n);\n`;\n","import type { PersistedAudit } from '../types.js';\nimport { sha1, sha1File } from '../utils/hash.js';\nimport { isoNow } from '../utils/time.js';\nimport { createDb } from './client.js';\n\nexport function persistAudit(audit: PersistedAudit, dbPath: string) {\n const { sqlite } = createDb(dbPath);\n const importedAt = isoNow();\n const pricingRows = audit.pricingCatalog.map((entry) => ({\n ...entry,\n cachedInputPer1m: entry.cachedInputPer1m ?? null,\n }));\n const sourceFileRows = audit.summary.sourceFiles.map((file) => ({\n id: sha1(`${file.path}:${file.mtimeMs}:${file.sizeBytes}`),\n path: file.path,\n kind: file.kind,\n fileHash: sha1File(file.path),\n mtimeMs: Math.trunc(file.mtimeMs),\n sizeBytes: file.sizeBytes,\n importedAt,\n }));\n const runRows = audit.runs.map((run) => ({\n id: run.id,\n sourcePath: run.sourcePath,\n sourceKind: run.sourceKind,\n timestamp: run.timestamp,\n workflow: run.workflow,\n environment: run.environment,\n tagsJson: JSON.stringify(run.tags),\n totalCostUsd: run.totalCostUsd,\n totalTokens: run.totalTokens,\n observedCostUsd: run.observedCostUsd,\n estimatedCostUsd: run.estimatedCostUsd,\n }));\n const callRows = audit.runs.flatMap((run) =>\n run.calls.map((call) => ({\n id: call.id,\n runId: call.runId,\n timestamp: call.timestamp,\n provider: call.provider,\n model: call.model,\n inputTokens: call.inputTokens,\n outputTokens: call.outputTokens,\n costUsd: call.costUsd,\n costSource: call.costSource,\n latencyMs: call.latencyMs,\n toolCalls: call.toolCalls,\n retries: call.retries,\n attempt: call.attempt,\n iteration: call.iteration,\n status: call.status,\n taskClass: call.taskClass,\n cacheHit: call.cacheHit,\n cacheCostUsd: call.cacheCostUsd,\n metadataJson: JSON.stringify(call.metadata),\n })),\n );\n const findingRows = audit.summary.findings.map((finding) => ({\n id: finding.id,\n auditId: audit.summary.auditId,\n classification: finding.classification,\n confidence: finding.confidence,\n kind: finding.kind,\n title: finding.title,\n summary: finding.summary,\n scope: finding.scope,\n scopeId: finding.scopeId,\n costImpactUsd: finding.costImpactUsd,\n detailsJson: JSON.stringify(finding.details),\n }));\n const persistTransaction = sqlite.transaction(() => {\n insertMany(\n sqlite,\n `\n INSERT OR IGNORE INTO pricing_catalog (\n id,\n provider,\n model,\n effective_date,\n input_per_1m,\n output_per_1m,\n cached_input_per_1m\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `,\n pricingRows.map((row) => [\n row.id,\n row.provider,\n row.model,\n row.effectiveDate,\n row.inputPer1m,\n row.outputPer1m,\n row.cachedInputPer1m,\n ]),\n );\n\n insertMany(\n sqlite,\n `\n INSERT OR IGNORE INTO source_files (\n id,\n path,\n kind,\n file_hash,\n mtime_ms,\n size_bytes,\n imported_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `,\n sourceFileRows.map((row) => [\n row.id,\n row.path,\n row.kind,\n row.fileHash,\n row.mtimeMs,\n row.sizeBytes,\n row.importedAt,\n ]),\n );\n\n insertMany(\n sqlite,\n `\n INSERT OR IGNORE INTO runs (\n id,\n source_path,\n source_kind,\n timestamp,\n workflow,\n environment,\n tags_json,\n total_cost_usd,\n total_tokens,\n observed_cost_usd,\n estimated_cost_usd\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n runRows.map((row) => [\n row.id,\n row.sourcePath,\n row.sourceKind,\n row.timestamp,\n row.workflow,\n row.environment,\n row.tagsJson,\n row.totalCostUsd,\n row.totalTokens,\n row.observedCostUsd,\n row.estimatedCostUsd,\n ]),\n );\n\n insertMany(\n sqlite,\n `\n INSERT OR IGNORE INTO calls (\n id,\n run_id,\n timestamp,\n provider,\n model,\n input_tokens,\n output_tokens,\n cost_usd,\n cost_source,\n latency_ms,\n tool_calls,\n retries,\n attempt,\n iteration,\n status,\n task_class,\n cache_hit,\n cache_cost_usd,\n metadata_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n callRows.map((row) => [\n row.id,\n row.runId,\n row.timestamp,\n row.provider,\n row.model,\n row.inputTokens,\n row.outputTokens,\n row.costUsd,\n row.costSource,\n row.latencyMs ?? null,\n row.toolCalls,\n row.retries,\n row.attempt ?? null,\n row.iteration ?? null,\n row.status ?? null,\n row.taskClass ?? null,\n row.cacheHit ? 1 : 0,\n row.cacheCostUsd ?? null,\n row.metadataJson,\n ]),\n );\n\n insertMany(\n sqlite,\n `\n INSERT OR IGNORE INTO findings (\n id,\n audit_id,\n classification,\n confidence,\n kind,\n title,\n summary,\n scope,\n scope_id,\n cost_impact_usd,\n details_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n findingRows.map((row) => [\n row.id,\n row.auditId,\n row.classification,\n row.confidence,\n row.kind,\n row.title,\n row.summary,\n row.scope,\n row.scopeId,\n row.costImpactUsd,\n row.detailsJson,\n ]),\n );\n\n sqlite\n .prepare(\n `\n INSERT OR IGNORE INTO audit_snapshots (\n id,\n created_at,\n summary_json\n ) VALUES (?, ?, ?)\n `,\n )\n .run(audit.summary.auditId, audit.summary.generatedAt, JSON.stringify(audit.summary));\n });\n\n try {\n persistTransaction();\n } finally {\n sqlite.close();\n }\n}\n\nfunction insertMany(sqlite: ReturnType<typeof createDb>['sqlite'], sql: string, rows: unknown[][]) {\n if (rows.length === 0) {\n return;\n }\n\n const statement = sqlite.prepare(sql);\n\n for (const row of rows) {\n statement.run(...row);\n }\n}\n","import type {\n AuditComparison,\n AuditRuntime,\n AuditSummary,\n DetectedSourceFile,\n Finding,\n FindingChange,\n FindingClassification,\n FindingTaxonomyBucket,\n SpendBreakdown,\n SpendDelta,\n} from '../types.js';\nimport { sha1 } from '../utils/hash.js';\n\nconst FINDING_KIND_LABELS: Record<string, string> = {\n 'retry-waste': 'Retry waste',\n 'context-outlier': 'Context bloat',\n 'loop-waste': 'Loop waste',\n 'candidate-downgrade': 'Downgrade candidates',\n 'idle-spend': 'Idle waste',\n};\n\nfunction round(value: number) {\n return Number(value.toFixed(6));\n}\n\nfunction normalizeSinceValue(since?: string) {\n if (!since) {\n return 'all';\n }\n\n const match = since\n .trim()\n .toLowerCase()\n .match(/^(\\d+)([mhdw])$/);\n if (!match) {\n return since.trim().toLowerCase();\n }\n\n return `${Number(match[1])}${match[2]}`;\n}\n\nfunction normalizePath(path: string) {\n return path.replace(/\\\\/g, '/');\n}\n\nfunction findSessionsRoot(path: string) {\n const normalized = normalizePath(path);\n const marker = '/sessions/';\n const index = normalized.lastIndexOf(marker);\n\n if (index >= 0) {\n return normalized.slice(0, index + marker.length - 1);\n }\n\n return normalized.slice(0, normalized.lastIndexOf('/')) || normalized;\n}\n\nfunction findGatewayRoot(path: string) {\n const normalized = normalizePath(path);\n return normalized.slice(0, normalized.lastIndexOf('/')) || normalized;\n}\n\nexport function getFindingKindLabel(kind: string) {\n return FINDING_KIND_LABELS[kind] ?? kind;\n}\n\nexport function getComparisonSourceRoot(source: DetectedSourceFile) {\n if (source.kind === 'sessions') {\n return findSessionsRoot(source.path);\n }\n\n return findGatewayRoot(source.path);\n}\n\nexport function buildComparisonKey(input: {\n runtime: AuditRuntime;\n sources: DetectedSourceFile[];\n since?: string;\n}) {\n const kinds = Array.from(new Set(input.sources.map((source) => source.kind))).sort();\n const roots = Array.from(\n new Set(input.sources.map((source) => `${source.kind}:${getComparisonSourceRoot(source)}`)),\n ).sort();\n\n return sha1(\n JSON.stringify({\n runtime: input.runtime,\n kinds,\n roots,\n since: normalizeSinceValue(input.since),\n }),\n );\n}\n\nexport function buildTaxonomyBuckets(\n findings: Finding[],\n classification: FindingClassification,\n): FindingTaxonomyBucket[] {\n const buckets = new Map<string, FindingTaxonomyBucket>();\n\n for (const finding of findings) {\n if (finding.classification !== classification) {\n continue;\n }\n\n const current = buckets.get(finding.kind) ?? {\n kind: finding.kind,\n label: getFindingKindLabel(finding.kind),\n classification,\n spendUsd: 0,\n findingCount: 0,\n };\n\n current.spendUsd = round(current.spendUsd + finding.costImpactUsd);\n current.findingCount += 1;\n buckets.set(finding.kind, current);\n }\n\n return Array.from(buckets.values()).sort((left, right) => right.spendUsd - left.spendUsd);\n}\n\nfunction toSpendMap(rows: SpendBreakdown[]) {\n return new Map(rows.map((row) => [row.key, row.spendUsd]));\n}\n\nfunction buildTopSpendDeltas(currentRows: SpendBreakdown[], baselineRows: SpendBreakdown[]) {\n const currentMap = toSpendMap(currentRows);\n const baselineMap = toSpendMap(baselineRows);\n const keys = Array.from(new Set([...currentMap.keys(), ...baselineMap.keys()]));\n\n return keys\n .map((key) => {\n const baselineSpendUsd = baselineMap.get(key) ?? 0;\n const currentSpendUsd = currentMap.get(key) ?? 0;\n\n return {\n key,\n baselineSpendUsd: round(baselineSpendUsd),\n currentSpendUsd: round(currentSpendUsd),\n deltaSpendUsd: round(currentSpendUsd - baselineSpendUsd),\n } satisfies SpendDelta;\n })\n .filter((row) => row.deltaSpendUsd !== 0)\n .sort((left, right) => Math.abs(right.deltaSpendUsd) - Math.abs(left.deltaSpendUsd))\n .slice(0, 3);\n}\n\nfunction getFindingIdentity(finding: Finding) {\n return `${finding.kind}:${finding.scope}:${finding.scopeId}`;\n}\n\nfunction sortFindingChanges(changes: FindingChange[]) {\n return changes.sort(\n (left, right) => Math.abs(right.deltaCostImpactUsd) - Math.abs(left.deltaCostImpactUsd),\n );\n}\n\nfunction buildFindingChanges(currentFindings: Finding[], baselineFindings: Finding[]) {\n const currentWaste = currentFindings.filter(\n (finding) => finding.classification === 'waste' && finding.confidence === 'high',\n );\n const baselineWaste = baselineFindings.filter(\n (finding) => finding.classification === 'waste' && finding.confidence === 'high',\n );\n const currentMap = new Map(currentWaste.map((finding) => [getFindingIdentity(finding), finding]));\n const baselineMap = new Map(\n baselineWaste.map((finding) => [getFindingIdentity(finding), finding]),\n );\n\n const newHighConfidenceWaste: FindingChange[] = [];\n const resolvedHighConfidenceWaste: FindingChange[] = [];\n const worsenedHighConfidenceWaste: FindingChange[] = [];\n\n for (const [identity, current] of currentMap.entries()) {\n const baseline = baselineMap.get(identity);\n\n if (!baseline) {\n newHighConfidenceWaste.push({\n kind: current.kind,\n title: current.title,\n scope: current.scope,\n scopeId: current.scopeId,\n currentCostImpactUsd: current.costImpactUsd,\n deltaCostImpactUsd: round(current.costImpactUsd),\n });\n continue;\n }\n\n const deltaCostImpactUsd = round(current.costImpactUsd - baseline.costImpactUsd);\n if (deltaCostImpactUsd > 0) {\n worsenedHighConfidenceWaste.push({\n kind: current.kind,\n title: current.title,\n scope: current.scope,\n scopeId: current.scopeId,\n baselineCostImpactUsd: baseline.costImpactUsd,\n currentCostImpactUsd: current.costImpactUsd,\n deltaCostImpactUsd,\n });\n }\n }\n\n for (const [identity, baseline] of baselineMap.entries()) {\n if (currentMap.has(identity)) {\n continue;\n }\n\n resolvedHighConfidenceWaste.push({\n kind: baseline.kind,\n title: baseline.title,\n scope: baseline.scope,\n scopeId: baseline.scopeId,\n baselineCostImpactUsd: baseline.costImpactUsd,\n deltaCostImpactUsd: round(-baseline.costImpactUsd),\n });\n }\n\n return {\n newHighConfidenceWaste: sortFindingChanges(newHighConfidenceWaste),\n resolvedHighConfidenceWaste: sortFindingChanges(resolvedHighConfidenceWaste),\n worsenedHighConfidenceWaste: sortFindingChanges(worsenedHighConfidenceWaste),\n };\n}\n\nfunction inferSummaryRuntime(summary: AuditSummary): AuditRuntime {\n if ('runtime' in summary && summary.runtime) {\n return summary.runtime;\n }\n\n if (summary.sourceFiles.some((source) => source.kind === 'cursor-usage-csv')) {\n return 'cursor';\n }\n\n return 'openclaw';\n}\n\nexport function hydrateAuditSummary(summary: AuditSummary): AuditSummary {\n const runtime = inferSummaryRuntime(summary);\n const shouldRebuildComparisonKey =\n !('runtime' in summary) || !summary.runtime || !summary.comparisonKey;\n const hydratedSources = summary.sourceFiles.map((source) => ({\n ...source,\n runtime:\n source.runtime ??\n (source.kind === 'cursor-usage-csv' ? 'cursor' : runtime === 'cursor' ? 'openclaw' : runtime),\n }));\n\n return {\n ...summary,\n runtime,\n sourceFiles: hydratedSources,\n comparisonKey: shouldRebuildComparisonKey\n ? buildComparisonKey({\n runtime,\n sources: hydratedSources,\n since: summary.since,\n })\n : summary.comparisonKey,\n comparison: summary.comparison ?? null,\n wasteByKind:\n summary.wasteByKind?.length > 0\n ? summary.wasteByKind\n : buildTaxonomyBuckets(summary.findings, 'waste'),\n opportunityByKind:\n summary.opportunityByKind?.length > 0\n ? summary.opportunityByKind\n : buildTaxonomyBuckets(summary.findings, 'opportunity'),\n spendByDay: summary.spendByDay ?? [],\n wasteByDay: summary.wasteByDay ?? [],\n recommendations: summary.recommendations ?? [],\n notes: summary.notes ?? [],\n pricingCoverage: summary.pricingCoverage ?? null,\n cursorUsage: summary.cursorUsage ?? null,\n };\n}\n\nexport function buildAuditComparison(\n current: AuditSummary,\n baseline: AuditSummary,\n): AuditComparison {\n const workflowDeltas = buildTopSpendDeltas(current.spendByWorkflow, baseline.spendByWorkflow);\n const modelDeltas = buildTopSpendDeltas(current.spendByModel, baseline.spendByModel);\n\n return {\n baselineAuditId: baseline.auditId,\n baselineGeneratedAt: baseline.generatedAt,\n baselineRunCount: baseline.runCount,\n baselineCallCount: baseline.callCount,\n baselineTotalSpendUsd: baseline.totalSpendUsd,\n baselineObservedSpendUsd: baseline.observedSpendUsd,\n baselineEstimatedSpendUsd: baseline.estimatedSpendUsd,\n baselineWasteSpendUsd: baseline.wasteSpendUsd,\n baselineOpportunitySpendUsd: baseline.opportunitySpendUsd,\n baselineStructuralWasteRate: baseline.structuralWasteRate,\n deltaTotalSpendUsd: round(current.totalSpendUsd - baseline.totalSpendUsd),\n deltaObservedSpendUsd: round(current.observedSpendUsd - baseline.observedSpendUsd),\n deltaEstimatedSpendUsd: round(current.estimatedSpendUsd - baseline.estimatedSpendUsd),\n deltaWasteSpendUsd: round(current.wasteSpendUsd - baseline.wasteSpendUsd),\n deltaOpportunitySpendUsd: round(current.opportunitySpendUsd - baseline.opportunitySpendUsd),\n deltaStructuralWasteRate: round(current.structuralWasteRate - baseline.structuralWasteRate),\n deltaRunCount: current.runCount - baseline.runCount,\n deltaCallCount: current.callCount - baseline.callCount,\n workflowDeltas,\n modelDeltas,\n findingChanges: buildFindingChanges(current.findings, baseline.findings),\n };\n}\n","import { hydrateAuditSummary } from '../report/comparison.js';\nimport type { AuditSummary } from '../types.js';\nimport { createDb } from './client.js';\n\nfunction parseAuditSummary(row: { id: string; summaryJson: string }) {\n try {\n return hydrateAuditSummary(JSON.parse(row.summaryJson) as AuditSummary);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n process.stderr.write(`Warning: skipping unreadable audit snapshot ${row.id}: ${message}\\n`);\n return null;\n }\n}\n\nexport function listStoredAuditSummaries(dbPath: string): AuditSummary[] {\n const { sqlite } = createDb(dbPath);\n\n try {\n const rows = sqlite\n .prepare(\n `\n SELECT id, summary_json AS summaryJson\n FROM audit_snapshots\n ORDER BY created_at DESC\n `,\n )\n .all() as { id: string; summaryJson: string }[];\n\n return rows\n .map((row) => parseAuditSummary(row))\n .filter((summary): summary is AuditSummary => summary !== null);\n } finally {\n sqlite.close();\n }\n}\n\nexport function readLatestComparableAuditSummary(input: {\n dbPath: string;\n comparisonKey: string;\n currentAuditId?: string;\n}) {\n return listStoredAuditSummaries(input.dbPath).find((summary) => {\n if (input.currentAuditId && summary.auditId === input.currentAuditId) {\n return false;\n }\n\n return summary.comparisonKey === input.comparisonKey;\n });\n}\n","import type {\n Finding,\n FindingBuildResult,\n FindingClassification,\n FindingConfidence,\n NormalizedRun,\n} from '../types.js';\nimport { sha1 } from '../utils/hash.js';\n\nfunction round(value: number) {\n return Number(value.toFixed(6));\n}\n\nfunction createFinding(input: Omit<Finding, 'id'>): Finding {\n return {\n ...input,\n id: sha1(\n `${input.kind}:${input.scope}:${input.scopeId}:${input.title}:${input.costImpactUsd}:${input.summary}`,\n ),\n };\n}\n\nfunction asNumber(value: unknown) {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction asBoolean(value: unknown) {\n return value === true;\n}\n\nexport function buildCursorUsageFindings(runs: NormalizedRun[]): FindingBuildResult {\n const calls = runs.flatMap((run) => run.calls);\n const billableCalls = calls.filter((call) => call.costUsd > 0);\n if (billableCalls.length === 0) {\n return { findings: [], wasteAttributions: [] };\n }\n\n const cacheAwareCalls = billableCalls.filter((call) => {\n return asNumber(call.metadata.cacheReadTokens) > 0;\n });\n if (cacheAwareCalls.length === 0) {\n return { findings: [], wasteAttributions: [] };\n }\n\n const totalSpendUsd = billableCalls.reduce((sum, call) => sum + call.costUsd, 0);\n const totalInputTokens = billableCalls.reduce((sum, call) => sum + call.inputTokens, 0);\n const totalCacheReadTokens = cacheAwareCalls.reduce(\n (sum, call) => sum + asNumber(call.metadata.cacheReadTokens),\n 0,\n );\n const totalCacheWriteTokens = billableCalls.reduce(\n (sum, call) => sum + asNumber(call.metadata.inputWithCacheWriteTokens),\n 0,\n );\n const cacheSpendUsd = cacheAwareCalls.reduce((sum, call) => sum + (call.cacheCostUsd ?? 0), 0);\n const cacheWriteSpendUsd = billableCalls.reduce(\n (sum, call) => sum + asNumber(call.metadata.cacheWriteCostUsd),\n 0,\n );\n const coveredSpendUsd = billableCalls\n .filter((call) => call.cacheCostUsd !== null)\n .reduce((sum, call) => sum + call.costUsd, 0);\n const maxModeSpendUsd = billableCalls\n .filter((call) => asBoolean(call.metadata.maxMode))\n .reduce((sum, call) => sum + call.costUsd, 0);\n const cacheReadShare = totalInputTokens === 0 ? 0 : totalCacheReadTokens / totalInputTokens;\n const cacheCoverageShare = totalSpendUsd === 0 ? 0 : coveredSpendUsd / totalSpendUsd;\n const maxModeSpendShare = totalSpendUsd === 0 ? 0 : maxModeSpendUsd / totalSpendUsd;\n const cacheImpactUsd = round(cacheSpendUsd + cacheWriteSpendUsd);\n\n const meetsWasteBar =\n cacheImpactUsd >= 25 &&\n cacheReadShare >= 0.6 &&\n cacheAwareCalls.length >= 20 &&\n cacheCoverageShare >= 0.4;\n const meetsOpportunityBar =\n cacheImpactUsd >= 5 &&\n cacheReadShare >= 0.35 &&\n cacheAwareCalls.length >= 10 &&\n cacheCoverageShare >= 0.25;\n\n if (!meetsWasteBar && !meetsOpportunityBar) {\n return { findings: [], wasteAttributions: [] };\n }\n\n const classification: FindingClassification = meetsWasteBar ? 'waste' : 'opportunity';\n\n const confidence: FindingConfidence =\n cacheReadShare >= 0.8 && cacheAwareCalls.length >= 50 && cacheCoverageShare >= 0.5\n ? 'high'\n : cacheReadShare >= 0.5 && cacheAwareCalls.length >= 20\n ? 'medium'\n : 'low';\n\n const summary =\n classification === 'waste'\n ? `Xerg estimated ${cacheImpactUsd.toFixed(2)} USD of billed spend was driven by repeatedly replaying cached context across ${cacheAwareCalls.length} paid row${cacheAwareCalls.length === 1 ? '' : 's'}. This pattern is consistent with long chats carrying more history than needed.`\n : `Xerg estimated ${cacheImpactUsd.toFixed(2)} USD of billed spend was tied to cached context replay across ${cacheAwareCalls.length} paid row${cacheAwareCalls.length === 1 ? '' : 's'}. Summarizing and resetting long chats could reduce this carryover cost.`;\n\n const findings: Finding[] = [\n createFinding({\n classification,\n confidence,\n kind: 'cache-carryover',\n title:\n classification === 'waste'\n ? 'Cached context carryover is driving avoidable spend'\n : 'Cached context carryover looks like a strong cost-reduction opportunity',\n summary,\n scope: 'global',\n scopeId: 'all',\n scopeLabel: 'Cursor usage',\n costImpactUsd: cacheImpactUsd,\n details: {\n cacheReadShare: round(cacheReadShare),\n cacheCoverageShare: round(cacheCoverageShare),\n totalCacheReadTokens,\n totalCacheWriteTokens,\n billableCallCount: billableCalls.length,\n cacheAwareCallCount: cacheAwareCalls.length,\n maxModeSpendShare: round(maxModeSpendShare),\n estimatedCacheReadSpendUsd: round(cacheSpendUsd),\n estimatedCacheWriteSpendUsd: round(cacheWriteSpendUsd),\n },\n }),\n ];\n\n const maxModeCalls = billableCalls.filter((call) => asBoolean(call.metadata.maxMode));\n const maxModeCallShare =\n billableCalls.length === 0 ? 0 : maxModeCalls.length / billableCalls.length;\n\n if (maxModeSpendShare >= 0.6 && maxModeSpendUsd >= 25 && maxModeCalls.length >= 10) {\n const maxModeConfidence: FindingConfidence =\n maxModeSpendShare >= 0.85 && maxModeCalls.length >= 50\n ? 'high'\n : maxModeSpendShare >= 0.7 && maxModeCalls.length >= 20\n ? 'medium'\n : 'low';\n\n findings.push(\n createFinding({\n classification: 'opportunity',\n confidence: maxModeConfidence,\n kind: 'max-mode-concentration',\n title: 'Max mode is concentrated in the billed spend mix',\n summary: `Max mode accounts for ${(maxModeSpendShare * 100).toFixed(0)}% of billed spend across ${maxModeCalls.length} paid row${maxModeCalls.length === 1 ? '' : 's'}. This is a strong candidate for splitting work between premium and standard passes.`,\n scope: 'global',\n scopeId: 'all',\n scopeLabel: 'Cursor usage',\n costImpactUsd: round(maxModeSpendUsd * 0.2),\n details: {\n maxModeSpendUsd: round(maxModeSpendUsd),\n maxModeSpendShare: round(maxModeSpendShare),\n maxModeCallCount: maxModeCalls.length,\n maxModeCallShare: round(maxModeCallShare),\n },\n }),\n );\n }\n\n const wasteAttributions =\n classification === 'waste'\n ? billableCalls\n .map((call) => ({\n kind: 'cache-carryover',\n timestamp: call.timestamp,\n wasteUsd: round((call.cacheCostUsd ?? 0) + asNumber(call.metadata.cacheWriteCostUsd)),\n }))\n .filter((attribution) => attribution.wasteUsd > 0)\n : [];\n\n return {\n findings: findings.sort((left, right) => right.costImpactUsd - left.costImpactUsd),\n wasteAttributions,\n };\n}\n","import type { Finding, FindingBuildResult, NormalizedRun, WasteAttribution } from '../types.js';\nimport { sha1 } from '../utils/hash.js';\n\nfunction createFinding(input: Omit<Finding, 'id'>): Finding {\n return {\n ...input,\n id: sha1(\n `${input.kind}:${input.scope}:${input.scopeId}:${input.title}:${input.costImpactUsd}:${input.summary}`,\n ),\n };\n}\n\nfunction round(value: number) {\n return Number(value.toFixed(6));\n}\n\nexport function buildFindings(runs: NormalizedRun[]): FindingBuildResult {\n const findings: Finding[] = [];\n const wasteAttributions: WasteAttribution[] = [];\n const allCalls = runs.flatMap((run) => run.calls.map((call) => ({ run, call })));\n\n const retryCandidates = allCalls.filter(({ call }) => {\n const status = (call.status ?? '').toLowerCase();\n return status.includes('error') || status.includes('fail');\n });\n\n const retryCost = retryCandidates.reduce((sum, item) => sum + item.call.costUsd, 0);\n if (retryCost > 0) {\n wasteAttributions.push(\n ...retryCandidates.map(({ call }) => ({\n kind: 'retry-waste',\n timestamp: call.timestamp,\n wasteUsd: call.costUsd,\n })),\n );\n findings.push(\n createFinding({\n classification: 'waste',\n confidence: 'high',\n kind: 'retry-waste',\n title: 'Retry waste is consuming measurable spend',\n summary: `${retryCandidates.length} failed call${retryCandidates.length === 1 ? '' : 's'} were followed by additional work, making their spend pure retry overhead.`,\n scope: 'global',\n scopeId: 'all',\n scopeLabel: 'workspace',\n costImpactUsd: round(retryCost),\n details: {\n failedCallCount: retryCandidates.length,\n },\n }),\n );\n }\n\n for (const run of runs) {\n const maxIteration = Math.max(...run.calls.map((call) => call.iteration ?? 0));\n if (maxIteration >= 7) {\n const loopCalls = run.calls.filter((call) => (call.iteration ?? 0) > 5);\n const loopCost = loopCalls.reduce((sum, call) => sum + call.costUsd, 0);\n wasteAttributions.push(\n ...loopCalls.map((call) => ({\n kind: 'loop-waste',\n timestamp: call.timestamp,\n wasteUsd: call.costUsd,\n })),\n );\n findings.push(\n createFinding({\n classification: 'waste',\n confidence: 'high',\n kind: 'loop-waste',\n title: `Workflow \"${run.workflow}\" ran beyond efficient loop bounds`,\n summary: `This run reached ${maxIteration} iterations. Xerg treats the spend after iteration 5 as likely loop waste.`,\n scope: 'run',\n scopeId: run.workflow,\n scopeLabel: run.workflow,\n costImpactUsd: round(loopCost),\n details: {\n workflow: run.workflow,\n maxIteration,\n },\n }),\n );\n }\n }\n\n const runsByWorkflow = new Map<string, NormalizedRun[]>();\n for (const run of runs) {\n const bucket = runsByWorkflow.get(run.workflow) ?? [];\n bucket.push(run);\n runsByWorkflow.set(run.workflow, bucket);\n }\n\n for (const [workflow, workflowRuns] of runsByWorkflow.entries()) {\n if (workflowRuns.length >= 3) {\n const totalInputs = workflowRuns.map((run) =>\n run.calls.reduce((sum, call) => sum + call.inputTokens, 0),\n );\n const average = totalInputs.reduce((sum, value) => sum + value, 0) / totalInputs.length;\n const outlierRuns = workflowRuns.filter((run) => {\n const tokens = run.calls.reduce((sum, call) => sum + call.inputTokens, 0);\n return tokens > average * 1.75 && tokens > 1500;\n });\n\n if (outlierRuns.length > 0) {\n const outlierCost = outlierRuns.reduce((sum, run) => sum + run.totalCostUsd, 0);\n findings.push(\n createFinding({\n classification: 'opportunity',\n confidence: 'medium',\n kind: 'context-outlier',\n title: `Context usage in \"${workflow}\" is well above its baseline`,\n summary: `Xerg found ${outlierRuns.length} run${outlierRuns.length === 1 ? '' : 's'} in this workflow with input token volume far above the workflow average.`,\n scope: 'workflow',\n scopeId: workflow,\n scopeLabel: workflow,\n costImpactUsd: round(outlierCost),\n details: {\n workflow,\n averageInputTokens: round(average),\n outlierRunCount: outlierRuns.length,\n },\n }),\n );\n }\n }\n\n const idleRuns = workflowRuns.filter((run) =>\n /(heartbeat|cron|monitor|poll)/i.test(run.workflow),\n );\n if (idleRuns.length > 0) {\n const idleCost = idleRuns.reduce((sum, run) => sum + run.totalCostUsd, 0);\n findings.push(\n createFinding({\n classification: 'opportunity',\n confidence: 'medium',\n kind: 'idle-spend',\n title: `Idle or monitoring spend detected in \"${workflow}\"`,\n summary:\n 'This workflow name looks like a recurring heartbeat or monitoring loop. Review whether the cadence and model tier are justified.',\n scope: 'workflow',\n scopeId: workflow,\n scopeLabel: workflow,\n costImpactUsd: round(idleCost),\n details: {\n workflow,\n },\n }),\n );\n }\n\n const downgradeCalls = workflowRuns\n .flatMap((run) => run.calls)\n .filter((call) => {\n return (\n /(opus|gpt-4o|sonnet)/i.test(call.model) &&\n /(heartbeat|cron|monitor|summary|tag|triage)/i.test(call.taskClass ?? workflow)\n );\n });\n\n if (downgradeCalls.length > 0) {\n const spend = downgradeCalls.reduce((sum, call) => sum + call.costUsd, 0);\n findings.push(\n createFinding({\n classification: 'opportunity',\n confidence: 'low',\n kind: 'candidate-downgrade',\n title: `Candidate model downgrade opportunity in \"${workflow}\"`,\n summary:\n 'An expensive model is being used on a workflow that looks operationally simple. Treat this as an A/B test candidate, not proven waste.',\n scope: 'workflow',\n scopeId: workflow,\n scopeLabel: workflow,\n costImpactUsd: round(spend * 0.3),\n details: {\n workflow,\n expensiveCallCount: downgradeCalls.length,\n inspectedSpendUsd: round(spend),\n },\n }),\n );\n }\n }\n\n return {\n findings: findings.sort((left, right) => right.costImpactUsd - left.costImpactUsd),\n wasteAttributions,\n };\n}\n","import type { PricingEntry } from './types.js';\n\nexport const PRICING_CATALOG: PricingEntry[] = [\n {\n id: 'anthropic-claude-haiku-4-5-2026-03-01',\n provider: 'anthropic',\n model: 'claude-haiku-4-5',\n effectiveDate: '2026-03-01',\n inputPer1m: 0.8,\n outputPer1m: 4,\n },\n {\n id: 'anthropic-claude-sonnet-4-5-2026-03-01',\n provider: 'anthropic',\n model: 'claude-sonnet-4-5',\n effectiveDate: '2026-03-01',\n inputPer1m: 3,\n outputPer1m: 15,\n },\n {\n id: 'anthropic-claude-opus-4-2026-03-01',\n provider: 'anthropic',\n model: 'claude-opus-4',\n effectiveDate: '2026-03-01',\n inputPer1m: 15,\n outputPer1m: 75,\n },\n {\n id: 'openai-gpt-4o-2026-03-01',\n provider: 'openai',\n model: 'gpt-4o',\n effectiveDate: '2026-03-01',\n inputPer1m: 2.5,\n outputPer1m: 10,\n },\n {\n id: 'openai-gpt-4.1-mini-2026-03-01',\n provider: 'openai',\n model: 'gpt-4.1-mini',\n effectiveDate: '2026-03-01',\n inputPer1m: 0.4,\n outputPer1m: 1.6,\n },\n {\n id: 'google-gemini-2.0-flash-2026-03-01',\n provider: 'google',\n model: 'gemini-2.0-flash',\n effectiveDate: '2026-03-01',\n inputPer1m: 0.35,\n outputPer1m: 1.4,\n },\n {\n id: 'meta-llama-3.3-70b-2026-03-01',\n provider: 'meta',\n model: 'llama-3.3-70b-instruct',\n effectiveDate: '2026-03-01',\n inputPer1m: 0.9,\n outputPer1m: 0.9,\n },\n];\n\nexport function getPricingEntry(provider: string, model: string): PricingEntry | undefined {\n const normalizedProvider = provider.trim().toLowerCase();\n const normalizedModel = model.trim().toLowerCase();\n\n return PRICING_CATALOG.find((entry) => {\n return (\n entry.provider.toLowerCase() === normalizedProvider &&\n entry.model.toLowerCase() === normalizedModel\n );\n });\n}\n\nexport function estimateCostUsd(\n provider: string,\n model: string,\n inputTokens: number,\n outputTokens: number,\n) {\n const entry = getPricingEntry(provider, model);\n\n if (!entry) {\n return null;\n }\n\n const inputCost = (Math.max(inputTokens, 0) / 1_000_000) * entry.inputPer1m;\n const outputCost = (Math.max(outputTokens, 0) / 1_000_000) * entry.outputPer1m;\n\n return Number((inputCost + outputCost).toFixed(8));\n}\n","import type {\n XergRecommendation,\n XergRecommendationCategory,\n XergRecommendationEffort,\n XergRecommendationPriorityBucket,\n XergRecommendationSeverity,\n XergRecommendationSurface,\n} from '@xerg/schemas';\n\nimport type { AuditSummary, Finding } from './types.js';\nimport { sha1 } from './utils/hash.js';\n\ninterface RecommendationTemplate {\n priorityBucket: XergRecommendationPriorityBucket;\n implementationSurface: XergRecommendationSurface;\n category: XergRecommendationCategory;\n severity: XergRecommendationSeverity;\n effort: XergRecommendationEffort;\n titleFn: (finding: Finding) => string;\n summaryFn: (finding: Finding) => string;\n whereToChangeFn: (finding: Finding) => string;\n validationPlanFn: (finding: Finding) => string;\n actionsFn: (finding: Finding) => string[];\n}\n\nconst PRIORITY_RANK: Record<XergRecommendationPriorityBucket, number> = {\n fix_now: 2,\n test_next: 1,\n watch: 0,\n};\n\nconst CONFIDENCE_RANK: Record<XergRecommendation['confidence'], number> = {\n high: 2,\n medium: 1,\n low: 0,\n};\n\nfunction roundCurrency(value: number) {\n return Number(value.toFixed(6));\n}\n\nfunction roundPct(value: number) {\n return Number(value.toFixed(4));\n}\n\nfunction formatScopeLabel(finding: Finding) {\n if (finding.scope === 'global') {\n return 'workspace';\n }\n\n return finding.scopeLabel?.trim() || finding.scopeId;\n}\n\nfunction normalizeRecommendationScope(finding: Finding): XergRecommendation['scope'] {\n if (finding.scope === 'global') {\n return 'workspace';\n }\n\n return 'workflow';\n}\n\nfunction stableScopeKeyForFinding(finding: Finding) {\n if (finding.scope === 'global') {\n return 'workspace';\n }\n\n return finding.scopeId;\n}\n\nfunction resolveScopeId(finding: Finding, scope: XergRecommendation['scope']) {\n return scope === 'workspace' ? 'workspace' : stableScopeKeyForFinding(finding);\n}\n\nfunction dedupKeyForFinding(finding: Finding) {\n const scope = normalizeRecommendationScope(finding);\n return `${finding.kind}:${scope}:${stableScopeKeyForFinding(finding)}`;\n}\n\nfunction recommendationIdForFinding(\n finding: Finding,\n implementationSurface: XergRecommendationSurface,\n) {\n const scope = normalizeRecommendationScope(finding);\n return sha1(\n `rec:v2:${finding.kind}:${scope}:${stableScopeKeyForFinding(finding)}:${implementationSurface}`,\n );\n}\n\nfunction compareRecommendations(left: XergRecommendation, right: XergRecommendation) {\n const priorityDelta = PRIORITY_RANK[right.priorityBucket] - PRIORITY_RANK[left.priorityBucket];\n if (priorityDelta !== 0) {\n return priorityDelta;\n }\n\n if (right.estimatedSavingsUsd !== left.estimatedSavingsUsd) {\n return right.estimatedSavingsUsd - left.estimatedSavingsUsd;\n }\n\n const confidenceDelta = CONFIDENCE_RANK[right.confidence] - CONFIDENCE_RANK[left.confidence];\n if (confidenceDelta !== 0) {\n return confidenceDelta;\n }\n\n return left.title.localeCompare(right.title);\n}\n\nconst templatesByKind: Record<string, RecommendationTemplate> = {\n 'retry-waste': {\n priorityBucket: 'fix_now',\n implementationSurface: 'retry_policy',\n category: 'structural_efficiency',\n severity: 'high',\n effort: 'low',\n titleFn: (finding) => `Reduce retry waste in ${formatScopeLabel(finding)}`,\n summaryFn: (finding) =>\n `${finding.summary} This is confirmed retry overhead, so it is a fix-now issue rather than an experiment.`,\n whereToChangeFn: (finding) =>\n `Reduce retries or add exponential backoff in the retry wrapper for ${formatScopeLabel(finding)}.`,\n validationPlanFn: () =>\n 'Ship the change, then rerun `xerg audit --compare --push` against the same source. Retry waste should drop materially on the next audit.',\n actionsFn: () => [\n 'Lower max retry count.',\n 'Add exponential backoff if none exists.',\n 'Log or alert when retries hit the cap.',\n ],\n },\n 'loop-waste': {\n priorityBucket: 'fix_now',\n implementationSurface: 'loop_guard',\n category: 'structural_efficiency',\n severity: 'high',\n effort: 'medium',\n titleFn: (finding) => `Cap loop depth in ${formatScopeLabel(finding)}`,\n summaryFn: (finding) =>\n `${finding.summary} This is confirmed loop waste and should be fixed before chasing lower-confidence opportunities.`,\n whereToChangeFn: (finding) =>\n `Cap iteration depth or add an early-exit guard in the loop controller for ${formatScopeLabel(finding)}.`,\n validationPlanFn: () =>\n 'Ship the change, then rerun `xerg audit --compare --push`. Loop waste and call volume should fall on the next audit.',\n actionsFn: () => [\n 'Add a hard iteration cap.',\n 'Add a no-progress exit.',\n 'Emit a warning when the cap is hit.',\n ],\n },\n 'context-outlier': {\n priorityBucket: 'test_next',\n implementationSurface: 'prompt_builder',\n category: 'context_hygiene',\n severity: 'medium',\n effort: 'medium',\n titleFn: (finding) => `Trim context in ${formatScopeLabel(finding)}`,\n summaryFn: (finding) =>\n `${finding.summary} Treat this as a reversible optimization test rather than proven waste.`,\n whereToChangeFn: (finding) =>\n `Trim input context in the prompt builder for ${formatScopeLabel(finding)}.`,\n validationPlanFn: () =>\n 'Ship the change, then rerun `xerg audit --compare --push`. Input tokens and context-related spend should fall.',\n actionsFn: () => [\n 'Drop stale context blocks.',\n 'Summarize long histories.',\n 'Cap prompt size for this workflow.',\n ],\n },\n 'idle-spend': {\n priorityBucket: 'test_next',\n implementationSurface: 'scheduler',\n category: 'cadence_activity',\n severity: 'medium',\n effort: 'low',\n titleFn: (finding) => `Review cadence for ${formatScopeLabel(finding)}`,\n summaryFn: (finding) =>\n `${finding.summary} This is usually a scheduling decision, so validate it by lowering or gating activity instead of rewriting the workflow.`,\n whereToChangeFn: (finding) =>\n `Lower cadence or move to event-driven triggers for ${formatScopeLabel(finding)}.`,\n validationPlanFn: () =>\n 'Ship the change, then rerun `xerg audit --compare --push`. Idle spend per day should drop.',\n actionsFn: () => [\n 'Reduce poll frequency.',\n 'Gate runs behind a real trigger.',\n 'Disable runs during dead windows.',\n ],\n },\n 'candidate-downgrade': {\n priorityBucket: 'test_next',\n implementationSurface: 'model_routing',\n category: 'model_fit',\n severity: 'low',\n effort: 'low',\n titleFn: (finding) => `Evaluate a cheaper model for ${formatScopeLabel(finding)}`,\n summaryFn: (finding) =>\n `${finding.summary} This is an A/B candidate: spend may fall, but quality needs to be checked before rollout.`,\n whereToChangeFn: (finding) =>\n `Re-map ${formatScopeLabel(finding)} to a cheaper model in the routing layer.`,\n validationPlanFn: () =>\n 'A/B the cheaper model, then rerun `xerg audit --compare --push`. Confirm spend drops without a quality regression.',\n actionsFn: () => [\n 'Try a cheaper model on this workflow.',\n 'Compare quality on a labeled sample.',\n 'Roll out if acceptable.',\n ],\n },\n 'cache-carryover': {\n priorityBucket: 'test_next',\n implementationSurface: 'user_behavior',\n category: 'context_hygiene',\n severity: 'medium',\n effort: 'low',\n titleFn: () => 'Reset or summarize long Cursor chats',\n summaryFn: (finding) =>\n `${finding.summary} This is about session behavior rather than code structure, so the intervention is to reset context more aggressively.`,\n whereToChangeFn: () =>\n 'Reset or summarize long Cursor chats instead of continuing the same session.',\n validationPlanFn: () =>\n 'Change session behavior, then push a new Cursor usage audit with `--compare --push`. Cache-read share should fall.',\n actionsFn: () => [\n 'Summarize context into a short recall note.',\n 'Start a fresh chat.',\n 'Carry forward only the recall note and necessary facts.',\n ],\n },\n 'max-mode-concentration': {\n priorityBucket: 'test_next',\n implementationSurface: 'user_behavior',\n category: 'model_fit',\n severity: 'medium',\n effort: 'low',\n titleFn: () => 'Reserve max mode for the hardest Cursor turns',\n summaryFn: (finding) =>\n `${finding.summary} The likely fix is changing mode habits or escalation rules, not modifying a prompt builder.`,\n whereToChangeFn: () =>\n 'Reserve max mode for the hardest Cursor turns; default to standard mode.',\n validationPlanFn: () =>\n 'Change your mode defaults, then push a new Cursor usage audit with `--compare --push`. Max-mode spend share should fall.',\n actionsFn: () => [\n 'Start in standard mode.',\n 'Escalate only when standard fails.',\n 'Review any auto-escalation habit.',\n ],\n },\n};\n\nconst unknownTemplate: RecommendationTemplate = {\n priorityBucket: 'watch',\n implementationSurface: 'other',\n category: 'other',\n severity: 'low',\n effort: 'medium',\n titleFn: (finding) => `Review ${finding.title}`,\n summaryFn: (finding) => finding.summary,\n whereToChangeFn: (finding) => `Review ${formatScopeLabel(finding)} with your operator.`,\n validationPlanFn: () =>\n 'Ship any change, then rerun `xerg audit --compare --push` to confirm impact.',\n actionsFn: () => [\n 'Investigate the finding details.',\n 'Decide whether to act.',\n 'Re-audit after the change.',\n ],\n};\n\nfunction buildSingleRecommendation(summary: AuditSummary, finding: Finding): XergRecommendation {\n const template = templatesByKind[finding.kind] ?? unknownTemplate;\n const scope = normalizeRecommendationScope(finding);\n const scopeId = resolveScopeId(finding, scope);\n const scopeLabel = formatScopeLabel(finding);\n const estimatedSavingsPct =\n summary.totalSpendUsd === 0\n ? 0\n : roundPct(Math.min(Math.max(finding.costImpactUsd / summary.totalSpendUsd, 0), 1));\n\n return {\n id: recommendationIdForFinding(finding, template.implementationSurface),\n findingId: finding.id,\n kind: finding.kind,\n title: template.titleFn(finding),\n summary: template.summaryFn(finding),\n priorityBucket: template.priorityBucket,\n recommendedOrder: 0,\n implementationSurface: template.implementationSurface,\n category: template.category,\n severity: template.severity,\n estimatedSavingsUsd: roundCurrency(finding.costImpactUsd),\n estimatedSavingsPct,\n confidence: finding.confidence,\n effort: template.effort,\n scope,\n scopeId,\n scopeLabel,\n whereToChange: template.whereToChangeFn(finding),\n validationPlan: template.validationPlanFn(finding),\n actions: template.actionsFn(finding),\n };\n}\n\nexport function buildRecommendations(summary: AuditSummary): XergRecommendation[] {\n const deduped = new Map<string, XergRecommendation>();\n\n for (const finding of summary.findings) {\n const recommendation = buildSingleRecommendation(summary, finding);\n const key = dedupKeyForFinding(finding);\n const existing = deduped.get(key);\n\n if (!existing) {\n deduped.set(key, recommendation);\n continue;\n }\n\n if (\n recommendation.estimatedSavingsUsd > existing.estimatedSavingsUsd ||\n (recommendation.estimatedSavingsUsd === existing.estimatedSavingsUsd &&\n CONFIDENCE_RANK[recommendation.confidence] > CONFIDENCE_RANK[existing.confidence])\n ) {\n deduped.set(key, recommendation);\n }\n }\n\n return [...deduped.values()].sort(compareRecommendations).map((recommendation, index) => ({\n ...recommendation,\n recommendedOrder: index + 1,\n }));\n}\n","import type {\n DailySpendBreakdown,\n DailyWasteBreakdown,\n NormalizedRun,\n WasteAttribution,\n} from '../types.js';\n\nfunction round(value: number) {\n return Number(value.toFixed(6));\n}\n\nfunction toUtcDay(timestamp: string): string | null {\n const candidate = new Date(timestamp);\n if (Number.isNaN(candidate.getTime())) {\n return null;\n }\n\n return candidate.toISOString().slice(0, 10);\n}\n\nfunction incrementUtcDay(date: string) {\n const candidate = new Date(`${date}T00:00:00.000Z`);\n candidate.setUTCDate(candidate.getUTCDate() + 1);\n return candidate.toISOString().slice(0, 10);\n}\n\nexport function buildObservedUtcDayRange(runs: NormalizedRun[]): string[] {\n const days = runs\n .flatMap((run) => run.calls)\n .map((call) => toUtcDay(call.timestamp))\n .filter((day): day is string => day !== null)\n .sort();\n\n if (days.length === 0) {\n return [];\n }\n\n const range: string[] = [];\n let current = days[0];\n const last = days[days.length - 1];\n\n while (current <= last) {\n range.push(current);\n current = incrementUtcDay(current);\n }\n\n return range;\n}\n\nfunction reconcileDailyTotal<T extends Record<string, number | string>>(\n rows: T[],\n key: keyof T,\n expected: number,\n) {\n if (rows.length === 0) {\n return;\n }\n\n const actual = round(\n rows.reduce((sum, row) => sum + (typeof row[key] === 'number' ? (row[key] as number) : 0), 0),\n );\n const delta = round(expected - actual);\n\n if (delta === 0) {\n return;\n }\n\n const last = rows[rows.length - 1];\n const current = last[key];\n if (typeof current === 'number') {\n last[key] = round(current + delta) as T[keyof T];\n }\n}\n\nexport function buildSpendByDay(runs: NormalizedRun[]): DailySpendBreakdown[] {\n const days = buildObservedUtcDayRange(runs);\n if (days.length === 0) {\n return [];\n }\n\n const byDay = new Map(\n days.map((day) => [\n day,\n { date: day, observedSpendUsd: 0, estimatedSpendUsd: 0, callCount: 0 },\n ]),\n );\n\n for (const run of runs) {\n for (const call of run.calls) {\n const day = toUtcDay(call.timestamp);\n if (!day) {\n continue;\n }\n\n const bucket = byDay.get(day);\n if (!bucket) {\n continue;\n }\n\n bucket.callCount += 1;\n if (call.costSource === 'observed') {\n bucket.observedSpendUsd += call.costUsd;\n } else if (call.costSource === 'estimated') {\n bucket.estimatedSpendUsd += call.costUsd;\n }\n }\n }\n\n const rows = days.map((day) => {\n const bucket = byDay.get(day);\n const observedSpendUsd = round(bucket?.observedSpendUsd ?? 0);\n const estimatedSpendUsd = round(bucket?.estimatedSpendUsd ?? 0);\n\n return {\n date: day,\n observedSpendUsd,\n estimatedSpendUsd,\n spendUsd: round(observedSpendUsd + estimatedSpendUsd),\n callCount: bucket?.callCount ?? 0,\n };\n });\n\n reconcileDailyTotal(\n rows,\n 'observedSpendUsd',\n round(runs.reduce((sum, run) => sum + run.observedCostUsd, 0)),\n );\n reconcileDailyTotal(\n rows,\n 'estimatedSpendUsd',\n round(runs.reduce((sum, run) => sum + run.estimatedCostUsd, 0)),\n );\n\n for (const row of rows) {\n row.spendUsd = round(row.observedSpendUsd + row.estimatedSpendUsd);\n }\n\n return rows;\n}\n\nexport function buildWasteByDay(\n wasteAttributions: WasteAttribution[],\n days: string[],\n expectedWasteUsd: number,\n): DailyWasteBreakdown[] {\n if (days.length === 0) {\n return [];\n }\n\n const byDay = new Map(days.map((day) => [day, 0]));\n\n for (const attribution of wasteAttributions) {\n const day = toUtcDay(attribution.timestamp);\n if (!day || !byDay.has(day)) {\n continue;\n }\n\n byDay.set(day, (byDay.get(day) ?? 0) + attribution.wasteUsd);\n }\n\n const rows = days.map((day) => ({\n date: day,\n wasteUsd: round(byDay.get(day) ?? 0),\n }));\n\n reconcileDailyTotal(rows, 'wasteUsd', round(expectedWasteUsd));\n\n return rows;\n}\n","import { buildRecommendations } from '../recommendations.js';\nimport type {\n AuditRuntime,\n AuditSummary,\n DetectedSourceFile,\n Finding,\n NormalizedRun,\n SpendBreakdown,\n WasteAttribution,\n} from '../types.js';\nimport { sha1 } from '../utils/hash.js';\nimport { isoNow } from '../utils/time.js';\nimport { buildComparisonKey, buildTaxonomyBuckets } from './comparison.js';\nimport { buildObservedUtcDayRange, buildSpendByDay, buildWasteByDay } from './timeseries.js';\n\nfunction buildBreakdown(\n items: { key: string; spendUsd: number; observedSpendUsd: number }[],\n): SpendBreakdown[] {\n const buckets = new Map<\n string,\n { spendUsd: number; observedSpendUsd: number; callCount: number }\n >();\n\n for (const item of items) {\n const current = buckets.get(item.key) ?? { spendUsd: 0, observedSpendUsd: 0, callCount: 0 };\n current.spendUsd += item.spendUsd;\n current.observedSpendUsd += item.observedSpendUsd;\n current.callCount += 1;\n buckets.set(item.key, current);\n }\n\n return Array.from(buckets.entries())\n .map(([key, value]) => {\n const observedShare = value.spendUsd === 0 ? 0 : value.observedSpendUsd / value.spendUsd;\n return {\n key,\n spendUsd: Number(value.spendUsd.toFixed(6)),\n callCount: value.callCount,\n observedShare: Number(observedShare.toFixed(4)),\n };\n })\n .sort((left, right) => right.spendUsd - left.spendUsd);\n}\n\nexport function buildAuditSummary(input: {\n runtime: AuditRuntime;\n runs: NormalizedRun[];\n findings: Finding[];\n wasteAttributions: WasteAttribution[];\n sources: DetectedSourceFile[];\n since?: string;\n dbPath?: string;\n comparisonKeyOverride?: string;\n}): AuditSummary {\n const callCount = input.runs.reduce((sum, run) => sum + run.calls.length, 0);\n const totalSpendUsd = input.runs.reduce((sum, run) => sum + run.totalCostUsd, 0);\n const observedSpendUsd = input.runs.reduce((sum, run) => sum + run.observedCostUsd, 0);\n const estimatedSpendUsd = input.runs.reduce((sum, run) => sum + run.estimatedCostUsd, 0);\n const wasteSpendUsd = input.findings\n .filter((finding) => finding.classification === 'waste')\n .reduce((sum, finding) => sum + finding.costImpactUsd, 0);\n const opportunitySpendUsd = input.findings\n .filter((finding) => finding.classification === 'opportunity')\n .reduce((sum, finding) => sum + finding.costImpactUsd, 0);\n const generatedAt = isoNow();\n const spendByDay = buildSpendByDay(input.runs);\n const observedDays = buildObservedUtcDayRange(input.runs);\n const summary: AuditSummary = {\n auditId: sha1(\n `${generatedAt}:${input.runs.length}:${input.sources.map((source) => source.path).join('|')}`,\n ),\n generatedAt,\n runtime: input.runtime,\n comparisonKey:\n input.comparisonKeyOverride ??\n buildComparisonKey({\n runtime: input.runtime,\n sources: input.sources,\n since: input.since,\n }),\n comparison: null,\n since: input.since,\n runCount: input.runs.length,\n callCount,\n totalSpendUsd: Number(totalSpendUsd.toFixed(6)),\n observedSpendUsd: Number(observedSpendUsd.toFixed(6)),\n estimatedSpendUsd: Number(estimatedSpendUsd.toFixed(6)),\n wasteSpendUsd: Number(wasteSpendUsd.toFixed(6)),\n opportunitySpendUsd: Number(opportunitySpendUsd.toFixed(6)),\n structuralWasteRate: Number(\n (totalSpendUsd === 0 ? 0 : wasteSpendUsd / totalSpendUsd).toFixed(4),\n ),\n wasteByKind: buildTaxonomyBuckets(input.findings, 'waste'),\n opportunityByKind: buildTaxonomyBuckets(input.findings, 'opportunity'),\n spendByWorkflow: buildBreakdown(\n input.runs.map((run) => ({\n key: run.workflow,\n spendUsd: run.totalCostUsd,\n observedSpendUsd: run.observedCostUsd,\n })),\n ),\n spendByModel: buildBreakdown(\n input.runs.flatMap((run) =>\n run.calls.map((call) => ({\n key: `${call.provider}/${call.model}`,\n spendUsd: call.costUsd,\n observedSpendUsd: call.costSource === 'observed' ? call.costUsd : 0,\n })),\n ),\n ),\n spendByDay,\n wasteByDay: buildWasteByDay(input.wasteAttributions, observedDays, wasteSpendUsd),\n findings: input.findings,\n recommendations: [],\n notes: [\n 'Cost per outcome is intentionally unavailable in v0. Xerg is measuring waste intelligence only.',\n 'Opportunity findings are directional recommendations, not proven waste.',\n ],\n sourceFiles: input.sources,\n dbPath: input.dbPath,\n };\n\n summary.recommendations = buildRecommendations(summary);\n\n return summary;\n}\n","import { basename } from 'node:path';\n\nimport { detectHermesSources } from './detect/hermes.js';\nimport { detectOpenClawSources } from './detect/openclaw.js';\nimport { normalizeHermesSources } from './normalize/hermes.js';\nimport { normalizeOpenClawSources } from './normalize/openclaw.js';\nimport type { AgentRuntime, AuditOptions, DetectedSourceFile, DoctorReport } from './types.js';\nimport {\n getDefaultHermesGatewayPattern,\n getDefaultHermesSessionsPattern,\n getDefaultOpenClawGatewayPattern,\n getDefaultOpenClawSessionsPattern,\n} from './utils/paths.js';\n\nexport interface RuntimeAdapter {\n runtime: AgentRuntime;\n productName: string;\n detectSources: (options: AuditOptions) => Promise<DetectedSourceFile[]>;\n normalizeSources: typeof normalizeOpenClawSources;\n noSourceNotes: string[];\n gatewayNote: string;\n sessionNote: string;\n noDataError: (commandPrefix: string) => string;\n defaultPaths: () => {\n runtime: AgentRuntime;\n gatewayPattern: string;\n sessionsPattern: string;\n };\n}\n\nconst RUNTIME_ADAPTERS: Record<AgentRuntime, RuntimeAdapter> = {\n openclaw: {\n runtime: 'openclaw',\n productName: 'OpenClaw',\n detectSources: detectOpenClawSources,\n normalizeSources: normalizeOpenClawSources,\n noSourceNotes: [\n 'No OpenClaw gateway logs or session files were detected.',\n 'Doctor checks local defaults by default. Use --log-file or --sessions-dir if your OpenClaw data lives outside the defaults.',\n 'Use --remote or --railway to inspect remote OpenClaw targets.',\n ],\n gatewayNote: 'Gateway logs detected. These are preferred when cost metadata is present.',\n sessionNote: 'Session transcript fallback detected. Xerg will extract usage metadata only.',\n noDataError: (commandPrefix: string) =>\n `No OpenClaw sources were detected. Run \\`${commandPrefix} doctor --runtime openclaw\\` or provide --log-file / --sessions-dir.`,\n defaultPaths: () => ({\n runtime: 'openclaw',\n gatewayPattern: getDefaultOpenClawGatewayPattern(),\n sessionsPattern: getDefaultOpenClawSessionsPattern(),\n }),\n },\n hermes: {\n runtime: 'hermes',\n productName: 'Hermes',\n detectSources: detectHermesSources,\n normalizeSources: normalizeHermesSources,\n noSourceNotes: [\n 'No Hermes gateway logs or session files were detected.',\n 'Doctor checks local defaults by default. Use --log-file or --sessions-dir if your Hermes data lives outside the defaults.',\n 'Hermes remote transport is not part of this rollout yet.',\n ],\n gatewayNote:\n 'Hermes gateway logs detected. Xerg prefers agent.log entries when billable model-call records are present.',\n sessionNote: 'Hermes session transcripts detected. Xerg will extract usage metadata only.',\n noDataError: (commandPrefix: string) =>\n `No Hermes sources were detected. Run \\`${commandPrefix} doctor --runtime hermes\\` or provide --log-file / --sessions-dir.`,\n defaultPaths: () => ({\n runtime: 'hermes',\n gatewayPattern: getDefaultHermesGatewayPattern(),\n sessionsPattern: getDefaultHermesSessionsPattern(),\n }),\n },\n};\n\ninterface RuntimeCandidate {\n adapter: RuntimeAdapter;\n sources: DetectedSourceFile[];\n usable: boolean;\n}\n\nexport function getRuntimeAdapter(runtime: AgentRuntime) {\n return RUNTIME_ADAPTERS[runtime];\n}\n\nfunction hasExplicitLocalPaths(options: AuditOptions) {\n return Boolean(options.logFile || options.sessionsDir);\n}\n\nfunction inferRuntimeFromExplicitPaths(options: AuditOptions): AgentRuntime | null {\n const paths = [options.logFile, options.sessionsDir]\n .filter((path): path is string => Boolean(path))\n .map((path) => path.replace(/\\\\/g, '/').toLowerCase());\n\n if (paths.length === 0) {\n return null;\n }\n\n const hints = new Set<AgentRuntime>();\n\n for (const path of paths) {\n const name = basename(path).toLowerCase();\n\n if (\n path.includes('/.openclaw/') ||\n path.includes('/openclaw/') ||\n path.includes('/tmp/openclaw') ||\n name.includes('openclaw')\n ) {\n hints.add('openclaw');\n }\n\n if (\n path.includes('/.hermes/') ||\n path.includes('/hermes/') ||\n path.includes('/.hermes') ||\n name.includes('hermes') ||\n name.startsWith('agent.log')\n ) {\n hints.add('hermes');\n }\n }\n\n return hints.size === 1 ? Array.from(hints)[0] : null;\n}\n\nasync function probeRuntimeCandidate(\n adapter: RuntimeAdapter,\n options: AuditOptions,\n): Promise<RuntimeCandidate> {\n const sources = await adapter.detectSources(options);\n return {\n adapter,\n sources,\n usable: sources.length > 0,\n };\n}\n\nfunction buildResolvedDoctorNotes(adapter: RuntimeAdapter, sources: DetectedSourceFile[]) {\n if (sources.length === 0) {\n return adapter.noSourceNotes;\n }\n\n const notes: string[] = [];\n if (sources.some((source) => source.kind === 'gateway')) {\n notes.push(adapter.gatewayNote);\n }\n if (sources.some((source) => source.kind === 'sessions')) {\n notes.push(adapter.sessionNote);\n }\n\n return notes;\n}\n\nfunction buildResolvedDoctorReport(\n adapter: RuntimeAdapter,\n sources: DetectedSourceFile[],\n): DoctorReport {\n return {\n canAudit: sources.length > 0,\n mode: sources.length > 0 ? 'resolved' : 'none',\n runtime: sources.length > 0 ? adapter.runtime : null,\n sources,\n defaults: [adapter.defaultPaths()],\n notes: buildResolvedDoctorNotes(adapter, sources),\n };\n}\n\nfunction buildAutoNoDataDoctorReport(candidates: RuntimeCandidate[]): DoctorReport {\n return {\n canAudit: false,\n mode: 'none',\n runtime: null,\n sources: candidates.flatMap((candidate) => candidate.sources),\n defaults: Object.values(RUNTIME_ADAPTERS).map((adapter) => adapter.defaultPaths()),\n notes: [\n 'No supported local runtime sources were detected.',\n 'Auto-detection checked both OpenClaw and Hermes local defaults.',\n 'Use --runtime openclaw or --runtime hermes with --log-file / --sessions-dir when you want to point Xerg at explicit local paths.',\n ],\n };\n}\n\nfunction buildAutoAmbiguousDoctorReport(candidates: RuntimeCandidate[]): DoctorReport {\n return {\n canAudit: false,\n mode: 'ambiguous',\n runtime: null,\n sources: candidates.flatMap((candidate) => candidate.sources),\n defaults: Object.values(RUNTIME_ADAPTERS).map((adapter) => adapter.defaultPaths()),\n notes: [\n 'Both OpenClaw and Hermes local sources were detected.',\n 'Re-run doctor with --runtime openclaw or --runtime hermes to choose the local runtime explicitly.',\n ],\n };\n}\n\nfunction buildExplicitNoDataError(\n options: AuditOptions,\n hintedRuntime: AgentRuntime | null,\n): string {\n const commandPrefix = options.commandPrefix ?? 'xerg';\n\n if (hintedRuntime) {\n return getRuntimeAdapter(hintedRuntime).noDataError(commandPrefix);\n }\n\n return `No supported local runtime sources were detected. Run \\`${commandPrefix} doctor\\`, or use --runtime openclaw / --runtime hermes with --log-file / --sessions-dir.`;\n}\n\nfunction buildExplicitNoDataDoctorReport(\n candidates: RuntimeCandidate[],\n hintedRuntime: AgentRuntime | null,\n): DoctorReport {\n if (hintedRuntime) {\n const adapter = getRuntimeAdapter(hintedRuntime);\n return {\n canAudit: false,\n mode: 'none',\n runtime: null,\n sources: [],\n defaults: [adapter.defaultPaths()],\n notes: [\n `No ${adapter.productName} sources were detected from the provided local paths.`,\n `Verify --log-file / --sessions-dir and re-run doctor with --runtime ${adapter.runtime} if needed.`,\n ],\n };\n }\n\n return {\n canAudit: false,\n mode: 'none',\n runtime: null,\n sources: candidates.flatMap((candidate) => candidate.sources),\n defaults: Object.values(RUNTIME_ADAPTERS).map((adapter) => adapter.defaultPaths()),\n notes: [\n 'No supported local runtime sources were detected from the provided local paths.',\n 'Verify --log-file / --sessions-dir and re-run doctor with --runtime openclaw or --runtime hermes if needed.',\n ],\n };\n}\n\nexport function getRuntimeProductName(runtime: AgentRuntime) {\n return getRuntimeAdapter(runtime).productName;\n}\n\nexport async function resolveRuntimeCandidates(options: AuditOptions) {\n return Promise.all(\n (Object.values(RUNTIME_ADAPTERS) as RuntimeAdapter[]).map((adapter) =>\n probeRuntimeCandidate(adapter, options),\n ),\n );\n}\n\nexport async function resolveLocalAgentRuntime(options: AuditOptions) {\n const requestedRuntime = options.runtime ?? 'auto';\n\n if (requestedRuntime !== 'auto') {\n const adapter = getRuntimeAdapter(requestedRuntime);\n const sources = await adapter.detectSources(options);\n return {\n adapter,\n sources,\n };\n }\n\n const candidates = await resolveRuntimeCandidates(options);\n const usableCandidates = candidates.filter((candidate) => candidate.usable);\n\n if (hasExplicitLocalPaths(options)) {\n const hintedRuntime = inferRuntimeFromExplicitPaths(options);\n if (hintedRuntime) {\n const hintedCandidate = usableCandidates.find(\n (candidate) => candidate.adapter.runtime === hintedRuntime,\n );\n if (hintedCandidate) {\n return {\n adapter: hintedCandidate.adapter,\n sources: hintedCandidate.sources,\n };\n }\n }\n\n if (usableCandidates.length === 0) {\n throw new Error(buildExplicitNoDataError(options, hintedRuntime));\n }\n\n if (usableCandidates.length === 1) {\n return {\n adapter: usableCandidates[0].adapter,\n sources: usableCandidates[0].sources,\n };\n }\n\n throw new Error(\n 'Could not determine whether the provided local files belong to OpenClaw or Hermes. Re-run with --runtime openclaw or --runtime hermes.',\n );\n }\n\n if (usableCandidates.length === 0) {\n throw new Error(\n `No supported local runtime sources were detected. Run \\`${options.commandPrefix ?? 'xerg'} doctor\\`, or use --runtime openclaw / --runtime hermes with --log-file / --sessions-dir.`,\n );\n }\n\n if (usableCandidates.length > 1) {\n throw new Error(\n 'Both OpenClaw and Hermes local sources were detected. Re-run with --runtime openclaw or --runtime hermes.',\n );\n }\n\n return {\n adapter: usableCandidates[0].adapter,\n sources: usableCandidates[0].sources,\n };\n}\n\nexport async function doctorAgentRuntime(options: AuditOptions): Promise<DoctorReport> {\n const requestedRuntime = options.runtime ?? 'auto';\n\n if (requestedRuntime !== 'auto') {\n options.onProgress?.(`Checking local ${getRuntimeProductName(requestedRuntime)} defaults...`);\n const adapter = getRuntimeAdapter(requestedRuntime);\n const sources = await adapter.detectSources(options);\n options.onProgress?.(\n sources.length > 0\n ? `Detected ${sources.length} local source file${sources.length === 1 ? '' : 's'}.`\n : `No local ${adapter.productName} source files were detected.`,\n );\n return buildResolvedDoctorReport(adapter, sources);\n }\n\n options.onProgress?.('Checking local runtime defaults...');\n const candidates = await resolveRuntimeCandidates(options);\n const usableCandidates = candidates.filter((candidate) => candidate.usable);\n const detectedCount = candidates.reduce((sum, candidate) => sum + candidate.sources.length, 0);\n options.onProgress?.(\n detectedCount > 0\n ? `Detected ${detectedCount} local source file${detectedCount === 1 ? '' : 's'} across supported runtimes.`\n : 'No local runtime source files were detected.',\n );\n\n if (hasExplicitLocalPaths(options)) {\n const hintedRuntime = inferRuntimeFromExplicitPaths(options);\n if (hintedRuntime) {\n const hintedCandidate = usableCandidates.find(\n (candidate) => candidate.adapter.runtime === hintedRuntime,\n );\n if (hintedCandidate) {\n return buildResolvedDoctorReport(hintedCandidate.adapter, hintedCandidate.sources);\n }\n }\n\n if (usableCandidates.length === 0) {\n return buildExplicitNoDataDoctorReport(candidates, hintedRuntime);\n }\n\n if (usableCandidates.length === 1) {\n return buildResolvedDoctorReport(usableCandidates[0].adapter, usableCandidates[0].sources);\n }\n\n return {\n canAudit: false,\n mode: 'ambiguous',\n runtime: null,\n sources: candidates.flatMap((candidate) => candidate.sources),\n defaults: Object.values(RUNTIME_ADAPTERS).map((adapter) => adapter.defaultPaths()),\n notes: [\n 'Could not determine whether the provided local files belong to OpenClaw or Hermes.',\n 'Re-run doctor with --runtime openclaw or --runtime hermes to choose the local runtime explicitly.',\n ],\n };\n }\n\n if (usableCandidates.length === 0) {\n return buildAutoNoDataDoctorReport(candidates);\n }\n\n if (usableCandidates.length > 1) {\n return buildAutoAmbiguousDoctorReport(usableCandidates);\n }\n\n return buildResolvedDoctorReport(usableCandidates[0].adapter, usableCandidates[0].sources);\n}\n\nexport function buildRuntimeNoDataError(runtime: AgentRuntime, commandPrefix = 'xerg') {\n return getRuntimeAdapter(runtime).noDataError(commandPrefix);\n}\n","import { homedir } from 'node:os';\nimport { basename, join } from 'node:path';\n\nimport { logFileHasBillableRecords } from '../normalize/hermes.js';\nimport type { AuditOptions, DetectedSourceFile } from '../types.js';\nimport { getDefaultHermesGatewayPattern, getDefaultHermesSessionsPattern } from '../utils/paths.js';\nimport { collectGlobMatches, toDetected } from './shared.js';\n\nfunction getDefaultAgentLogPattern() {\n return join(process.env.HOME ?? homedir(), '.hermes', 'logs', 'agent.log*');\n}\n\nfunction getDefaultGatewayLogPattern() {\n return join(process.env.HOME ?? homedir(), '.hermes', 'logs', 'gateway.log*');\n}\n\nfunction getDefaultSessionsDirPattern() {\n return join(process.env.HOME ?? homedir(), '.hermes', 'sessions', '**', '*');\n}\n\nfunction isHermesSessionTranscript(path: string) {\n const lowerName = basename(path).toLowerCase();\n if (lowerName === 'sessions.json') {\n return false;\n }\n\n return lowerName.endsWith('.jsonl') || lowerName.endsWith('.json');\n}\n\nasync function collectHermesSessionMatches(baseDir: string) {\n const matches = await collectGlobMatches('**/*', {\n cwd: baseDir,\n resolveWith: baseDir,\n });\n\n return matches.filter((match) => isHermesSessionTranscript(match));\n}\n\nasync function pickPreferredLogFamily() {\n const [agentMatches, gatewayMatches] = await Promise.all([\n collectGlobMatches(getDefaultAgentLogPattern()),\n collectGlobMatches(getDefaultGatewayLogPattern()),\n ]);\n\n if (agentMatches.some((path) => logFileHasBillableRecords(path))) {\n return agentMatches;\n }\n\n if (gatewayMatches.some((path) => logFileHasBillableRecords(path))) {\n return gatewayMatches;\n }\n\n return [...agentMatches, ...gatewayMatches];\n}\n\nexport async function detectHermesSources(options: AuditOptions): Promise<DetectedSourceFile[]> {\n const explicitSources: DetectedSourceFile[] = [];\n\n if (options.logFile) {\n const detected = toDetected(options.logFile, 'gateway', 'hermes');\n if (detected) {\n explicitSources.push(detected);\n }\n }\n\n if (options.sessionsDir) {\n const matches = await collectHermesSessionMatches(options.sessionsDir);\n\n for (const match of matches) {\n const detected = toDetected(match, 'sessions', 'hermes');\n if (detected) {\n explicitSources.push(detected);\n }\n }\n }\n\n if (explicitSources.length > 0) {\n return explicitSources.sort((left, right) => right.mtimeMs - left.mtimeMs);\n }\n\n const [gatewayMatches, sessionMatches] = await Promise.all([\n pickPreferredLogFamily(),\n collectGlobMatches(getDefaultSessionsDirPattern()),\n ]);\n\n const detected = [\n ...gatewayMatches.map((path) => toDetected(path, 'gateway', 'hermes')).filter(Boolean),\n ...sessionMatches\n .filter((path) => isHermesSessionTranscript(path))\n .map((path) => toDetected(path, 'sessions', 'hermes'))\n .filter(Boolean),\n ] as DetectedSourceFile[];\n\n return detected.sort((left, right) => right.mtimeMs - left.mtimeMs);\n}\n\nexport function getHermesDefaultDoctorPaths() {\n return {\n runtime: 'hermes' as const,\n gatewayPattern: getDefaultHermesGatewayPattern(),\n sessionsPattern: getDefaultHermesSessionsPattern(),\n };\n}\n","import { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\n\nimport { estimateCostUsd } from '../pricing-catalog.js';\nimport type { DetectedSourceFile, NormalizedCall, NormalizedRun } from '../types.js';\nimport { sha1 } from '../utils/hash.js';\nimport { asBoolean, asNumber, asString, getNestedValue, pickMetadata } from '../utils/records.js';\nimport { parseSince, toIsoOrNow } from '../utils/time.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nconst PRICING_PROVIDER_PREFIXES = new Set(['anthropic', 'openai', 'google', 'meta']);\n\nfunction parseJsonLine(line: string): JsonRecord | null {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n try {\n return JSON.parse(trimmed) as JsonRecord;\n } catch {}\n\n const jsonStart = trimmed.indexOf('{');\n const jsonEnd = trimmed.lastIndexOf('}');\n if (jsonStart < 0 || jsonEnd <= jsonStart) {\n return null;\n }\n\n try {\n return JSON.parse(trimmed.slice(jsonStart, jsonEnd + 1)) as JsonRecord;\n } catch {\n return null;\n }\n}\n\nfunction parseJsonLines(path: string) {\n const content = readFileSync(path, 'utf8');\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const records: JsonRecord[] = [];\n\n for (const line of lines) {\n const parsed = parseJsonLine(line);\n if (parsed) {\n records.push(parsed);\n }\n }\n\n return records;\n}\n\nfunction flattenSourceRecords(source: DetectedSourceFile) {\n const records = parseJsonLines(source.path);\n\n if (source.kind !== 'sessions') {\n return records;\n }\n\n return records.flatMap((record) => expandSessionRecord(record));\n}\n\nfunction expandSessionRecord(record: JsonRecord): JsonRecord[] {\n const messages = getNestedValue(record, [['messages']]);\n if (!Array.isArray(messages)) {\n return [record];\n }\n\n return messages\n .filter((message): message is JsonRecord => Boolean(message) && typeof message === 'object')\n .map((message, index) => ({\n ...record,\n message,\n timestamp:\n asString(\n getNestedValue(message, [['timestamp'], ['created_at'], ['createdAt'], ['time']]),\n ) ??\n asString(\n getNestedValue(record, [['timestamp'], ['created_at'], ['createdAt'], ['updated_at']]),\n ) ??\n `${sourceTimestampSeed(record)}:${index}`,\n }));\n}\n\nfunction sourceTimestampSeed(record: JsonRecord) {\n return (\n asString(getNestedValue(record, [['updated_at'], ['created_at'], ['timestamp'], ['id']])) ??\n 'session'\n );\n}\n\nfunction normalizeProviderAndModel(record: JsonRecord) {\n const rawProvider =\n asString(\n getNestedValue(record, [\n ['provider'],\n ['provider_name'],\n ['runtime', 'provider'],\n ['usage', 'provider'],\n ['token_usage', 'provider'],\n ['message', 'provider'],\n ['message', 'usage', 'provider'],\n ]),\n ) ?? 'unknown';\n\n const rawModel =\n asString(\n getNestedValue(record, [\n ['model'],\n ['model_name'],\n ['runtime', 'model'],\n ['usage', 'model'],\n ['token_usage', 'model'],\n ['message', 'model'],\n ['message', 'usage', 'model'],\n ]),\n ) ?? 'unknown-model';\n\n if (rawModel.includes('/')) {\n const [providerPrefix, ...rest] = rawModel.split('/');\n if (PRICING_PROVIDER_PREFIXES.has(providerPrefix.toLowerCase()) && rest.length > 0) {\n return {\n provider: providerPrefix.toLowerCase(),\n model: rest.join('/'),\n };\n }\n }\n\n return {\n provider: rawProvider.toLowerCase(),\n model: rawModel,\n };\n}\n\nfunction inferWorkflow(record: JsonRecord, sourcePath: string) {\n return (\n asString(\n getNestedValue(record, [\n ['workflow'],\n ['job_name'],\n ['task_class'],\n ['taskClass'],\n ['agent_name'],\n ['agent', 'name'],\n ['source'],\n ['session', 'source'],\n ['session_key'],\n ['session_id'],\n ['sessionId'],\n ['title'],\n ]),\n ) ?? basename(sourcePath).replace(/\\.(jsonl|json|log)(\\.\\d+)?$/i, '')\n );\n}\n\nfunction inferEnvironment(record: JsonRecord) {\n return (\n asString(getNestedValue(record, [['environment'], ['env'], ['metadata', 'environment']])) ??\n 'local'\n );\n}\n\nfunction inferRunKey(record: JsonRecord, workflow: string, index: number, sourcePath: string) {\n return (\n asString(\n getNestedValue(record, [\n ['run_id'],\n ['runId'],\n ['session_id'],\n ['sessionId'],\n ['session_key'],\n ['thread_id'],\n ['threadId'],\n ['trace_id'],\n ['traceId'],\n ['conversation_id'],\n ['conversationId'],\n ['id'],\n ]),\n ) ?? `${sourcePath}:${workflow}:${index}`\n );\n}\n\nfunction inferTaskClass(record: JsonRecord, workflow: string) {\n return (\n asString(\n getNestedValue(record, [\n ['task_class'],\n ['taskClass'],\n ['event'],\n ['source'],\n ['message', 'source'],\n ]),\n ) ?? workflow.toLowerCase()\n );\n}\n\nfunction inferToolCalls(record: JsonRecord) {\n const direct =\n asNumber(\n getNestedValue(record, [\n ['tool_calls'],\n ['toolCalls'],\n ['usage', 'tool_calls'],\n ['message', 'usage', 'tool_calls'],\n ]),\n ) ?? null;\n\n if (direct !== null) {\n return direct;\n }\n\n const toolCalls = getNestedValue(record, [\n ['tool_calls'],\n ['toolCalls'],\n ['message', 'tool_calls'],\n ]);\n return Array.isArray(toolCalls) ? toolCalls.length : 0;\n}\n\nfunction extractUsage(record: JsonRecord) {\n const inputTokens =\n asNumber(\n getNestedValue(record, [\n ['input_tokens'],\n ['inputTokens'],\n ['usage', 'input_tokens'],\n ['usage', 'inputTokens'],\n ['usage', 'prompt_tokens'],\n ['token_usage', 'input_tokens'],\n ['token_usage', 'prompt_tokens'],\n ['token_usage', 'input'],\n ['message', 'usage', 'input_tokens'],\n ['message', 'usage', 'prompt_tokens'],\n ['message', 'token_usage', 'input_tokens'],\n ]),\n ) ?? 0;\n\n const outputTokens =\n asNumber(\n getNestedValue(record, [\n ['output_tokens'],\n ['outputTokens'],\n ['usage', 'output_tokens'],\n ['usage', 'outputTokens'],\n ['usage', 'completion_tokens'],\n ['token_usage', 'output_tokens'],\n ['token_usage', 'completion_tokens'],\n ['token_usage', 'output'],\n ['message', 'usage', 'output_tokens'],\n ['message', 'usage', 'completion_tokens'],\n ['message', 'token_usage', 'output_tokens'],\n ]),\n ) ?? 0;\n\n const observedCost =\n asNumber(\n getNestedValue(record, [\n ['cost_usd'],\n ['costUsd'],\n ['estimated_cost_usd'],\n ['estimatedCostUsd'],\n ['total_cost_usd'],\n ['usage', 'cost_usd'],\n ['usage', 'costUsd'],\n ['usage', 'estimated_cost_usd'],\n ['usage', 'total_cost_usd'],\n ['token_usage', 'cost_usd'],\n ['token_usage', 'total_cost_usd'],\n ['cost', 'usd'],\n ['cost', 'total_usd'],\n ['pricing', 'total_usd'],\n ['message', 'usage', 'cost_usd'],\n ['message', 'cost_usd'],\n ]),\n ) ?? null;\n\n return {\n inputTokens,\n outputTokens,\n observedCost,\n };\n}\n\nfunction shouldTreatAsCall(record: JsonRecord) {\n const { inputTokens, outputTokens, observedCost } = extractUsage(record);\n return inputTokens > 0 || outputTokens > 0 || observedCost !== null;\n}\n\nfunction buildCall(\n source: DetectedSourceFile,\n record: JsonRecord,\n runId: string,\n index: number,\n): NormalizedCall {\n const { provider, model } = normalizeProviderAndModel(record);\n const workflow = inferWorkflow(record, source.path);\n const { inputTokens, outputTokens, observedCost } = extractUsage(record);\n const estimatedCost = estimateCostUsd(provider, model, inputTokens, outputTokens);\n const timestamp = toIsoOrNow(\n getNestedValue(record, [\n ['timestamp'],\n ['createdAt'],\n ['created_at'],\n ['time'],\n ['updated_at'],\n ]),\n );\n const attempt =\n asNumber(\n getNestedValue(record, [['attempt'], ['usage', 'attempt'], ['metadata', 'attempt']]),\n ) ?? null;\n const iteration =\n asNumber(\n getNestedValue(record, [['iteration'], ['loop_iteration'], ['metadata', 'iteration']]),\n ) ?? null;\n const retries =\n asNumber(getNestedValue(record, [['retries'], ['retry_count'], ['metadata', 'retries']])) ?? 0;\n const costUsd = observedCost ?? estimatedCost ?? 0;\n\n return {\n id: sha1(`${runId}:${source.path}:${index}:${model}:${timestamp}:${costUsd}`),\n runId,\n timestamp,\n provider,\n model,\n inputTokens,\n outputTokens,\n costUsd,\n costSource:\n observedCost !== null ? 'observed' : estimatedCost !== null ? 'estimated' : 'unpriced',\n latencyMs:\n asNumber(getNestedValue(record, [['latency_ms'], ['latencyMs'], ['usage', 'latency_ms']])) ??\n null,\n toolCalls: inferToolCalls(record),\n retries,\n attempt,\n iteration,\n status:\n asString(getNestedValue(record, [['status'], ['level'], ['result'], ['error', 'type']])) ??\n null,\n taskClass: inferTaskClass(record, workflow),\n cacheHit: asBoolean(\n getNestedValue(record, [['cache_hit'], ['cacheHit'], ['usage', 'cache_hit']]),\n ),\n cacheCostUsd:\n asNumber(\n getNestedValue(record, [['cache_cost_usd'], ['cacheCostUsd'], ['usage', 'cache_cost_usd']]),\n ) ?? null,\n metadata: pickMetadata(record, [\n 'event',\n 'type',\n 'source',\n 'session_id',\n 'sessionId',\n 'thread_id',\n 'trace_id',\n ]),\n };\n}\n\nexport function logFileHasBillableRecords(path: string) {\n return flattenSourceRecords({\n kind: 'gateway',\n runtime: 'hermes',\n path,\n sizeBytes: 0,\n mtimeMs: 0,\n }).some((record) => shouldTreatAsCall(record));\n}\n\nexport function normalizeHermesSources(\n sources: DetectedSourceFile[],\n since?: string,\n): NormalizedRun[] {\n const cutoff = parseSince(since);\n const runsById = new Map<string, NormalizedRun>();\n\n for (const source of sources) {\n const records = flattenSourceRecords(source);\n\n records.forEach((record, index) => {\n if (!shouldTreatAsCall(record)) {\n return;\n }\n\n const workflow = inferWorkflow(record, source.path);\n const timestamp = toIsoOrNow(\n getNestedValue(record, [\n ['timestamp'],\n ['createdAt'],\n ['created_at'],\n ['time'],\n ['updated_at'],\n ]),\n );\n if (cutoff && new Date(timestamp).getTime() < cutoff) {\n return;\n }\n\n const runKey = inferRunKey(record, workflow, index, source.path);\n const runId = sha1(`${source.path}:${runKey}`);\n const call = buildCall(source, record, runId, index);\n const existing = runsById.get(runId);\n\n if (!existing) {\n runsById.set(runId, {\n id: runId,\n sourceKind: source.kind,\n sourcePath: source.path,\n timestamp,\n workflow,\n environment: inferEnvironment(record),\n tags: {\n sourceKind: source.kind,\n },\n calls: [call],\n totalCostUsd: call.costUsd,\n totalTokens: call.inputTokens + call.outputTokens,\n observedCostUsd: call.costSource === 'observed' ? call.costUsd : 0,\n estimatedCostUsd: call.costSource === 'estimated' ? call.costUsd : 0,\n });\n return;\n }\n\n existing.calls.push(call);\n existing.totalCostUsd = Number((existing.totalCostUsd + call.costUsd).toFixed(8));\n existing.totalTokens += call.inputTokens + call.outputTokens;\n existing.observedCostUsd += call.costSource === 'observed' ? call.costUsd : 0;\n existing.estimatedCostUsd += call.costSource === 'estimated' ? call.costUsd : 0;\n if (timestamp < existing.timestamp) {\n existing.timestamp = timestamp;\n }\n });\n }\n\n return Array.from(runsById.values()).sort((left, right) =>\n left.timestamp < right.timestamp ? -1 : 1,\n );\n}\n","export function getNestedValue(input: unknown, paths: string[][]): unknown {\n if (!input || typeof input !== 'object') {\n return null;\n }\n\n const record = input as Record<string, unknown>;\n\n for (const path of paths) {\n let current: unknown = record;\n\n for (const segment of path) {\n if (!current || typeof current !== 'object' || !(segment in current)) {\n current = undefined;\n break;\n }\n\n current = (current as Record<string, unknown>)[segment];\n }\n\n if (current !== undefined) {\n return current;\n }\n }\n\n return null;\n}\n\nexport function asNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : null;\n }\n\n return null;\n}\n\nexport function asString(value: unknown): string | null {\n if (typeof value === 'string' && value.trim() !== '') {\n return value.trim();\n }\n\n return null;\n}\n\nexport function asBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string') {\n return ['true', '1', 'yes'].includes(value.trim().toLowerCase());\n }\n\n if (typeof value === 'number') {\n return value > 0;\n }\n\n return false;\n}\n\nexport function pickMetadata(input: Record<string, unknown>, keys: string[]) {\n const output: Record<string, string | number | boolean | null> = {};\n\n for (const key of keys) {\n const value = input[key];\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n output[key] = value;\n }\n }\n\n return output;\n}\n","import { mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { platform } from 'node:process';\n\nfunction getUserHome() {\n return process.env.HOME ?? homedir();\n}\n\nexport function getAppPaths() {\n const home = getUserHome();\n return platform === 'darwin'\n ? {\n data: join(home, 'Library', 'Application Support', 'xerg'),\n config: join(home, 'Library', 'Preferences', 'xerg'),\n cache: join(home, 'Library', 'Caches', 'xerg'),\n }\n : platform === 'win32'\n ? {\n data: join(process.env.LOCALAPPDATA ?? join(home, 'AppData', 'Local'), 'xerg', 'Data'),\n config: join(process.env.APPDATA ?? join(home, 'AppData', 'Roaming'), 'xerg', 'Config'),\n cache: join(process.env.LOCALAPPDATA ?? join(home, 'AppData', 'Local'), 'xerg', 'Cache'),\n }\n : {\n data: join(process.env.XDG_DATA_HOME ?? join(home, '.local', 'share'), 'xerg'),\n config: join(process.env.XDG_CONFIG_HOME ?? join(home, '.config'), 'xerg'),\n cache: join(process.env.XDG_CACHE_HOME ?? join(home, '.cache'), 'xerg'),\n };\n}\n\nexport function ensureAppPaths() {\n const paths = getAppPaths();\n for (const path of Object.values(paths)) {\n mkdirSync(path, { recursive: true });\n }\n\n return paths;\n}\n\nexport function getDefaultDbPath() {\n return join(getAppPaths().data, 'xerg.db');\n}\n\nexport function getDefaultOpenClawSessionsPattern() {\n return join(getUserHome(), '.openclaw', 'agents', '*', 'sessions', '*.jsonl');\n}\n\nexport function getDefaultOpenClawGatewayPattern() {\n return '/tmp/openclaw/openclaw-*.log';\n}\n\nexport function getDefaultHermesSessionsPattern() {\n return join(getUserHome(), '.hermes', 'sessions', '**', '*.{json,jsonl}');\n}\n\nexport function getDefaultHermesGatewayPattern() {\n return join(getUserHome(), '.hermes', 'logs', 'agent.log* (fallback: gateway.log*)');\n}\n\nexport function getDefaultSessionsPattern() {\n return getDefaultOpenClawSessionsPattern();\n}\n\nexport function getDefaultGatewayPattern() {\n return getDefaultOpenClawGatewayPattern();\n}\n","import { readdirSync, statSync } from 'node:fs';\nimport { isAbsolute, join, resolve, sep } from 'node:path';\n\nimport type { AuditRuntime, DetectedSourceFile, SourceKind } from '../types.js';\n\nexport function toDetected(\n path: string,\n kind: Extract<SourceKind, 'gateway' | 'sessions'>,\n runtime: AuditRuntime,\n): DetectedSourceFile | null {\n try {\n const stats = statSync(path);\n if (!stats.isFile()) {\n return null;\n }\n\n return {\n kind,\n runtime,\n path,\n sizeBytes: stats.size,\n mtimeMs: stats.mtimeMs,\n };\n } catch {\n return null;\n }\n}\n\nexport async function collectGlobMatches(\n pattern: string,\n options?: {\n cwd?: string;\n resolveWith?: string;\n },\n) {\n const baseDir = options?.cwd ? resolve(options.cwd) : isAbsolute(pattern) ? sep : process.cwd();\n const relativePattern = options?.cwd\n ? pattern\n : isAbsolute(pattern)\n ? pattern.slice(baseDir.length)\n : pattern;\n const segments = relativePattern.split('/').filter(Boolean);\n const matches = collectMatchesFromSegments(baseDir, segments);\n\n return matches.map((match) =>\n options?.resolveWith ? resolve(options.resolveWith, match) : match,\n );\n}\n\nfunction collectMatchesFromSegments(currentPath: string, segments: string[]): string[] {\n if (segments.length === 0) {\n return [currentPath];\n }\n\n const [segment, ...rest] = segments;\n\n if (segment === '**') {\n const matches = collectMatchesFromSegments(currentPath, rest);\n\n for (const entry of readDirSafe(currentPath)) {\n if (entry.isDirectory()) {\n matches.push(...collectMatchesFromSegments(join(currentPath, entry.name), segments));\n }\n }\n\n return matches;\n }\n\n const matches: string[] = [];\n const matcher = segmentToRegExp(segment);\n\n for (const entry of readDirSafe(currentPath)) {\n if (!matcher.test(entry.name)) {\n continue;\n }\n\n const nextPath = join(currentPath, entry.name);\n if (rest.length === 0) {\n matches.push(nextPath);\n continue;\n }\n\n if (entry.isDirectory()) {\n matches.push(...collectMatchesFromSegments(nextPath, rest));\n }\n }\n\n return matches;\n}\n\nfunction readDirSafe(path: string) {\n try {\n return readdirSync(path, { withFileTypes: true });\n } catch {\n return [];\n }\n}\n\nfunction segmentToRegExp(segment: string) {\n const escaped = segment.replaceAll(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replaceAll('*', '.*');\n return new RegExp(`^${escaped}$`);\n}\n","import type { AuditOptions, DetectedSourceFile } from '../types.js';\nimport {\n getDefaultOpenClawGatewayPattern,\n getDefaultOpenClawSessionsPattern,\n} from '../utils/paths.js';\nimport { collectGlobMatches, toDetected } from './shared.js';\n\nexport async function detectOpenClawSources(options: AuditOptions): Promise<DetectedSourceFile[]> {\n const explicitSources: DetectedSourceFile[] = [];\n\n if (options.logFile) {\n const detected = toDetected(options.logFile, 'gateway', 'openclaw');\n if (detected) {\n explicitSources.push(detected);\n }\n }\n\n if (options.sessionsDir) {\n const matches = await collectGlobMatches('**/*.jsonl', {\n cwd: options.sessionsDir,\n resolveWith: options.sessionsDir,\n });\n\n for (const match of matches) {\n const detected = toDetected(match, 'sessions', 'openclaw');\n if (detected) {\n explicitSources.push(detected);\n }\n }\n }\n\n if (explicitSources.length > 0) {\n return explicitSources.sort((left, right) => right.mtimeMs - left.mtimeMs);\n }\n\n const [gatewayMatches, sessionMatches] = await Promise.all([\n collectGlobMatches(getDefaultOpenClawGatewayPattern()),\n collectGlobMatches(getDefaultOpenClawSessionsPattern()),\n ]);\n\n const detected = [\n ...gatewayMatches.map((path) => toDetected(path, 'gateway', 'openclaw')).filter(Boolean),\n ...sessionMatches.map((path) => toDetected(path, 'sessions', 'openclaw')).filter(Boolean),\n ] as DetectedSourceFile[];\n\n return detected.sort((left, right) => right.mtimeMs - left.mtimeMs);\n}\n","import { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\n\nimport { estimateCostUsd } from '../pricing-catalog.js';\nimport type { DetectedSourceFile, NormalizedCall, NormalizedRun } from '../types.js';\nimport { sha1 } from '../utils/hash.js';\nimport { asBoolean, asNumber, asString, getNestedValue, pickMetadata } from '../utils/records.js';\nimport { parseSince, toIsoOrNow } from '../utils/time.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction parseJsonLines(path: string) {\n const content = readFileSync(path, 'utf8');\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const records: JsonRecord[] = [];\n\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line) as JsonRecord;\n records.push(parsed);\n } catch {}\n }\n\n return records;\n}\n\nfunction inferProvider(record: JsonRecord) {\n return (\n asString(\n getNestedValue(record, [['provider'], ['message', 'provider'], ['usage', 'provider']]),\n ) ?? 'unknown'\n );\n}\n\nfunction inferModel(record: JsonRecord) {\n return (\n asString(getNestedValue(record, [['model'], ['message', 'model'], ['usage', 'model']])) ??\n 'unknown-model'\n );\n}\n\nfunction inferWorkflow(record: JsonRecord, sourcePath: string) {\n return (\n asString(\n getNestedValue(record, [\n ['workflow'],\n ['session', 'workflow'],\n ['metadata', 'workflow'],\n ['agent', 'name'],\n ['agentId'],\n ['sessionId'],\n ]),\n ) ?? basename(sourcePath, '.jsonl')\n );\n}\n\nfunction inferEnvironment(record: JsonRecord) {\n return (\n asString(getNestedValue(record, [['environment'], ['env'], ['metadata', 'environment']])) ??\n 'local'\n );\n}\n\nfunction inferRunKey(record: JsonRecord, workflow: string, index: number, sourcePath: string) {\n return (\n asString(\n getNestedValue(record, [\n ['run_id'],\n ['runId'],\n ['trace_id'],\n ['traceId'],\n ['sessionId'],\n ['thread_id'],\n ]),\n ) ?? `${sourcePath}:${workflow}:${index}`\n );\n}\n\nfunction inferTaskClass(record: JsonRecord, workflow: string) {\n return (\n asString(getNestedValue(record, [['task_class'], ['taskClass'], ['metadata', 'taskClass']])) ??\n workflow.toLowerCase()\n );\n}\n\nfunction extractUsage(record: JsonRecord) {\n const inputTokens =\n asNumber(\n getNestedValue(record, [\n ['input_tokens'],\n ['inputTokens'],\n ['usage', 'input_tokens'],\n ['usage', 'inputTokens'],\n ['message', 'usage', 'input_tokens'],\n ['message', 'usage', 'inputTokens'],\n ['usage', 'prompt_tokens'],\n ['message', 'usage', 'prompt_tokens'],\n ]),\n ) ?? 0;\n\n const outputTokens =\n asNumber(\n getNestedValue(record, [\n ['output_tokens'],\n ['outputTokens'],\n ['usage', 'output_tokens'],\n ['usage', 'outputTokens'],\n ['message', 'usage', 'output_tokens'],\n ['message', 'usage', 'outputTokens'],\n ['usage', 'completion_tokens'],\n ['message', 'usage', 'completion_tokens'],\n ]),\n ) ?? 0;\n\n const observedCost =\n asNumber(\n getNestedValue(record, [\n ['cost_usd'],\n ['costUsd'],\n ['usage', 'cost_usd'],\n ['usage', 'costUsd'],\n ['usage', 'cost', 'total'],\n ['message', 'usage', 'cost', 'total'],\n ['message', 'usage', 'cost_usd'],\n ['pricing', 'total_usd'],\n ]),\n ) ?? null;\n\n return {\n inputTokens,\n outputTokens,\n observedCost,\n };\n}\n\nfunction buildCall(\n source: DetectedSourceFile,\n record: JsonRecord,\n runId: string,\n index: number,\n): NormalizedCall {\n const provider = inferProvider(record);\n const model = inferModel(record);\n const workflow = inferWorkflow(record, source.path);\n const { inputTokens, outputTokens, observedCost } = extractUsage(record);\n const estimatedCost = estimateCostUsd(provider, model, inputTokens, outputTokens);\n const timestamp = toIsoOrNow(\n getNestedValue(record, [['timestamp'], ['createdAt'], ['created_at']]),\n );\n const attempt =\n asNumber(\n getNestedValue(record, [['attempt'], ['usage', 'attempt'], ['metadata', 'attempt']]),\n ) ?? null;\n const iteration =\n asNumber(\n getNestedValue(record, [['iteration'], ['loop_iteration'], ['metadata', 'iteration']]),\n ) ?? null;\n const retries =\n asNumber(getNestedValue(record, [['retries'], ['retry_count'], ['metadata', 'retries']])) ?? 0;\n const costUsd = observedCost ?? estimatedCost ?? 0;\n\n return {\n id: sha1(`${runId}:${source.path}:${index}:${model}:${timestamp}:${costUsd}`),\n runId,\n timestamp,\n provider,\n model,\n inputTokens,\n outputTokens,\n costUsd,\n costSource: observedCost !== null ? 'observed' : 'estimated',\n latencyMs:\n asNumber(getNestedValue(record, [['latency_ms'], ['latencyMs'], ['usage', 'latency_ms']])) ??\n null,\n toolCalls:\n asNumber(getNestedValue(record, [['tool_calls'], ['toolCalls'], ['usage', 'tool_calls']])) ??\n 0,\n retries,\n attempt,\n iteration,\n status:\n asString(getNestedValue(record, [['status'], ['level'], ['result'], ['error', 'type']])) ??\n null,\n taskClass: inferTaskClass(record, workflow),\n cacheHit: asBoolean(\n getNestedValue(record, [['cache_hit'], ['cacheHit'], ['usage', 'cache_hit']]),\n ),\n cacheCostUsd:\n asNumber(\n getNestedValue(record, [['cache_cost_usd'], ['cacheCostUsd'], ['usage', 'cache_cost_usd']]),\n ) ?? null,\n metadata: pickMetadata(record, ['event', 'type', 'sessionId', 'agentId']),\n };\n}\n\nfunction shouldTreatAsCall(record: JsonRecord) {\n const hasUsage =\n extractUsage(record).inputTokens > 0 ||\n extractUsage(record).outputTokens > 0 ||\n extractUsage(record).observedCost !== null;\n\n return hasUsage;\n}\n\nexport function normalizeOpenClawSources(\n sources: DetectedSourceFile[],\n since?: string,\n): NormalizedRun[] {\n const cutoff = parseSince(since);\n const runsById = new Map<string, NormalizedRun>();\n\n for (const source of sources) {\n const records = parseJsonLines(source.path);\n\n records.forEach((record, index) => {\n if (!shouldTreatAsCall(record)) {\n return;\n }\n\n const workflow = inferWorkflow(record, source.path);\n const timestamp = toIsoOrNow(\n getNestedValue(record, [['timestamp'], ['createdAt'], ['created_at']]),\n );\n if (cutoff && new Date(timestamp).getTime() < cutoff) {\n return;\n }\n\n const runKey = inferRunKey(record, workflow, index, source.path);\n const runId = sha1(`${source.path}:${runKey}`);\n const call = buildCall(source, record, runId, index);\n const existing = runsById.get(runId);\n\n if (!existing) {\n runsById.set(runId, {\n id: runId,\n sourceKind: source.kind,\n sourcePath: source.path,\n timestamp,\n workflow,\n environment: inferEnvironment(record),\n tags: {\n sourceKind: source.kind,\n },\n calls: [call],\n totalCostUsd: call.costUsd,\n totalTokens: call.inputTokens + call.outputTokens,\n observedCostUsd: call.costSource === 'observed' ? call.costUsd : 0,\n estimatedCostUsd: call.costSource === 'estimated' ? call.costUsd : 0,\n });\n return;\n }\n\n existing.calls.push(call);\n existing.totalCostUsd = Number((existing.totalCostUsd + call.costUsd).toFixed(8));\n existing.totalTokens += call.inputTokens + call.outputTokens;\n existing.observedCostUsd += call.costSource === 'observed' ? call.costUsd : 0;\n existing.estimatedCostUsd += call.costSource === 'estimated' ? call.costUsd : 0;\n });\n }\n\n return Array.from(runsById.values()).sort((left, right) => {\n return new Date(left.timestamp).getTime() - new Date(right.timestamp).getTime();\n });\n}\n","import {\n inspectCursorUsageCsv,\n normalizeCursorUsageCsv,\n readCursorUsageCsv,\n} from './cursor/usage-csv.js';\nimport { persistAudit } from './db/persist.js';\nimport { readLatestComparableAuditSummary } from './db/read.js';\nimport { buildCursorUsageFindings } from './findings/cursor.js';\nimport { buildFindings } from './findings/engine.js';\nimport { PRICING_CATALOG } from './pricing-catalog.js';\nimport { buildAuditComparison } from './report/comparison.js';\nimport { buildAuditSummary } from './report/summary.js';\nimport { doctorAgentRuntime, getRuntimeAdapter, resolveLocalAgentRuntime } from './runtime.js';\nimport type { AgentRuntime, AuditOptions, AuditSummary, PricingCoverage } from './types.js';\nimport { getDefaultDbPath } from './utils/paths.js';\n\nexport async function doctorOpenClaw(options: AuditOptions) {\n return doctorAgentRuntime({\n ...options,\n runtime: 'openclaw',\n });\n}\n\nexport async function doctorHermes(options: AuditOptions) {\n return doctorAgentRuntime({\n ...options,\n runtime: 'hermes',\n });\n}\n\nexport { doctorAgentRuntime };\n\nexport async function auditOpenClaw(options: AuditOptions) {\n return auditAgentRuntime({\n ...options,\n runtime: 'openclaw',\n });\n}\n\nexport async function auditHermes(options: AuditOptions) {\n return auditAgentRuntime({\n ...options,\n runtime: 'hermes',\n });\n}\n\nexport async function doctorCursorUsageCsv(options: AuditOptions) {\n return inspectCursorUsageCsv(options);\n}\n\nfunction validateCompareOptions(options: AuditOptions) {\n if (options.compare && options.noDb) {\n throw new Error(\n 'The --compare flag needs local snapshot history. Remove --no-db or provide --db <path>.',\n );\n }\n}\n\nfunction maybeAttachComparison(\n options: AuditOptions,\n dbPath: string | undefined,\n summary: AuditSummary,\n) {\n if (!options.compare || !dbPath) {\n return;\n }\n\n options.onProgress?.('Looking for a comparable baseline audit...');\n const baseline = readLatestComparableAuditSummary({\n dbPath,\n comparisonKey: summary.comparisonKey,\n currentAuditId: summary.auditId,\n });\n\n if (!baseline) {\n summary.notes = [\n ...summary.notes,\n 'No prior comparable audit was found. Run the same audit again after a fix to unlock before/after deltas.',\n ];\n return;\n }\n\n summary.comparison = buildAuditComparison(summary, baseline);\n\n if (hasPricingCoverageChange(summary.pricingCoverage, baseline.pricingCoverage)) {\n summary.notes = [\n ...summary.notes,\n 'Pricing coverage changed versus the baseline audit. Spend deltas are directional because different Cursor aliases were priced in each run.',\n ];\n }\n}\n\nfunction persistLocalSnapshot(\n summary: AuditSummary,\n runs: Parameters<typeof persistAudit>[0]['runs'],\n dbPath: string | undefined,\n onProgress?: (message: string) => void,\n) {\n if (!dbPath) {\n onProgress?.('Skipping local snapshot persistence (--no-db).');\n return;\n }\n\n onProgress?.(`Persisting local snapshot to ${dbPath}...`);\n persistAudit(\n {\n summary,\n runs,\n pricingCatalog: PRICING_CATALOG,\n },\n dbPath,\n );\n onProgress?.('Local snapshot stored.');\n}\n\nfunction hasPricingCoverageChange(\n current?: PricingCoverage | null,\n baseline?: PricingCoverage | null,\n) {\n if (!current && !baseline) {\n return false;\n }\n\n return (\n (current?.pricedCallCount ?? 0) !== (baseline?.pricedCallCount ?? 0) ||\n (current?.unpricedCallCount ?? 0) !== (baseline?.unpricedCallCount ?? 0) ||\n (current?.pricedTokenCount ?? 0) !== (baseline?.pricedTokenCount ?? 0) ||\n (current?.unpricedTokenCount ?? 0) !== (baseline?.unpricedTokenCount ?? 0)\n );\n}\n\nasync function auditResolvedRuntime(\n runtime: AgentRuntime,\n options: AuditOptions,\n detectedSources?: Awaited<ReturnType<typeof resolveLocalAgentRuntime>>['sources'],\n) {\n const adapter = getRuntimeAdapter(runtime);\n options.onProgress?.(`Scanning for ${adapter.productName} source files...`);\n validateCompareOptions(options);\n\n const sources = detectedSources ?? (await adapter.detectSources(options));\n if (sources.length === 0) {\n options.onProgress?.(`No ${adapter.productName} source files were detected.`);\n throw new Error(adapter.noDataError(options.commandPrefix ?? 'xerg'));\n }\n options.onProgress?.(`Detected ${sources.length} source file${sources.length === 1 ? '' : 's'}.`);\n\n options.onProgress?.(`Normalizing ${adapter.productName} source files...`);\n const runs = adapter.normalizeSources(sources, options.since);\n options.onProgress?.(`Normalized ${runs.length} run${runs.length === 1 ? '' : 's'}.`);\n options.onProgress?.('Computing waste and savings findings...');\n const { findings, wasteAttributions } = buildFindings(runs);\n const dbPath = options.noDb ? undefined : (options.dbPath ?? getDefaultDbPath());\n options.onProgress?.('Building audit summary...');\n const summary = buildAuditSummary({\n runtime,\n runs,\n findings,\n wasteAttributions,\n sources,\n since: options.since,\n dbPath,\n comparisonKeyOverride: options.comparisonKeyOverride,\n });\n\n maybeAttachComparison(options, dbPath, summary);\n persistLocalSnapshot(summary, runs, dbPath, options.onProgress);\n\n return summary;\n}\n\nexport async function auditAgentRuntime(options: AuditOptions) {\n const runtime = options.runtime ?? 'auto';\n\n if (runtime !== 'auto') {\n return auditResolvedRuntime(runtime, options);\n }\n\n const resolved = await resolveLocalAgentRuntime(options);\n return auditResolvedRuntime(resolved.adapter.runtime, options, resolved.sources);\n}\n\nexport async function auditCursorUsageCsv(options: AuditOptions) {\n options.onProgress?.('Reading Cursor usage CSV...');\n validateCompareOptions(options);\n\n if (!options.cursorUsageCsv) {\n throw new Error('No Cursor usage CSV was provided. Use --cursor-usage-csv <path>.');\n }\n\n const parsed = readCursorUsageCsv(options.cursorUsageCsv);\n options.onProgress?.(`Loaded Cursor usage CSV: ${parsed.source.path}`);\n options.onProgress?.('Normalizing Cursor usage rows...');\n const normalized = normalizeCursorUsageCsv({\n source: parsed.source,\n rows: parsed.rows,\n hasObservedCostRows: parsed.hasObservedCostRows,\n since: options.since,\n });\n options.onProgress?.(\n `Normalized ${normalized.runs.length} usage row${normalized.runs.length === 1 ? '' : 's'}.`,\n );\n options.onProgress?.('Computing Cursor-specific findings...');\n const { findings, wasteAttributions } = buildCursorUsageFindings(normalized.runs);\n const dbPath = options.noDb ? undefined : (options.dbPath ?? getDefaultDbPath());\n options.onProgress?.('Building audit summary...');\n const summary = buildAuditSummary({\n runtime: 'cursor',\n runs: normalized.runs,\n findings,\n wasteAttributions,\n sources: [parsed.source],\n since: options.since,\n dbPath,\n comparisonKeyOverride: options.comparisonKeyOverride,\n });\n\n summary.pricingCoverage = normalized.pricingCoverage;\n summary.cursorUsage = normalized.cursorUsage;\n summary.notes = [\n 'Cursor CSV audits analyze exported usage rows rather than raw session transcripts.',\n 'OpenClaw-specific retry, loop, and session-level workflow findings are still unavailable for Cursor CSV inputs because the export does not include retries, iterations, or real workflow IDs.',\n parsed.hasObservedCostRows\n ? 'Numeric Cost values were used as observed spend. Included rows are treated as zero billed spend in this export mode.'\n : 'This CSV did not include numeric Cost values, so spend was estimated from local model pricing where possible.',\n ];\n\n if (parsed.rows.length > 0 && normalized.runs.length === 0 && options.since) {\n summary.notes = [\n ...summary.notes,\n `No Cursor usage rows matched the --since window (${options.since}).`,\n ];\n }\n\n if (normalized.pricingCoverage.unpricedCallCount > 0) {\n const aliases = normalized.pricingCoverage.topUnpricedModels\n .map((model) => model.key)\n .join(', ');\n summary.notes = [\n ...summary.notes,\n `Some Cursor aliases do not have full local pricing coverage: ${aliases || 'unknown aliases'}.`,\n ];\n }\n\n maybeAttachComparison(options, dbPath, summary);\n persistLocalSnapshot(summary, normalized.runs, dbPath, options.onProgress);\n\n return summary;\n}\n","import type { XergRecommendation } from '@xerg/schemas';\nimport type {\n AuditSummary,\n CursorUsageCsvDoctorReport,\n CursorUsageModeBreakdown,\n CursorUsageModelBreakdown,\n DailySpendBreakdown,\n DailyWasteBreakdown,\n DoctorReport,\n Finding,\n FindingChange,\n FindingTaxonomyBucket,\n SpendBreakdown,\n SpendDelta,\n} from '../types.js';\n\nfunction formatUsd(value: number) {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: value >= 1 ? 2 : 4,\n maximumFractionDigits: 4,\n }).format(value);\n}\n\nfunction formatPercent(value: number) {\n return `${(value * 100).toFixed(0)}%`;\n}\n\nfunction formatPercentDelta(value: number) {\n const points = value * 100;\n const sign = points > 0 ? '+' : '';\n return `${sign}${points.toFixed(0)} pts`;\n}\n\nfunction formatCount(value: number) {\n return new Intl.NumberFormat('en-US').format(value);\n}\n\nfunction formatUsdDelta(value: number) {\n const sign = value > 0 ? '+' : '';\n return `${sign}${formatUsd(value)}`;\n}\n\nfunction isCursorUsageSummary(summary: AuditSummary) {\n return summary.sourceFiles.some((source) => source.kind === 'cursor-usage-csv');\n}\n\nfunction topRows(rows: SpendBreakdown[], limit = 5) {\n return rows.slice(0, limit).map((row) => {\n return `- ${row.key}: ${formatUsd(row.spendUsd)} (${formatPercent(row.observedShare)} observed)`;\n });\n}\n\nfunction renderTaxonomyRows(rows: FindingTaxonomyBucket[], emptyLabel: string, suffix?: string) {\n if (rows.length === 0) {\n return [`- ${emptyLabel}`];\n }\n\n return rows.map((row) => {\n const countLabel = `${row.findingCount} finding${row.findingCount === 1 ? '' : 's'}`;\n const detail = suffix ? ` ${suffix}` : '';\n return `- ${row.label}: ${formatUsd(row.spendUsd)} across ${countLabel}${detail}`;\n });\n}\n\nfunction renderTaxonomyBlock(summary: AuditSummary) {\n return [\n '## Waste taxonomy',\n 'Structural waste',\n ...renderTaxonomyRows(summary.wasteByKind, 'No confirmed waste buckets detected.'),\n 'Savings opportunities',\n ...renderTaxonomyRows(\n summary.opportunityByKind,\n 'No opportunity buckets detected.',\n '(directional)',\n ),\n ];\n}\n\nfunction topFinding(summary: AuditSummary, classification: 'waste' | 'opportunity') {\n return summary.findings\n .filter((finding) => finding.classification === classification)\n .sort((left, right) => right.costImpactUsd - left.costImpactUsd)[0];\n}\n\nfunction renderFindingList(findings: Finding[], emptyLabel: string) {\n if (findings.length === 0) {\n return [`- ${emptyLabel}`];\n }\n\n return findings.slice(0, 5).map((finding) => {\n return `- ${finding.title}: ${formatUsd(finding.costImpactUsd)} (${finding.confidence})`;\n });\n}\n\nfunction renderActionQueueRow(label: string, recommendation?: XergRecommendation) {\n if (!recommendation) {\n return [`${label}`, '- none'];\n }\n\n return [\n label,\n `- ${recommendation.title} [${recommendation.scopeLabel}]: ${formatUsd(recommendation.estimatedSavingsUsd)} (${recommendation.severity})`,\n ];\n}\n\nfunction renderActionQueue(summary: AuditSummary) {\n const fixNow = summary.recommendations.find(\n (recommendation) => recommendation.priorityBucket === 'fix_now',\n );\n const testNext = summary.recommendations.find(\n (recommendation) => recommendation.priorityBucket === 'test_next',\n );\n const watch = summary.recommendations.find(\n (recommendation) => recommendation.priorityBucket === 'watch',\n );\n\n return [\n '## Action queue',\n ...renderActionQueueRow('Fix now', fixNow),\n ...renderActionQueueRow('Test next', testNext),\n ...renderActionQueueRow('Watch', watch),\n 'How to validate: `xerg audit --compare --push`',\n ];\n}\n\nfunction describeSpendDelta(delta: SpendDelta) {\n return `${delta.key} (${formatUsdDelta(delta.deltaSpendUsd)})`;\n}\n\nfunction pickBiggestImprovement(deltas: SpendDelta[]) {\n return deltas\n .filter((delta) => delta.deltaSpendUsd < 0)\n .sort((left, right) => left.deltaSpendUsd - right.deltaSpendUsd)[0];\n}\n\nfunction pickBiggestRegression(deltas: SpendDelta[]) {\n return deltas\n .filter((delta) => delta.deltaSpendUsd > 0)\n .sort((left, right) => right.deltaSpendUsd - left.deltaSpendUsd)[0];\n}\n\nfunction renderFindingChange(change: FindingChange, state: 'new' | 'resolved' | 'worsened') {\n if (state === 'resolved') {\n return `- Resolved: ${change.title} (${formatUsd(change.baselineCostImpactUsd ?? 0)})`;\n }\n\n if (state === 'worsened') {\n return `- Worsened: ${change.title} (${formatUsdDelta(change.deltaCostImpactUsd)})`;\n }\n\n return `- New: ${change.title} (${formatUsd(change.currentCostImpactUsd ?? 0)})`;\n}\n\nfunction renderCompareBlock(summary: AuditSummary) {\n if (!summary.comparison) {\n return [];\n }\n\n const comparison = summary.comparison;\n const biggestImprovement = pickBiggestImprovement(comparison.workflowDeltas);\n const biggestRegression = pickBiggestRegression(comparison.workflowDeltas);\n const firstWorkflowToInspect = biggestRegression?.key ?? summary.spendByWorkflow[0]?.key ?? null;\n const findingChanges = [\n ...comparison.findingChanges.newHighConfidenceWaste.map((change) =>\n renderFindingChange(change, 'new'),\n ),\n ...comparison.findingChanges.resolvedHighConfidenceWaste.map((change) =>\n renderFindingChange(change, 'resolved'),\n ),\n ...comparison.findingChanges.worsenedHighConfidenceWaste.map((change) =>\n renderFindingChange(change, 'worsened'),\n ),\n ].slice(0, 5);\n\n return [\n '## Before / after',\n `Compared against ${comparison.baselineGeneratedAt}`,\n `- Total spend: ${formatUsd(comparison.baselineTotalSpendUsd)} -> ${formatUsd(summary.totalSpendUsd)} (${formatUsdDelta(comparison.deltaTotalSpendUsd)})`,\n `- Structural waste: ${formatUsd(comparison.baselineWasteSpendUsd)} -> ${formatUsd(summary.wasteSpendUsd)} (${formatUsdDelta(comparison.deltaWasteSpendUsd)})`,\n `- Waste rate: ${formatPercent(comparison.baselineStructuralWasteRate)} -> ${formatPercent(summary.structuralWasteRate)} (${formatPercentDelta(comparison.deltaStructuralWasteRate)})`,\n `- Runs analyzed: ${comparison.baselineRunCount} -> ${summary.runCount} (${comparison.deltaRunCount > 0 ? '+' : ''}${comparison.deltaRunCount})`,\n `- Model calls: ${comparison.baselineCallCount} -> ${summary.callCount} (${comparison.deltaCallCount > 0 ? '+' : ''}${comparison.deltaCallCount})`,\n biggestImprovement\n ? `- Biggest improvement: ${describeSpendDelta(biggestImprovement)}`\n : '- Biggest improvement: none detected',\n biggestRegression\n ? `- Biggest regression: ${describeSpendDelta(biggestRegression)}`\n : '- Biggest regression: none detected',\n firstWorkflowToInspect\n ? `- First workflow to inspect now: ${firstWorkflowToInspect}`\n : '- First workflow to inspect now: no workflow delta available',\n ...(comparison.modelDeltas.length > 0\n ? [`- Model swing to inspect: ${describeSpendDelta(comparison.modelDeltas[0])}`]\n : ['- Model swing to inspect: none']),\n ...(findingChanges.length > 0 ? findingChanges : ['- High-confidence waste changes: none']),\n ];\n}\n\nfunction renderDailyTrendRows(\n spendByDay: DailySpendBreakdown[],\n wasteByDay: DailyWasteBreakdown[],\n) {\n if (spendByDay.length <= 1) {\n return [];\n }\n\n const wasteByDate = new Map(wasteByDay.map((row) => [row.date, row.wasteUsd]));\n\n return [\n '## Daily trend',\n ...spendByDay.map((row) => {\n const wasteUsd = wasteByDate.get(row.date) ?? 0;\n return `- ${row.date}: ${formatUsd(row.spendUsd)} spend, ${formatUsd(wasteUsd)} waste`;\n }),\n ];\n}\n\nexport function renderDoctorReport(report: DoctorReport, options?: { commandPrefix?: string }) {\n const commandPrefix = options?.commandPrefix ?? 'xerg';\n const status =\n report.mode === 'resolved' && report.runtime\n ? `${report.runtime === 'hermes' ? 'Hermes' : 'OpenClaw'} sources detected.`\n : report.mode === 'ambiguous'\n ? 'Multiple supported local runtimes detected.'\n : 'No supported local sources detected.';\n const nextSteps = report.canAudit\n ? []\n : report.mode === 'ambiguous'\n ? [\n '',\n '## Next steps',\n `- Inspect OpenClaw only: ${commandPrefix} doctor --runtime openclaw`,\n `- Inspect Hermes only: ${commandPrefix} doctor --runtime hermes`,\n `- Try explicit local paths: ${commandPrefix} doctor --runtime hermes --log-file /path/to/log --sessions-dir /path/to/sessions`,\n ]\n : [\n '',\n '## Next steps',\n `- Inspect OpenClaw locally: ${commandPrefix} doctor --runtime openclaw`,\n `- Inspect Hermes locally: ${commandPrefix} doctor --runtime hermes`,\n `- Try explicit local paths: ${commandPrefix} doctor --runtime hermes --log-file /path/to/log --sessions-dir /path/to/sessions`,\n `- Inspect an SSH host for OpenClaw: ${commandPrefix} doctor --remote user@host`,\n `- Inspect a Railway service for OpenClaw: ${commandPrefix} doctor --railway`,\n '- Remote audits still analyze locally after Xerg pulls the source files to your machine.',\n ];\n\n const sections = [\n '# Xerg doctor',\n '',\n status,\n '',\n '## Defaults',\n ...report.defaults.flatMap((defaults) => [\n `- ${defaults.runtime === 'hermes' ? 'Hermes' : 'OpenClaw'} gateway logs: ${defaults.gatewayPattern}`,\n `- ${defaults.runtime === 'hermes' ? 'Hermes' : 'OpenClaw'} session files: ${defaults.sessionsPattern}`,\n ]),\n '',\n '## Sources',\n ...(report.sources.length > 0\n ? report.sources.map((source) => `- [${source.runtime}/${source.kind}] ${source.path}`)\n : ['- none']),\n '',\n '## Notes',\n ...report.notes.map((note) => `- ${note}`),\n ...nextSteps,\n ];\n\n return sections.join('\\n');\n}\n\nexport function renderCursorDoctorReport(report: CursorUsageCsvDoctorReport) {\n const status = report.canAudit ? 'Cursor usage CSV detected.' : 'Cursor usage CSV is not ready.';\n\n return [\n '# Xerg doctor [cursor csv]',\n '',\n status,\n '',\n `File: ${report.filePath || '(not provided)'}`,\n `Rows: ${formatCount(report.rowCount)}`,\n `Date range: ${report.dateRange ? `${report.dateRange.start} -> ${report.dateRange.end}` : 'unavailable'}`,\n '',\n '## Pricing coverage',\n `- Priced rows: ${formatCount(report.pricingCoverage.pricedCallCount)}`,\n `- Unpriced rows: ${formatCount(report.pricingCoverage.unpricedCallCount)}`,\n `- Priced tokens: ${formatCount(report.pricingCoverage.pricedTokenCount)}`,\n `- Unpriced tokens: ${formatCount(report.pricingCoverage.unpricedTokenCount)}`,\n ...(report.pricingCoverage.topUnpricedModels.length > 0\n ? report.pricingCoverage.topUnpricedModels.map(\n (model) =>\n `- Unpriced model: ${model.key} (${formatCount(model.totalTokens)} tokens across ${formatCount(model.callCount)} row${model.callCount === 1 ? '' : 's'})`,\n )\n : ['- Unpriced model: none']),\n '',\n '## Notes',\n ...report.notes.map((note) => `- ${note}`),\n ].join('\\n');\n}\n\nfunction renderCursorModeRows(rows: CursorUsageModeBreakdown[]) {\n if (rows.length === 0) {\n return ['- none'];\n }\n\n return rows.map((row) => {\n return `- ${row.key}: ${formatCount(row.callCount)} row${row.callCount === 1 ? '' : 's'}, ${formatCount(row.totalTokens)} tokens, ${formatUsd(row.estimatedSpendUsd)} spend`;\n });\n}\n\nfunction renderCursorModelRows(rows: CursorUsageModelBreakdown[]) {\n if (rows.length === 0) {\n return ['- none'];\n }\n\n return rows.slice(0, 8).map((row) => {\n const coverage =\n row.unpricedCallCount === 0\n ? `${formatUsd(row.estimatedSpendUsd)} spend`\n : row.pricedCallCount === 0\n ? 'unpriced'\n : `${formatUsd(row.estimatedSpendUsd)} spend, ${formatCount(row.unpricedCallCount)} unpriced row${row.unpricedCallCount === 1 ? '' : 's'}`;\n\n return `- ${row.key}: ${formatCount(row.callCount)} row${row.callCount === 1 ? '' : 's'}, ${formatCount(row.totalTokens)} tokens, ${coverage}`;\n });\n}\n\nfunction renderCursorPricingCoverage(summary: AuditSummary) {\n const coverage = summary.pricingCoverage;\n if (!coverage) {\n return ['- Pricing coverage unavailable'];\n }\n\n return [\n `- Priced rows: ${formatCount(coverage.pricedCallCount)}`,\n `- Unpriced rows: ${formatCount(coverage.unpricedCallCount)}`,\n `- Priced tokens: ${formatCount(coverage.pricedTokenCount)}`,\n `- Unpriced tokens: ${formatCount(coverage.unpricedTokenCount)}`,\n ...(coverage.topUnpricedModels.length > 0\n ? coverage.topUnpricedModels.map(\n (model) =>\n `- Unpriced model: ${model.key} (${formatCount(model.totalTokens)} tokens across ${formatCount(model.callCount)} row${model.callCount === 1 ? '' : 's'})`,\n )\n : ['- Unpriced model: none']),\n ];\n}\n\nfunction renderCursorCompareBlock(summary: AuditSummary) {\n if (!summary.comparison) {\n return [];\n }\n\n const comparison = summary.comparison;\n const modeSwing = comparison.workflowDeltas[0];\n const modelSwing = comparison.modelDeltas[0];\n\n return [\n '## Before / after',\n `Compared against ${comparison.baselineGeneratedAt}`,\n `- Total spend: ${formatUsd(comparison.baselineTotalSpendUsd)} -> ${formatUsd(summary.totalSpendUsd)} (${formatUsdDelta(comparison.deltaTotalSpendUsd)})`,\n `- Rows analyzed: ${formatCount(comparison.baselineRunCount)} -> ${formatCount(summary.runCount)} (${comparison.deltaRunCount > 0 ? '+' : ''}${comparison.deltaRunCount})`,\n `- Usage rows with pricing: ${formatCount(summary.pricingCoverage?.pricedCallCount ?? 0)}`,\n modeSwing\n ? `- Mode swing to inspect: ${describeSpendDelta(modeSwing)}`\n : '- Mode swing to inspect: none',\n modelSwing\n ? `- Model swing to inspect: ${describeSpendDelta(modelSwing)}`\n : '- Model swing to inspect: none',\n ];\n}\n\nfunction renderCursorTerminalSummary(summary: AuditSummary) {\n const usage = summary.cursorUsage;\n\n return [\n '# Xerg audit [cursor csv]',\n '',\n `Total spend: ${formatUsd(summary.totalSpendUsd)}`,\n `Observed spend: ${formatUsd(summary.observedSpendUsd)}`,\n `Estimated spend: ${formatUsd(summary.estimatedSpendUsd)}`,\n `Rows analyzed: ${formatCount(summary.runCount)}`,\n `Usage rows with pricing: ${formatCount(summary.pricingCoverage?.pricedCallCount ?? 0)} / ${formatCount(summary.runCount)}`,\n `Total tokens: ${formatCount(usage?.totalTokens ?? 0)}`,\n `Structural waste identified: ${formatUsd(summary.wasteSpendUsd)} (${formatPercent(summary.structuralWasteRate)})`,\n `Potential impact surfaced: ${formatUsd(summary.opportunitySpendUsd)}`,\n '',\n '## Token mix',\n `- Input tokens: ${formatCount(usage?.totalInputTokens ?? 0)}`,\n `- Output tokens: ${formatCount(usage?.totalOutputTokens ?? 0)}`,\n `- Cache read tokens: ${formatCount(usage?.totalCacheReadTokens ?? 0)}`,\n `- Input (cache write): ${formatCount(usage?.totalInputWithCacheWriteTokens ?? 0)}`,\n `- Input (no cache write): ${formatCount(usage?.totalInputWithoutCacheWriteTokens ?? 0)}`,\n '',\n '## Max mode usage',\n ...renderCursorModeRows(usage?.modes ?? []),\n '',\n '## Model mix',\n ...renderCursorModelRows(usage?.models ?? []),\n '',\n '## Pricing coverage',\n ...renderCursorPricingCoverage(summary),\n '',\n ...renderDailyTrendRows(summary.spendByDay, summary.wasteByDay),\n ...(summary.spendByDay.length > 1 ? [''] : []),\n '## Waste taxonomy',\n 'Structural waste',\n ...renderTaxonomyRows(summary.wasteByKind, 'No confirmed waste buckets detected.'),\n 'Savings opportunities',\n ...renderTaxonomyRows(\n summary.opportunityByKind,\n 'No opportunity buckets detected.',\n '(directional)',\n ),\n '',\n '## Findings',\n ...renderFindingList(summary.findings, 'none detected'),\n '',\n ...renderActionQueue(summary),\n '',\n ...renderCursorCompareBlock(summary),\n ...(summary.comparison ? [''] : []),\n '## Notes',\n ...summary.notes.map((note) => `- ${note}`),\n ].join('\\n');\n}\n\nfunction renderCursorMarkdownSummary(summary: AuditSummary) {\n const usage = summary.cursorUsage;\n\n return [\n '# Xerg Cursor CSV Audit',\n '',\n `- Generated: ${summary.generatedAt}`,\n `- Total spend: ${formatUsd(summary.totalSpendUsd)}`,\n `- Observed spend: ${formatUsd(summary.observedSpendUsd)}`,\n `- Estimated spend: ${formatUsd(summary.estimatedSpendUsd)}`,\n `- Structural waste identified: ${formatUsd(summary.wasteSpendUsd)} (${formatPercent(summary.structuralWasteRate)})`,\n `- Potential impact surfaced: ${formatUsd(summary.opportunitySpendUsd)}`,\n `- Rows analyzed: ${formatCount(summary.runCount)}`,\n `- Usage rows with pricing: ${formatCount(summary.pricingCoverage?.pricedCallCount ?? 0)} / ${formatCount(summary.runCount)}`,\n `- Total tokens: ${formatCount(usage?.totalTokens ?? 0)}`,\n '',\n '## Token mix',\n `- Input tokens: ${formatCount(usage?.totalInputTokens ?? 0)}`,\n `- Output tokens: ${formatCount(usage?.totalOutputTokens ?? 0)}`,\n `- Cache read tokens: ${formatCount(usage?.totalCacheReadTokens ?? 0)}`,\n '',\n '## Max mode usage',\n ...renderCursorModeRows(usage?.modes ?? []),\n '',\n '## Model mix',\n ...renderCursorModelRows(usage?.models ?? []),\n '',\n '## Pricing coverage',\n ...renderCursorPricingCoverage(summary),\n '',\n ...renderDailyTrendRows(summary.spendByDay, summary.wasteByDay),\n ...(summary.spendByDay.length > 1 ? [''] : []),\n ...renderTaxonomyBlock(summary),\n '',\n '## Findings',\n ...summary.findings.slice(0, 10).map((finding) => {\n return `- **${finding.title}** (${finding.classification}, ${finding.confidence}) — ${finding.summary} Estimated impact: ${formatUsd(finding.costImpactUsd)}.`;\n }),\n '',\n ...renderActionQueue(summary),\n ...(summary.comparison ? ['', ...renderCursorCompareBlock(summary)] : []),\n '',\n '## Notes',\n ...summary.notes.map((note) => `- ${note}`),\n ].join('\\n');\n}\n\nexport function renderTerminalSummary(summary: AuditSummary) {\n if (isCursorUsageSummary(summary)) {\n return renderCursorTerminalSummary(summary);\n }\n\n const wasteFindings = summary.findings.filter((finding) => finding.classification === 'waste');\n const opportunityFindings = summary.findings.filter(\n (finding) => finding.classification === 'opportunity',\n );\n const topWaste = topFinding(summary, 'waste');\n\n return [\n '# Xerg audit',\n '',\n `Total spend: ${formatUsd(summary.totalSpendUsd)}`,\n `Observed spend: ${formatUsd(summary.observedSpendUsd)}`,\n `Estimated spend: ${formatUsd(summary.estimatedSpendUsd)}`,\n `Runs analyzed: ${summary.runCount}`,\n `Model calls: ${summary.callCount}`,\n `Structural waste identified: ${formatUsd(summary.wasteSpendUsd)} (${formatPercent(summary.structuralWasteRate)})`,\n `Potential impact surfaced: ${formatUsd(summary.opportunitySpendUsd)}`,\n '',\n ...renderTaxonomyBlock(summary),\n '',\n '## Top workflows',\n ...topRows(summary.spendByWorkflow),\n '',\n '## Top models',\n ...topRows(summary.spendByModel),\n '',\n ...renderDailyTrendRows(summary.spendByDay, summary.wasteByDay),\n ...(summary.spendByDay.length > 1 ? [''] : []),\n '## High-confidence waste',\n ...renderFindingList(wasteFindings, 'none detected'),\n '',\n '## Opportunities',\n ...renderFindingList(opportunityFindings, 'none detected'),\n '',\n ...renderActionQueue(summary),\n '',\n ...(topWaste\n ? [`- Confirmed leak to close first: ${topWaste.title}`]\n : ['- Confirmed leak to close first: none']),\n ...(summary.spendByWorkflow[0]\n ? [`- Workflow to inspect first: ${summary.spendByWorkflow[0].key}`]\n : ['- Workflow to inspect first: none']),\n '',\n ...renderCompareBlock(summary),\n ...(summary.comparison ? [''] : []),\n '## Notes',\n ...summary.notes.map((note) => `- ${note}`),\n ].join('\\n');\n}\n\nexport function renderMarkdownSummary(summary: AuditSummary) {\n if (isCursorUsageSummary(summary)) {\n return renderCursorMarkdownSummary(summary);\n }\n\n const lines = [\n '# Xerg Audit Report',\n '',\n `- Generated: ${summary.generatedAt}`,\n `- Total spend: ${formatUsd(summary.totalSpendUsd)}`,\n `- Observed spend: ${formatUsd(summary.observedSpendUsd)}`,\n `- Estimated spend: ${formatUsd(summary.estimatedSpendUsd)}`,\n `- Structural waste identified: ${formatUsd(summary.wasteSpendUsd)} (${formatPercent(summary.structuralWasteRate)})`,\n `- Potential impact surfaced: ${formatUsd(summary.opportunitySpendUsd)}`,\n `- Runs analyzed: ${summary.runCount}`,\n `- Model calls: ${summary.callCount}`,\n '',\n ...renderTaxonomyBlock(summary),\n '',\n '## Top workflows',\n ...topRows(summary.spendByWorkflow),\n '',\n ...renderDailyTrendRows(summary.spendByDay, summary.wasteByDay),\n ...(summary.spendByDay.length > 1 ? [''] : []),\n '',\n '## Findings',\n ...summary.findings.slice(0, 10).map((finding) => {\n return `- **${finding.title}** (${finding.classification}, ${finding.confidence}) — ${finding.summary} Estimated impact: ${formatUsd(finding.costImpactUsd)}.`;\n }),\n '',\n ...renderActionQueue(summary),\n ];\n\n if (summary.comparison) {\n const comparison = summary.comparison;\n lines.push(\n '',\n '## Before / after',\n `- Compared against: ${comparison.baselineGeneratedAt}`,\n `- Total spend: ${formatUsd(comparison.baselineTotalSpendUsd)} -> ${formatUsd(summary.totalSpendUsd)} (${formatUsdDelta(comparison.deltaTotalSpendUsd)})`,\n `- Structural waste: ${formatUsd(comparison.baselineWasteSpendUsd)} -> ${formatUsd(summary.wasteSpendUsd)} (${formatUsdDelta(comparison.deltaWasteSpendUsd)})`,\n `- Waste rate: ${formatPercent(comparison.baselineStructuralWasteRate)} -> ${formatPercent(summary.structuralWasteRate)} (${formatPercentDelta(comparison.deltaStructuralWasteRate)})`,\n );\n }\n\n return lines.join('\\n');\n}\n","// src/audit-push-payload.ts\nvar AUDIT_PUSH_PAYLOAD_VERSION = 2;\nexport {\n AUDIT_PUSH_PAYLOAD_VERSION\n};\n","import {\n AUDIT_PUSH_PAYLOAD_VERSION,\n type AuditPushPayload,\n type WireComparison,\n type WireFinding,\n} from '@xerg/schemas';\n\nimport type { AuditComparison, AuditSummary, Finding, WirePayloadMeta } from './types.js';\nimport { isoNow } from './utils/time.js';\n\nfunction toWireFinding(finding: Finding): WireFinding {\n return {\n id: finding.id,\n classification: finding.classification,\n confidence: finding.confidence,\n kind: finding.kind,\n title: finding.title,\n summary: finding.summary,\n scope: finding.scope,\n scopeId: finding.scopeId,\n costImpactUsd: finding.costImpactUsd,\n };\n}\n\nfunction toWireComparison(comparison: AuditComparison): WireComparison {\n return {\n baselineAuditId: comparison.baselineAuditId,\n baselineGeneratedAt: comparison.baselineGeneratedAt,\n baselineTotalSpendUsd: comparison.baselineTotalSpendUsd,\n baselineWasteSpendUsd: comparison.baselineWasteSpendUsd,\n baselineStructuralWasteRate: comparison.baselineStructuralWasteRate,\n deltaTotalSpendUsd: comparison.deltaTotalSpendUsd,\n deltaWasteSpendUsd: comparison.deltaWasteSpendUsd,\n deltaStructuralWasteRate: comparison.deltaStructuralWasteRate,\n deltaRunCount: comparison.deltaRunCount,\n deltaCallCount: comparison.deltaCallCount,\n };\n}\n\nexport function toWirePayload(summary: AuditSummary, meta: WirePayloadMeta): AuditPushPayload {\n return {\n version: AUDIT_PUSH_PAYLOAD_VERSION,\n summary: {\n auditId: summary.auditId,\n generatedAt: summary.generatedAt,\n comparisonKey: summary.comparisonKey,\n runCount: summary.runCount,\n callCount: summary.callCount,\n totalSpendUsd: summary.totalSpendUsd,\n observedSpendUsd: summary.observedSpendUsd,\n estimatedSpendUsd: summary.estimatedSpendUsd,\n wasteSpendUsd: summary.wasteSpendUsd,\n opportunitySpendUsd: summary.opportunitySpendUsd,\n structuralWasteRate: summary.structuralWasteRate,\n wasteByKind: summary.wasteByKind,\n opportunityByKind: summary.opportunityByKind,\n spendByWorkflow: summary.spendByWorkflow,\n spendByModel: summary.spendByModel,\n spendByDay: summary.spendByDay,\n wasteByDay: summary.wasteByDay,\n findings: summary.findings.map(toWireFinding),\n recommendations: summary.recommendations,\n notes: summary.notes,\n comparison: summary.comparison ? toWireComparison(summary.comparison) : null,\n },\n meta: {\n cliVersion: meta.cliVersion,\n sourceId: meta.sourceId,\n sourceHost: meta.sourceHost,\n environment: meta.environment,\n pushedAt: isoNow(),\n },\n };\n}\n","export class NoDataError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'NoDataError';\n }\n}\n","export interface CliLogger {\n info: (message: string) => void;\n verbose: (message: string) => void;\n}\n\nexport function createCliLogger(options: { verbose?: boolean }): CliLogger {\n return {\n info(message: string) {\n process.stderr.write(`${message}\\n`);\n },\n verbose(message: string) {\n if (!options.verbose) {\n return;\n }\n\n process.stderr.write(`[verbose] ${message}\\n`);\n },\n };\n}\n","import type { AuditPushPayload } from '@xerg/schemas';\n\nimport type { PushConfig } from './config.js';\n\nexport interface PushSuccess {\n ok: true;\n auditId: string;\n}\n\nexport interface PushFailure {\n ok: false;\n status: number;\n message: string;\n}\n\nexport type PushResult = PushSuccess | PushFailure;\n\nexport async function pushAudit(\n payload: AuditPushPayload,\n config: PushConfig,\n): Promise<PushResult> {\n const url = `${config.apiUrl}/v1/audits`;\n const body = JSON.stringify(payload);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.apiKey}`,\n },\n body,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Network error';\n return { ok: false, status: 0, message: `Failed to reach ${config.apiUrl}: ${message}` };\n }\n\n if (response.status === 201) {\n const data = (await response.json()) as { id?: string };\n return { ok: true, auditId: data.id ?? payload.summary.auditId };\n }\n\n let errorMessage: string;\n try {\n const data = (await response.json()) as { error?: string; message?: string };\n errorMessage = data.error || data.message || response.statusText;\n } catch {\n errorMessage = response.statusText || `HTTP ${response.status}`;\n }\n\n return { ok: false, status: response.status, message: errorMessage };\n}\n","import { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { loadStoredCredentials } from '../auth/credentials.js';\nimport { formatCommand } from '../command-display.js';\n\nexport interface PushConfig {\n apiKey: string;\n apiUrl: string;\n source: 'env' | 'config' | 'stored';\n}\n\nconst DEFAULT_API_URL = 'https://api.xerg.ai';\nconst CONFIG_PATH = join(homedir(), '.xerg', 'config.json');\n\nexport function loadPushConfig(): PushConfig {\n const envKey = process.env.XERG_API_KEY;\n const envUrl = process.env.XERG_API_URL;\n\n if (envKey) {\n return {\n apiKey: envKey,\n apiUrl: envUrl || DEFAULT_API_URL,\n source: 'env',\n };\n }\n\n try {\n const raw = readFileSync(CONFIG_PATH, 'utf8');\n const parsed = JSON.parse(raw) as { apiKey?: string; apiUrl?: string };\n\n if (parsed.apiKey) {\n return {\n apiKey: parsed.apiKey,\n apiUrl: envUrl || parsed.apiUrl || DEFAULT_API_URL,\n source: 'config',\n };\n }\n } catch {\n // config file doesn't exist or isn't valid JSON — fall through\n }\n\n const storedToken = loadStoredCredentials();\n if (storedToken) {\n return {\n apiKey: storedToken,\n apiUrl: envUrl || DEFAULT_API_URL,\n source: 'stored',\n };\n }\n\n throw new Error(\n `No API key configured. Set XERG_API_KEY, add \"apiKey\" to ${CONFIG_PATH}, or run \\`${formatCommand('login')}\\`.\\nGet your key at https://xerg.ai/dashboard/settings`,\n );\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\ninterface StoredCredentials {\n token: string;\n storedAt: string;\n}\n\nexport function getCredentialsPath(): string {\n const xdgConfig = process.env.XDG_CONFIG_HOME || join(homedir(), '.config');\n return join(xdgConfig, 'xerg', 'credentials.json');\n}\n\nexport function storeCredentials(token: string): void {\n const credPath = getCredentialsPath();\n const dir = dirname(credPath);\n mkdirSync(dir, { recursive: true });\n const data: StoredCredentials = { token, storedAt: new Date().toISOString() };\n writeFileSync(credPath, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function loadStoredCredentials(): string | null {\n const credPath = getCredentialsPath();\n try {\n if (!existsSync(credPath)) return null;\n const raw = readFileSync(credPath, 'utf8');\n const parsed = JSON.parse(raw) as StoredCredentials;\n return parsed.token || null;\n } catch {\n return null;\n }\n}\n\nexport function clearCredentials(): boolean {\n const credPath = getCredentialsPath();\n try {\n if (!existsSync(credPath)) return false;\n rmSync(credPath);\n return true;\n } catch {\n return false;\n }\n}\n","import { hostname } from 'node:os';\nimport type { AuditRuntime, AuditSummary, WirePayloadMeta } from '@xergai/core';\n\nimport { parseRemoteTarget } from './transport/index.js';\nimport type { RemoteSource } from './transport/index.js';\n\ntype PushSourceMeta = Pick<WirePayloadMeta, 'environment' | 'sourceHost' | 'sourceId'>;\n\nconst RAILWAY_SOURCE_ID = 'OpenClaw - Railway';\n\nexport function buildLocalPushSourceMeta(\n kind: AuditRuntime,\n localHost = hostname(),\n): PushSourceMeta {\n const productName = kind === 'cursor' ? 'Cursor' : kind === 'hermes' ? 'Hermes' : 'OpenClaw';\n\n return {\n environment: 'local',\n sourceId: `${productName} - ${localHost}`,\n sourceHost: localHost,\n };\n}\n\nexport function buildRemotePushSourceMeta(source: RemoteSource): PushSourceMeta {\n if (source.transport === 'railway') {\n return {\n environment: 'railway',\n sourceId: isGeneratedRailwayName(source.name)\n ? RAILWAY_SOURCE_ID\n : `OpenClaw - ${source.name}`,\n sourceHost: isGeneratedRailwayName(source.host) ? 'Railway' : source.host,\n };\n }\n\n return {\n environment: 'remote',\n sourceId: `OpenClaw - ${source.name}`,\n sourceHost: resolveRemoteHost(source.host),\n };\n}\n\nexport function buildCachedPushSourceMeta(\n summary: AuditSummary,\n localHost = hostname(),\n): PushSourceMeta {\n if (summary.runtime === 'cursor') {\n return buildLocalPushSourceMeta('cursor', localHost);\n }\n\n const sourceFiles = summary.sourceFiles ?? [];\n const comparisonKey = summary.comparisonKey ?? '';\n\n if (sourceFiles.some((sourceFile) => sourceFile.kind === 'cursor-usage-csv')) {\n return buildLocalPushSourceMeta('cursor', localHost);\n }\n\n if (isRailwayComparisonKey(comparisonKey)) {\n return {\n environment: 'railway',\n sourceId: RAILWAY_SOURCE_ID,\n sourceHost: 'Railway',\n };\n }\n\n const remoteHost = parseRemoteHostFromComparisonKey(comparisonKey);\n if (remoteHost) {\n return {\n environment: 'remote',\n sourceId: `OpenClaw - ${remoteHost}`,\n sourceHost: remoteHost,\n };\n }\n\n if (summary.runtime === 'hermes') {\n return buildLocalPushSourceMeta('hermes', localHost);\n }\n\n return buildLocalPushSourceMeta('openclaw', localHost);\n}\n\nfunction isGeneratedRailwayName(name: string): boolean {\n return name === 'railway-linked' || /^railway-[a-z0-9]{8}$/i.test(name);\n}\n\nfunction isRailwayComparisonKey(comparisonKey: string): boolean {\n return comparisonKey.startsWith('railway:') || comparisonKey.startsWith('railway-linked:');\n}\n\nfunction parseRemoteHostFromComparisonKey(comparisonKey: string): string | null {\n const parts = comparisonKey.split(':');\n if (parts.length < 3) {\n return null;\n }\n\n const target = parts.slice(0, -2).join(':');\n if (!target) {\n return null;\n }\n\n return resolveRemoteHost(target);\n}\n\nfunction resolveRemoteHost(target: string): string {\n const parsed = parseRemoteTarget(target);\n return parsed.host || target;\n}\n","import { execSync, spawnSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { mkdirSync, rmSync } from 'node:fs';\nimport { homedir, tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\nimport type { PullResult, RemoteDoctorReport, RemoteSource } from './types.js';\n\nconst DEFAULT_GATEWAY_DIR = '/tmp/openclaw';\nconst DEFAULT_SESSIONS_DIR = '~/.openclaw/agents';\n\nfunction hashString(input: string): string {\n return createHash('sha256').update(input).digest('hex').slice(0, 12);\n}\n\nfunction sshArgs(source: RemoteSource): string[] {\n const args: string[] = [];\n if (source.identityFile) {\n const resolved = source.identityFile.replace(/^~/, homedir());\n args.push('-i', resolved);\n }\n args.push('-o', 'BatchMode=yes', '-o', 'ConnectTimeout=10');\n return args;\n}\n\nfunction rsyncSshCommand(source: RemoteSource): string {\n const parts = ['ssh'];\n if (source.identityFile) {\n const resolved = source.identityFile.replace(/^~/, homedir());\n parts.push(`-i \"${resolved}\"`);\n }\n parts.push('-o BatchMode=yes', '-o ConnectTimeout=10');\n return parts.join(' ');\n}\n\nfunction isRsyncAvailable(): boolean {\n try {\n spawnSync('rsync', ['--version'], { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isRemoteRsyncAvailable(source: RemoteSource): boolean {\n try {\n const result = spawnSync('ssh', [...sshArgs(source), source.host, 'which rsync'], {\n stdio: 'pipe',\n timeout: 15_000,\n });\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\nfunction testSshConnectivity(source: RemoteSource): { ok: boolean; error?: string } {\n const result = spawnSync('ssh', [...sshArgs(source), source.host, 'echo ok'], {\n stdio: 'pipe',\n timeout: 15_000,\n });\n\n if (result.status === 0) {\n return { ok: true };\n }\n\n const stderr = result.stderr?.toString().trim() || 'Connection failed';\n return { ok: false, error: stderr };\n}\n\nfunction sshExec(source: RemoteSource, command: string): { stdout: string; status: number } {\n const result = spawnSync('ssh', [...sshArgs(source), source.host, command], {\n stdio: 'pipe',\n timeout: 30_000,\n });\n return {\n stdout: result.stdout?.toString().trim() ?? '',\n status: result.status ?? 1,\n };\n}\n\nfunction buildSinceFind(since: string | undefined): string {\n if (!since) return '';\n\n const match = since\n .trim()\n .toLowerCase()\n .match(/^(\\d+)([mhdw])$/);\n if (!match) return '';\n\n const value = Number(match[1]);\n const unit = match[2];\n\n let minutes: number;\n switch (unit) {\n case 'm':\n minutes = value;\n break;\n case 'h':\n minutes = value * 60;\n break;\n case 'd':\n minutes = value * 60 * 24;\n break;\n case 'w':\n minutes = value * 60 * 24 * 7;\n break;\n default:\n return '';\n }\n\n return `-mmin -${minutes}`;\n}\n\nfunction rsyncPull(opts: {\n source: RemoteSource;\n remotePath: string;\n localDir: string;\n includes?: string[];\n since?: string;\n}): boolean {\n mkdirSync(opts.localDir, { recursive: true });\n\n const args = ['-avz', '--timeout=30', '-e', rsyncSshCommand(opts.source)];\n\n if (opts.includes) {\n for (const pattern of opts.includes) {\n args.push('--include', pattern);\n }\n args.push('--exclude', '*');\n }\n\n if (opts.since) {\n const findArgs = buildSinceFind(opts.since);\n if (findArgs) {\n const fileListCmd = `find ${opts.remotePath} -type f ${findArgs} 2>/dev/null`;\n const { stdout, status } = sshExec(opts.source, fileListCmd);\n if (status !== 0 || !stdout) return false;\n\n const files = stdout.split('\\n').filter(Boolean);\n if (files.length === 0) return false;\n\n const tmpFile = join(tmpdir(), `xerg-filelist-${hashString(opts.remotePath)}`);\n const relativePaths = files.map((f) =>\n f.startsWith(opts.remotePath) ? f.slice(opts.remotePath.length).replace(/^\\//, '') : f,\n );\n execSync(`cat > ${tmpFile} << 'XERGEOF'\\n${relativePaths.join('\\n')}\\nXERGEOF`);\n args.push('--files-from', tmpFile);\n }\n }\n\n const remoteSrc = opts.remotePath.endsWith('/')\n ? `${opts.source.host}:${opts.remotePath}`\n : `${opts.source.host}:${opts.remotePath}/`;\n\n args.push(remoteSrc, `${opts.localDir}/`);\n\n const result = spawnSync('rsync', args, { stdio: 'pipe', timeout: 120_000 });\n return result.status === 0;\n}\n\nfunction tarSshPull(opts: {\n source: RemoteSource;\n remotePath: string;\n localDir: string;\n}): boolean {\n mkdirSync(opts.localDir, { recursive: true });\n\n const tarCmd = `tar -czf - -C ${opts.remotePath} . 2>/dev/null`;\n const sshArgsList = sshArgs(opts.source);\n const fullCmd = `ssh ${sshArgsList.map((a) => `\"${a}\"`).join(' ')} ${opts.source.host} '${tarCmd}' | tar -xzf - -C ${opts.localDir}`;\n\n try {\n execSync(fullCmd, { stdio: 'pipe', timeout: 120_000 });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pullDirectory(opts: {\n source: RemoteSource;\n remotePath: string;\n localDir: string;\n includes?: string[];\n since?: string;\n useRsync: boolean;\n}): boolean {\n if (opts.useRsync) {\n const ok = rsyncPull({\n source: opts.source,\n remotePath: opts.remotePath,\n localDir: opts.localDir,\n includes: opts.includes,\n since: opts.since,\n });\n if (ok) return true;\n }\n\n process.stderr.write(\n opts.useRsync\n ? 'rsync transfer failed, falling back to tar over ssh\\n'\n : 'rsync not found, using tar over ssh\\n',\n );\n\n return tarSshPull({\n source: opts.source,\n remotePath: opts.remotePath,\n localDir: opts.localDir,\n });\n}\n\nfunction resolveLocalPath(source: RemoteSource, keepFiles: boolean): string {\n if (keepFiles) {\n const cacheDir = join(homedir(), '.xerg', 'remote-cache', source.name);\n mkdirSync(cacheDir, { recursive: true });\n return cacheDir;\n }\n\n const hash = hashString(`${source.host}:${Date.now()}`);\n const tmpPath = join(tmpdir(), `xerg-remote-${hash}`);\n mkdirSync(tmpPath, { recursive: true });\n return tmpPath;\n}\n\nexport function parseRemoteTarget(target: string): { user: string; host: string; port?: string } {\n const portMatch = target.match(/^(.+):(\\d+)$/);\n if (portMatch) {\n const userHost = portMatch[1];\n const port = portMatch[2];\n const atIndex = userHost.indexOf('@');\n return {\n user: atIndex >= 0 ? userHost.slice(0, atIndex) : '',\n host: atIndex >= 0 ? userHost.slice(atIndex + 1) : userHost,\n port,\n };\n }\n\n const atIndex = target.indexOf('@');\n return {\n user: atIndex >= 0 ? target.slice(0, atIndex) : '',\n host: atIndex >= 0 ? target.slice(atIndex + 1) : target,\n };\n}\n\nexport function buildSourceFromFlags(opts: {\n remote: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n}): RemoteSource {\n const parsed = parseRemoteTarget(opts.remote);\n return {\n name: parsed.host,\n transport: 'ssh',\n host: opts.remote,\n logFile: opts.remoteLogFile,\n sessionsDir: opts.remoteSessionsDir,\n };\n}\n\nexport function buildComparisonKeyForRemote(source: RemoteSource): string {\n const logPath = source.logFile ?? DEFAULT_GATEWAY_DIR;\n const sessPath = source.sessionsDir ?? DEFAULT_SESSIONS_DIR;\n return `${source.host}:${logPath}:${sessPath}`;\n}\n\nexport async function pullRemoteFiles(opts: {\n source: RemoteSource;\n since?: string;\n keepFiles?: boolean;\n onProgress?: (message: string) => void;\n}): Promise<PullResult> {\n const { source, since, keepFiles = false, onProgress } = opts;\n\n onProgress?.(`Testing SSH connectivity to ${source.host}...`);\n const connectivity = testSshConnectivity(source);\n if (!connectivity.ok) {\n throw new Error(\n `Cannot connect to ${source.host}. Check SSH config and key access.${connectivity.error ? ` (${connectivity.error})` : ''}`,\n );\n }\n onProgress?.('SSH connectivity OK.');\n\n const useRsync = isRsyncAvailable();\n onProgress?.(\n useRsync\n ? 'Local rsync detected. Xerg will prefer rsync and fall back to tar over SSH if needed.'\n : 'Local rsync not detected. Xerg will pull files with tar over SSH.',\n );\n const localBase = resolveLocalPath(source, keepFiles);\n const gatewayDir = join(localBase, 'gateway');\n const sessionsDir = join(localBase, 'sessions');\n\n const remoteLogPath = source.logFile ?? DEFAULT_GATEWAY_DIR;\n const remoteSessionsPath = source.sessionsDir ?? DEFAULT_SESSIONS_DIR;\n\n const { stdout: expandedSessions } = sshExec(source, `eval echo ${remoteSessionsPath}`);\n const resolvedSessionsPath = expandedSessions || remoteSessionsPath;\n onProgress?.('Checking remote default paths for gateway logs and sessions...');\n\n const { status: logPathExists } = sshExec(source, `test -e ${remoteLogPath} && echo exists`);\n const { status: sessPathExists } = sshExec(\n source,\n `test -e ${resolvedSessionsPath} && echo exists`,\n );\n\n let pulledLog = false;\n let pulledSessions = false;\n\n if (logPathExists === 0) {\n onProgress?.(`Pulling gateway logs from ${remoteLogPath}...`);\n const { stdout: isFile } = sshExec(source, `test -f ${remoteLogPath} && echo file`);\n if (isFile === 'file') {\n const parentDir = remoteLogPath.slice(0, remoteLogPath.lastIndexOf('/')) || '/tmp';\n const fileName = remoteLogPath.slice(remoteLogPath.lastIndexOf('/') + 1);\n pulledLog = pullDirectory({\n source,\n remotePath: parentDir,\n localDir: gatewayDir,\n includes: [fileName],\n since,\n useRsync,\n });\n } else {\n pulledLog = pullDirectory({\n source,\n remotePath: remoteLogPath,\n localDir: gatewayDir,\n includes: ['openclaw-*.log', '*.log'],\n since,\n useRsync,\n });\n }\n }\n\n if (sessPathExists === 0) {\n onProgress?.(`Pulling session files from ${resolvedSessionsPath}...`);\n pulledSessions = pullDirectory({\n source,\n remotePath: resolvedSessionsPath,\n localDir: sessionsDir,\n includes: ['**/', '*.jsonl'],\n since,\n useRsync,\n });\n }\n\n if (!pulledLog && !pulledSessions) {\n if (keepFiles) {\n rmSync(localBase, { recursive: true, force: true });\n }\n throw new Error(\n `No OpenClaw data found at default paths on ${source.host}. Use --remote-log-file or --remote-sessions-dir.`,\n );\n }\n\n const result: PullResult = {\n localPath: localBase,\n source,\n };\n\n if (pulledLog) result.logFile = gatewayDir;\n if (pulledSessions) result.sessionsDir = sessionsDir;\n onProgress?.('Remote files pulled successfully.');\n\n return result;\n}\n\nexport async function runRemoteDoctor(opts: {\n source: RemoteSource;\n onProgress?: (message: string) => void;\n}): Promise<RemoteDoctorReport> {\n const { source, onProgress } = opts;\n const notes: string[] = [];\n\n onProgress?.(`Testing SSH connectivity to ${source.host}...`);\n const connectivity = testSshConnectivity(source);\n if (!connectivity.ok) {\n return {\n host: source.host,\n sshConnectivity: false,\n sshError: connectivity.error,\n rsyncAvailableLocal: false,\n rsyncAvailableRemote: false,\n defaultPaths: {\n gatewayExists: false,\n gatewayPath: DEFAULT_GATEWAY_DIR,\n gatewayFileCount: 0,\n gatewayTotalBytes: 0,\n sessionsExists: false,\n sessionsPath: DEFAULT_SESSIONS_DIR,\n sessionsFileCount: 0,\n sessionsTotalBytes: 0,\n },\n notes: [\n `Cannot connect to ${source.host}. Check SSH config and key access.${connectivity.error ? ` (${connectivity.error})` : ''}`,\n ],\n };\n }\n\n onProgress?.('SSH connectivity OK.');\n notes.push('SSH connectivity: OK');\n\n onProgress?.('Checking rsync availability locally and on the remote host...');\n const rsyncLocal = isRsyncAvailable();\n const rsyncRemote = isRemoteRsyncAvailable(source);\n notes.push(`rsync available locally: ${rsyncLocal ? 'yes' : 'no'}`);\n notes.push(`rsync available on remote: ${rsyncRemote ? 'yes' : 'no'}`);\n if (!rsyncLocal || !rsyncRemote) {\n notes.push('tar over ssh fallback will be used for file transfer');\n }\n\n function checkPath(remotePath: string) {\n const { stdout: expanded } = sshExec(source, `eval echo ${remotePath}`);\n const resolved = expanded || remotePath;\n const { status: exists } = sshExec(source, `test -e ${resolved} && echo exists`);\n if (exists !== 0) {\n return { exists: false, path: resolved, fileCount: 0, totalBytes: 0 };\n }\n const { stdout: countOut } = sshExec(source, `find ${resolved} -type f 2>/dev/null | wc -l`);\n const { stdout: sizeOut } = sshExec(source, `du -sb ${resolved} 2>/dev/null | cut -f1`);\n return {\n exists: true,\n path: resolved,\n fileCount: Number.parseInt(countOut, 10) || 0,\n totalBytes: Number.parseInt(sizeOut, 10) || 0,\n };\n }\n\n onProgress?.('Inspecting remote default paths...');\n const gateway = checkPath(DEFAULT_GATEWAY_DIR);\n const sessions = checkPath(DEFAULT_SESSIONS_DIR);\n\n if (gateway.exists) {\n notes.push(\n `Gateway logs found at ${gateway.path}: ${gateway.fileCount} files, ${formatBytes(gateway.totalBytes)}`,\n );\n } else {\n notes.push(`No gateway logs at ${gateway.path}`);\n }\n\n if (sessions.exists) {\n notes.push(\n `Sessions found at ${sessions.path}: ${sessions.fileCount} files, ${formatBytes(sessions.totalBytes)}`,\n );\n } else {\n notes.push(`No sessions at ${sessions.path}`);\n }\n\n const report: RemoteDoctorReport = {\n host: source.host,\n sshConnectivity: true,\n rsyncAvailableLocal: rsyncLocal,\n rsyncAvailableRemote: rsyncRemote,\n defaultPaths: {\n gatewayExists: gateway.exists,\n gatewayPath: gateway.path,\n gatewayFileCount: gateway.fileCount,\n gatewayTotalBytes: gateway.totalBytes,\n sessionsExists: sessions.exists,\n sessionsPath: sessions.path,\n sessionsFileCount: sessions.fileCount,\n sessionsTotalBytes: sessions.totalBytes,\n },\n notes,\n };\n\n if (source.logFile || source.sessionsDir) {\n const logCheck = source.logFile ? checkPath(source.logFile) : null;\n const sessCheck = source.sessionsDir ? checkPath(source.sessionsDir) : null;\n\n report.customPaths = {\n logFileExists: logCheck?.exists ?? false,\n logFilePath: source.logFile ?? '',\n logFileBytes: logCheck?.totalBytes ?? 0,\n sessionsDirExists: sessCheck?.exists ?? false,\n sessionsDirPath: source.sessionsDir ?? '',\n sessionsFileCount: sessCheck?.fileCount ?? 0,\n sessionsTotalBytes: sessCheck?.totalBytes ?? 0,\n };\n\n if (logCheck?.exists) {\n notes.push(`Custom log path ${source.logFile}: ${formatBytes(logCheck.totalBytes)}`);\n } else if (source.logFile) {\n notes.push(`Custom log path ${source.logFile}: not found`);\n }\n\n if (sessCheck?.exists) {\n notes.push(\n `Custom sessions path ${source.sessionsDir}: ${sessCheck.fileCount} files, ${formatBytes(sessCheck.totalBytes)}`,\n );\n } else if (source.sessionsDir) {\n notes.push(`Custom sessions path ${source.sessionsDir}: not found`);\n }\n }\n\n return report;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const value = bytes / 1024 ** i;\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n","import { execSync, spawnSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { mkdirSync, rmSync } from 'node:fs';\nimport { homedir, tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\nimport type { PullResult, RailwayDoctorReport, RailwayTarget, RemoteSource } from './types.js';\n\nconst DEFAULT_GATEWAY_DIR = '/tmp/openclaw';\nconst DEFAULT_SESSIONS_DIR = '~/.openclaw/agents';\n\nconst ALTERNATE_SESSION_PATHS = ['/data/.clawdbot/agents/main/sessions'];\n\nfunction hashString(input: string): string {\n return createHash('sha256').update(input).digest('hex').slice(0, 12);\n}\n\nfunction railwaySshArgs(target?: RailwayTarget): string[] {\n const args = ['ssh'];\n if (target) {\n args.push(`--project=${target.projectId}`);\n args.push(`--environment=${target.environmentId}`);\n args.push(`--service=${target.serviceId}`);\n }\n return args;\n}\n\nfunction railwayExec(command: string, target?: RailwayTarget): { stdout: string; status: number } {\n const args = [...railwaySshArgs(target), command];\n const result = spawnSync('railway', args, { stdio: 'pipe', timeout: 30_000 });\n return {\n stdout: result.stdout?.toString().trim() ?? '',\n status: result.status ?? 1,\n };\n}\n\nfunction buildSinceFind(since: string | undefined): string {\n if (!since) return '';\n\n const match = since\n .trim()\n .toLowerCase()\n .match(/^(\\d+)([mhdw])$/);\n if (!match) return '';\n\n const value = Number(match[1]);\n const unit = match[2];\n\n let minutes: number;\n switch (unit) {\n case 'm':\n minutes = value;\n break;\n case 'h':\n minutes = value * 60;\n break;\n case 'd':\n minutes = value * 60 * 24;\n break;\n case 'w':\n minutes = value * 60 * 24 * 7;\n break;\n default:\n return '';\n }\n\n return `-mmin -${minutes}`;\n}\n\nfunction tarRailwayPull(opts: {\n target?: RailwayTarget;\n remotePath: string;\n localDir: string;\n since?: string;\n}): boolean {\n mkdirSync(opts.localDir, { recursive: true });\n\n // Railway SSH allocates a PTY that corrupts binary data (LF → CRLF).\n // Base64-encoding the tar stream on the remote side avoids this.\n let tarCmd: string;\n if (opts.since) {\n const findArgs = buildSinceFind(opts.since);\n if (findArgs) {\n tarCmd = `find ${opts.remotePath} -type f ${findArgs} -print0 2>/dev/null | tar -czf - --null -T - 2>/dev/null | base64`;\n } else {\n tarCmd = `tar -czf - -C ${opts.remotePath} . 2>/dev/null | base64`;\n }\n } else {\n tarCmd = `tar -czf - -C ${opts.remotePath} . 2>/dev/null | base64`;\n }\n\n const sshArgs = railwaySshArgs(opts.target).join(' ');\n const fullCmd = `railway ${sshArgs} '${tarCmd}' | base64 -d | tar -xzf - -C ${opts.localDir}`;\n\n try {\n execSync(fullCmd, { stdio: 'pipe', timeout: 120_000 });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction resolveLocalPath(source: RemoteSource, keepFiles: boolean): string {\n if (keepFiles) {\n const cacheDir = join(homedir(), '.xerg', 'remote-cache', source.name);\n mkdirSync(cacheDir, { recursive: true });\n return cacheDir;\n }\n\n const identity = source.railway\n ? `railway:${source.railway.projectId}:${Date.now()}`\n : `${source.name}:${Date.now()}`;\n const hash = hashString(identity);\n const tmpPath = join(tmpdir(), `xerg-remote-${hash}`);\n mkdirSync(tmpPath, { recursive: true });\n return tmpPath;\n}\n\nfunction checkRemotePath(remotePath: string, target?: RailwayTarget) {\n const { status: exists } = railwayExec(`test -e ${remotePath} && echo exists`, target);\n if (exists !== 0) {\n return { exists: false, path: remotePath, fileCount: 0, totalBytes: 0 };\n }\n const { stdout: countOut } = railwayExec(\n `find ${remotePath} -type f 2>/dev/null | wc -l`,\n target,\n );\n const { stdout: sizeOut } = railwayExec(`du -sb ${remotePath} 2>/dev/null | cut -f1`, target);\n return {\n exists: true,\n path: remotePath,\n fileCount: Number.parseInt(countOut, 10) || 0,\n totalBytes: Number.parseInt(sizeOut, 10) || 0,\n };\n}\n\nfunction findSessionsPath(target?: RailwayTarget, customPath?: string): string | null {\n if (customPath) {\n const check = checkRemotePath(customPath, target);\n return check.exists ? customPath : null;\n }\n\n const { stdout: expandedDefault } = railwayExec(`eval echo ${DEFAULT_SESSIONS_DIR}`, target);\n const defaultPath = expandedDefault || DEFAULT_SESSIONS_DIR;\n const defaultCheck = checkRemotePath(defaultPath, target);\n if (defaultCheck.exists && defaultCheck.fileCount > 0) {\n return defaultPath;\n }\n\n for (const altPath of ALTERNATE_SESSION_PATHS) {\n const check = checkRemotePath(altPath, target);\n if (check.exists && check.fileCount > 0) {\n return altPath;\n }\n }\n\n return null;\n}\n\nexport function buildRailwaySourceFromFlags(opts: {\n railway?: RailwayTarget;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n}): RemoteSource {\n // Linked mode intentionally follows the Railway service linked to the current cwd.\n // If that turns out to be a database or sidecar, diagnostics should nudge users to relink.\n const name = opts.railway ? `railway-${opts.railway.serviceId.slice(0, 8)}` : 'railway-linked';\n return {\n name,\n transport: 'railway',\n host: name,\n logFile: opts.remoteLogFile,\n sessionsDir: opts.remoteSessionsDir,\n railway: opts.railway,\n };\n}\n\nexport function buildComparisonKeyForRailway(source: RemoteSource): string {\n const logPath = source.logFile ?? DEFAULT_GATEWAY_DIR;\n const sessPath = source.sessionsDir ?? DEFAULT_SESSIONS_DIR;\n if (source.railway) {\n return `railway:${source.railway.projectId}:${source.railway.environmentId}:${source.railway.serviceId}:${logPath}:${sessPath}`;\n }\n return `railway-linked:${logPath}:${sessPath}`;\n}\n\nexport async function pullRemoteFilesRailway(opts: {\n source: RemoteSource;\n since?: string;\n keepFiles?: boolean;\n onProgress?: (message: string) => void;\n}): Promise<PullResult> {\n const { source, since, keepFiles = false, onProgress } = opts;\n const target = source.railway;\n\n onProgress?.('Testing Railway service connectivity...');\n const { status } = railwayExec('echo ok', target);\n if (status !== 0) {\n throw new Error(\n target\n ? `Cannot reach Railway service ${target.serviceId} (project: ${target.projectId}). Check the provided --project / --environment / --service values and confirm the Railway CLI can reach that service.`\n : 'Cannot reach the Railway service linked to this directory. Run `railway link` here and choose the OpenClaw app service, or pass --project / --environment / --service explicitly.',\n );\n }\n onProgress?.('Railway service reachable.');\n\n const localBase = resolveLocalPath(source, keepFiles);\n const gatewayDir = join(localBase, 'gateway');\n const sessionsDir = join(localBase, 'sessions');\n\n const remoteLogPath = source.logFile ?? DEFAULT_GATEWAY_DIR;\n\n onProgress?.('Checking Railway default paths for gateway logs and sessions...');\n const logCheck = checkRemotePath(remoteLogPath, target);\n const resolvedSessionsPath = findSessionsPath(target, source.sessionsDir);\n\n let pulledLog = false;\n let pulledSessions = false;\n\n if (logCheck.fileCount > 0) {\n onProgress?.(`Pulling gateway logs from ${remoteLogPath}...`);\n const { stdout: isFile } = railwayExec(`test -f ${remoteLogPath} && echo file`, target);\n if (isFile === 'file') {\n const parentDir = remoteLogPath.slice(0, remoteLogPath.lastIndexOf('/')) || '/tmp';\n pulledLog = tarRailwayPull({\n target,\n remotePath: parentDir,\n localDir: gatewayDir,\n since,\n });\n } else {\n pulledLog = tarRailwayPull({\n target,\n remotePath: remoteLogPath,\n localDir: gatewayDir,\n since,\n });\n }\n }\n\n if (resolvedSessionsPath) {\n onProgress?.(`Pulling session files from ${resolvedSessionsPath}...`);\n pulledSessions = tarRailwayPull({\n target,\n remotePath: resolvedSessionsPath,\n localDir: sessionsDir,\n since,\n });\n }\n\n if (!pulledLog && !pulledSessions) {\n if (keepFiles) {\n rmSync(localBase, { recursive: true, force: true });\n }\n const checkedPaths = [remoteLogPath, DEFAULT_SESSIONS_DIR, ...ALTERNATE_SESSION_PATHS].join(\n ', ',\n );\n const wrongServiceHint = target\n ? ' Verify that the selected service is the OpenClaw app, or use --remote-log-file / --remote-sessions-dir for custom paths.'\n : ' If this directory is linked to a database or sidecar instead of the OpenClaw app, run `railway link` again and choose the app service.';\n throw new Error(\n `No OpenClaw data found on Railway service. Checked: ${checkedPaths}. Use --remote-log-file or --remote-sessions-dir to specify custom paths.${wrongServiceHint}`,\n );\n }\n\n const result: PullResult = {\n localPath: localBase,\n source,\n };\n\n if (pulledLog) result.logFile = gatewayDir;\n if (pulledSessions) result.sessionsDir = sessionsDir;\n onProgress?.('Railway files pulled successfully.');\n\n return result;\n}\n\nexport async function runRailwayDoctor(opts: {\n source: RemoteSource;\n onProgress?: (message: string) => void;\n}): Promise<RailwayDoctorReport> {\n const { source, onProgress } = opts;\n const target = source.railway;\n const notes: string[] = [];\n\n onProgress?.('Checking whether the Railway CLI is installed...');\n const whichCheck = spawnSync('which', ['railway'], { stdio: 'pipe', timeout: 5_000 });\n const railwayCliInstalled = whichCheck.status === 0;\n\n if (!railwayCliInstalled) {\n return {\n transport: 'railway',\n name: source.name,\n railwayCliInstalled: false,\n railwayAuthenticated: false,\n serviceReachable: false,\n defaultPaths: emptyDefaultPaths(),\n alternateSessionPaths: [],\n notes: ['Railway CLI is not installed. Install it: npm i -g @railway/cli'],\n };\n }\n\n const railwayPath = whichCheck.stdout?.toString().trim() ?? 'railway';\n onProgress?.('Checking Railway CLI authentication...');\n const versionCheck = spawnSync('railway', ['version'], { stdio: 'pipe', timeout: 10_000 });\n const versionStr =\n versionCheck.status === 0 ? versionCheck.stdout?.toString().trim() : railwayPath;\n notes.push(`Railway CLI: installed (${versionStr})`);\n\n const whoami = spawnSync('railway', ['whoami'], { stdio: 'pipe', timeout: 10_000 });\n const railwayAuthenticated = whoami.status === 0;\n const railwayAuthUser = railwayAuthenticated ? whoami.stdout?.toString().trim() : undefined;\n\n if (!railwayAuthenticated) {\n return {\n transport: 'railway',\n name: source.name,\n railwayCliInstalled: true,\n railwayAuthenticated: false,\n serviceReachable: false,\n defaultPaths: emptyDefaultPaths(),\n alternateSessionPaths: [],\n notes: [...notes, 'Not authenticated. Run: railway login'],\n };\n }\n\n notes.push(`Authenticated as: ${railwayAuthUser}`);\n\n onProgress?.('Testing Railway service connectivity...');\n const { status: reachStatus } = railwayExec('echo ok', target);\n const serviceReachable = reachStatus === 0;\n\n if (!serviceReachable) {\n return {\n transport: 'railway',\n name: source.name,\n railwayCliInstalled: true,\n railwayAuthenticated: true,\n railwayAuthUser,\n serviceReachable: false,\n serviceError: target\n ? `Cannot reach service ${target.serviceId} in project ${target.projectId}`\n : 'Current directory is not linked to a reachable Railway service. Run `railway link` here and choose the OpenClaw app service, or pass --project / --environment / --service.',\n defaultPaths: emptyDefaultPaths(),\n alternateSessionPaths: [],\n notes: [\n ...notes,\n target\n ? `Service unreachable (project: ${target.projectId}, service: ${target.serviceId}). Verify the provided Railway IDs point at the OpenClaw app service.`\n : 'Service unreachable for the current directory. Run `railway link` here and choose the OpenClaw app service, or pass explicit Railway IDs.',\n ],\n };\n }\n\n notes.push('Service connectivity: OK');\n\n onProgress?.('Inspecting Railway default paths...');\n const gateway = checkRemotePath(DEFAULT_GATEWAY_DIR, target);\n const { stdout: expandedDefault } = railwayExec(`eval echo ${DEFAULT_SESSIONS_DIR}`, target);\n const resolvedDefault = expandedDefault || DEFAULT_SESSIONS_DIR;\n const sessions = checkRemotePath(resolvedDefault, target);\n\n if (gateway.exists) {\n notes.push(\n `Gateway logs at ${gateway.path}: ${gateway.fileCount} files, ${formatBytes(gateway.totalBytes)}`,\n );\n } else {\n notes.push(`No gateway logs at ${DEFAULT_GATEWAY_DIR}`);\n }\n\n if (sessions.exists) {\n notes.push(\n `Sessions at ${sessions.path}: ${sessions.fileCount} files, ${formatBytes(sessions.totalBytes)}`,\n );\n } else {\n notes.push(`No sessions at ${resolvedDefault}`);\n }\n\n const alternateSessionPaths = ALTERNATE_SESSION_PATHS.map((altPath) => {\n const check = checkRemotePath(altPath, target);\n if (check.exists) {\n notes.push(\n `Alternate sessions at ${altPath}: ${check.fileCount} files, ${formatBytes(check.totalBytes)}`,\n );\n } else {\n notes.push(`No alternate sessions at ${altPath}`);\n }\n return {\n path: altPath,\n exists: check.exists,\n fileCount: check.fileCount,\n totalBytes: check.totalBytes,\n };\n });\n\n const report: RailwayDoctorReport = {\n transport: 'railway',\n name: source.name,\n railwayCliInstalled: true,\n railwayAuthenticated: true,\n railwayAuthUser,\n serviceReachable: true,\n defaultPaths: {\n gatewayExists: gateway.exists,\n gatewayPath: gateway.path,\n gatewayFileCount: gateway.fileCount,\n gatewayTotalBytes: gateway.totalBytes,\n sessionsExists: sessions.exists,\n sessionsPath: sessions.path,\n sessionsFileCount: sessions.fileCount,\n sessionsTotalBytes: sessions.totalBytes,\n },\n alternateSessionPaths,\n notes,\n };\n\n let logCheck: ReturnType<typeof checkRemotePath> | null = null;\n let sessCheck: ReturnType<typeof checkRemotePath> | null = null;\n\n if (source.logFile || source.sessionsDir) {\n logCheck = source.logFile ? checkRemotePath(source.logFile, target) : null;\n sessCheck = source.sessionsDir ? checkRemotePath(source.sessionsDir, target) : null;\n\n report.customPaths = {\n logFileExists: logCheck?.exists ?? false,\n logFilePath: source.logFile ?? '',\n logFileBytes: logCheck?.totalBytes ?? 0,\n sessionsDirExists: sessCheck?.exists ?? false,\n sessionsDirPath: source.sessionsDir ?? '',\n sessionsFileCount: sessCheck?.fileCount ?? 0,\n sessionsTotalBytes: sessCheck?.totalBytes ?? 0,\n };\n\n if (logCheck?.exists) {\n notes.push(`Custom log path ${source.logFile}: ${formatBytes(logCheck.totalBytes)}`);\n } else if (source.logFile) {\n notes.push(`Custom log path ${source.logFile}: not found`);\n }\n\n if (sessCheck?.exists) {\n notes.push(\n `Custom sessions path ${source.sessionsDir}: ${sessCheck.fileCount} files, ${formatBytes(sessCheck.totalBytes)}`,\n );\n } else if (source.sessionsDir) {\n notes.push(`Custom sessions path ${source.sessionsDir}: not found`);\n }\n }\n\n const foundOpenClawData =\n gateway.fileCount > 0 ||\n sessions.fileCount > 0 ||\n alternateSessionPaths.some((path) => path.fileCount > 0) ||\n (logCheck?.fileCount ?? 0) > 0 ||\n (sessCheck?.fileCount ?? 0) > 0;\n\n if (!foundOpenClawData) {\n notes.push(\n target\n ? 'No OpenClaw data was found on this Railway service. Verify that the selected service is the OpenClaw app, or use --remote-log-file / --remote-sessions-dir for custom paths.'\n : 'No OpenClaw data was found on the linked Railway service. If this directory is linked to a database or sidecar instead of the OpenClaw app, run `railway link` again and choose the app service.',\n );\n }\n\n return report;\n}\n\nfunction emptyDefaultPaths() {\n return {\n gatewayExists: false,\n gatewayPath: DEFAULT_GATEWAY_DIR,\n gatewayFileCount: 0,\n gatewayTotalBytes: 0,\n sessionsExists: false,\n sessionsPath: DEFAULT_SESSIONS_DIR,\n sessionsFileCount: 0,\n sessionsTotalBytes: 0,\n };\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const value = bytes / 1024 ** i;\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport type { RemoteConfig, RemoteConfigEntry, RemoteSource } from './types.js';\n\nexport function loadRemoteConfig(configPath: string): RemoteSource[] {\n const resolved = resolve(configPath);\n let raw: string;\n\n try {\n raw = readFileSync(resolved, 'utf8');\n } catch {\n throw new Error(`Cannot read remote config at ${resolved}`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid JSON in remote config at ${resolved}`);\n }\n\n const config = parsed as RemoteConfig;\n if (!config.remotes || !Array.isArray(config.remotes)) {\n throw new Error('Remote config must have a \"remotes\" array');\n }\n\n if (config.remotes.length === 0) {\n throw new Error('Remote config \"remotes\" array is empty');\n }\n\n return config.remotes.map((entry) => validateAndNormalize(entry));\n}\n\nfunction validateAndNormalize(entry: RemoteConfigEntry): RemoteSource {\n if (!entry.name || typeof entry.name !== 'string') {\n throw new Error('Each remote must have a \"name\" string');\n }\n\n const transport = entry.transport ?? 'ssh';\n\n if (transport !== 'ssh' && transport !== 'railway') {\n throw new Error(\n `Remote \"${entry.name}\" has invalid transport \"${transport}\". Use \"ssh\" or \"railway\".`,\n );\n }\n\n if (transport === 'railway') {\n return validateRailwayEntry(entry);\n }\n\n return validateSshEntry(entry);\n}\n\nfunction validateSshEntry(entry: RemoteConfigEntry): RemoteSource {\n if (!entry.host || typeof entry.host !== 'string') {\n throw new Error(`Remote \"${entry.name}\" must have a \"host\" string`);\n }\n\n return {\n name: entry.name,\n transport: 'ssh',\n host: entry.host,\n logFile: entry.logFile,\n sessionsDir: entry.sessionsDir,\n identityFile: entry.identityFile,\n };\n}\n\nfunction validateRailwayEntry(entry: RemoteConfigEntry): RemoteSource {\n if (!entry.railway || typeof entry.railway !== 'object') {\n throw new Error(`Remote \"${entry.name}\" with transport \"railway\" must have a \"railway\" object`);\n }\n\n const { projectId, environmentId, serviceId } = entry.railway;\n\n if (!projectId || typeof projectId !== 'string') {\n throw new Error(`Remote \"${entry.name}\" railway config must have a \"projectId\" string`);\n }\n if (!environmentId || typeof environmentId !== 'string') {\n throw new Error(`Remote \"${entry.name}\" railway config must have an \"environmentId\" string`);\n }\n if (!serviceId || typeof serviceId !== 'string') {\n throw new Error(`Remote \"${entry.name}\" railway config must have a \"serviceId\" string`);\n }\n\n return {\n name: entry.name,\n transport: 'railway',\n host: `railway-${serviceId.slice(0, 8)}`,\n logFile: entry.logFile,\n sessionsDir: entry.sessionsDir,\n railway: { projectId, environmentId, serviceId },\n };\n}\n","import { readFileSync } from 'node:fs';\n\nexport function getCliVersion(): string {\n try {\n const packageJsonPath = new URL('../package.json', import.meta.url);\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as {\n version?: string;\n };\n return packageJson.version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n","import { styleText } from 'node:util';\n\nimport {\n getCredentialsPath,\n loadStoredCredentials,\n storeCredentials,\n} from '../auth/credentials.js';\nimport { formatCommand } from '../command-display.js';\n\nconst DEFAULT_AUTH_URL = 'https://xerg.ai/dashboard/settings';\nconst DEFAULT_API_URL = 'https://api.xerg.ai';\nconst POLL_INTERVAL_MS = 2000;\nconst POLL_TIMEOUT_MS = 300_000; // 5 minutes\n\nexport async function runLoginCommand() {\n const existing = loadStoredCredentials();\n if (existing) {\n process.stderr.write(\n `Already logged in. Credentials stored at ${getCredentialsPath()}.\\nRun ${colorBold(formatCommand('logout'))} first to re-authenticate.\\n`,\n );\n return;\n }\n\n const data = await performDeviceLogin();\n storeCredentials(data.token);\n const teamInfo = data.teamName ? ` (team: ${data.teamName})` : '';\n process.stderr.write(\n `\\n${colorSuccess('Authenticated successfully')}${teamInfo}.\\nCredentials saved to ${getCredentialsPath()}.\\n`,\n );\n}\n\nexport async function performDeviceLogin(): Promise<{ token: string; teamName?: string }> {\n const apiUrl = process.env.XERG_API_URL || DEFAULT_API_URL;\n const deviceCodeUrl = `${apiUrl}/v1/auth/device-code`;\n\n let deviceResponse: {\n deviceCode: string;\n userCode: string;\n verificationUrl: string;\n interval?: number;\n };\n try {\n const res = await fetch(deviceCodeUrl, { method: 'POST' });\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n }\n deviceResponse = (await res.json()) as typeof deviceResponse;\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n throw new Error(\n `Could not start device auth flow (${msg}).\\n\\nAlternative: create an API key at ${DEFAULT_AUTH_URL}\\nand set XERG_API_KEY in your environment.`,\n );\n }\n\n const verifyUrl = deviceResponse.verificationUrl || DEFAULT_AUTH_URL;\n const pollInterval = (deviceResponse.interval || 2) * 1000;\n\n process.stderr.write(\n `\\nOpen this URL in your browser to authenticate:\\n\\n ${colorBold(verifyUrl)}\\n\\n`,\n );\n if (deviceResponse.userCode) {\n process.stderr.write(`Your code: ${colorBold(deviceResponse.userCode)}\\n\\n`);\n }\n process.stderr.write('Waiting for authentication...\\n');\n\n await openBrowser(verifyUrl);\n\n const tokenUrl = `${apiUrl}/v1/auth/device-token`;\n const startTime = Date.now();\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n await sleep(Math.max(pollInterval, POLL_INTERVAL_MS));\n\n try {\n const res = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ deviceCode: deviceResponse.deviceCode }),\n });\n\n if (res.status === 200) {\n return (await res.json()) as { token: string; teamName?: string };\n }\n\n if (res.status === 428) {\n // Authorization pending -- keep polling\n continue;\n }\n\n if (res.status === 410) {\n throw new Error(`Device code expired. Please run \\`${formatCommand('login')}\\` again.`);\n }\n\n const body = (await res.json().catch(() => ({}))) as { error?: string };\n throw new Error(body.error || `Unexpected response: HTTP ${res.status}`);\n } catch (err) {\n if (\n err instanceof Error &&\n (err.message.includes('expired') || err.message.includes('Unexpected'))\n ) {\n throw err;\n }\n // Network errors during poll -- keep trying\n }\n }\n\n throw new Error(`Authentication timed out. Please run \\`${formatCommand('login')}\\` again.`);\n}\n\nasync function openBrowser(url: string): Promise<void> {\n const { exec } = await import('node:child_process');\n const { platform } = await import('node:os');\n\n const commands: Record<string, string> = {\n darwin: 'open',\n win32: 'start',\n linux: 'xdg-open',\n };\n\n const cmd = commands[platform()];\n if (!cmd) return;\n\n return new Promise((resolve) => {\n exec(`${cmd} ${JSON.stringify(url)}`, () => resolve());\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction colorBold(text: string): string {\n return process.stderr.isTTY ? styleText('bold', text) : text;\n}\n\nfunction colorSuccess(text: string): string {\n return process.stderr.isTTY ? styleText('green', text) : text;\n}\n","import { getCredentialsPath, storeCredentials } from './auth/credentials.js';\nimport { performDeviceLogin } from './commands/login.js';\nimport { loadPushConfig } from './push/index.js';\nimport type { PushConfig } from './push/index.js';\n\nexport function loadPushConfigOrNull(): PushConfig | null {\n try {\n return loadPushConfig();\n } catch {\n return null;\n }\n}\n\nexport async function authenticateAndLoadPushConfig(): Promise<PushConfig> {\n const data = await performDeviceLogin();\n storeCredentials(data.token);\n\n const teamInfo = data.teamName ? ` (team: ${data.teamName})` : '';\n process.stderr.write(\n `\\nAuthenticated successfully${teamInfo}.\\nCredentials saved to ${getCredentialsPath()}.\\n`,\n );\n\n return loadPushConfig();\n}\n\nexport function renderCloudDisclaimer(): string {\n return [\n 'Xerg Cloud sync and hosted MCP are optional paid workspace features.',\n 'Local audits and compare stay free, and you can keep using Xerg locally if you skip this step.',\n ].join('\\n');\n}\n\nexport function renderMcpCredentialSourceMessage(config: PushConfig): string {\n if (config.source === 'stored') {\n return 'Using your stored login token. If hosted MCP requires a workspace API key, create one at xerg.ai/dashboard/settings and set XERG_API_KEY.';\n }\n\n return 'Using your workspace API key.';\n}\n","import { confirm, select } from '@inquirer/prompts';\n\nexport interface PromptChoice<T> {\n name: string;\n value: T;\n description?: string;\n}\n\nexport function hasPromptTty(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nexport async function promptConfirm(message: string, defaultValue = true): Promise<boolean> {\n return confirm({\n message,\n default: defaultValue,\n });\n}\n\nexport async function promptSelect<T>(message: string, choices: PromptChoice<T>[]): Promise<T> {\n return select({\n message,\n choices,\n });\n}\n","import { readFileSync } from 'node:fs';\nimport type { AuditPushPayload } from '@xerg/schemas';\nimport { getDefaultDbPath, listStoredAuditSummaries, toWirePayload } from '@xergai/core';\nimport type { WirePayloadMeta } from '@xergai/core';\n\nimport { formatCommand } from '../command-display.js';\nimport { NoDataError } from '../errors.js';\nimport { loadPushConfig, pushAudit } from '../push/index.js';\nimport { buildCachedPushSourceMeta } from '../source-meta.js';\nimport { getCliVersion } from '../version.js';\n\nexport interface PushCommandOptions {\n file?: string;\n dryRun?: boolean;\n}\n\nexport async function runPushCommand(options: PushCommandOptions) {\n const payload = options.file ? loadPayloadFromFile(options.file) : loadLatestCachedAuditPayload();\n\n if (options.dryRun) {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n return;\n }\n\n const config = loadPushConfig();\n const auditId = payload.summary.auditId;\n process.stderr.write(`Pushing audit ${auditId} to ${config.apiUrl}...\\n`);\n\n const result = await pushAudit(payload, config);\n\n if (result.ok) {\n process.stderr.write(`Pushed successfully (audit: ${result.auditId}).\\n`);\n } else {\n const statusInfo = result.status > 0 ? ` (HTTP ${result.status})` : '';\n throw new Error(`Push failed${statusInfo}: ${result.message}`);\n }\n}\n\nfunction loadPayloadFromFile(filePath: string): AuditPushPayload {\n let raw: string;\n try {\n raw = readFileSync(filePath, 'utf8');\n } catch {\n throw new Error(`Cannot read file: ${filePath}`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`File is not valid JSON: ${filePath}`);\n }\n\n const payload = parsed as AuditPushPayload;\n if (!payload.version || !payload.summary || !payload.meta) {\n throw new Error(\n `File does not look like an AuditPushPayload (missing version, summary, or meta): ${filePath}`,\n );\n }\n\n return payload;\n}\n\nexport function loadLatestCachedAuditPayload(): AuditPushPayload {\n const dbPath = getDefaultDbPath();\n let summaries: ReturnType<typeof listStoredAuditSummaries>;\n\n try {\n summaries = listStoredAuditSummaries(dbPath);\n } catch {\n throw new NoDataError(\n `No local audit database found. Run \\`${formatCommand('audit')}\\` first, or use \\`${formatCommand('push --file <path>')}\\`.`,\n );\n }\n\n if (summaries.length === 0) {\n throw new NoDataError(\n `No cached audit snapshots found. Run \\`${formatCommand('audit')}\\` first, or use \\`${formatCommand('push --file <path>')}\\`.`,\n );\n }\n\n const latest = summaries[0];\n const meta = buildMeta(latest);\n\n process.stderr.write(\n `Using most recent cached audit: ${latest.auditId} (${latest.generatedAt})\\n`,\n );\n\n return toWirePayload(latest, meta);\n}\n\nfunction buildMeta(summary: Parameters<typeof buildCachedPushSourceMeta>[0]): WirePayloadMeta {\n const sourceMeta = buildCachedPushSourceMeta(summary);\n return {\n cliVersion: getCliVersion(),\n sourceId: sourceMeta.sourceId,\n sourceHost: sourceMeta.sourceHost,\n environment: sourceMeta.environment,\n };\n}\n","import { toWirePayload } from '@xergai/core';\nimport type { AuditSummary, WirePayloadMeta } from '@xergai/core';\n\nimport {\n authenticateAndLoadPushConfig,\n loadPushConfigOrNull,\n renderCloudDisclaimer,\n} from '../cloud.js';\nimport { formatCommand } from '../command-display.js';\nimport { NoDataError } from '../errors.js';\nimport { hasPromptTty, promptConfirm } from '../prompts.js';\nimport { loadPushConfig, pushAudit } from '../push/index.js';\nimport { buildLocalPushSourceMeta } from '../source-meta.js';\nimport { getCliVersion } from '../version.js';\nimport { loadLatestCachedAuditPayload } from './push.js';\n\nexport async function runConnectCommand() {\n await runConnectFlow();\n}\n\nexport async function runConnectFlow(options?: {\n skipDisclaimer?: boolean;\n auditSummary?: AuditSummary;\n}): Promise<boolean> {\n if (!options?.skipDisclaimer) {\n process.stderr.write(`${renderCloudDisclaimer()}\\n`);\n }\n\n let config = loadPushConfigOrNull();\n if (config) {\n process.stderr.write('Xerg authentication detected.\\n');\n } else {\n if (!hasPromptTty()) {\n process.stderr.write(\n `No Xerg authentication is configured, and ${formatCommand('connect')} needs an interactive terminal before it can start browser login.\\nRun ${formatCommand('login')} from a TTY, or keep using local audits for free.\\n`,\n );\n process.exitCode = 1;\n return false;\n }\n\n const shouldLogin = await promptConfirm('Sign in to Xerg Cloud now?', true);\n if (!shouldLogin) {\n process.stderr.write(\n 'Skipped Xerg Cloud setup. You can keep using local audits and compare without connecting.\\n',\n );\n return false;\n }\n\n config = await authenticateAndLoadPushConfig();\n }\n\n if (!hasPromptTty()) {\n if (!options?.auditSummary) {\n process.stderr.write(\n `Non-interactive mode skips the push prompt. Run ${formatCommand('push')} when you want to sync a cached audit.\\n`,\n );\n } else {\n process.stderr.write(\n `Authentication is ready. Run ${formatCommand('push')} later if you want to sync this audit.\\n`,\n );\n }\n return true;\n }\n\n const shouldPush = await promptConfirm(\n options?.auditSummary\n ? 'Push this audit to Xerg Cloud?'\n : 'Push your latest cached audit to Xerg Cloud?',\n true,\n );\n\n if (!shouldPush) {\n process.stderr.write(\n options?.auditSummary\n ? `Skipped push. Run ${formatCommand('push')} later if you want to sync a cached audit.\\n`\n : `Skipped push. Run ${formatCommand('push')} when you want to sync a cached audit.\\n`,\n );\n return true;\n }\n\n const payload = options?.auditSummary\n ? toWirePayload(options.auditSummary, buildLocalMeta(options.auditSummary))\n : loadStandalonePayload();\n\n if (!payload) {\n return true;\n }\n\n await pushResolvedPayload(payload, config ?? loadPushConfig());\n return true;\n}\n\nfunction buildLocalMeta(summary: AuditSummary): WirePayloadMeta {\n const sourceMeta = buildLocalPushSourceMeta(summary.runtime);\n return {\n cliVersion: getCliVersion(),\n sourceId: sourceMeta.sourceId,\n sourceHost: sourceMeta.sourceHost,\n environment: sourceMeta.environment,\n };\n}\n\nfunction loadStandalonePayload() {\n try {\n return loadLatestCachedAuditPayload();\n } catch (error) {\n if (error instanceof NoDataError || (error instanceof Error && error.name === 'NoDataError')) {\n process.stderr.write(\n `${error instanceof Error ? error.message : 'No cached audit snapshots found.'}\\n`,\n );\n return null;\n }\n throw error;\n }\n}\n\nasync function pushResolvedPayload(\n payload: Parameters<typeof pushAudit>[0],\n config: Parameters<typeof pushAudit>[1],\n) {\n process.stderr.write(`Pushing audit ${payload.summary.auditId} to ${config.apiUrl}...\\n`);\n const result = await pushAudit(payload, config);\n\n if (result.ok) {\n process.stderr.write(`Pushed successfully (audit: ${result.auditId}).\\n`);\n return;\n }\n\n const statusInfo = result.status > 0 ? ` (HTTP ${result.status})` : '';\n throw new Error(`Push failed${statusInfo}: ${result.message}`);\n}\n","import {\n doctorAgentRuntime,\n doctorCursorUsageCsv,\n renderCursorDoctorReport,\n renderDoctorReport,\n} from '@xergai/core';\n\nimport { createCliLogger } from '../log.js';\nimport {\n buildRailwaySourceFromFlags,\n buildSourceFromFlags,\n runRailwayDoctor,\n runRemoteDoctor,\n} from '../transport/index.js';\nimport type { RailwayDoctorReport, RailwayTarget, RemoteDoctorReport } from '../transport/index.js';\n\nexport interface DoctorCommandOptions {\n runtime?: 'openclaw' | 'hermes';\n logFile?: string;\n sessionsDir?: string;\n cursorUsageCsv?: string;\n remote?: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n railway?: boolean;\n railwayProject?: string;\n railwayEnvironment?: string;\n railwayService?: string;\n verbose?: boolean;\n commandPrefix?: string;\n}\n\nexport async function runDoctorCommand(options: DoctorCommandOptions) {\n const logger = createCliLogger({ verbose: options.verbose });\n validateRuntimeOption(options.runtime);\n validateCursorUsageCsvOptions(options);\n validateHermesLocalOnly(options);\n\n if (options.railway) {\n logger.verbose('Inspecting Railway audit readiness.');\n const railwayTarget = buildRailwayTarget(options);\n const source = buildRailwaySourceFromFlags({\n railway: railwayTarget,\n remoteLogFile: options.remoteLogFile,\n remoteSessionsDir: options.remoteSessionsDir,\n });\n\n const report = await runRailwayDoctor({ source, onProgress: logger.verbose });\n process.stdout.write(`${renderRailwayDoctorReport(report)}\\n`);\n return;\n }\n\n if (options.remote) {\n logger.verbose(`Inspecting SSH audit readiness for ${options.remote}.`);\n const source = buildSourceFromFlags({\n remote: options.remote,\n remoteLogFile: options.remoteLogFile,\n remoteSessionsDir: options.remoteSessionsDir,\n });\n\n const report = await runRemoteDoctor({ source, onProgress: logger.verbose });\n process.stdout.write(`${renderRemoteDoctorReport(report)}\\n`);\n return;\n }\n\n if (options.cursorUsageCsv) {\n logger.verbose('Inspecting local Cursor usage CSV audit readiness.');\n logger.verbose(`Using Cursor usage CSV: ${options.cursorUsageCsv}`);\n const report = await doctorCursorUsageCsv({\n cursorUsageCsv: options.cursorUsageCsv,\n onProgress: logger.verbose,\n });\n process.stdout.write(`${renderCursorDoctorReport(report)}\\n`);\n return;\n }\n\n logger.verbose(\n options.runtime\n ? `Inspecting local ${options.runtime === 'hermes' ? 'Hermes' : 'OpenClaw'} audit readiness.`\n : 'Inspecting local runtime audit readiness.',\n );\n if (options.logFile) {\n logger.verbose(`Using explicit local log file: ${options.logFile}`);\n }\n if (options.sessionsDir) {\n logger.verbose(`Using explicit local sessions directory: ${options.sessionsDir}`);\n }\n\n const report = await doctorAgentRuntime({\n runtime: options.runtime ?? 'auto',\n logFile: options.logFile,\n sessionsDir: options.sessionsDir,\n onProgress: logger.verbose,\n });\n\n process.stdout.write(`${renderDoctorReport(report, { commandPrefix: options.commandPrefix })}\\n`);\n}\n\nfunction validateRuntimeOption(runtime?: DoctorCommandOptions['runtime']) {\n if (!runtime) {\n return;\n }\n\n if (runtime !== 'openclaw' && runtime !== 'hermes') {\n throw new Error(\n `Unsupported runtime \"${runtime}\". Use --runtime openclaw or --runtime hermes.`,\n );\n }\n}\n\nfunction validateCursorUsageCsvOptions(options: DoctorCommandOptions) {\n if (!options.cursorUsageCsv) {\n return;\n }\n\n const conflicts = [\n options.runtime ? '--runtime' : null,\n options.logFile ? '--log-file' : null,\n options.sessionsDir ? '--sessions-dir' : null,\n options.remote ? '--remote' : null,\n options.remoteLogFile ? '--remote-log-file' : null,\n options.remoteSessionsDir ? '--remote-sessions-dir' : null,\n options.railway ? '--railway' : null,\n options.railwayProject ? '--project' : null,\n options.railwayEnvironment ? '--environment' : null,\n options.railwayService ? '--service' : null,\n ].filter((flag): flag is string => flag !== null);\n\n if (conflicts.length > 0) {\n throw new Error(`The --cursor-usage-csv flag cannot be combined with ${conflicts.join(', ')}.`);\n }\n}\n\nfunction validateHermesLocalOnly(options: DoctorCommandOptions) {\n if (options.runtime !== 'hermes') {\n return;\n }\n\n const conflicts = [\n options.remote ? '--remote' : null,\n options.remoteLogFile ? '--remote-log-file' : null,\n options.remoteSessionsDir ? '--remote-sessions-dir' : null,\n options.railway ? '--railway' : null,\n options.railwayProject ? '--project' : null,\n options.railwayEnvironment ? '--environment' : null,\n options.railwayService ? '--service' : null,\n ].filter((flag): flag is string => flag !== null);\n\n if (conflicts.length > 0) {\n throw new Error(\n `Hermes remote transport is not supported yet. Remove ${conflicts.join(', ')} or switch to --runtime openclaw.`,\n );\n }\n}\n\nfunction buildRailwayTarget(options: DoctorCommandOptions): RailwayTarget | undefined {\n if (options.railwayProject && options.railwayEnvironment && options.railwayService) {\n return {\n projectId: options.railwayProject,\n environmentId: options.railwayEnvironment,\n serviceId: options.railwayService,\n };\n }\n return undefined;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const value = bytes / 1024 ** i;\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n\nfunction renderRemoteDoctorReport(report: RemoteDoctorReport): string {\n const sections = [\n '# Xerg doctor [remote]',\n '',\n `Host: ${report.host}`,\n `SSH connectivity: ${report.sshConnectivity ? 'OK' : 'FAILED'}`,\n ];\n\n if (!report.sshConnectivity) {\n sections.push('', ...report.notes.map((n) => `[remote] ${n}`));\n return sections.join('\\n');\n }\n\n sections.push(\n `rsync (local): ${report.rsyncAvailableLocal ? 'available' : 'not found'}`,\n `rsync (remote): ${report.rsyncAvailableRemote ? 'available' : 'not found'}`,\n '',\n '## Default paths',\n `[remote] Gateway (${report.defaultPaths.gatewayPath}): ${\n report.defaultPaths.gatewayExists\n ? `${report.defaultPaths.gatewayFileCount} files, ${formatBytes(report.defaultPaths.gatewayTotalBytes)}`\n : 'not found'\n }`,\n `[remote] Sessions (${report.defaultPaths.sessionsPath}): ${\n report.defaultPaths.sessionsExists\n ? `${report.defaultPaths.sessionsFileCount} files, ${formatBytes(report.defaultPaths.sessionsTotalBytes)}`\n : 'not found'\n }`,\n );\n\n if (report.customPaths) {\n sections.push('', '## Custom paths');\n if (report.customPaths.logFilePath) {\n sections.push(\n `[remote] Log file (${report.customPaths.logFilePath}): ${\n report.customPaths.logFileExists\n ? formatBytes(report.customPaths.logFileBytes)\n : 'not found'\n }`,\n );\n }\n if (report.customPaths.sessionsDirPath) {\n sections.push(\n `[remote] Sessions dir (${report.customPaths.sessionsDirPath}): ${\n report.customPaths.sessionsDirExists\n ? `${report.customPaths.sessionsFileCount} files, ${formatBytes(report.customPaths.sessionsTotalBytes)}`\n : 'not found'\n }`,\n );\n }\n }\n\n sections.push('', '## Notes', ...report.notes.map((n) => `[remote] ${n}`));\n\n return sections.join('\\n');\n}\n\nfunction renderRailwayDoctorReport(report: RailwayDoctorReport): string {\n const sections = [\n '# Xerg doctor [railway]',\n '',\n `Source: ${report.name}`,\n `Railway CLI: ${report.railwayCliInstalled ? 'installed' : 'NOT INSTALLED'}`,\n ];\n\n if (!report.railwayCliInstalled) {\n sections.push('', ...report.notes.map((n) => `[railway] ${n}`));\n return sections.join('\\n');\n }\n\n sections.push(`Authentication: ${report.railwayAuthenticated ? 'OK' : 'NOT AUTHENTICATED'}`);\n\n if (!report.railwayAuthenticated) {\n sections.push('', ...report.notes.map((n) => `[railway] ${n}`));\n return sections.join('\\n');\n }\n\n if (report.railwayAuthUser) {\n sections.push(`User: ${report.railwayAuthUser}`);\n }\n\n sections.push(`Service reachable: ${report.serviceReachable ? 'OK' : 'FAILED'}`);\n\n if (!report.serviceReachable) {\n if (report.serviceError) {\n sections.push(`Error: ${report.serviceError}`);\n }\n sections.push('', ...report.notes.map((n) => `[railway] ${n}`));\n return sections.join('\\n');\n }\n\n sections.push(\n '',\n '## Default paths',\n `[railway] Gateway (${report.defaultPaths.gatewayPath}): ${\n report.defaultPaths.gatewayExists\n ? `${report.defaultPaths.gatewayFileCount} files, ${formatBytes(report.defaultPaths.gatewayTotalBytes)}`\n : 'not found'\n }`,\n `[railway] Sessions (${report.defaultPaths.sessionsPath}): ${\n report.defaultPaths.sessionsExists\n ? `${report.defaultPaths.sessionsFileCount} files, ${formatBytes(report.defaultPaths.sessionsTotalBytes)}`\n : 'not found'\n }`,\n );\n\n if (report.alternateSessionPaths.length > 0) {\n sections.push('', '## Alternate session paths');\n for (const alt of report.alternateSessionPaths) {\n sections.push(\n `[railway] ${alt.path}: ${\n alt.exists ? `${alt.fileCount} files, ${formatBytes(alt.totalBytes)}` : 'not found'\n }`,\n );\n }\n }\n\n if (report.customPaths) {\n sections.push('', '## Custom paths');\n if (report.customPaths.logFilePath) {\n sections.push(\n `[railway] Log file (${report.customPaths.logFilePath}): ${\n report.customPaths.logFileExists\n ? formatBytes(report.customPaths.logFileBytes)\n : 'not found'\n }`,\n );\n }\n if (report.customPaths.sessionsDirPath) {\n sections.push(\n `[railway] Sessions dir (${report.customPaths.sessionsDirPath}): ${\n report.customPaths.sessionsDirExists\n ? `${report.customPaths.sessionsFileCount} files, ${formatBytes(report.customPaths.sessionsTotalBytes)}`\n : 'not found'\n }`,\n );\n }\n }\n\n sections.push('', '## Notes', ...report.notes.map((n) => `[railway] ${n}`));\n\n return sections.join('\\n');\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nimport {\n authenticateAndLoadPushConfig,\n loadPushConfigOrNull,\n renderCloudDisclaimer,\n renderMcpCredentialSourceMessage,\n} from '../cloud.js';\nimport { formatCommand } from '../command-display.js';\nimport { hasPromptTty, promptConfirm, promptSelect } from '../prompts.js';\nimport type { PushConfig } from '../push/index.js';\n\nconst HOSTED_MCP_URL = 'https://mcp.xerg.ai/mcp';\nconst MCP_SERVER_NAME = 'xerg';\n\ntype McpClient = 'cursor' | 'claude-code' | 'codex' | 'other';\n\nexport async function runMcpSetupCommand() {\n await runMcpSetupFlow();\n}\n\nexport async function runMcpSetupFlow() {\n let config = loadPushConfigOrNull();\n\n if (!config) {\n process.stderr.write(`${renderCloudDisclaimer()}\\n`);\n process.stderr.write('Hosted MCP requires Xerg Cloud authentication before client setup.\\n');\n }\n\n if (!hasPromptTty()) {\n process.stderr.write(\n `${formatCommand('mcp-setup')} needs an interactive terminal so it can ask which MCP client you want to configure.\\n`,\n );\n process.exitCode = 1;\n return;\n }\n\n if (!config) {\n const shouldLogin = await promptConfirm('Authenticate with Xerg Cloud now?', true);\n if (!shouldLogin) {\n process.stderr.write(\n `Skipped hosted MCP setup. Run ${formatCommand('mcp-setup')} when you're ready.\\n`,\n );\n return;\n }\n\n config = await authenticateAndLoadPushConfig();\n }\n\n process.stderr.write(`${renderMcpCredentialSourceMessage(config)}\\n`);\n\n const client = await promptSelect<McpClient>('Which MCP client do you want to configure?', [\n {\n name: 'Cursor',\n value: 'cursor',\n description: 'Project-scoped or global Cursor MCP config',\n },\n {\n name: 'Claude Code',\n value: 'claude-code',\n description: 'Project-scoped Claude Code MCP config',\n },\n {\n name: 'Codex',\n value: 'codex',\n description: 'Codex config.toml snippet',\n },\n {\n name: 'Other',\n value: 'other',\n description: 'Print the hosted HTTP MCP snippet for another client',\n },\n ]);\n\n const snippet = JSON.stringify(buildHostedMcpConfig(config), null, 2);\n\n if (client === 'cursor') {\n await handleCursorSetup(snippet, config);\n return;\n }\n\n if (client === 'codex') {\n process.stdout.write(`${buildCodexMcpConfig(config)}\\n`);\n process.stderr.write(\n 'Add this to `~/.codex/config.toml`, then restart Codex so it loads the Xerg MCP tools.\\n',\n );\n return;\n }\n\n process.stdout.write(`${snippet}\\n`);\n\n if (client === 'claude-code') {\n process.stderr.write(\n 'Add this to `.mcp.json` in your project root, or import the same `mcpServers.xerg` config through Claude Code MCP settings.\\n',\n );\n return;\n }\n\n process.stderr.write(\n `Add this as a remote HTTP MCP server in your client. Endpoint: ${HOSTED_MCP_URL}\\n`,\n );\n}\n\nasync function handleCursorSetup(snippet: string, config: PushConfig) {\n const cursorDir = join(process.cwd(), '.cursor');\n const cursorConfigPath = join(cursorDir, 'mcp.json');\n\n if (existsSync(cursorDir)) {\n const shouldWrite = await promptConfirm(\n 'Write a project-scoped Cursor MCP config to .cursor/mcp.json?',\n true,\n );\n\n if (shouldWrite) {\n writeCursorConfig(cursorConfigPath, config);\n process.stderr.write(`Wrote hosted MCP config to ${cursorConfigPath}.\\n`);\n return;\n }\n }\n\n process.stdout.write(`${snippet}\\n`);\n process.stderr.write(\n 'Add this to `.cursor/mcp.json` for a project-scoped Cursor config, or `~/.cursor/mcp.json` for a global Cursor config.\\n',\n );\n}\n\nfunction buildHostedMcpConfig(config: PushConfig) {\n return {\n mcpServers: {\n [MCP_SERVER_NAME]: {\n type: 'http',\n url: HOSTED_MCP_URL,\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n },\n },\n },\n };\n}\n\nfunction buildCodexMcpConfig(config: PushConfig) {\n return [\n `[mcp_servers.${MCP_SERVER_NAME}]`,\n 'enabled = true',\n `url = ${tomlString(HOSTED_MCP_URL)}`,\n '',\n `[mcp_servers.${MCP_SERVER_NAME}.http_headers]`,\n `Authorization = ${tomlString(`Bearer ${config.apiKey}`)}`,\n ].join('\\n');\n}\n\nfunction tomlString(value: string) {\n return JSON.stringify(value);\n}\n\nfunction writeCursorConfig(filePath: string, config: PushConfig) {\n mkdirSync(dirname(filePath), { recursive: true });\n\n let parsed: {\n mcpServers?: Record<string, unknown>;\n [key: string]: unknown;\n } = {};\n\n if (existsSync(filePath)) {\n try {\n parsed = JSON.parse(readFileSync(filePath, 'utf8')) as typeof parsed;\n } catch {\n throw new Error(`Cursor config is not valid JSON: ${filePath}`);\n }\n }\n\n const existingServers = parsed.mcpServers;\n if (existingServers && typeof existingServers !== 'object') {\n throw new Error(`Cursor config has an invalid \"mcpServers\" value: ${filePath}`);\n }\n\n parsed.mcpServers = {\n ...(existingServers ?? {}),\n xerg: buildHostedMcpConfig(config).mcpServers.xerg,\n };\n\n writeFileSync(filePath, `${JSON.stringify(parsed, null, 2)}\\n`);\n}\n","import {\n auditAgentRuntime,\n getRuntimeAdapter,\n renderTerminalSummary,\n resolveRuntimeCandidates,\n} from '@xergai/core';\nimport type { AgentRuntime } from '@xergai/core';\n\nimport { loadPushConfigOrNull, renderCloudDisclaimer } from '../cloud.js';\nimport { formatCommand } from '../command-display.js';\nimport { hasPromptTty, promptConfirm, promptSelect } from '../prompts.js';\nimport { runConnectFlow } from './connect.js';\nimport { runMcpSetupFlow } from './mcp-setup.js';\n\ntype RuntimeCandidate = Awaited<ReturnType<typeof resolveRuntimeCandidates>>[number];\n\nexport async function runInitCommand() {\n if (!hasPromptTty()) {\n process.stderr.write(\n `${formatCommand('init')} is interactive in this release. Run ${formatCommand('audit')} directly when you need a non-interactive audit.\\n`,\n );\n process.exitCode = 1;\n return;\n }\n\n const candidates = await resolveRuntimeCandidates({ runtime: 'auto' });\n const usable = candidates.filter((candidate) => candidate.usable);\n\n if (usable.length === 0) {\n renderNoDataGuidance();\n return;\n }\n\n const runtime = await chooseRuntime(usable);\n if (!runtime) {\n return;\n }\n\n try {\n const summary = await auditAgentRuntime({\n runtime,\n commandPrefix: formatCommand(''),\n });\n\n process.stdout.write(`${renderTerminalSummary(summary)}\\n`);\n process.stderr.write(\n `\\nNext: after you make a fix, run ${formatCommand('audit --compare')} to measure the delta.\\n`,\n );\n\n const existingAuth = loadPushConfigOrNull();\n process.stderr.write(\n `${\n existingAuth\n ? 'Xerg Cloud authentication is already configured. You can optionally push this audit and set up hosted MCP next.'\n : renderCloudDisclaimer()\n }\\n`,\n );\n\n const shouldConnect = await promptConfirm('Continue with optional Xerg Cloud setup?', true);\n if (!shouldConnect) {\n process.stderr.write(\n `Skipped Xerg Cloud setup. Run ${formatCommand('connect')} or ${formatCommand('mcp-setup')} whenever you want the hosted follow-up.\\n`,\n );\n return;\n }\n\n const connected = await runConnectFlow({\n skipDisclaimer: true,\n auditSummary: summary,\n });\n\n if (!connected) {\n return;\n }\n\n const shouldSetupMcp = await promptConfirm('Set up hosted MCP now?', true);\n if (!shouldSetupMcp) {\n process.stderr.write(\n `Skipped hosted MCP setup. Run ${formatCommand('mcp-setup')} when you're ready.\\n`,\n );\n return;\n }\n\n await runMcpSetupFlow();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n const productName = getRuntimeAdapter(runtime).productName;\n process.stderr.write(\n `${[\n `${productName} audit failed: ${message}`,\n `Try ${formatCommand(['doctor', '--runtime', runtime])} to inspect the detected paths first.`,\n `Re-run ${formatCommand('audit --verbose')} for more detail.`,\n ].join('\\n')}\\n`,\n );\n process.exitCode = 1;\n }\n}\n\nasync function chooseRuntime(candidates: RuntimeCandidate[]): Promise<AgentRuntime | null> {\n if (candidates.length === 1) {\n const candidate = candidates[0];\n process.stderr.write(`${describeCandidate(candidate)}\\n`);\n\n const shouldAudit = await promptConfirm(\n `Run your first ${candidate.adapter.productName} audit now?`,\n true,\n );\n if (!shouldAudit) {\n process.stderr.write(\n `Skipped the first audit. Run ${formatCommand(['audit', '--runtime', candidate.adapter.runtime])} when you're ready.\\n`,\n );\n return null;\n }\n\n return candidate.adapter.runtime;\n }\n\n return promptSelect<AgentRuntime>('Choose the local runtime to audit first.', [\n ...candidates.map((candidate) => ({\n name: candidate.adapter.productName,\n value: candidate.adapter.runtime,\n description: describeSources(candidate),\n })),\n ]);\n}\n\nfunction describeCandidate(candidate: RuntimeCandidate): string {\n return `Found local ${candidate.adapter.productName} data (${describeSources(candidate)}).`;\n}\n\nfunction describeSources(candidate: RuntimeCandidate): string {\n const kinds = new Set(candidate.sources.map((source) => source.kind));\n const details = [\n kinds.has('gateway') ? 'gateway logs' : null,\n kinds.has('sessions') ? 'session transcripts' : null,\n ].filter((detail): detail is string => detail !== null);\n\n return details.join(' and ');\n}\n\nfunction renderNoDataGuidance() {\n const openclawDefaults = getRuntimeAdapter('openclaw').defaultPaths();\n const hermesDefaults = getRuntimeAdapter('hermes').defaultPaths();\n\n process.stderr.write(\n `${[\n 'No local OpenClaw or Hermes data was detected in the default locations Xerg checked.',\n '',\n 'Checked defaults:',\n `- OpenClaw gateway logs: ${openclawDefaults.gatewayPattern}`,\n `- OpenClaw session transcripts: ${openclawDefaults.sessionsPattern}`,\n `- Hermes gateway logs: ${hermesDefaults.gatewayPattern}`,\n `- Hermes session transcripts: ${hermesDefaults.sessionsPattern}`,\n '',\n 'Next steps:',\n `- Local OpenClaw paths: ${formatCommand('audit --runtime openclaw --log-file /path/to/openclaw.log')} or ${formatCommand('audit --runtime openclaw --sessions-dir /path/to/sessions')}`,\n `- Local Hermes paths: ${formatCommand('audit --runtime hermes --log-file ~/.hermes/logs/agent.log')} or ${formatCommand('audit --runtime hermes --sessions-dir ~/.hermes/sessions')}`,\n `- Remote OpenClaw only: ${formatCommand('audit --remote user@host')}`,\n `- Railway OpenClaw only: ${formatCommand('audit --railway')}`,\n ].join('\\n')}\\n`,\n );\n}\n","import { clearCredentials, getCredentialsPath } from '../auth/credentials.js';\n\nexport function runLogoutCommand() {\n const removed = clearCredentials();\n\n if (removed) {\n process.stderr.write(`Credentials removed from ${getCredentialsPath()}.\\n`);\n } else {\n process.stderr.write('No stored credentials found. Already logged out.\\n');\n }\n}\n","import { type CommandDisplay, formatCommand } from './command-display.js';\n\nexport function renderRootHelp(version: string, display: CommandDisplay) {\n return `${display.name} ${version}\n\nWaste intelligence for OpenClaw and Hermes workflows.\n\nUsage:\n ${formatCommand('<command> [options]', display.prefix)}\n\nGetting started:\n init Detect local runtimes, run a first audit, and offer optional cloud follow-up.\n\nAudit and inspect:\n audit Analyze OpenClaw or Hermes logs, or a local Cursor usage CSV.\n doctor Inspect OpenClaw or Hermes sources, or a local Cursor usage CSV.\n\nCloud:\n connect Authenticate and optionally push your latest audit to Xerg Cloud.\n push Push a cached audit snapshot to the Xerg API.\n login Authenticate with the Xerg API via browser.\n logout Remove stored Xerg API credentials.\n mcp-setup Generate hosted MCP client configuration.\n\nGlobal options:\n -h, --help Show help\n -v, --version Show version\n`;\n}\n\nexport function renderInitHelp(commandPrefix: string) {\n return `${formatCommand('init', commandPrefix)}\n\nDetect local OpenClaw or Hermes runtimes, run a first audit, and offer optional cloud follow-up.\n\nUsage:\n ${formatCommand('init', commandPrefix)}\n\nNotes:\n - Interactive only in v1\n - Uses local runtime auto-detection\n - Runs a first local audit with snapshot persistence enabled\n - Offers optional Xerg Cloud connect and hosted MCP setup after a successful audit\n\n -h, --help Show help\n`;\n}\n\nexport function renderAuditHelp(commandPrefix: string) {\n return `${formatCommand('audit', commandPrefix)}\n\nAnalyze OpenClaw or Hermes logs, or a local Cursor usage CSV, and produce an audit report.\n\nUsage:\n ${formatCommand('audit [options]', commandPrefix)}\n\nOptions:\n --runtime <name> Local runtime to inspect: openclaw or hermes\n --log-file <path> Explicit local gateway log file to analyze\n --sessions-dir <path> Explicit local sessions directory to analyze\n --cursor-usage-csv <path> Local Cursor usage CSV export to analyze\n --since <duration> Look back window such as 24h, 7d, or 30m\n --compare Compare this audit to the newest compatible prior local snapshot\n --json Render the report as JSON\n --markdown Render the report as Markdown\n --db <path> Custom SQLite database path\n --no-db Skip local persistence\n\nRemote options (SSH, OpenClaw only):\n --remote <user@host> SSH target in user@host or user@host:port format\n --remote-log-file <path> Override the default gateway log path on the remote host\n --remote-sessions-dir <path> Override the default sessions directory on the remote host\n --remote-config <path> Path to a JSON file defining multiple remote sources\n --keep-remote-files Retain pulled files in ~/.xerg/remote-cache/ instead of using a temp directory\n\nPrerequisites:\n SSH remote audits require ssh and rsync on your PATH.\n\nRailway options (OpenClaw only):\n --railway Audit a Railway service (uses linked project by default)\n --project <id> Railway project ID\n --environment <id> Railway environment ID\n --service <id> Railway service ID\n\n Railway audits require the railway CLI on your PATH.\n\nPush options:\n --push Push the audit summary to the Xerg API after computing it\n --dry-run With --push: print the payload to stdout without sending it\n --verbose Print progress updates to stderr while the audit runs\n\nThreshold options:\n --fail-above-waste-rate <n> Exit with code 3 if structural waste rate exceeds threshold (e.g. 0.30)\n --fail-above-waste-usd <n> Exit with code 3 if waste spend exceeds threshold in USD (e.g. 50)\n\n -h, --help Show help\n`;\n}\n\nexport function renderPushHelp(commandPrefix: string) {\n return `${formatCommand('push', commandPrefix)}\n\nPush a cached audit snapshot to the Xerg API.\n\nUsage:\n ${formatCommand('push [options]', commandPrefix)}\n\nOptions:\n --file <path> Push a specific snapshot file instead of the most recent cached audit\n --dry-run Print the payload to stdout without sending it\n\n -h, --help Show help\n\nAuthentication:\n Set XERG_API_KEY in your environment, add \"apiKey\" to ~/.xerg/config.json,\n or run \\`${formatCommand('connect', commandPrefix)}\\` / \\`${formatCommand('login', commandPrefix)}\\` to authenticate via browser.\n Browser login stores a token at ~/.config/xerg/credentials.json by default.\n`;\n}\n\nexport function renderDoctorHelp(commandPrefix: string) {\n return `${formatCommand('doctor', commandPrefix)}\n\nInspect OpenClaw or Hermes sources, or a local Cursor usage CSV, before you audit.\n\nUsage:\n ${formatCommand('doctor [options]', commandPrefix)}\n\nOptions:\n --runtime <name> Local runtime to inspect: openclaw or hermes\n --log-file <path> Explicit local gateway log file to inspect\n --sessions-dir <path> Explicit local sessions directory to inspect\n --cursor-usage-csv <path> Local Cursor usage CSV export to inspect\n --verbose Print progress updates to stderr while doctor runs\n\nRemote options (SSH, OpenClaw only):\n --remote <user@host> SSH target in user@host or user@host:port format\n --remote-log-file <path> Override the default gateway log path on the remote host\n --remote-sessions-dir <path> Override the default sessions directory on the remote host\n\n SSH checks require ssh and rsync on your PATH.\n\nRailway options (OpenClaw only):\n --railway Check a Railway service (uses linked project by default)\n --project <id> Railway project ID\n --environment <id> Railway environment ID\n --service <id> Railway service ID\n\n Railway checks require the railway CLI on your PATH.\n\n -h, --help Show help\n`;\n}\n\nexport function renderConnectHelp(commandPrefix: string) {\n return `${formatCommand('connect', commandPrefix)}\n\nAuthenticate with Xerg Cloud and optionally push the latest audit.\n\nUsage:\n ${formatCommand('connect', commandPrefix)}\n\nNotes:\n - Shows paid-workspace disclosure before hosted setup\n - Reuses existing auth from XERG_API_KEY, ~/.xerg/config.json, or stored browser login\n - Standalone non-interactive mode reports auth status and skips the push prompt\n - When called after ${formatCommand('init', commandPrefix)}, it can push the in-memory audit directly\n\n -h, --help Show help\n`;\n}\n\nexport function renderMcpSetupHelp(commandPrefix: string) {\n return `${formatCommand('mcp-setup', commandPrefix)}\n\nGenerate hosted MCP client configuration for Cursor, Claude Code, Codex, or another MCP client.\n\nUsage:\n ${formatCommand('mcp-setup', commandPrefix)}\n\nNotes:\n - Interactive in v1 because client selection is prompt-driven\n - Uses the hosted MCP endpoint at https://mcp.xerg.ai/mcp\n - Can write a project-scoped Cursor config when .cursor/ already exists\n - Prints a Codex config.toml snippet when Codex is selected\n - Local audits and compare stay available even if you skip hosted MCP setup\n\n -h, --help Show help\n`;\n}\n"],"mappings":"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","names":["styleText","command","argv","rmSync","cacheCost","cacheWriteCost","run","run","round","round","run","createFinding","round","run","round","run","run","basename","homedir","basename","join","readFileSync","asNumber","asBoolean","readFileSync","asNumber","buildCall","asBoolean","mkdirSync","statSync","join","resolve","matches","join","homedir","basename","detected","detected","readFileSync","basename","parseJsonLines","readFileSync","inferProvider","inferWorkflow","basename","inferEnvironment","inferRunKey","inferTaskClass","extractUsage","asNumber","buildCall","asBoolean","shouldTreatAsCall","basename","readFileSync","homedir","join","mkdirSync","readFileSync","homedir","dirname","join","join","homedir","readFileSync","createHash","mkdirSync","rmSync","homedir","join","command","atIndex","execSync","spawnSync","createHash","mkdirSync","rmSync","homedir","tmpdir","join","DEFAULT_GATEWAY_DIR","DEFAULT_SESSIONS_DIR","hashString","command","buildSinceFind","sshArgs","resolveLocalPath","formatBytes","readFileSync","resolve","readFileSync","source","summary","rmSync","DEFAULT_API_URL","platform","resolve","readFileSync","readFileSync","buildMeta","validateRuntimeOption","validateCursorUsageCsvOptions","validateHermesLocalOnly","buildRailwayTarget","report","formatBytes","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","join","existsSync","mkdirSync","dirname","readFileSync","writeFileSync","argv","styleText"]}