import { resolveGatewayLaunchAgentLabel, resolveGatewaySystemdServiceName, resolveGatewayWindowsTaskName, } from "../daemon/constants.js"; import { resolveGatewayLogPaths } from "../daemon/launchd.js"; import type { GatewayServiceRuntime } from "../daemon/service-runtime.js"; import { getResolvedLoggerSettings } from "../logging.js"; type RuntimeHintOptions = { platform?: NodeJS.Platform; env?: Record; }; export function formatGatewayRuntimeSummary( runtime: GatewayServiceRuntime | undefined, ): string | null { if (!runtime) return null; const status = runtime.status ?? "unknown"; const details: string[] = []; if (runtime.pid) details.push(`pid ${runtime.pid}`); if (runtime.state && runtime.state.toLowerCase() !== status) { details.push(`state ${runtime.state}`); } if (runtime.subState) details.push(`sub ${runtime.subState}`); if (runtime.lastExitStatus !== undefined) { details.push(`last exit ${runtime.lastExitStatus}`); } if (runtime.lastExitReason) { details.push(`reason ${runtime.lastExitReason}`); } if (runtime.lastRunResult) { details.push(`last run ${runtime.lastRunResult}`); } if (runtime.lastRunTime) { details.push(`last run time ${runtime.lastRunTime}`); } if (runtime.detail) details.push(runtime.detail); return details.length > 0 ? `${status} (${details.join(", ")})` : status; } export function buildGatewayRuntimeHints( runtime: GatewayServiceRuntime | undefined, options: RuntimeHintOptions = {}, ): string[] { const hints: string[] = []; if (!runtime) return hints; const platform = options.platform ?? process.platform; const env = options.env ?? process.env; const fileLog = (() => { try { return getResolvedLoggerSettings().file; } catch { return null; } })(); if (runtime.cachedLabel && platform === "darwin") { const label = resolveGatewayLaunchAgentLabel(env.CLAWDBOT_PROFILE); hints.push( `LaunchAgent label cached but plist missing. Clear with: launchctl bootout gui/$UID/${label}`, ); hints.push("Then reinstall: clawdbot daemon install"); } if (runtime.missingUnit) { hints.push("Service not installed. Run: clawdbot daemon install"); if (fileLog) hints.push(`File logs: ${fileLog}`); return hints; } if (runtime.status === "stopped") { hints.push( "Service is loaded but not running (likely exited immediately).", ); if (fileLog) hints.push(`File logs: ${fileLog}`); if (platform === "darwin") { const logs = resolveGatewayLogPaths(env); hints.push(`Launchd stdout (if installed): ${logs.stdoutPath}`); hints.push(`Launchd stderr (if installed): ${logs.stderrPath}`); } else if (platform === "linux") { const unit = resolveGatewaySystemdServiceName(env.CLAWDBOT_PROFILE); hints.push( `Logs: journalctl --user -u ${unit}.service -n 200 --no-pager`, ); } else if (platform === "win32") { const task = resolveGatewayWindowsTaskName(env.CLAWDBOT_PROFILE); hints.push(`Logs: schtasks /Query /TN "${task}" /V /FO LIST`); } } return hints; }