{"version":3,"file":"inspect.mjs","names":[],"sources":["../../../src/cli/commands/inspect.ts"],"sourcesContent":["import { existsSync, watch } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { findConfigPath, MISSING_CONFIG_MESSAGE } from \"../../config\";\nimport type {\n  KillOptions,\n  KillResult,\n  LogsOptions,\n  LogsResult,\n  PsResult,\n  TypecheckWorkspaceResult,\n} from \"../../contract\";\nimport { colors, frames, gradients, icons } from \"../../utils/theme\";\nimport { exitCodeFor } from \"../exit-codes\";\nimport { printConfigView } from \"../render/config\";\nimport { formatTimeAgo } from \"../render/logs\";\nimport { renderPs } from \"../render/processes\";\nimport { compareSemver } from \"../status\";\nimport type { ResultRenderer } from \"./context\";\n\nexport const inspectRenderers: Record<string, ResultRenderer> = {\n  config: async (result, _ctx) => {\n    if (!result.config) {\n      console.error(MISSING_CONFIG_MESSAGE);\n      process.exit(1);\n    }\n\n    printConfigView(result.config);\n    process.stdout.write(`${JSON.stringify(result.config, null, 2)}\\n`);\n    return;\n  },\n\n  status: async (result, _ctx) => {\n    console.log();\n    if (exitCodeFor(result) === 1) {\n      console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n      process.exit(1);\n    }\n    console.log(colors.cyan(frames.top(52)));\n    console.log(`  ${icons.app} ${gradients.cyber(\"STATUS\")}`);\n    console.log(colors.cyan(frames.bottom(52)));\n    console.log();\n    if (result.extends) console.log(`  ${colors.dim(\"Extends:\")}     ${result.extends}`);\n    if (result.account) console.log(`  ${colors.dim(\"Account:\")}     ${result.account}`);\n    if (result.domain) console.log(`  ${colors.dim(\"Domain:\")}      ${result.domain}`);\n    console.log();\n    console.log(`  ${colors.dim(\"Packages:\")}`);\n    for (const pkg of result.packages) {\n      const hasUpdate = pkg.installed && pkg.latest && compareSemver(pkg.installed, pkg.latest) < 0;\n      const versionStr = hasUpdate\n        ? `${pkg.installed}  →  ${pkg.latest}`\n        : pkg.installed || \"not installed\";\n      const label = hasUpdate ? colors.yellow(versionStr) : colors.dim(versionStr);\n      console.log(`    ${colors.dim(`${pkg.name}`)}  ${label}`);\n    }\n    console.log();\n    if (result.lastSync) {\n      const ago = formatTimeAgo(result.lastSync);\n      console.log(`  ${colors.dim(\"Last sync:\")}   ${ago}`);\n    } else {\n      console.log(`  ${colors.dim(\"Last sync:\")}   never`);\n    }\n    const envLabel =\n      result.envFile === \"found\"\n        ? colors.green(\"found\")\n        : result.envFile === \"example-only\"\n          ? colors.yellow(\"missing (only .env.example found)\")\n          : colors.error(\"missing\");\n    console.log(`  ${colors.dim(\".env:\")}         ${envLabel}`);\n    if (result.parentReachable !== undefined) {\n      const parentLabel = result.parentReachable\n        ? colors.green(\"reachable\")\n        : colors.error(\"unreachable\");\n      console.log(`  ${colors.dim(\"Parent:\")}      ${parentLabel}`);\n    }\n    const hasUpdates = result.packages.some(\n      (p: { installed?: string; latest?: string }) =>\n        p.installed && p.latest && compareSemver(p.installed, p.latest) < 0,\n    );\n    if (hasUpdates) {\n      console.log();\n      console.log(\n        colors.dim(\n          `  Run ${colors.cyan(\"bos upgrade\")} to update packages and sync template files.`,\n        ),\n      );\n    }\n    console.log();\n    return;\n  },\n\n  ps: async (result, _ctx) => {\n    renderPs(result as PsResult);\n    return;\n  },\n\n  logs: async (result, ctx) => {\n    const input = ctx.input;\n    const logsResult = result as LogsResult;\n    const opts = input as LogsOptions;\n    for (const line of logsResult.lines) {\n      console.log(line);\n    }\n    if (logsResult.lines.length === 0) {\n      console.log(colors.dim(`  No matching log lines in ${logsResult.logFile}.`));\n    }\n    if (opts.follow) {\n      if (logsResult.logFile === \"unknown\" || !existsSync(logsResult.logFile)) {\n        console.log(colors.dim(\"  No log file to follow — nothing was found on disk.\"));\n      } else {\n        const filter = opts.service;\n        let byteOffset = 0;\n        for (const line of logsResult.lines) byteOffset += Buffer.byteLength(line, \"utf8\") + 1;\n        const followMatch = (line: string): boolean => {\n          if (!filter) return true;\n          const source = /\\] \\[([^\\]]+)\\] \\[(?:OUT|ERR)\\] /.exec(line)?.[1];\n          return source === filter || source === `plugin:${filter}`;\n        };\n        const watcher = watch(logsResult.logFile, (event) => {\n          if (event !== \"change\") return;\n          void readFile(logsResult.logFile, \"utf8\")\n            .then((text) => {\n              const newLines = text\n                .slice(byteOffset)\n                .split(\"\\n\")\n                .filter((line) => line.length > 0 && followMatch(line));\n              byteOffset = Buffer.byteLength(text, \"utf8\");\n              for (const line of newLines) {\n                console.log(line);\n              }\n            })\n            .catch(() => {\n              // the followed file was rotated or deleted — stop following\n              watcher.close();\n            });\n        });\n        console.log(colors.dim(\"  Following — Ctrl+C to stop.\"));\n        process.on(\"SIGINT\", () => {\n          watcher.close();\n          process.exit(0);\n        });\n      }\n    }\n    return;\n  },\n\n  kill: async (result, ctx) => {\n    const input = ctx.input;\n    const killResult = result as KillResult;\n    console.log();\n    if (killResult.status === \"error\") {\n      console.error(`[CLI] ${killResult.error || \"Unknown error\"}`);\n      process.exit(1);\n    }\n    if (killResult.killed.length > 0) {\n      console.log(colors.green(`${icons.ok} Sent ${killResult.killed.length} kill signal(s)`));\n      for (const k of killResult.killed) {\n        console.log(`  ${colors.dim(\"pid\")} ${k.pid}  ${colors.dim(k.configDir)}`);\n      }\n    }\n    if (killResult.skipped.length > 0) {\n      console.log(colors.yellow(`${icons.err} ${killResult.skipped.length} skipped`));\n      for (const s of killResult.skipped) {\n        console.log(`  ${colors.dim(\"pid\")} ${s.pid}  ${colors.dim(s.reason)}`);\n      }\n    }\n    if (killResult.killed.length === 0 && killResult.skipped.length === 0) {\n      const opts = input as KillOptions;\n      if (opts.all) {\n        console.log(colors.dim(\"  No tracked processes to kill.\"));\n      } else {\n        const configPath = findConfigPath();\n        const dir = opts.configDir ?? (configPath ? resolve(dirname(configPath)) : process.cwd());\n        console.log(colors.dim(`  No tracked processes for ${dir}`));\n        console.log(colors.dim(`  Use ${colors.cyan(\"--all\")} to kill across all directories.`));\n      }\n    }\n    console.log();\n    return;\n  },\n\n  typesGen: async (result, _ctx) => {\n    console.log();\n    if (exitCodeFor(result) === 1) {\n      console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n      process.exit(1);\n    }\n    console.log(colors.green(`${icons.ok} Types generated`));\n    if (result.generated.length > 0) {\n      console.log(`  ${colors.dim(\"Written:\")}`);\n      for (const f of result.generated) console.log(`    ${colors.dim(f)}`);\n    }\n    if (result.fetched.length > 0 || result.skipped.length > 0 || result.failed.length > 0) {\n      console.log(`  ${colors.dim(\"Contract sources:\")}`);\n      for (const entry of result.fetched) {\n        const space = entry.indexOf(\" \");\n        const key = space !== -1 ? entry.slice(0, space) : entry;\n        const rest = space !== -1 ? entry.slice(space + 1) : \"\";\n        const restSpace = rest.indexOf(\" \");\n        const detail = restSpace !== -1 ? rest.slice(restSpace + 1) : \"\";\n        console.log(`    ${key} ${colors.cyan(\"remote\")}${detail ? ` ${colors.dim(detail)}` : \"\"}`);\n      }\n      for (const entry of result.skipped) {\n        const space = entry.indexOf(\" \");\n        const key = space !== -1 ? entry.slice(0, space) : entry;\n        const rest = space !== -1 ? entry.slice(space + 1) : \"\";\n        if (rest === \"no URL resolved\") {\n          console.log(`    ${key} ${colors.dim(\"no URL resolved\")}`);\n          continue;\n        }\n        const restSpace = rest.indexOf(\" \");\n        const detail = restSpace !== -1 ? rest.slice(restSpace + 1) : \"\";\n        console.log(`    ${key} ${colors.dim(\"local\")}${detail ? ` ${colors.dim(detail)}` : \"\"}`);\n      }\n    }\n    if (result.failed.length > 0) {\n      console.log(`  ${colors.yellow(\"Failed:\")}`);\n      for (const f of result.failed) {\n        const colon = f.indexOf(\": \");\n        if (colon !== -1) {\n          console.log(`    ${colors.error(f.slice(0, colon))}${colors.dim(f.slice(colon))}`);\n        } else {\n          console.log(`    ${colors.error(f)}`);\n        }\n      }\n    }\n    console.log();\n    return;\n  },\n\n  typecheck: async (result, _ctx) => {\n    console.log();\n    if (exitCodeFor(result) === 1) {\n      console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n      process.exit(1);\n    }\n    const failed = result.results.filter((r: TypecheckWorkspaceResult) => !r.passed);\n    const passed = result.results.filter((r: TypecheckWorkspaceResult) => r.passed);\n    console.log(colors.cyan(frames.top(52)));\n    console.log(`  ${icons.app} ${gradients.cyber(\"TYPECHECK\")}`);\n    console.log(colors.cyan(frames.bottom(52)));\n    console.log();\n    for (const r of result.results) {\n      const icon = r.passed ? colors.green(\"✓\") : colors.error(\"✗\");\n      console.log(`  ${icon} ${r.workspace}`);\n    }\n    if (result.skipped.length > 0) {\n      console.log(`  ${colors.dim(`Skipped: ${result.skipped.join(\", \")}`)}`);\n    }\n    console.log();\n    if (failed.length > 0) {\n      console.log(`  ${colors.error(`${failed.length} failed`)}`);\n      for (const f of failed) {\n        if (f.error) console.log(`    ${colors.dim(f.error)}`);\n      }\n      console.log();\n      process.exit(1);\n    }\n    console.log(`  ${colors.green(`${passed.length} passed`)}`);\n    console.log();\n    return;\n  },\n\n  mfCheck: async (result, _ctx) => {\n    console.log();\n    console.log(\n      `  ${colors.dim(\"Host\")}   ${result.hostReachable ? colors.green(\"OK  \") : colors.error(\"FAIL\")}  ${\n        result.hostVersion ?? \"unreachable\"\n      }${result.hostReason ? `  (${result.hostReason})` : \"\"}`,\n    );\n    for (const r of result.remotes) {\n      const tag = r.ok ? colors.green(\"OK  \") : colors.error(\"FAIL\");\n      console.log(\n        `  ${colors.dim(r.role.padEnd(10))} ${tag} ${r.url}  pluginVersion=${r.pluginVersion ?? \"?\"}${\n          r.reason ? `  ↳ ${r.reason}` : \"\"\n        }`,\n      );\n    }\n    if (result.ui) {\n      for (const slot of result.ui.slots) {\n        const tag = slot.ok ? colors.green(\"OK  \") : colors.error(\"FAIL\");\n        console.log(\n          `  ${colors.dim(`ui:${slot.slot}`.padEnd(10))} ${tag} ${slot.url}${\n            slot.reason ? `  ↳ ${slot.reason}` : \"\"\n          }`,\n        );\n      }\n    }\n    if (result.platform) {\n      for (const v of result.platform.violations) {\n        console.log(`  ${colors.dim(\"platform\".padEnd(10))} ${colors.error(\"FAIL\")} ${v.message}`);\n      }\n      if (result.platform.ok) {\n        console.log(\n          `  ${colors.dim(\"platform\".padEnd(10))} ${colors.green(\"OK  \")} release contract satisfied`,\n        );\n      }\n    }\n    console.log();\n    if (result.status !== \"ok\") {\n      console.log(\n        colors.error(\n          \"  mf-compat: ✗ federation manifests NOT compatible — redeploy affected plugin(s) so pluginVersion and shared versions match host\",\n        ),\n      );\n      console.log();\n      process.exit(1);\n    }\n    console.log(colors.green(\"  mf-compat: ✓ all federation manifests compatible\"));\n    console.log();\n    return;\n  },\n\n  platformManifest: async (result, _ctx) => {\n    console.log();\n    if (result.status === \"fail\") {\n      console.error(`[CLI] ${result.error || \"platform manifest resolution failed\"}`);\n      if (result.drift) {\n        console.log();\n        console.log(\n          colors.error(\n            `  parent platform is ${result.drift.published} (published), you pinned ${result.drift.pinned} — run \\`bos upgrade\\` to realign`,\n          ),\n        );\n      }\n      console.log();\n      process.exit(1);\n    }\n    if (result.status === \"absent\") {\n      console.log(\n        colors.yellow(\n          `  ${icons.err} No platform release manifest resolves${result.error ? ` — ${result.error}` : \"\"}.`,\n        ),\n      );\n      console.log(\n        colors.dim(\"  Children fall back to the parent-repo tarball walk (ADR 0034 pt 7).\"),\n      );\n      console.log();\n      return;\n    }\n    console.log(\n      `  ${colors.dim(\"Platform\")}  ${colors.green(result.version ?? \"?\")}  ${colors.dim(`(${result.source}${result.fromCache ? \", cached\" : \"\"})`)}`,\n    );\n    if (result.compat) {\n      for (const v of result.compat.violations) {\n        console.log(`  ${colors.error(\"FAIL\")}  ${v.message}`);\n      }\n      console.log();\n      if (!result.compat.ok) {\n        console.log(\n          colors.error(\n            \"  platform-compat: ✗ the workspace does not satisfy this release's compat contract — bump the framework or clear the pin\",\n          ),\n        );\n        console.log();\n        process.exit(1);\n      }\n      console.log(colors.green(\"  platform-compat: ✓ workspace satisfies the release contract\"));\n    }\n    console.log();\n    return;\n  },\n};\n"],"mappings":"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"}