@xerg/cli 0.1.8 → 0.1.9

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/commands/audit.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/detect/openclaw.ts","../../core/src/utils/paths.ts","../../core/src/findings/engine.ts","../../core/src/normalize/openclaw.ts","../../core/src/pricing-catalog.ts","../../core/src/utils/records.ts","../../core/src/report/summary.ts","../../core/src/audit.ts","../../core/src/recommendations.ts","../../core/src/report/render.ts","../../schemas/dist/index.js","../../core/src/wire.ts","../src/errors.ts","../src/push/client.ts","../src/push/config.ts","../src/auth/credentials.ts","../src/transport/ssh.ts","../src/transport/railway.ts","../src/transport/config.ts","../src/commands/doctor.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/push.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { readFileSync } from 'node:fs';\nimport { styleText } from 'node:util';\n\nimport { runAuditCommand } from './commands/audit.js';\nimport { runDoctorCommand } from './commands/doctor.js';\nimport { runLoginCommand } from './commands/login.js';\nimport { runLogoutCommand } from './commands/logout.js';\nimport { runPushCommand } from './commands/push.js';\nimport { NoDataError } from './errors.js';\n\ntype AuditCliOptions = {\n logFile?: string;\n sessionsDir?: 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};\n\ntype PushCliOptions = {\n file?: string;\n dryRun?: boolean;\n};\n\ntype DoctorCliOptions = {\n logFile?: string;\n sessionsDir?: string;\n remote?: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n railway?: boolean;\n railwayProject?: string;\n railwayEnvironment?: string;\n railwayService?: string;\n};\n\nconst VERSION = readVersion();\nconst argv = process.argv.slice(2);\n\nconst command = argv[0];\n\nif (!command || command === '--help' || command === '-h' || command === 'help') {\n process.stdout.write(renderRootHelp());\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(`xerg 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(options);\n return;\n }\n\n if (command === 'doctor') {\n const options = parseDoctorOptions(argv.slice(1));\n await runDoctorCommand(options);\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 === 'login') {\n await runLoginCommand();\n return;\n }\n\n if (command === 'logout') {\n runLogoutCommand();\n return;\n }\n\n throw new Error(`Unknown command \"${command}\". Run \\`xerg --help\\` to see available commands.`);\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());\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 '--sessions-dir':\n options.sessionsDir = 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 '--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(`Unknown audit option \"${arg}\". Run \\`xerg audit --help\\` for usage.`);\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());\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(`Unknown push option \"${arg}\". Run \\`xerg push --help\\` for usage.`);\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());\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 '--sessions-dir':\n options.sessionsDir = 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 default:\n throw new Error(`Unknown doctor option \"${arg}\". Run \\`xerg doctor --help\\` for usage.`);\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 renderRootHelp() {\n return `xerg ${VERSION}\n\nWaste intelligence for OpenClaw workflows.\n\nUsage:\n xerg <command> [options]\n\nCommands:\n audit Analyze OpenClaw logs and produce a waste intelligence report.\n doctor Inspect your machine for OpenClaw sources and audit readiness.\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\nGlobal options:\n -h, --help Show help\n -v, --version Show version\n`;\n}\n\nfunction renderAuditHelp() {\n return `xerg audit\n\nAnalyze OpenClaw logs and produce a waste intelligence report.\n\nUsage:\n xerg audit [options]\n\nOptions:\n --log-file <path> Explicit OpenClaw gateway log file to analyze\n --sessions-dir <path> Explicit OpenClaw sessions directory 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):\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:\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\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\nfunction renderPushHelp() {\n return `xerg push\n\nPush a cached audit snapshot to the Xerg API.\n\nUsage:\n xerg push [options]\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 \\`xerg login\\` to authenticate via browser.\n Browser login stores a token at ~/.config/xerg/credentials.json by default.\n`;\n}\n\nfunction renderDoctorHelp() {\n return `xerg doctor\n\nInspect your machine for OpenClaw sources and audit readiness.\n\nUsage:\n xerg doctor [options]\n\nOptions:\n --log-file <path> Explicit OpenClaw gateway log file to inspect\n --sessions-dir <path> Explicit OpenClaw sessions directory to inspect\n\nRemote options (SSH):\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:\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\nfunction colorError(message: string) {\n return process.stderr.isTTY ? styleText('red', message) : message;\n}\n\nfunction readVersion() {\n const packageJsonPath = new URL('../package.json', import.meta.url);\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { version?: string };\n return packageJson.version ?? '0.0.0';\n}\n","import { readFileSync } from 'node:fs';\nimport { rmSync } from 'node:fs';\nimport { hostname } from 'node:os';\nimport {\n auditOpenClaw,\n buildRecommendations,\n renderMarkdownSummary,\n renderTerminalSummary,\n toWirePayload,\n} from '@xergai/core';\nimport type { AuditSummary, WirePayloadMeta } from '@xergai/core';\n\nimport { NoDataError } from '../errors.js';\nimport { loadPushConfig, pushAudit } from '../push/index.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';\n\nexport interface AuditCommandOptions {\n logFile?: string;\n sessionsDir?: 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}\n\nconst NO_DATA_PATTERN = /no openclaw sources were detected/i;\n\nasync function auditOrNoData(\n ...args: Parameters<typeof auditOpenClaw>\n): ReturnType<typeof auditOpenClaw> {\n try {\n return await auditOpenClaw(...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 if (options.dryRun && !options.push) {\n throw new Error('--dry-run requires --push.');\n }\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);\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);\n }\n\n if (options.remoteConfig) {\n const sources = loadRemoteConfig(options.remoteConfig);\n if (sources.length === 1) {\n return runSingleRemoteAudit(sources[0], options);\n }\n return runMultiRemoteAudit(sources, options);\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);\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(options: AuditCommandOptions) {\n const summary = await auditOrNoData({\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 });\n\n renderOutput(summary, options);\n\n if (options.push) {\n const meta = buildMeta({ environment: 'local', sourceId: hostname(), sourceHost: hostname() });\n await handlePush(summary, meta, options);\n }\n\n checkThresholds(summary, options);\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(source: RemoteSource, since?: string, keepFiles?: boolean): Promise<PullResult> {\n if (source.transport === 'railway') {\n return pullRemoteFilesRailway({ source, since, keepFiles });\n }\n return pullRemoteFiles({ source, since, keepFiles });\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\nfunction sourceEnvironment(source: RemoteSource): WirePayloadMeta['environment'] {\n return source.transport === 'railway' ? 'railway' : 'remote';\n}\n\nasync function runSingleRemoteAudit(source: RemoteSource, options: AuditCommandOptions) {\n process.stderr.write(`Pulling files from ${describeSource(source)}...\\n`);\n\n const pullResult = await pullFiles(source, options.since, options.keepRemoteFiles);\n\n try {\n const comparisonKeyOverride = getComparisonKey(source);\n const summary = await auditOrNoData({\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 });\n\n renderOutput(summary, options);\n\n if (options.push) {\n const meta = buildMeta({\n environment: sourceEnvironment(source),\n sourceId: source.name,\n sourceHost: source.host,\n });\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(sources: RemoteSource[], options: AuditCommandOptions) {\n const results: { source: RemoteSource; pullResult: PullResult }[] = [];\n const errors: { source: RemoteSource; error: string }[] = [];\n\n for (const source of sources) {\n process.stderr.write(`Pulling files from ${source.name} (${describeSource(source)})...\\n`);\n try {\n const pullResult = await pullFiles(source, options.since, options.keepRemoteFiles);\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 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 });\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, recommendations: buildRecommendations(summaries[0].summary) }\n : {\n sources: summaries.map((s) => ({\n name: s.name,\n ...s.summary,\n recommendations: buildRecommendations(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({\n environment: sourceEnvironment(source),\n sourceId: source.name,\n sourceHost: source.host,\n });\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 readCliVersion(): string {\n try {\n const packageJsonPath = new URL('../../package.json', import.meta.url);\n const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { version?: string };\n return pkg.version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nfunction buildMeta(input: {\n environment: WirePayloadMeta['environment'];\n sourceId: string;\n sourceHost: string;\n}): WirePayloadMeta {\n return {\n cliVersion: readCliVersion(),\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 const recommendations = buildRecommendations(summary);\n const output = { ...summary, recommendations };\n process.stdout.write(`${JSON.stringify(output, 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 { 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 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 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 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\nexport function hydrateAuditSummary(summary: AuditSummary): AuditSummary {\n return {\n ...summary,\n comparisonKey:\n summary.comparisonKey ??\n buildComparisonKey({\n sources: summary.sourceFiles,\n since: summary.since,\n }),\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 notes: summary.notes ?? [],\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 { readdirSync, statSync } from 'node:fs';\nimport { isAbsolute, join, resolve, sep } from 'node:path';\n\nimport type { AuditOptions, DetectedSourceFile, DoctorReport } from '../types.js';\nimport { getDefaultGatewayPattern, getDefaultSessionsPattern } from '../utils/paths.js';\n\nfunction toDetected(path: string, kind: 'gateway' | 'sessions'): DetectedSourceFile | null {\n try {\n const stats = statSync(path);\n if (!stats.isFile()) {\n return null;\n }\n\n return {\n kind,\n path,\n sizeBytes: stats.size,\n mtimeMs: stats.mtimeMs,\n };\n } catch {\n return null;\n }\n}\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');\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');\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(getDefaultGatewayPattern()),\n collectGlobMatches(getDefaultSessionsPattern()),\n ]);\n\n const detected = [\n ...gatewayMatches.map((path) => toDetected(path, 'gateway')).filter(Boolean),\n ...sessionMatches.map((path) => toDetected(path, 'sessions')).filter(Boolean),\n ] as DetectedSourceFile[];\n\n return detected.sort((left, right) => right.mtimeMs - left.mtimeMs);\n}\n\nasync 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\nexport async function inspectOpenClawSources(options: AuditOptions): Promise<DoctorReport> {\n const sources = await detectOpenClawSources(options);\n const notes: string[] = [];\n\n if (sources.length === 0) {\n notes.push('No OpenClaw gateway logs or session files were detected.');\n notes.push(\n 'Use --log-file or --sessions-dir if your OpenClaw data lives outside the defaults.',\n );\n }\n\n if (sources.some((source) => source.kind === 'gateway')) {\n notes.push('Gateway logs detected. These are preferred when cost metadata is present.');\n }\n\n if (sources.some((source) => source.kind === 'sessions')) {\n notes.push('Session transcript fallback detected. Xerg will extract usage metadata only.');\n }\n\n return {\n canAudit: sources.length > 0,\n sources,\n defaults: {\n gatewayPattern: getDefaultGatewayPattern(),\n sessionsPattern: getDefaultSessionsPattern(),\n },\n notes,\n };\n}\n","import { mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { platform } from 'node:process';\n\nexport function getAppPaths() {\n const home = homedir();\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 getDefaultSessionsPattern() {\n return join(homedir(), '.openclaw', 'agents', '*', 'sessions', '*.jsonl');\n}\n\nexport function getDefaultGatewayPattern() {\n return '/tmp/openclaw/openclaw-*.log';\n}\n","import type { Finding, NormalizedRun } 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[]): Finding[] {\n const findings: Finding[] = [];\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 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 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 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.id,\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 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 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 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 findings.sort((left, right) => right.costImpactUsd - left.costImpactUsd);\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 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","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 type {\n AuditSummary,\n DetectedSourceFile,\n Finding,\n NormalizedRun,\n SpendBreakdown,\n} from '../types.js';\nimport { sha1 } from '../utils/hash.js';\nimport { isoNow } from '../utils/time.js';\nimport { buildComparisonKey, buildTaxonomyBuckets } from './comparison.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 runs: NormalizedRun[];\n findings: Finding[];\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\n return {\n auditId: sha1(\n `${generatedAt}:${input.runs.length}:${input.sources.map((source) => source.path).join('|')}`,\n ),\n generatedAt,\n comparisonKey:\n input.comparisonKeyOverride ??\n buildComparisonKey({\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 findings: input.findings,\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","import { persistAudit } from './db/persist.js';\nimport { readLatestComparableAuditSummary } from './db/read.js';\nimport { detectOpenClawSources, inspectOpenClawSources } from './detect/openclaw.js';\nimport { buildFindings } from './findings/engine.js';\nimport { normalizeOpenClawSources } from './normalize/openclaw.js';\nimport { PRICING_CATALOG } from './pricing-catalog.js';\nimport { buildAuditComparison } from './report/comparison.js';\nimport { buildAuditSummary } from './report/summary.js';\nimport type { AuditOptions } from './types.js';\nimport { getDefaultDbPath } from './utils/paths.js';\n\nexport async function doctorOpenClaw(options: AuditOptions) {\n return inspectOpenClawSources(options);\n}\n\nexport async function auditOpenClaw(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 const sources = await detectOpenClawSources(options);\n if (sources.length === 0) {\n throw new Error(\n 'No OpenClaw sources were detected. Run `xerg doctor` or provide --log-file / --sessions-dir.',\n );\n }\n\n const runs = normalizeOpenClawSources(sources, options.since);\n const findings = buildFindings(runs);\n const dbPath = options.noDb ? undefined : (options.dbPath ?? getDefaultDbPath());\n const summary = buildAuditSummary({\n runs,\n findings,\n sources,\n since: options.since,\n dbPath,\n comparisonKeyOverride: options.comparisonKeyOverride,\n });\n\n if (options.compare && dbPath) {\n const baseline = readLatestComparableAuditSummary({\n dbPath,\n comparisonKey: summary.comparisonKey,\n currentAuditId: summary.auditId,\n });\n\n if (baseline) {\n summary.comparison = buildAuditComparison(summary, baseline);\n } else {\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 }\n }\n\n if (dbPath) {\n persistAudit(\n {\n summary,\n runs,\n pricingCatalog: PRICING_CATALOG,\n },\n dbPath,\n );\n }\n\n return summary;\n}\n","import type { XergRecommendation } from '@xerg/schemas';\n\nimport type { AuditSummary, Finding } from './types.js';\nimport { sha1 } from './utils/hash.js';\n\ninterface RecommendationTemplate {\n actionType: XergRecommendation['actionType'];\n titleFn: (finding: Finding) => string;\n descriptionFn: (finding: Finding) => string;\n suggestedChangeFn?: (finding: Finding) => Record<string, unknown> | undefined;\n}\n\nconst templatesByKind: Record<string, RecommendationTemplate> = {\n 'retry-waste': {\n actionType: 'other',\n titleFn: () => 'Add retry backoff or reduce retry attempts',\n descriptionFn: (f) =>\n `${f.summary} Consider adding exponential backoff or reducing the maximum retry count to eliminate this overhead.`,\n suggestedChangeFn: (f) => ({\n strategy: 'exponential-backoff',\n maxRetries: 3,\n failedCallCount: (f.details as Record<string, unknown>).failedCallCount,\n }),\n },\n 'loop-waste': {\n actionType: 'other',\n titleFn: (f) => `Cap iteration depth for ${extractWorkflow(f)}`,\n descriptionFn: (f) =>\n `${f.summary} Adding an iteration limit or early-exit condition would prevent runaway loops from burning spend.`,\n suggestedChangeFn: (f) => ({\n strategy: 'iteration-cap',\n suggestedMaxIterations: 5,\n observedMaxIteration: (f.details as Record<string, unknown>).maxIteration,\n }),\n },\n 'context-outlier': {\n actionType: 'prompt-trim',\n titleFn: (f) => `Trim context for ${extractWorkflow(f)}`,\n descriptionFn: (f) =>\n `${f.summary} Reducing input token volume to near the workflow baseline would lower cost proportionally.`,\n suggestedChangeFn: (f) => ({\n strategy: 'context-reduction',\n averageInputTokens: (f.details as Record<string, unknown>).averageInputTokens,\n }),\n },\n 'candidate-downgrade': {\n actionType: 'model-switch',\n titleFn: (f) => `Evaluate cheaper model for ${extractWorkflow(f)}`,\n descriptionFn: (f) =>\n `${f.summary} This is an A/B test candidate — try a cheaper model on this workflow and compare quality.`,\n suggestedChangeFn: () => ({\n strategy: 'model-downgrade',\n candidates: ['claude-3-haiku', 'gpt-4o-mini'],\n }),\n },\n 'idle-spend': {\n actionType: 'other',\n titleFn: (f) => `Review cadence for ${extractWorkflow(f)}`,\n descriptionFn: (f) =>\n `${f.summary} Consider reducing polling frequency or switching to an event-driven approach.`,\n suggestedChangeFn: () => ({\n strategy: 'cadence-review',\n }),\n },\n};\n\nfunction extractWorkflow(finding: Finding): string {\n const details = finding.details as Record<string, unknown>;\n return (details.workflow as string) || finding.scopeId || 'this workflow';\n}\n\nfunction buildSingleRecommendation(finding: Finding): XergRecommendation {\n const template = templatesByKind[finding.kind];\n\n if (template) {\n return {\n id: sha1(`rec:${finding.id}:${template.actionType}`),\n findingId: finding.id,\n kind: finding.kind,\n title: template.titleFn(finding),\n description: template.descriptionFn(finding),\n estimatedSavingsUsd: finding.costImpactUsd,\n confidence: finding.confidence,\n actionType: template.actionType,\n suggestedChange: template.suggestedChangeFn?.(finding),\n };\n }\n\n return {\n id: sha1(`rec:${finding.id}:other`),\n findingId: finding.id,\n kind: finding.kind,\n title: `Review: ${finding.title}`,\n description: finding.summary,\n estimatedSavingsUsd: finding.costImpactUsd,\n confidence: finding.confidence,\n actionType: 'other',\n };\n}\n\nexport function buildRecommendations(summary: AuditSummary): XergRecommendation[] {\n return summary.findings.map(buildSingleRecommendation);\n}\n","import type {\n AuditSummary,\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 formatUsdDelta(value: number) {\n const sign = value > 0 ? '+' : '';\n return `${sign}${formatUsd(value)}`;\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 topSavingsTest(summary: AuditSummary) {\n return (\n summary.findings\n .filter((finding) => finding.classification === 'opportunity')\n .sort((left, right) => {\n const leftPriority = left.kind === 'candidate-downgrade' ? 1 : 0;\n const rightPriority = right.kind === 'candidate-downgrade' ? 1 : 0;\n\n if (leftPriority !== rightPriority) {\n return rightPriority - leftPriority;\n }\n\n return right.costImpactUsd - left.costImpactUsd;\n })[0] ?? null\n );\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 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\nexport function renderDoctorReport(report: DoctorReport) {\n const sections = [\n '# Xerg doctor',\n '',\n report.canAudit ? 'OpenClaw sources detected.' : 'No OpenClaw sources detected.',\n '',\n '## Defaults',\n `- gateway logs: ${report.defaults.gatewayPattern}`,\n `- session files: ${report.defaults.sessionsPattern}`,\n '',\n '## Sources',\n ...(report.sources.length > 0\n ? report.sources.map((source) => `- [${source.kind}] ${source.path}`)\n : ['- none']),\n '',\n '## Notes',\n ...report.notes.map((note) => `- ${note}`),\n ];\n\n return sections.join('\\n');\n}\n\nexport function renderTerminalSummary(summary: AuditSummary) {\n const wasteFindings = summary.findings.filter((finding) => finding.classification === 'waste');\n const opportunityFindings = summary.findings.filter(\n (finding) => finding.classification === 'opportunity',\n );\n const topSavings = topSavingsTest(summary);\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 '## High-confidence waste',\n ...renderFindingList(wasteFindings, 'none detected'),\n '',\n '## Opportunities',\n ...renderFindingList(opportunityFindings, 'none detected'),\n '',\n '## First savings test',\n ...(topSavings\n ? [\n `- Start with ${topSavings.title}: ${formatUsd(topSavings.costImpactUsd)} of potential impact`,\n `- Why this test first: ${topSavings.summary}`,\n ]\n : ['- No savings test surfaced yet']),\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 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 '## 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\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 = 1;\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 findings: summary.findings.map(toWireFinding),\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","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';\n\nexport interface PushConfig {\n apiKey: string;\n apiUrl: string;\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 };\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 };\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 };\n }\n\n throw new Error(\n `No API key configured. Set XERG_API_KEY, add \"apiKey\" to ${CONFIG_PATH}, or run \\`xerg 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 { 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}): Promise<PullResult> {\n const { source, since, keepFiles = false } = opts;\n\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\n const useRsync = isRsyncAvailable();\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\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 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 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\n return result;\n}\n\nexport async function runRemoteDoctor(opts: {\n source: RemoteSource;\n}): Promise<RemoteDoctorReport> {\n const { source } = opts;\n const notes: string[] = [];\n\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 notes.push('SSH connectivity: OK');\n\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 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 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}): Promise<PullResult> {\n const { source, since, keepFiles = false } = opts;\n const target = source.railway;\n\n const { status } = railwayExec('echo ok', target);\n if (status !== 0) {\n throw new Error(\n `Cannot reach Railway service${target ? ` (project: ${target.projectId})` : ' (linked project)'}. Check railway CLI auth and service configuration.`,\n );\n }\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 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.exists) {\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 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 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.`,\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\n return result;\n}\n\nexport async function runRailwayDoctor(opts: {\n source: RemoteSource;\n}): Promise<RailwayDoctorReport> {\n const { source } = opts;\n const target = source.railway;\n const notes: string[] = [];\n\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 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 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}`\n : 'Cannot reach linked service. Run: railway link',\n defaultPaths: emptyDefaultPaths(),\n alternateSessionPaths: [],\n notes: [\n ...notes,\n target\n ? `Service unreachable (project: ${target.projectId}, service: ${target.serviceId})`\n : 'Service unreachable. Ensure a project is linked with: railway link',\n ],\n };\n }\n\n notes.push('Service connectivity: OK');\n\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 if (source.logFile || source.sessionsDir) {\n const logCheck = source.logFile ? checkRemotePath(source.logFile, target) : null;\n const 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 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 { doctorOpenClaw, renderDoctorReport } from '@xergai/core';\n\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 logFile?: string;\n sessionsDir?: string;\n remote?: string;\n remoteLogFile?: string;\n remoteSessionsDir?: string;\n railway?: boolean;\n railwayProject?: string;\n railwayEnvironment?: string;\n railwayService?: string;\n}\n\nexport async function runDoctorCommand(options: DoctorCommandOptions) {\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\n const report = await runRailwayDoctor({ source });\n process.stdout.write(`${renderRailwayDoctorReport(report)}\\n`);\n return;\n }\n\n if (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 });\n process.stdout.write(`${renderRemoteDoctorReport(report)}\\n`);\n return;\n }\n\n const report = await doctorOpenClaw({\n logFile: options.logFile,\n sessionsDir: options.sessionsDir,\n });\n\n process.stdout.write(`${renderDoctorReport(report)}\\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 { styleText } from 'node:util';\n\nimport {\n getCredentialsPath,\n loadStoredCredentials,\n storeCredentials,\n} from '../auth/credentials.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('xerg logout')} first to re-authenticate.\\n`,\n );\n return;\n }\n\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 const data = (await res.json()) as { token: string; teamName?: string };\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 return;\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 `xerg 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 `xerg 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 { 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 { readFileSync } from 'node:fs';\nimport { hostname } from 'node:os';\nimport type { AuditPushPayload } from '@xerg/schemas';\nimport { getDefaultDbPath, listStoredAuditSummaries, toWirePayload } from '@xergai/core';\nimport type { WirePayloadMeta } from '@xergai/core';\n\nimport { NoDataError } from '../errors.js';\nimport { loadPushConfig, pushAudit } from '../push/index.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) : loadPayloadFromCache();\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\nfunction loadPayloadFromCache(): 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 `xerg audit` first, or use `xerg push --file <path>`.',\n );\n }\n\n if (summaries.length === 0) {\n throw new NoDataError(\n 'No cached audit snapshots found. Run `xerg audit` first, or use `xerg push --file <path>`.',\n );\n }\n\n const latest = summaries[0];\n const meta = buildMeta();\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 readCliVersion(): string {\n try {\n const packageJsonPath = new URL('../../package.json', import.meta.url);\n const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { version?: string };\n return pkg.version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nfunction buildMeta(): WirePayloadMeta {\n return {\n cliVersion: readCliVersion(),\n sourceId: hostname(),\n sourceHost: hostname(),\n environment: 'local',\n };\n}\n"],"mappings":"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","names":["readFileSync","styleText","readFileSync","rmSync","run","join","mkdirSync","detected","matches","join","round","run","run","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","source","readFileSync","rmSync","buildRailwayTarget","report","formatBytes","DEFAULT_API_URL","platform","resolve","readFileSync","hostname","readFileSync","buildMeta","readCliVersion","hostname","argv","styleText","readFileSync"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/audit.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/detect/openclaw.ts","../../core/src/utils/paths.ts","../../core/src/findings/engine.ts","../../core/src/normalize/openclaw.ts","../../core/src/pricing-catalog.ts","../../core/src/utils/records.ts","../../core/src/report/summary.ts","../../core/src/audit.ts","../../core/src/recommendations.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/transport/ssh.ts","../src/transport/railway.ts","../src/transport/config.ts","../src/commands/doctor.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/push.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { readFileSync } from 'node:fs';\nimport { styleText } from 'node:util';\n\nimport { runAuditCommand } from './commands/audit.js';\nimport { runDoctorCommand } from './commands/doctor.js';\nimport { runLoginCommand } from './commands/login.js';\nimport { runLogoutCommand } from './commands/logout.js';\nimport { runPushCommand } from './commands/push.js';\nimport { NoDataError } from './errors.js';\n\ntype AuditCliOptions = {\n logFile?: string;\n sessionsDir?: 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 logFile?: string;\n sessionsDir?: 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 = readVersion();\nconst argv = process.argv.slice(2);\n\nconst command = argv[0];\n\nif (!command || command === '--help' || command === '-h' || command === 'help') {\n process.stdout.write(renderRootHelp());\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(`xerg 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(options);\n return;\n }\n\n if (command === 'doctor') {\n const options = parseDoctorOptions(argv.slice(1));\n await runDoctorCommand(options);\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 === 'login') {\n await runLoginCommand();\n return;\n }\n\n if (command === 'logout') {\n runLogoutCommand();\n return;\n }\n\n throw new Error(`Unknown command \"${command}\". Run \\`xerg --help\\` to see available commands.`);\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());\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 '--sessions-dir':\n options.sessionsDir = 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(`Unknown audit option \"${arg}\". Run \\`xerg audit --help\\` for usage.`);\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());\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(`Unknown push option \"${arg}\". Run \\`xerg push --help\\` for usage.`);\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());\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 '--sessions-dir':\n options.sessionsDir = 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(`Unknown doctor option \"${arg}\". Run \\`xerg doctor --help\\` for usage.`);\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 renderRootHelp() {\n return `xerg ${VERSION}\n\nWaste intelligence for OpenClaw workflows.\n\nUsage:\n xerg <command> [options]\n\nCommands:\n audit Analyze OpenClaw logs and produce a waste intelligence report.\n doctor Inspect your machine for OpenClaw sources and audit readiness.\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\nGlobal options:\n -h, --help Show help\n -v, --version Show version\n`;\n}\n\nfunction renderAuditHelp() {\n return `xerg audit\n\nAnalyze OpenClaw logs and produce a waste intelligence report.\n\nUsage:\n xerg audit [options]\n\nOptions:\n --log-file <path> Explicit OpenClaw gateway log file to analyze\n --sessions-dir <path> Explicit OpenClaw sessions directory 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):\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:\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\nfunction renderPushHelp() {\n return `xerg push\n\nPush a cached audit snapshot to the Xerg API.\n\nUsage:\n xerg push [options]\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 \\`xerg login\\` to authenticate via browser.\n Browser login stores a token at ~/.config/xerg/credentials.json by default.\n`;\n}\n\nfunction renderDoctorHelp() {\n return `xerg doctor\n\nInspect your machine for OpenClaw sources and audit readiness.\n\nUsage:\n xerg doctor [options]\n\nOptions:\n --log-file <path> Explicit OpenClaw gateway log file to inspect\n --sessions-dir <path> Explicit OpenClaw sessions directory to inspect\n --verbose Print progress updates to stderr while doctor runs\n\nRemote options (SSH):\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:\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\nfunction colorError(message: string) {\n return process.stderr.isTTY ? styleText('red', message) : message;\n}\n\nfunction readVersion() {\n const packageJsonPath = new URL('../package.json', import.meta.url);\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { version?: string };\n return packageJson.version ?? '0.0.0';\n}\n","import { readFileSync } from 'node:fs';\nimport { rmSync } from 'node:fs';\nimport { hostname } from 'node:os';\nimport {\n auditOpenClaw,\n buildRecommendations,\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 {\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';\n\nexport interface AuditCommandOptions {\n logFile?: string;\n sessionsDir?: 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\nconst NO_DATA_PATTERN = /no openclaw sources were detected/i;\n\nasync function auditOrNoData(\n ...args: Parameters<typeof auditOpenClaw>\n): ReturnType<typeof auditOpenClaw> {\n try {\n return await auditOpenClaw(...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 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 logger.verbose('Running a local audit.');\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 logFile: options.logFile,\n sessionsDir: options.sessionsDir,\n since: options.since,\n compare: options.compare,\n dbPath: options.db,\n noDb: options.noDb,\n onProgress: logger.verbose,\n });\n\n renderOutput(summary, options);\n\n if (options.push) {\n const meta = buildMeta({ environment: 'local', sourceId: hostname(), sourceHost: hostname() });\n await handlePush(summary, meta, options);\n }\n\n checkThresholds(summary, options);\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\nfunction sourceEnvironment(source: RemoteSource): WirePayloadMeta['environment'] {\n return source.transport === 'railway' ? 'railway' : 'remote';\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 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 onProgress: logger.verbose,\n });\n\n renderOutput(summary, options);\n\n if (options.push) {\n const meta = buildMeta({\n environment: sourceEnvironment(source),\n sourceId: source.name,\n sourceHost: source.host,\n });\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 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 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, recommendations: buildRecommendations(summaries[0].summary) }\n : {\n sources: summaries.map((s) => ({\n name: s.name,\n ...s.summary,\n recommendations: buildRecommendations(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({\n environment: sourceEnvironment(source),\n sourceId: source.name,\n sourceHost: source.host,\n });\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 readCliVersion(): string {\n try {\n const packageJsonPath = new URL('../../package.json', import.meta.url);\n const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { version?: string };\n return pkg.version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nfunction buildMeta(input: {\n environment: WirePayloadMeta['environment'];\n sourceId: string;\n sourceHost: string;\n}): WirePayloadMeta {\n return {\n cliVersion: readCliVersion(),\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 const recommendations = buildRecommendations(summary);\n const output = { ...summary, recommendations };\n process.stdout.write(`${JSON.stringify(output, 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 { 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 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 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 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\nexport function hydrateAuditSummary(summary: AuditSummary): AuditSummary {\n return {\n ...summary,\n comparisonKey:\n summary.comparisonKey ??\n buildComparisonKey({\n sources: summary.sourceFiles,\n since: summary.since,\n }),\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 notes: summary.notes ?? [],\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 { readdirSync, statSync } from 'node:fs';\nimport { isAbsolute, join, resolve, sep } from 'node:path';\n\nimport type { AuditOptions, DetectedSourceFile, DoctorReport } from '../types.js';\nimport { getDefaultGatewayPattern, getDefaultSessionsPattern } from '../utils/paths.js';\n\nfunction toDetected(path: string, kind: 'gateway' | 'sessions'): DetectedSourceFile | null {\n try {\n const stats = statSync(path);\n if (!stats.isFile()) {\n return null;\n }\n\n return {\n kind,\n path,\n sizeBytes: stats.size,\n mtimeMs: stats.mtimeMs,\n };\n } catch {\n return null;\n }\n}\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');\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');\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(getDefaultGatewayPattern()),\n collectGlobMatches(getDefaultSessionsPattern()),\n ]);\n\n const detected = [\n ...gatewayMatches.map((path) => toDetected(path, 'gateway')).filter(Boolean),\n ...sessionMatches.map((path) => toDetected(path, 'sessions')).filter(Boolean),\n ] as DetectedSourceFile[];\n\n return detected.sort((left, right) => right.mtimeMs - left.mtimeMs);\n}\n\nasync 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\nexport async function inspectOpenClawSources(options: AuditOptions): Promise<DoctorReport> {\n options.onProgress?.('Checking local OpenClaw defaults...');\n const sources = await detectOpenClawSources(options);\n const notes: string[] = [];\n\n options.onProgress?.(\n sources.length > 0\n ? `Detected ${sources.length} local source file${sources.length === 1 ? '' : 's'}.`\n : 'No local OpenClaw source files were detected.',\n );\n\n if (sources.length === 0) {\n notes.push('No OpenClaw gateway logs or session files were detected.');\n notes.push(\n 'Doctor checks local defaults by default. Use --remote or --railway to inspect remote targets.',\n );\n notes.push(\n 'Use --log-file or --sessions-dir if your OpenClaw data lives outside the defaults.',\n );\n }\n\n if (sources.some((source) => source.kind === 'gateway')) {\n notes.push('Gateway logs detected. These are preferred when cost metadata is present.');\n }\n\n if (sources.some((source) => source.kind === 'sessions')) {\n notes.push('Session transcript fallback detected. Xerg will extract usage metadata only.');\n }\n\n return {\n canAudit: sources.length > 0,\n sources,\n defaults: {\n gatewayPattern: getDefaultGatewayPattern(),\n sessionsPattern: getDefaultSessionsPattern(),\n },\n notes,\n };\n}\n","import { mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { platform } from 'node:process';\n\nexport function getAppPaths() {\n const home = homedir();\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 getDefaultSessionsPattern() {\n return join(homedir(), '.openclaw', 'agents', '*', 'sessions', '*.jsonl');\n}\n\nexport function getDefaultGatewayPattern() {\n return '/tmp/openclaw/openclaw-*.log';\n}\n","import type { Finding, NormalizedRun } 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[]): Finding[] {\n const findings: Finding[] = [];\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 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 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 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.id,\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 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 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 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 findings.sort((left, right) => right.costImpactUsd - left.costImpactUsd);\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 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","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 type {\n AuditSummary,\n DetectedSourceFile,\n Finding,\n NormalizedRun,\n SpendBreakdown,\n} from '../types.js';\nimport { sha1 } from '../utils/hash.js';\nimport { isoNow } from '../utils/time.js';\nimport { buildComparisonKey, buildTaxonomyBuckets } from './comparison.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 runs: NormalizedRun[];\n findings: Finding[];\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\n return {\n auditId: sha1(\n `${generatedAt}:${input.runs.length}:${input.sources.map((source) => source.path).join('|')}`,\n ),\n generatedAt,\n comparisonKey:\n input.comparisonKeyOverride ??\n buildComparisonKey({\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 findings: input.findings,\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","import { persistAudit } from './db/persist.js';\nimport { readLatestComparableAuditSummary } from './db/read.js';\nimport { detectOpenClawSources, inspectOpenClawSources } from './detect/openclaw.js';\nimport { buildFindings } from './findings/engine.js';\nimport { normalizeOpenClawSources } from './normalize/openclaw.js';\nimport { PRICING_CATALOG } from './pricing-catalog.js';\nimport { buildAuditComparison } from './report/comparison.js';\nimport { buildAuditSummary } from './report/summary.js';\nimport type { AuditOptions } from './types.js';\nimport { getDefaultDbPath } from './utils/paths.js';\n\nexport async function doctorOpenClaw(options: AuditOptions) {\n return inspectOpenClawSources(options);\n}\n\nexport async function auditOpenClaw(options: AuditOptions) {\n options.onProgress?.('Scanning for OpenClaw source files...');\n\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 const sources = await detectOpenClawSources(options);\n if (sources.length === 0) {\n options.onProgress?.('No OpenClaw source files were detected.');\n throw new Error(\n 'No OpenClaw sources were detected. Run `xerg doctor` or provide --log-file / --sessions-dir.',\n );\n }\n options.onProgress?.(`Detected ${sources.length} source file${sources.length === 1 ? '' : 's'}.`);\n\n options.onProgress?.('Normalizing OpenClaw source files...');\n const runs = normalizeOpenClawSources(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 = buildFindings(runs);\n const dbPath = options.noDb ? undefined : (options.dbPath ?? getDefaultDbPath());\n options.onProgress?.('Building audit summary...');\n const summary = buildAuditSummary({\n runs,\n findings,\n sources,\n since: options.since,\n dbPath,\n comparisonKeyOverride: options.comparisonKeyOverride,\n });\n\n if (options.compare && dbPath) {\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.comparison = buildAuditComparison(summary, baseline);\n } else {\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 }\n }\n\n if (dbPath) {\n options.onProgress?.(`Persisting local snapshot to ${dbPath}...`);\n persistAudit(\n {\n summary,\n runs,\n pricingCatalog: PRICING_CATALOG,\n },\n dbPath,\n );\n options.onProgress?.('Local snapshot stored.');\n } else {\n options.onProgress?.('Skipping local snapshot persistence (--no-db).');\n }\n\n return summary;\n}\n","import type { XergRecommendation } from '@xerg/schemas';\n\nimport type { AuditSummary, Finding } from './types.js';\nimport { sha1 } from './utils/hash.js';\n\ninterface RecommendationTemplate {\n actionType: XergRecommendation['actionType'];\n titleFn: (finding: Finding) => string;\n descriptionFn: (finding: Finding) => string;\n suggestedChangeFn?: (finding: Finding) => Record<string, unknown> | undefined;\n}\n\nconst templatesByKind: Record<string, RecommendationTemplate> = {\n 'retry-waste': {\n actionType: 'other',\n titleFn: () => 'Add retry backoff or reduce retry attempts',\n descriptionFn: (f) =>\n `${f.summary} Consider adding exponential backoff or reducing the maximum retry count to eliminate this overhead.`,\n suggestedChangeFn: (f) => ({\n strategy: 'exponential-backoff',\n maxRetries: 3,\n failedCallCount: (f.details as Record<string, unknown>).failedCallCount,\n }),\n },\n 'loop-waste': {\n actionType: 'other',\n titleFn: (f) => `Cap iteration depth for ${extractWorkflow(f)}`,\n descriptionFn: (f) =>\n `${f.summary} Adding an iteration limit or early-exit condition would prevent runaway loops from burning spend.`,\n suggestedChangeFn: (f) => ({\n strategy: 'iteration-cap',\n suggestedMaxIterations: 5,\n observedMaxIteration: (f.details as Record<string, unknown>).maxIteration,\n }),\n },\n 'context-outlier': {\n actionType: 'prompt-trim',\n titleFn: (f) => `Trim context for ${extractWorkflow(f)}`,\n descriptionFn: (f) =>\n `${f.summary} Reducing input token volume to near the workflow baseline would lower cost proportionally.`,\n suggestedChangeFn: (f) => ({\n strategy: 'context-reduction',\n averageInputTokens: (f.details as Record<string, unknown>).averageInputTokens,\n }),\n },\n 'candidate-downgrade': {\n actionType: 'model-switch',\n titleFn: (f) => `Evaluate cheaper model for ${extractWorkflow(f)}`,\n descriptionFn: (f) =>\n `${f.summary} This is an A/B test candidate — try a cheaper model on this workflow and compare quality.`,\n suggestedChangeFn: () => ({\n strategy: 'model-downgrade',\n candidates: ['claude-3-haiku', 'gpt-4o-mini'],\n }),\n },\n 'idle-spend': {\n actionType: 'other',\n titleFn: (f) => `Review cadence for ${extractWorkflow(f)}`,\n descriptionFn: (f) =>\n `${f.summary} Consider reducing polling frequency or switching to an event-driven approach.`,\n suggestedChangeFn: () => ({\n strategy: 'cadence-review',\n }),\n },\n};\n\nfunction extractWorkflow(finding: Finding): string {\n const details = finding.details as Record<string, unknown>;\n return (details.workflow as string) || finding.scopeId || 'this workflow';\n}\n\nfunction buildSingleRecommendation(finding: Finding): XergRecommendation {\n const template = templatesByKind[finding.kind];\n\n if (template) {\n return {\n id: sha1(`rec:${finding.id}:${template.actionType}`),\n findingId: finding.id,\n kind: finding.kind,\n title: template.titleFn(finding),\n description: template.descriptionFn(finding),\n estimatedSavingsUsd: finding.costImpactUsd,\n confidence: finding.confidence,\n actionType: template.actionType,\n suggestedChange: template.suggestedChangeFn?.(finding),\n };\n }\n\n return {\n id: sha1(`rec:${finding.id}:other`),\n findingId: finding.id,\n kind: finding.kind,\n title: `Review: ${finding.title}`,\n description: finding.summary,\n estimatedSavingsUsd: finding.costImpactUsd,\n confidence: finding.confidence,\n actionType: 'other',\n };\n}\n\nexport function buildRecommendations(summary: AuditSummary): XergRecommendation[] {\n return summary.findings.map(buildSingleRecommendation);\n}\n","import type {\n AuditSummary,\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 formatUsdDelta(value: number) {\n const sign = value > 0 ? '+' : '';\n return `${sign}${formatUsd(value)}`;\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 topSavingsTest(summary: AuditSummary) {\n return (\n summary.findings\n .filter((finding) => finding.classification === 'opportunity')\n .sort((left, right) => {\n const leftPriority = left.kind === 'candidate-downgrade' ? 1 : 0;\n const rightPriority = right.kind === 'candidate-downgrade' ? 1 : 0;\n\n if (leftPriority !== rightPriority) {\n return rightPriority - leftPriority;\n }\n\n return right.costImpactUsd - left.costImpactUsd;\n })[0] ?? null\n );\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 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\nexport function renderDoctorReport(report: DoctorReport) {\n const nextSteps = report.canAudit\n ? []\n : [\n '',\n '## Next steps',\n '- Try explicit local paths: xerg doctor --log-file /path/to/openclaw.log --sessions-dir /path/to/sessions',\n '- Inspect an SSH host: xerg doctor --remote user@host',\n '- Inspect a Railway service: xerg 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 report.canAudit ? 'OpenClaw sources detected.' : 'No OpenClaw sources detected.',\n '',\n '## Defaults',\n `- gateway logs: ${report.defaults.gatewayPattern}`,\n `- session files: ${report.defaults.sessionsPattern}`,\n '',\n '## Sources',\n ...(report.sources.length > 0\n ? report.sources.map((source) => `- [${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 renderTerminalSummary(summary: AuditSummary) {\n const wasteFindings = summary.findings.filter((finding) => finding.classification === 'waste');\n const opportunityFindings = summary.findings.filter(\n (finding) => finding.classification === 'opportunity',\n );\n const topSavings = topSavingsTest(summary);\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 '## High-confidence waste',\n ...renderFindingList(wasteFindings, 'none detected'),\n '',\n '## Opportunities',\n ...renderFindingList(opportunityFindings, 'none detected'),\n '',\n '## First savings test',\n ...(topSavings\n ? [\n `- Start with ${topSavings.title}: ${formatUsd(topSavings.costImpactUsd)} of potential impact`,\n `- Why this test first: ${topSavings.summary}`,\n ]\n : ['- No savings test surfaced yet']),\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 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 '## 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\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 = 1;\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 findings: summary.findings.map(toWireFinding),\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';\n\nexport interface PushConfig {\n apiKey: string;\n apiUrl: string;\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 };\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 };\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 };\n }\n\n throw new Error(\n `No API key configured. Set XERG_API_KEY, add \"apiKey\" to ${CONFIG_PATH}, or run \\`xerg 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 { 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 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 `Cannot reach Railway service${target ? ` (project: ${target.projectId})` : ' (linked project)'}. Check railway CLI auth and service configuration.`,\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.exists) {\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 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.`,\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}`\n : 'Cannot reach linked service. Run: railway link',\n defaultPaths: emptyDefaultPaths(),\n alternateSessionPaths: [],\n notes: [\n ...notes,\n target\n ? `Service unreachable (project: ${target.projectId}, service: ${target.serviceId})`\n : 'Service unreachable. Ensure a project is linked with: railway link',\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 if (source.logFile || source.sessionsDir) {\n const logCheck = source.logFile ? checkRemotePath(source.logFile, target) : null;\n const 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 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 { doctorOpenClaw, renderDoctorReport } 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 logFile?: string;\n sessionsDir?: 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\nexport async function runDoctorCommand(options: DoctorCommandOptions) {\n const logger = createCliLogger({ verbose: options.verbose });\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 logger.verbose('Inspecting local OpenClaw audit readiness.');\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 doctorOpenClaw({\n logFile: options.logFile,\n sessionsDir: options.sessionsDir,\n onProgress: logger.verbose,\n });\n\n process.stdout.write(`${renderDoctorReport(report)}\\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 { styleText } from 'node:util';\n\nimport {\n getCredentialsPath,\n loadStoredCredentials,\n storeCredentials,\n} from '../auth/credentials.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('xerg logout')} first to re-authenticate.\\n`,\n );\n return;\n }\n\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 const data = (await res.json()) as { token: string; teamName?: string };\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 return;\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 `xerg 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 `xerg 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 { 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 { readFileSync } from 'node:fs';\nimport { hostname } from 'node:os';\nimport type { AuditPushPayload } from '@xerg/schemas';\nimport { getDefaultDbPath, listStoredAuditSummaries, toWirePayload } from '@xergai/core';\nimport type { WirePayloadMeta } from '@xergai/core';\n\nimport { NoDataError } from '../errors.js';\nimport { loadPushConfig, pushAudit } from '../push/index.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) : loadPayloadFromCache();\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\nfunction loadPayloadFromCache(): 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 `xerg audit` first, or use `xerg push --file <path>`.',\n );\n }\n\n if (summaries.length === 0) {\n throw new NoDataError(\n 'No cached audit snapshots found. Run `xerg audit` first, or use `xerg push --file <path>`.',\n );\n }\n\n const latest = summaries[0];\n const meta = buildMeta();\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 readCliVersion(): string {\n try {\n const packageJsonPath = new URL('../../package.json', import.meta.url);\n const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { version?: string };\n return pkg.version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nfunction buildMeta(): WirePayloadMeta {\n return {\n cliVersion: readCliVersion(),\n sourceId: hostname(),\n sourceHost: hostname(),\n environment: 'local',\n };\n}\n"],"mappings":"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","names":["readFileSync","styleText","readFileSync","rmSync","run","join","mkdirSync","detected","matches","join","round","run","run","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","source","readFileSync","rmSync","buildRailwayTarget","report","formatBytes","DEFAULT_API_URL","platform","resolve","readFileSync","hostname","readFileSync","buildMeta","readCliVersion","hostname","argv","styleText","readFileSync"]}