{"version":3,"file":"import.cjs","names":["existsSync","statSync","parseGitHubUrl","parseBosUrl","resolve","isAbsolute","join","readFileSync","lstatSync","computeSnapshotHash","relative","dirname","fetchResponse","WorkspaceVersionManifestSchema","computeSriHash","localConfigEntryPath","walkExtendsChain","resolveExtendsRef","mkdtempSync","tmpdir","tarExtract","downloadTarball","listWorkspaceSubtreeFiles","readSnapshot","mergePackageJson","writeSnapshot","runPnpmInstall","findWorkspaceRoot","runTypesGen"],"sources":["../../../src/services/scaffold/import.ts"],"sourcesContent":["import {\n  copyFileSync,\n  existsSync,\n  lstatSync,\n  mkdirSync,\n  mkdtempSync,\n  readFileSync,\n  rmSync,\n  statSync,\n  writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { type SourceRef, WorkspaceVersionManifestSchema } from \"every-plugin/version-manifest\";\nimport { glob } from \"glob\";\nimport { extract as tarExtract } from \"tar\";\nimport { localConfigEntryPath } from \"../../config\";\nimport type {\n  ImportMigrationCollision,\n  ImportOptions,\n  ImportResult,\n  ImportRouteDelta,\n} from \"../../contract\";\nimport type { ExtendsConfig } from \"../../types\";\nimport { fetchResponse } from \"../../utils/http-client\";\nimport { computeSnapshotHash } from \"../../utils/snapshot-hash\";\nimport { listWorkspaceSubtreeFiles } from \"../../utils/workspace-subtree\";\nimport { computeSriHash } from \"../deploy/integrity\";\nimport { parseBosUrl } from \"../registry/fastkv\";\nimport { resolveExtendsRef } from \"../resolution/merge\";\nimport type { ResolutionIo } from \"../resolution/session\";\nimport { type WalkLink, walkExtendsChain } from \"../resolution/session\";\nimport { findWorkspaceRoot } from \"../workspace/workspace\";\nimport { downloadTarball, parseGitHubUrl, runPnpmInstall, runTypesGen } from \"./init\";\nimport { readSnapshot, writeSnapshot } from \"./snapshot\";\nimport { mergePackageJson } from \"./sync\";\n\nconst IMPORT_SNAPSHOT_FILE = \"import-snapshot.json\";\nconst IMPORT_REPORT_FILE = \"import-report.md\";\n\nexport const IMPORT_REPORT_PATH = `.bos/${IMPORT_REPORT_FILE}`;\n\nexport type ImportFromSpec =\n  | { kind: \"github\"; repo: string; ref?: string }\n  | { kind: \"archive\"; url: string; integrity: string }\n  | { kind: \"bos\"; bosUrl: string; account: string; gateway: string }\n  | { kind: \"local\"; dir: string };\n\nexport interface ImportChainProvenance {\n  /** the ref the chain was walked from: the bos:// source or the child's resolved extends */\n  extendsRef: string;\n  /** the runtime whose own config declares the workspace */\n  ancestorRef: string;\n  /** git ref pinned from the ancestor's published version manifest, when present */\n  pinnedSha?: string;\n  /** GitHub coordinate resolved rootward, when the chain publishes one */\n  repository?: string;\n  /** source archive coordinate from the ancestor's version manifest, when published */\n  sourceArchive?: { file: string; url: string; integrity: string };\n  warnings: string[];\n}\n\nexport type ImportFileClass =\n  | { kind: \"added\" }\n  | { kind: \"unchanged\" }\n  | { kind: \"updated\" }\n  | { kind: \"preserved-local\" }\n  | { kind: \"preserved-local-edit\" }\n  | { kind: \"merged\" }\n  | { kind: \"conflict\"; reason: \"no-baseline\" | \"both-changed\" };\n\nexport interface MigrationEntry {\n  idx: number;\n  tag: string;\n  sha: string | null;\n}\n\nexport interface ImportReportAnalysis {\n  workspace: string;\n  from: string;\n  ref: string;\n  resolvedSha?: string;\n  sourceKind: \"github\" | \"local\" | \"archive\";\n  chain?: ImportChainProvenance;\n  added: string[];\n  updated: string[];\n  unchanged: string[];\n  preservedLocal: string[];\n  preservedLocalEdit: string[];\n  merged: string[];\n  conflicts: Array<{ path: string; reason: \"no-baseline\" | \"both-changed\"; held: boolean }>;\n  routeDelta?: ImportRouteDelta;\n  migrationCollisions: ImportMigrationCollision[];\n  migrationReconciliation: MigrationReconciliation | null;\n  heldBackMigrations: string[];\n}\n\nexport interface ImportDeps {\n  confirm?: (info: {\n    workspace: string;\n    conflictCount: number;\n    migrationCollisionCount: number;\n    heldCount: number;\n    appendedCount: number;\n  }) => Promise<boolean>;\n}\n\nfunction isExistingDir(path: string): boolean {\n  try {\n    return existsSync(path) && statSync(path).isDirectory();\n  } catch {\n    return false;\n  }\n}\n\nfunction normalizeGithubRepo(spec: string): string | null {\n  if (parseGitHubUrl(spec)) {\n    return spec;\n  }\n  const match = spec.match(/^([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+?)(?:\\.git)?\\/?$/);\n  if (!match?.[1] || !match[2]) return null;\n  if (match[1] === \".\" || match[1] === \"..\" || match[2] === \".\" || match[2] === \"..\") return null;\n  return `https://github.com/${match[1]}/${match[2]}`;\n}\n\nexport function parseFromSpec(spec: string): ImportFromSpec {\n  const trimmed = spec.trim();\n  if (!trimmed) {\n    throw new Error(\n      \"--from is required: bos://<account>/<gateway>, <owner>/<repo>[@<ref>], a GitHub URL, or a local directory\",\n    );\n  }\n\n  if (trimmed.startsWith(\"bos://\")) {\n    const hashIndex = trimmed.indexOf(\"#\");\n    const bosPart = hashIndex === -1 ? trimmed : trimmed.slice(0, hashIndex);\n    const target = hashIndex === -1 ? undefined : trimmed.slice(hashIndex + 1).trim();\n    if (target) {\n      throw new Error(\n        `Targeted extends refs are not supported for import sources: ${spec}. Omit the #target and pass the workspace as the positional argument.`,\n      );\n    }\n    const parsed = parseBosUrl(bosPart);\n    if (parsed.pathSegments.length > 0) {\n      throw new Error(`Unsupported bos:// path — expected bos://<account>/<gateway>: ${spec}`);\n    }\n    return {\n      kind: \"bos\",\n      bosUrl: `bos://${parsed.accountId}/${parsed.gatewayId}`,\n      account: parsed.accountId,\n      gateway: parsed.gatewayId,\n    };\n  }\n\n  if (trimmed.startsWith(\"/\") || trimmed.startsWith(\"./\") || trimmed.startsWith(\"../\")) {\n    if (!isExistingDir(trimmed)) {\n      throw new Error(`Local directory not found: ${trimmed}`);\n    }\n    return { kind: \"local\", dir: resolve(trimmed) };\n  }\n\n  const at = trimmed.indexOf(\"@\");\n  if (at > 0) {\n    const head = trimmed.slice(0, at);\n    const ref = trimmed.slice(at + 1);\n    const repo = normalizeGithubRepo(head);\n    if (repo && ref) {\n      return { kind: \"github\", repo, ref };\n    }\n  }\n\n  const repo = normalizeGithubRepo(trimmed);\n  if (repo) {\n    return { kind: \"github\", repo };\n  }\n\n  if (isExistingDir(trimmed)) {\n    return { kind: \"local\", dir: resolve(trimmed) };\n  }\n\n  throw new Error(\n    `Cannot parse --from source: ${spec}. Expected bos://<account>/<gateway>, <owner>/<repo>[@<ref>], a GitHub URL, or a local directory.`,\n  );\n}\n\nexport function normalizeWorkspacePath(input: string): string {\n  const trimmed = input.trim().replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\").replace(/\\/+$/, \"\");\n  if (isAbsolute(input)) {\n    throw new Error(`Workspace path must be repo-relative: ${input}`);\n  }\n  if (!trimmed || trimmed === \".\" || trimmed === \"..\") {\n    throw new Error(`Invalid workspace path: ${input}`);\n  }\n  const segments = trimmed.split(\"/\");\n  if (segments.some((segment) => segment === \"\" || segment === \".\" || segment === \"..\")) {\n    throw new Error(`Invalid workspace path: ${input}`);\n  }\n  return trimmed;\n}\n\nexport function classifyImportFile(input: {\n  localHash: string | null;\n  upstreamHash: string;\n  baselineHash: string | undefined;\n  mergeable: boolean;\n}): ImportFileClass {\n  const { localHash, upstreamHash, baselineHash, mergeable } = input;\n  if (localHash === null) {\n    return { kind: \"added\" };\n  }\n  if (localHash === upstreamHash) {\n    return { kind: \"unchanged\" };\n  }\n  if (baselineHash === undefined) {\n    return mergeable ? { kind: \"merged\" } : { kind: \"conflict\", reason: \"no-baseline\" };\n  }\n  if (localHash === baselineHash) {\n    return mergeable ? { kind: \"merged\" } : { kind: \"updated\" };\n  }\n  if (upstreamHash === baselineHash) {\n    return { kind: \"preserved-local-edit\" };\n  }\n  return mergeable ? { kind: \"merged\" } : { kind: \"conflict\", reason: \"both-changed\" };\n}\n\nexport function extractContractRoutes(source: string): string[] {\n  const routes = new Set<string>();\n  const marker = \".route(\";\n  let cursor = source.indexOf(marker);\n  while (cursor !== -1) {\n    const open = cursor + marker.length - 1;\n    let depth = 0;\n    let end = open;\n    for (; end < source.length; end++) {\n      const char = source[end];\n      if (char === \"(\") {\n        depth++;\n      } else if (char === \")\") {\n        depth--;\n        if (depth === 0) break;\n      }\n    }\n    const arg = source.slice(open + 1, end);\n    const method = arg.match(/\\bmethod:\\s*[\"']([A-Za-z]+)[\"']/)?.[1];\n    const path = arg.match(/\\bpath:\\s*[\"']([^\"']+)[\"']/)?.[1];\n    if (method && path) {\n      routes.add(`${method} ${path}`);\n    }\n    cursor = source.indexOf(marker, cursor + 1);\n  }\n  return [...routes].sort();\n}\n\nexport function computeRouteDelta(ours: string[], theirs: string[]): ImportRouteDelta {\n  const oursSet = new Set(ours);\n  const theirsSet = new Set(theirs);\n  return {\n    oursOnly: ours.filter((route) => !theirsSet.has(route)),\n    theirsOnly: theirs.filter((route) => !oursSet.has(route)),\n  };\n}\n\nasync function collectContractRouteSources(\n  root: string,\n  workspace: string,\n): Promise<string[] | null> {\n  const sources: string[] = [];\n  const mainPath = join(root, workspace, \"src\", \"contract.ts\");\n  if (existsSync(mainPath)) {\n    sources.push(readFileSync(mainPath, \"utf-8\"));\n  }\n  const splitDir = join(root, workspace, \"src\", \"contract\");\n  if (existsSync(splitDir) && lstatSync(splitDir).isDirectory()) {\n    const matches = await glob(\"**/*.{ts,tsx}\", {\n      cwd: splitDir,\n      nodir: true,\n      absolute: false,\n    });\n    for (const match of matches.sort()) {\n      sources.push(readFileSync(join(splitDir, match), \"utf-8\"));\n    }\n  }\n  return sources.length > 0 ? sources : null;\n}\n\nfunction extractWorkspaceRoutes(sources: string[] | null): string[] | null {\n  if (sources === null) {\n    return null;\n  }\n  const routes = new Set<string>();\n  for (const source of sources) {\n    for (const route of extractContractRoutes(source)) {\n      routes.add(route);\n    }\n  }\n  return [...routes].sort();\n}\n\nexport function loadMigrationEntries(root: string, workspace: string): MigrationEntry[] | null {\n  const journalPath = journalPathFor(root, workspace);\n  if (!existsSync(journalPath)) {\n    return null;\n  }\n  let journal: unknown;\n  try {\n    journal = JSON.parse(readFileSync(journalPath, \"utf-8\"));\n  } catch {\n    return null;\n  }\n  const entries = (journal as { entries?: unknown }).entries;\n  if (!Array.isArray(entries)) {\n    return null;\n  }\n  const migrationsDir = join(root, workspace, \"src\", \"db\", \"migrations\");\n  const result: MigrationEntry[] = [];\n  for (const raw of entries) {\n    const entry = raw as { idx?: unknown; tag?: unknown };\n    if (typeof entry.idx !== \"number\" || typeof entry.tag !== \"string\") {\n      continue;\n    }\n    const sqlPath = join(migrationsDir, `${entry.tag}.sql`);\n    let sha: string | null = null;\n    if (existsSync(sqlPath)) {\n      try {\n        sha = computeSnapshotHash(readFileSync(sqlPath));\n      } catch {\n        sha = null;\n      }\n    }\n    result.push({ idx: entry.idx, tag: entry.tag, sha });\n  }\n  return result.sort((a, b) => a.idx - b.idx);\n}\n\ninterface RawMigrationJournal {\n  journal: Record<string, unknown>;\n  entries: Record<string, unknown>[];\n}\n\nfunction journalPathFor(root: string, workspace: string): string {\n  return join(root, workspace, \"src\", \"db\", \"migrations\", \"meta\", \"_journal.json\");\n}\n\nfunction loadRawJournal(root: string, workspace: string): RawMigrationJournal | null {\n  const journalPath = journalPathFor(root, workspace);\n  if (!existsSync(journalPath)) {\n    return null;\n  }\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(readFileSync(journalPath, \"utf-8\"));\n  } catch {\n    return null;\n  }\n  if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n    return null;\n  }\n  const entries = (parsed as { entries?: unknown }).entries;\n  if (!Array.isArray(entries)) {\n    return null;\n  }\n  return {\n    journal: parsed as Record<string, unknown>,\n    entries: entries as Record<string, unknown>[],\n  };\n}\n\nfunction buildMergedJournal(\n  localRoot: string,\n  upstreamRoot: string,\n  workspace: string,\n  appended: MigrationAppend[],\n): string | null {\n  const localRaw = loadRawJournal(localRoot, workspace);\n  const upstreamRaw = loadRawJournal(upstreamRoot, workspace);\n  if (!localRaw || !upstreamRaw) {\n    return null;\n  }\n  const upstreamEntryByTag = new Map<string, Record<string, unknown>>();\n  for (const entry of upstreamRaw.entries) {\n    if (typeof entry.tag === \"string\") {\n      upstreamEntryByTag.set(entry.tag, entry);\n    }\n  }\n  const maxLocalWhen = localRaw.entries.reduce(\n    (max, entry) => Math.max(max, typeof entry.when === \"number\" ? entry.when : 0),\n    0,\n  );\n  let appendedWhen = maxLocalWhen;\n  const appendedEntries = appended.map((append) => {\n    const raw = upstreamEntryByTag.get(append.fromTag);\n    const when =\n      typeof raw?.when === \"number\" && raw.when > appendedWhen ? raw.when : ++appendedWhen;\n    return { ...(raw ?? {}), idx: append.idx, tag: append.toTag, when };\n  });\n  const merged = { ...localRaw.journal, entries: [...localRaw.entries, ...appendedEntries] };\n  return `${JSON.stringify(merged, null, 2)}\\n`;\n}\n\nexport interface MigrationAppend {\n  idx: number;\n  fromTag: string;\n  toTag: string;\n}\n\nexport interface MigrationReconciliation {\n  kept: string[];\n  appended: MigrationAppend[];\n  contentMatched: string[];\n  unresolvable: ImportMigrationCollision[];\n}\n\nconst MIGRATION_TAG_PATTERN = /^(\\d+)_(.+)$/;\n\nfunction migrationTagFor(idx: number, fromTag: string): string {\n  const suffix = fromTag.match(MIGRATION_TAG_PATTERN)?.[2];\n  return suffix ? `${String(idx).padStart(4, \"0\")}_${suffix}` : fromTag;\n}\n\nfunction snapshotPrefixOf(tag: string): string | null {\n  const match = tag.match(MIGRATION_TAG_PATTERN);\n  return match?.[1] ? match[1].padStart(4, \"0\") : null;\n}\n\nexport function reconcileMigrationChains(\n  local: MigrationEntry[],\n  upstream: MigrationEntry[],\n): MigrationReconciliation {\n  const localTags = new Set(local.map((entry) => entry.tag));\n  const unresolvable: ImportMigrationCollision[] = [];\n  const appended: MigrationAppend[] = [];\n  const contentMatched: string[] = [];\n  let nextIdx = local.reduce((max, entry) => Math.max(max, entry.idx), -1) + 1;\n  for (const upstreamEntry of upstream) {\n    if (localTags.has(upstreamEntry.tag)) {\n      const localEntry = local.find((candidate) => candidate.tag === upstreamEntry.tag);\n      if (localEntry?.sha && upstreamEntry.sha && localEntry.sha !== upstreamEntry.sha) {\n        unresolvable.push({\n          kind: \"tag-mismatch\",\n          idx: upstreamEntry.idx,\n          localTag: localEntry.tag,\n          upstreamTag: upstreamEntry.tag,\n          message: `${upstreamEntry.tag} has different content locally than upstream — already-applied hashes would drift`,\n        });\n      }\n      continue;\n    }\n    if (upstreamEntry.sha && local.some((candidate) => candidate.sha === upstreamEntry.sha)) {\n      contentMatched.push(upstreamEntry.tag);\n      continue;\n    }\n    appended.push({\n      idx: nextIdx,\n      fromTag: upstreamEntry.tag,\n      toTag: migrationTagFor(nextIdx, upstreamEntry.tag),\n    });\n    nextIdx++;\n  }\n  return { kept: local.map((entry) => entry.tag), appended, contentMatched, unresolvable };\n}\n\nfunction hashFile(root: string, path: string): string | null {\n  const fullPath = join(root, path);\n  if (!existsSync(fullPath)) {\n    return null;\n  }\n  try {\n    return computeSnapshotHash(readFileSync(fullPath));\n  } catch {\n    return null;\n  }\n}\n\nfunction safeProjectPath(projectDir: string, path: string): string {\n  const dest = join(projectDir, path);\n  const rel = relative(projectDir, dest);\n  if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n    throw new Error(`Refusing to write outside the project: ${path}`);\n  }\n  return dest;\n}\n\nfunction readJson(path: string): Record<string, unknown> | null {\n  try {\n    const parsed: unknown = JSON.parse(readFileSync(path, \"utf-8\"));\n    if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n      return parsed as Record<string, unknown>;\n    }\n    return null;\n  } catch {\n    return null;\n  }\n}\n\ninterface ImportSnapshot {\n  workspaces: Record<\n    string,\n    { from: string; ref: string; timestamp: string; files: Record<string, string> }\n  >;\n}\n\nfunction readImportSnapshot(projectDir: string): ImportSnapshot {\n  const path = join(projectDir, \".bos\", IMPORT_SNAPSHOT_FILE);\n  if (!existsSync(path)) {\n    return { workspaces: {} };\n  }\n  try {\n    const parsed: unknown = JSON.parse(readFileSync(path, \"utf-8\"));\n    const workspaces = (parsed as { workspaces?: unknown }).workspaces;\n    if (workspaces && typeof workspaces === \"object\" && !Array.isArray(workspaces)) {\n      return { workspaces: workspaces as ImportSnapshot[\"workspaces\"] };\n    }\n    return { workspaces: {} };\n  } catch {\n    return { workspaces: {} };\n  }\n}\n\nfunction writeImportSnapshot(projectDir: string, snapshot: ImportSnapshot): void {\n  const dir = join(projectDir, \".bos\");\n  mkdirSync(dir, { recursive: true });\n  writeFileSync(join(dir, IMPORT_SNAPSHOT_FILE), `${JSON.stringify(snapshot, null, 2)}\\n`);\n}\n\nfunction writeImportReport(projectDir: string, content: string): string {\n  const dir = join(projectDir, \".bos\");\n  mkdirSync(dir, { recursive: true });\n  writeFileSync(join(dir, IMPORT_REPORT_FILE), content);\n  return IMPORT_REPORT_PATH;\n}\n\nfunction backupImportFiles(projectDir: string, paths: string[]): string | undefined {\n  const existing = paths.filter((path) => existsSync(join(projectDir, path)));\n  if (existing.length === 0) {\n    return undefined;\n  }\n  const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n  const backupDir = join(projectDir, \".bos\", \"import-backup\", stamp);\n  for (const path of existing) {\n    const dest = safeProjectPath(backupDir, path);\n    mkdirSync(dirname(dest), { recursive: true });\n    copyFileSync(join(projectDir, path), dest);\n  }\n  return backupDir;\n}\n\nfunction listSection(title: string, items: string[], held?: ReadonlySet<string>): string[] {\n  if (items.length === 0) {\n    return [`## ${title}`, \"\", \"(none)\", \"\"];\n  }\n  return [\n    `## ${title}`,\n    \"\",\n    ...items.map((item) => (held?.has(item) ? `- \\`${item}\\` (held)` : `- \\`${item}\\``)),\n    \"\",\n  ];\n}\n\nexport function buildImportReport(\n  analysis: ImportReportAnalysis,\n  outcome: { mode: \"dry-run\" | \"applied\" | \"refused\"; backupDir?: string },\n): string {\n  const lines: string[] = [];\n  lines.push(`# bos import report — \\`${analysis.workspace}\\``);\n  lines.push(\"\");\n  if (analysis.chain) {\n    lines.push(`- **Source:** \\`${analysis.chain.extendsRef}\\` (extends chain)`);\n    if (analysis.chain.sourceArchive) {\n      lines.push(`- **Source archive:** \\`${analysis.chain.sourceArchive.url}\\``);\n    }\n    if (analysis.chain.repository) {\n      lines.push(\n        `- **Upstream:** \\`${analysis.chain.repository}\\` @ \\`${analysis.ref}\\`${analysis.chain.pinnedSha ? ` (pinned git sha \\`${analysis.chain.pinnedSha}\\`)` : \"\"}`,\n      );\n    }\n    for (const warning of analysis.chain.warnings) {\n      lines.push(`- **Note:** ${warning}`);\n    }\n  } else {\n    const source =\n      analysis.sourceKind === \"local\"\n        ? `\\`${analysis.from}\\` (local directory)`\n        : `\\`${analysis.from}\\`${analysis.ref ? ` @ \\`${analysis.ref}\\`` : \"\"}`;\n    lines.push(`- **Source:** ${source}`);\n  }\n  if (analysis.resolvedSha) {\n    lines.push(`- **Resolved commit:** \\`${analysis.resolvedSha}\\``);\n  }\n  const modeLabel =\n    outcome.mode === \"dry-run\"\n      ? \"Dry run — no files written\"\n      : outcome.mode === \"applied\"\n        ? \"Applied — upstream written over shared files\"\n        : \"Refused — unresolvable conflicts exist, nothing was written\";\n  lines.push(`- **Mode:** ${modeLabel}`);\n  lines.push(`- **Generated:** ${new Date().toISOString()}`);\n  lines.push(\"\");\n\n  lines.push(\"## Summary\");\n  lines.push(\"\");\n  lines.push(\"| bucket | count |\");\n  lines.push(\"| --- | --- |\");\n  lines.push(`| added (upstream-only) | ${analysis.added.length} |`);\n  lines.push(`| updated (local unchanged, upstream changed) | ${analysis.updated.length} |`);\n  lines.push(`| merged (structured package.json merge) | ${analysis.merged.length} |`);\n  lines.push(`| conflicts (unresolvable) | ${analysis.conflicts.length} |`);\n  lines.push(`| migration collisions (unresolvable) | ${analysis.migrationCollisions.length} |`);\n  lines.push(\n    `| migrations appended (renumbered from upstream) | ${analysis.migrationReconciliation?.appended.length ?? 0} |`,\n  );\n  lines.push(`| migration chain held back | ${analysis.heldBackMigrations.length} |`);\n  lines.push(`| local-only (preserved) | ${analysis.preservedLocal.length} |`);\n  lines.push(\n    `| local edits preserved (upstream unchanged) | ${analysis.preservedLocalEdit.length} |`,\n  );\n  lines.push(`| unchanged | ${analysis.unchanged.length} |`);\n  lines.push(\"\");\n\n  if (analysis.conflicts.length > 0) {\n    lines.push(\"## Conflicts — manual-port checklist\");\n    lines.push(\"\");\n    lines.push(\"| file | reason |\");\n    lines.push(\"| --- | --- |\");\n    for (const conflict of analysis.conflicts) {\n      const reason =\n        conflict.reason === \"no-baseline\"\n          ? \"no import baseline (first import or snapshot gap)\"\n          : \"local and upstream both changed since the baseline\";\n      lines.push(\n        `| \\`${conflict.path}\\` | ${reason}${conflict.held ? \" — held (migration chain)\" : \"\"} |`,\n      );\n    }\n    lines.push(\"\");\n    const appliedConflicts = analysis.conflicts.filter((conflict) => !conflict.held);\n    if (outcome.mode === \"refused\") {\n      lines.push(\n        \"Nothing was written. Re-run with `--yes` to apply upstream over these files (local copies are backed up first), then port local-only content back onto the new upstream versions.\",\n      );\n    } else if (outcome.mode === \"applied\") {\n      if (appliedConflicts.length > 0) {\n        lines.push(\n          `Upstream was applied over ${appliedConflicts.length} of these file(s)${\n            outcome.backupDir ? ` — local copies backed up at \\`${outcome.backupDir}\\`` : \"\"\n          }. Port local-only content back onto the new upstream versions.`,\n        );\n      }\n      if (analysis.heldBackMigrations.length > 0) {\n        lines.push(\n          \"Migration-chain conflicts were held back and NOT written — see the held-back section below.\",\n        );\n      }\n    } else {\n      lines.push(\n        \"A real run with `--yes` would overwrite these with upstream (backing up local copies first); migration-chain files would be held back.\",\n      );\n    }\n    lines.push(\"\");\n  }\n\n  if (analysis.migrationReconciliation) {\n    const reconciliation = analysis.migrationReconciliation;\n    lines.push(\"## Migration chain reconciliation\");\n    lines.push(\"\");\n    lines.push(\"Applied locally — kept verbatim, never renumbered or rehashed:\");\n    lines.push(\"\");\n    if (reconciliation.kept.length === 0) {\n      lines.push(\"(no local journal entries)\");\n      lines.push(\"\");\n    } else {\n      for (const tag of reconciliation.kept) lines.push(`- \\`${tag}\\``);\n      lines.push(\"\");\n    }\n    if (reconciliation.appended.length > 0) {\n      lines.push(\"Appended — colliding upstream migrations renumbered after the local tail:\");\n      lines.push(\"\");\n      lines.push(\"| upstream tag | new tag | new idx |\");\n      lines.push(\"| --- | --- | --- |\");\n      for (const append of reconciliation.appended) {\n        lines.push(`| \\`${append.fromTag}\\` | \\`${append.toTag}\\` | ${append.idx} |`);\n      }\n      lines.push(\"\");\n      lines.push(\n        `Next boot will apply the ${reconciliation.appended.length} appended migration(s) above; the kept set is already applied to the database.`,\n      );\n      lines.push(\"\");\n    } else {\n      lines.push(\n        \"Nothing to append: every upstream migration is already applied (by tag or by content).\",\n      );\n      lines.push(\"\");\n    }\n    if (reconciliation.contentMatched.length > 0) {\n      lines.push(\"Already imported under another tag (matched by SQL content hash):\");\n      lines.push(\"\");\n      for (const tag of reconciliation.contentMatched) lines.push(`- \\`${tag}\\``);\n      lines.push(\"\");\n    }\n    if (reconciliation.appended.length > 0) {\n      lines.push(\n        \"Snapshot-chain note: renamed snapshot files record upstream intermediate schema states; review `drizzle-kit generate` output against the merged chain before generating new migrations.\",\n      );\n      lines.push(\"\");\n    }\n  }\n\n  if (analysis.migrationCollisions.length > 0) {\n    lines.push(\"## Migration chain collisions — unresolvable\");\n    lines.push(\"\");\n    lines.push(\"| kind | idx | local | upstream | detail |\");\n    lines.push(\"| --- | --- | --- | --- | --- |\");\n    for (const collision of analysis.migrationCollisions) {\n      lines.push(\n        `| ${collision.kind} | ${collision.idx} | \\`${collision.localTag ?? \"—\"}\\` | \\`${collision.upstreamTag ?? \"—\"}\\` | ${collision.message} |`,\n      );\n    }\n    lines.push(\"\");\n  }\n\n  if (analysis.heldBackMigrations.length > 0) {\n    lines.push(\"## Migration chain held back\");\n    lines.push(\"\");\n    for (const path of analysis.heldBackMigrations) lines.push(`- \\`${path}\\``);\n    lines.push(\"\");\n    lines.push(\n      \"`src/db/migrations/**` was not modified: reconciliation could not produce a safe merged chain (content drift on an already-applied migration, or an unreadable journal). Resolve the collisions above, then re-import. The rest of the workspace imported normally.\",\n    );\n    lines.push(\"\");\n  }\n\n  if (analysis.routeDelta) {\n    lines.push(\"## Contract route-set delta\");\n    lines.push(\"\");\n    if (analysis.routeDelta.oursOnly.length === 0 && analysis.routeDelta.theirsOnly.length === 0) {\n      lines.push(\"Route sets are identical.\");\n      lines.push(\"\");\n    } else {\n      lines.push(\n        `Ours-only: ${analysis.routeDelta.oursOnly.length}, theirs-only: ${analysis.routeDelta.theirsOnly.length}.`,\n      );\n      lines.push(\"\");\n      for (const route of analysis.routeDelta.oursOnly) lines.push(`- ours only: \\`${route}\\``);\n      for (const route of analysis.routeDelta.theirsOnly) lines.push(`- theirs only: \\`${route}\\``);\n      lines.push(\"\");\n    }\n  }\n\n  const heldSet = new Set(analysis.heldBackMigrations);\n  lines.push(...listSection(\"Added (upstream-only)\", analysis.added, heldSet));\n  lines.push(\n    ...listSection(\"Updated (would be overwritten with upstream)\", analysis.updated, heldSet),\n  );\n  lines.push(\n    ...listSection(\"Merged (package.json — local-only keys preserved)\", analysis.merged, heldSet),\n  );\n  lines.push(...listSection(\"Local-only (preserved, never deleted)\", analysis.preservedLocal));\n  lines.push(\n    ...listSection(\"Local edits preserved (upstream unchanged)\", analysis.preservedLocalEdit),\n  );\n  lines.push(\n    `## Unchanged`,\n    \"\",\n    `${analysis.unchanged.length} file(s) identical on both sides.`,\n    \"\",\n  );\n\n  lines.push(\"## Next steps\");\n  lines.push(\"\");\n  lines.push(\n    \"- `bos types gen` (and a build) regenerates `*.gen.ts` and `types/contract.d.ts` against the imported contract.\",\n  );\n  lines.push(\n    \"- If preserved local changes should live upstream, open a PR against the source repo rather than keeping them only locally.\",\n  );\n  lines.push(\"\");\n  return lines.join(\"\\n\");\n}\n\nconst LOCAL_PREFIX = \"local:\";\n\nexport interface LocalWorkspaceSlot {\n  /** config address of the declaring entry, e.g. `app.auth` or `plugins.ai` */\n  slot: string;\n}\n\nexport function localWorkspaceSlotOf(\n  config: unknown,\n  workspace: string,\n): LocalWorkspaceSlot | null {\n  if (!config || typeof config !== \"object\" || Array.isArray(config)) {\n    return null;\n  }\n  const node = config as Record<string, unknown>;\n  const matches = (ref: unknown): boolean =>\n    typeof ref === \"string\" &&\n    ref.startsWith(LOCAL_PREFIX) &&\n    ref.slice(LOCAL_PREFIX.length) === workspace;\n\n  const app = node.app as Record<string, unknown> | undefined;\n  if (app && typeof app === \"object\") {\n    for (const key of [\"host\", \"ui\", \"api\", \"auth\"]) {\n      const entry = app[key] as Record<string, unknown> | undefined;\n      if (entry && typeof entry === \"object\" && matches(entry.development)) {\n        return { slot: `app.${key}` };\n      }\n    }\n  }\n  const plugins = node.plugins as Record<string, unknown> | undefined;\n  if (plugins && typeof plugins === \"object\") {\n    for (const key of Object.keys(plugins)) {\n      const entry = plugins[key] as Record<string, unknown> | undefined;\n      if (\n        entry &&\n        typeof entry === \"object\" &&\n        !Array.isArray(entry) &&\n        matches(entry.development)\n      ) {\n        return { slot: `plugins.${key}` };\n      }\n    }\n  }\n  return null;\n}\n\nexport function configEntryAt(config: unknown, slot: string): Record<string, unknown> | null {\n  if (!config || typeof config !== \"object\") {\n    return null;\n  }\n  const dot = slot.indexOf(\".\");\n  if (dot === -1) {\n    return null;\n  }\n  const container = (config as Record<string, unknown>)[slot.slice(0, dot)];\n  const key = slot.slice(dot + 1);\n  const entry =\n    typeof container === \"object\" && container !== null && !Array.isArray(container)\n      ? (container as Record<string, unknown>)[key]\n      : undefined;\n  if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n    return null;\n  }\n  return entry as Record<string, unknown>;\n}\n\nconst HEAD_FALLBACK_NOTE = \"importing the default branch (HEAD)\";\n\nexport type VersionManifestFetcher = (url: string) => Promise<{\n  bytes: Uint8Array;\n  manifest: Record<string, unknown>;\n}>;\n\nasync function defaultVersionManifestFetch(\n  url: string,\n): Promise<{ bytes: Uint8Array; manifest: Record<string, unknown> }> {\n  const response = await fetchResponse(url, { headers: { accept: \"application/json\" } });\n  if (!response.ok) {\n    throw new Error(`HTTP ${response.status}`);\n  }\n  const bytes = new Uint8Array(await response.arrayBuffer());\n  const manifest = JSON.parse(new TextDecoder().decode(bytes)) as Record<string, unknown>;\n  return { bytes, manifest };\n}\n\nfunction manifestSourceOf(manifest: Record<string, unknown>): SourceRef | null {\n  const parsed = WorkspaceVersionManifestSchema.pick({ source: true }).safeParse(manifest);\n  return parsed.success ? (parsed.data.source ?? null) : null;\n}\n\nexport async function resolvePinnedSource(\n  entry: Record<string, unknown> | null,\n  fetchManifest: VersionManifestFetcher = defaultVersionManifestFetch,\n): Promise<{ sha?: string; source?: SourceRef; warning?: string }> {\n  if (!entry) {\n    return { warning: `no config entry found for the pinned slot — ${HEAD_FALLBACK_NOTE}` };\n  }\n  const pin = entry.pin as { manifest?: unknown; integrity?: unknown } | undefined;\n  const manifest = typeof pin?.manifest === \"string\" ? pin.manifest : undefined;\n  const production = typeof entry.production === \"string\" ? entry.production : undefined;\n  if (!manifest || !production) {\n    return {\n      warning: `no pinned version manifest on the published config — ${HEAD_FALLBACK_NOTE}`,\n    };\n  }\n  const url = `${production.replace(/\\/+$/, \"\")}/${manifest}`;\n  let body: { bytes: Uint8Array; manifest: Record<string, unknown> };\n  try {\n    body = await fetchManifest(url);\n  } catch (error) {\n    const message = error instanceof Error ? error.message : String(error);\n    return { warning: `could not read the version manifest (${message}) — ${HEAD_FALLBACK_NOTE}` };\n  }\n  const pinIntegrity = typeof pin?.integrity === \"string\" ? pin.integrity : undefined;\n  if (pinIntegrity) {\n    const computed = computeSriHash(Buffer.from(body.bytes));\n    if (computed !== pinIntegrity) {\n      throw new Error(\n        `Version manifest integrity mismatch for ${url} — expected ${pinIntegrity}, computed ${computed}. Refusing to fall back to GitHub.`,\n      );\n    }\n  }\n  const source = manifestSourceOf(body.manifest);\n  if (typeof body.manifest.gitSha !== \"string\" || body.manifest.gitSha.length === 0) {\n    return {\n      warning: `the version manifest records no git sha (it pins content hashes only) — ${HEAD_FALLBACK_NOTE}; future deploys pin the exact commit`,\n      ...(source ? { source } : {}),\n    };\n  }\n  return { sha: body.manifest.gitSha, ...(source ? { source } : {}) };\n}\n\nconst FROM_REMEDIES =\n  \"Pass the upstream explicitly: --from bos://<account>/<gateway> or --from <owner>/<repo>\";\n\nexport async function resolveImportChain(input: {\n  workspace: string;\n  projectDir: string;\n  entrySpec?: { bosUrl: string; account: string; gateway: string };\n  io?: ResolutionIo;\n  fetchVersionManifest?: VersionManifestFetcher;\n}): Promise<{\n  spec:\n    | { kind: \"github\"; repo: string; ref?: string }\n    | { kind: \"archive\"; url: string; integrity: string };\n  provenance: ImportChainProvenance;\n}> {\n  const fromBosSpec = input.entrySpec !== undefined;\n  const entry = fromBosSpec\n    ? `bos://${input.entrySpec!.account}/${input.entrySpec!.gateway}`\n    : (localConfigEntryPath(input.projectDir) ?? null);\n  if (!entry) {\n    throw new Error(`No authored config (bos.app.ts) found — ${FROM_REMEDIES}`);\n  }\n\n  const links: WalkLink[] = [];\n  await walkExtendsChain(entry, {\n    env: \"production\",\n    io: input.io,\n    visit: async (link) => {\n      links.push(link);\n    },\n  });\n  links.reverse();\n\n  if (links.length === 0) {\n    throw new Error(`Empty extends chain from ${entry}`);\n  }\n\n  const declaredIndex = links.findIndex(\n    (link) => localWorkspaceSlotOf(link.config, input.workspace) !== null,\n  );\n  if (declaredIndex === -1) {\n    const chainRefs = links.map((link) => link.ref).join(\" -> \");\n    throw new Error(\n      `No runtime in the extends chain declares workspace \"${input.workspace}\" (${chainRefs}). ${FROM_REMEDIES}.`,\n    );\n  }\n  if (!fromBosSpec && declaredIndex === 0) {\n    throw new Error(\n      `Workspace \"${input.workspace}\" is declared locally in your authored config — bos import targets an upstream ancestor`,\n    );\n  }\n\n  const ancestor = links[declaredIndex];\n  const ancestorRef = ancestor.ref.startsWith(\"bos://\")\n    ? ancestor.ref\n    : `authored config at ${ancestor.ref}`;\n\n  let repository: string | undefined;\n  for (let i = declaredIndex; i < links.length && repository === undefined; i++) {\n    const value = (links[i].config as Record<string, unknown> | undefined)?.repository;\n    if (typeof value === \"string\" && value.trim().length > 0) {\n      repository = value;\n    }\n  }\n\n  const warnings: string[] = [];\n  const slot = localWorkspaceSlotOf(ancestor.config, input.workspace)!.slot;\n  const ancestorEntry = configEntryAt(ancestor.config, slot);\n  const pin = await resolvePinnedSource(ancestorEntry, input.fetchVersionManifest);\n  if (pin.warning) warnings.push(pin.warning);\n\n  const production =\n    typeof ancestorEntry?.production === \"string\" ? ancestorEntry.production : undefined;\n  const sourceArchive =\n    pin.source && production\n      ? {\n          file: pin.source.file,\n          url: `${production.replace(/\\/+$/, \"\")}/${pin.source.file}`,\n          integrity: pin.source.integrity,\n        }\n      : undefined;\n  if (!sourceArchive && !repository) {\n    throw new Error(\n      `No repository found along the extends chain above ${ancestorRef} — the declaring runtime must publish its source (repository field in bos.app.ts)`,\n    );\n  }\n\n  const extendsRef = fromBosSpec\n    ? entry\n    : (() => {\n        const selfConfig = links[0].config;\n        const extendsValue = (selfConfig as Record<string, unknown> | undefined)?.extends;\n        if (extendsValue === undefined) return \"authored config\";\n        try {\n          return (\n            resolveExtendsRef(extendsValue as string | ExtendsConfig, \"production\") ??\n            \"authored config\"\n          );\n        } catch {\n          return \"authored config\";\n        }\n      })();\n\n  if (sourceArchive) {\n    return {\n      spec: { kind: \"archive\", url: sourceArchive.url, integrity: sourceArchive.integrity },\n      provenance: {\n        extendsRef,\n        ancestorRef,\n        ...(repository ? { repository } : {}),\n        ...(pin.sha ? { pinnedSha: pin.sha } : {}),\n        sourceArchive,\n        warnings,\n      },\n    };\n  }\n\n  return {\n    spec: { kind: \"github\", repo: repository!, ...(pin.sha ? { ref: pin.sha } : {}) },\n    provenance: {\n      extendsRef,\n      ancestorRef,\n      ...(pin.sha ? { pinnedSha: pin.sha } : {}),\n      repository: repository!,\n      warnings,\n    },\n  };\n}\n\ninterface ImportPlan {\n  fromLabel: string;\n  spec: ImportFromSpec & { kind: \"github\" | \"local\" | \"archive\" };\n  chain?: ImportChainProvenance;\n}\n\nasync function resolveImportPlan(input: {\n  workspace: string;\n  from?: string;\n  projectDir: string;\n}): Promise<ImportPlan> {\n  const from = input.from;\n  if (!from) {\n    const resolved = await resolveImportChain({\n      workspace: input.workspace,\n      projectDir: input.projectDir,\n    });\n    return {\n      fromLabel: resolved.provenance.extendsRef,\n      spec: resolved.spec,\n      chain: resolved.provenance,\n    };\n  }\n  const spec = parseFromSpec(from);\n  if (spec.kind === \"bos\") {\n    const resolved = await resolveImportChain({\n      workspace: input.workspace,\n      projectDir: input.projectDir,\n      entrySpec: spec,\n    });\n    return { fromLabel: spec.bosUrl, spec: resolved.spec, chain: resolved.provenance };\n  }\n  return { fromLabel: from, spec };\n}\n\ntype TarballDownloader = (\n  repo: string,\n  ref?: string,\n) => Promise<{\n  dir: string;\n  cleanup: () => Promise<void>;\n  resolvedRef?: string;\n  resolvedSha?: string;\n}>;\n\ntype ArchiveFetcher = (url: string) => Promise<Uint8Array>;\n\nasync function defaultArchiveFetch(url: string): Promise<Uint8Array> {\n  const response = await fetchResponse(url, { redirect: \"follow\", timeout: \"60 seconds\" });\n  if (!response.ok) {\n    throw new Error(`HTTP ${response.status}`);\n  }\n  return new Uint8Array(await response.arrayBuffer());\n}\n\nasync function extractArchive(bytes: Uint8Array): Promise<{\n  root: string;\n  cleanup: () => Promise<void>;\n}> {\n  const tmpDir = mkdtempSync(join(tmpdir(), \"bos-import-archive-\"));\n  const archivePath = join(tmpDir, \"source.tar.gz\");\n  const extractDir = mkdtempSync(join(tmpdir(), \"bos-import-archive-src-\"));\n  try {\n    writeFileSync(archivePath, bytes);\n    await tarExtract({ cwd: extractDir, file: archivePath, strip: 0 });\n  } finally {\n    rmSync(tmpDir, { recursive: true, force: true });\n  }\n  return {\n    root: extractDir,\n    cleanup: async () => {\n      rmSync(extractDir, { recursive: true, force: true });\n    },\n  };\n}\n\nasync function fetchGithubSource(input: {\n  repo: string;\n  ref?: string;\n  pinnedSha?: string;\n  download: TarballDownloader;\n}): Promise<{\n  source: { root: string; cleanup: () => Promise<void>; ref: string; resolvedSha?: string };\n  fallbackWarning?: string;\n}> {\n  const pinned = input.pinnedSha !== undefined && input.ref === input.pinnedSha;\n  try {\n    const tarball = await input.download(input.repo, input.ref);\n    return {\n      source: {\n        root: tarball.dir,\n        cleanup: tarball.cleanup,\n        ref: input.ref ?? tarball.resolvedRef ?? \"main\",\n        resolvedSha: tarball.resolvedSha,\n      },\n    };\n  } catch (error) {\n    if (!pinned) throw error;\n    const message = error instanceof Error ? error.message : String(error);\n    const tarball = await input.download(input.repo, undefined);\n    return {\n      source: {\n        root: tarball.dir,\n        cleanup: tarball.cleanup,\n        ref: tarball.resolvedRef ?? \"main\",\n        resolvedSha: tarball.resolvedSha,\n      },\n      fallbackWarning: `could not fetch the pinned commit ${input.pinnedSha} (${message}) — importing the default branch`,\n    };\n  }\n}\n\nexport async function fetchSourceWithPinFallback(input: {\n  spec: ImportFromSpec & { kind: \"github\" | \"local\" | \"archive\" };\n  pinnedSha?: string;\n  download?: TarballDownloader;\n  fetchArchive?: ArchiveFetcher;\n  fallback?: { repo: string; ref?: string };\n}): Promise<{\n  source: { root: string; cleanup: () => Promise<void>; ref: string; resolvedSha?: string };\n  fallbackWarning?: string;\n}> {\n  if (input.spec.kind === \"local\") {\n    return { source: { root: input.spec.dir, cleanup: async () => {}, ref: \"local\" } };\n  }\n  const download = input.download ?? downloadTarball;\n  if (input.spec.kind === \"archive\") {\n    const fetchArchive = input.fetchArchive ?? defaultArchiveFetch;\n    try {\n      const bytes = await fetchArchive(input.spec.url);\n      const computed = computeSriHash(Buffer.from(bytes));\n      if (computed !== input.spec.integrity) {\n        throw new Error(\n          `integrity mismatch for ${input.spec.url} — expected ${input.spec.integrity}, computed ${computed}`,\n        );\n      }\n      const extracted = await extractArchive(bytes);\n      return { source: { ...extracted, ref: \"source archive\" } };\n    } catch (error) {\n      if (!input.fallback) throw error;\n      const message = error instanceof Error ? error.message : String(error);\n      const gh = await fetchGithubSource({\n        repo: input.fallback.repo,\n        ref: input.fallback.ref,\n        pinnedSha: input.pinnedSha,\n        download,\n      });\n      return {\n        ...gh,\n        fallbackWarning: `could not fetch the source archive (${message}) — importing from ${input.fallback.repo} instead`,\n      };\n    }\n  }\n  return fetchGithubSource({\n    repo: input.spec.repo,\n    ref: input.spec.ref,\n    pinnedSha: input.pinnedSha,\n    download,\n  });\n}\n\nasync function resolveImportSource(\n  spec: ImportPlan[\"spec\"],\n  chain?: ImportChainProvenance,\n): Promise<{\n  root: string;\n  cleanup: () => Promise<void>;\n  ref: string;\n  resolvedSha?: string;\n  fallbackWarning?: string;\n}> {\n  const { source, fallbackWarning } = await fetchSourceWithPinFallback({\n    spec,\n    pinnedSha: chain?.pinnedSha,\n    fallback: chain?.repository\n      ? {\n          repo: chain.repository,\n          ...(chain.pinnedSha ? { ref: chain.pinnedSha } : {}),\n        }\n      : undefined,\n  });\n  return { ...source, fallbackWarning };\n}\n\nexport async function importWorkspace(\n  projectDir: string,\n  options: ImportOptions,\n  deps?: ImportDeps,\n): Promise<ImportResult> {\n  const errorResult = (workspace: string, ref: string, message: string): ImportResult => ({\n    status: \"error\",\n    workspace,\n    from: options.from ?? \"\",\n    ref,\n    added: [],\n    updated: [],\n    unchanged: [],\n    preservedLocal: [],\n    merged: [],\n    conflicts: [],\n    heldBackMigrations: [],\n    migrationCollisions: [],\n    warnings: [],\n    error: message,\n  });\n\n  const errorMessage = (error: unknown): string =>\n    error instanceof Error ? error.message : String(error);\n\n  let workspace = options.workspace;\n  let fromLabel = options.from ?? \"\";\n  let ref = \"\";\n  let chain: ImportChainProvenance | undefined;\n  try {\n    workspace = normalizeWorkspacePath(options.workspace);\n    const plan = await resolveImportPlan({\n      workspace,\n      from: options.from,\n      projectDir,\n    });\n    fromLabel = plan.fromLabel;\n    chain = plan.chain;\n    const spec = plan.spec;\n    const source = await resolveImportSource(spec, chain);\n    if (source.fallbackWarning && chain) {\n      const { sourceArchive: _dropped, ...rest } = chain;\n      chain = {\n        ...rest,\n        pinnedSha: undefined,\n        warnings: [...chain.warnings, source.fallbackWarning],\n      };\n    }\n    ref = source.ref;\n\n    try {\n      const upstreamWorkspaceDir = join(source.root, workspace);\n      if (!existsSync(upstreamWorkspaceDir) || !lstatSync(upstreamWorkspaceDir).isDirectory()) {\n        throw new Error(\n          `Workspace \"${workspace}\" not found in ${fromLabel}${\n            source.ref !== \"local\" ? ` at ref ${source.ref}` : \"\"\n          }`,\n        );\n      }\n\n      const upstreamFiles = await listWorkspaceSubtreeFiles(source.root, workspace);\n      const localWorkspaceDir = join(projectDir, workspace);\n      const localFiles = existsSync(localWorkspaceDir)\n        ? await listWorkspaceSubtreeFiles(projectDir, workspace)\n        : [];\n\n      const upstreamSet = new Set(upstreamFiles);\n      const localSet = new Set(localFiles);\n\n      const importSnapshot = readImportSnapshot(projectDir);\n      const workspaceSnapshot = importSnapshot.workspaces[workspace];\n      const syncSnapshot = await readSnapshot(projectDir);\n      const baselineFor = (path: string): string | undefined =>\n        workspaceSnapshot?.files[path] ?? syncSnapshot?.files[path];\n\n      const packageJsonPath = `${workspace}/package.json`;\n      const mergeablePackageJson = (() => {\n        if (!localSet.has(packageJsonPath) || !upstreamSet.has(packageJsonPath)) return false;\n        return (\n          readJson(join(projectDir, packageJsonPath)) !== null &&\n          readJson(join(source.root, packageJsonPath)) !== null\n        );\n      })();\n\n      const chainPrefix = `${workspace}/src/db/migrations/`;\n      const chainJournalPath = `${chainPrefix}meta/_journal.json`;\n      const localMigrations = loadMigrationEntries(projectDir, workspace);\n      const upstreamMigrations = loadMigrationEntries(source.root, workspace);\n      const localJournalExists = existsSync(join(projectDir, chainJournalPath));\n      const reconciliation =\n        localMigrations && upstreamMigrations\n          ? reconcileMigrationChains(localMigrations, upstreamMigrations)\n          : null;\n\n      let chainUnsafe: boolean;\n      if (reconciliation) {\n        chainUnsafe = reconciliation.unresolvable.length > 0;\n      } else if (localMigrations === null && localJournalExists) {\n        chainUnsafe = true;\n      } else if (localMigrations !== null && upstreamMigrations === null) {\n        chainUnsafe = true;\n      } else {\n        chainUnsafe = false;\n      }\n\n      const migrationRemap = new Map<string, string>();\n      const migrationSkipped = new Set<string>();\n      if (reconciliation && !chainUnsafe) {\n        const appendedByFromTag = new Map(\n          reconciliation.appended.map((append) => [append.fromTag, append]),\n        );\n        const contentMatchedTags = new Set(reconciliation.contentMatched);\n        const upstreamTagBySnapshotPrefix = new Map<string, string>();\n        for (const entry of upstreamMigrations ?? []) {\n          const prefix = snapshotPrefixOf(entry.tag);\n          if (prefix) upstreamTagBySnapshotPrefix.set(prefix, entry.tag);\n        }\n        for (const path of upstreamFiles) {\n          if (!path.startsWith(chainPrefix) || path === chainJournalPath) continue;\n          const relInMigrations = path.slice(chainPrefix.length);\n          if (relInMigrations.endsWith(\".sql\")) {\n            const tag = relInMigrations.slice(0, -\".sql\".length);\n            const append = appendedByFromTag.get(tag);\n            if (append) {\n              migrationRemap.set(path, `${chainPrefix}${append.toTag}.sql`);\n            } else if (contentMatchedTags.has(tag)) {\n              migrationSkipped.add(path);\n            }\n          } else if (\n            relInMigrations.startsWith(\"meta/\") &&\n            relInMigrations.endsWith(\"_snapshot.json\")\n          ) {\n            const prefix = relInMigrations.slice(\n              \"meta/\".length,\n              relInMigrations.length - \"_snapshot.json\".length,\n            );\n            const tag = upstreamTagBySnapshotPrefix.get(prefix);\n            const append = tag ? appendedByFromTag.get(tag) : undefined;\n            if (append) {\n              migrationRemap.set(\n                path,\n                `${chainPrefix}meta/${String(append.idx).padStart(4, \"0\")}_snapshot.json`,\n              );\n            } else if (tag && contentMatchedTags.has(tag)) {\n              migrationSkipped.add(path);\n            }\n          }\n        }\n      }\n\n      const added: string[] = [];\n      const updated: string[] = [];\n      const unchanged: string[] = [];\n      const preservedLocal: string[] = [];\n      const preservedLocalEdit: string[] = [];\n      const merged: string[] = [];\n      const conflicts: Array<{\n        path: string;\n        reason: \"no-baseline\" | \"both-changed\";\n        held: boolean;\n      }> = [];\n      const upstreamHashByPath = new Map<string, string>();\n\n      const allPaths = [...new Set([...localFiles, ...upstreamFiles])].sort();\n      for (const path of allPaths) {\n        if (!upstreamSet.has(path)) {\n          preservedLocal.push(path);\n          continue;\n        }\n        if (reconciliation && path === chainJournalPath) continue;\n        if (migrationRemap.has(path) || migrationSkipped.has(path)) continue;\n        const localHash = localSet.has(path) ? hashFile(projectDir, path) : null;\n        const upstreamHash = hashFile(source.root, path);\n        if (upstreamHash === null) {\n          throw new Error(`Failed to read upstream file: ${path}`);\n        }\n        upstreamHashByPath.set(path, upstreamHash);\n        const classification = classifyImportFile({\n          localHash,\n          upstreamHash,\n          baselineHash: baselineFor(path),\n          mergeable: path === packageJsonPath && mergeablePackageJson,\n        });\n        switch (classification.kind) {\n          case \"added\":\n            added.push(path);\n            break;\n          case \"unchanged\":\n            unchanged.push(path);\n            break;\n          case \"updated\":\n            updated.push(path);\n            break;\n          case \"preserved-local\":\n            preservedLocal.push(path);\n            break;\n          case \"preserved-local-edit\":\n            preservedLocalEdit.push(path);\n            break;\n          case \"merged\":\n            merged.push(path);\n            break;\n          case \"conflict\":\n            conflicts.push({ path, reason: classification.reason, held: false });\n            break;\n        }\n      }\n\n      let routeDelta: ImportRouteDelta | undefined;\n      const localRoutes = extractWorkspaceRoutes(\n        await collectContractRouteSources(projectDir, workspace),\n      );\n      const upstreamRoutes = extractWorkspaceRoutes(\n        await collectContractRouteSources(source.root, workspace),\n      );\n      if (localRoutes !== null || upstreamRoutes !== null) {\n        routeDelta = computeRouteDelta(localRoutes ?? [], upstreamRoutes ?? []);\n      }\n\n      const migrationCollisions = reconciliation?.unresolvable ?? [];\n\n      const writeCandidates = new Set([\n        ...added,\n        ...updated,\n        ...merged,\n        ...conflicts.map((conflict) => conflict.path),\n      ]);\n      const heldSet = new Set(\n        chainUnsafe ? [...writeCandidates].filter((path) => path.startsWith(chainPrefix)) : [],\n      );\n      if (chainUnsafe && reconciliation) {\n        heldSet.add(chainJournalPath);\n      }\n      const heldBackMigrations = [...heldSet].sort();\n      for (const conflict of conflicts) {\n        conflict.held = heldSet.has(conflict.path);\n      }\n\n      const analysis: ImportReportAnalysis = {\n        workspace,\n        from: fromLabel,\n        ref: source.ref,\n        resolvedSha: source.resolvedSha,\n        sourceKind: spec.kind,\n        chain,\n        added,\n        updated,\n        unchanged,\n        preservedLocal,\n        preservedLocalEdit,\n        merged,\n        conflicts,\n        routeDelta,\n        migrationCollisions,\n        migrationReconciliation: reconciliation,\n        heldBackMigrations,\n      };\n\n      const resultBase = {\n        workspace,\n        from: fromLabel,\n        ref: source.ref,\n        resolvedSha: source.resolvedSha,\n        sourceRepository: chain?.repository,\n        warnings: chain ? chain.warnings : [],\n        added,\n        updated,\n        unchanged,\n        preservedLocal,\n        merged,\n        conflicts: conflicts.map((conflict) => conflict.path),\n        heldBackMigrations,\n        routeDelta,\n        migrationCollisions,\n        migrationReconciliation: reconciliation ?? undefined,\n      };\n\n      if (options.dryRun) {\n        const reportPath = writeImportReport(\n          projectDir,\n          buildImportReport(analysis, { mode: \"dry-run\" }),\n        );\n        return { status: \"dry-run\", ...resultBase, reportPath };\n      }\n\n      const appendedCount = reconciliation?.appended.length ?? 0;\n      const gated = conflicts.length > 0 || heldBackMigrations.length > 0 || appendedCount > 0;\n      if (gated && !options.yes) {\n        let approved = false;\n        if (deps?.confirm) {\n          approved = await deps.confirm({\n            workspace,\n            conflictCount: conflicts.length,\n            migrationCollisionCount: migrationCollisions.length,\n            heldCount: heldBackMigrations.length,\n            appendedCount,\n          });\n        }\n        if (!approved) {\n          const reportPath = writeImportReport(\n            projectDir,\n            buildImportReport(analysis, { mode: \"refused\" }),\n          );\n          return { status: \"conflicts\", ...resultBase, reportPath };\n        }\n      }\n\n      const isHeld = (path: string): boolean => heldSet.has(path);\n\n      const mergeContents = new Map<string, string>();\n      for (const path of merged) {\n        const local = readJson(join(projectDir, path));\n        const upstream = readJson(join(source.root, path));\n        if (!local || !upstream) {\n          throw new Error(`Failed to merge ${path}: unreadable package.json`);\n        }\n        mergeContents.set(\n          path,\n          `${JSON.stringify(mergePackageJson(path, local, upstream), null, 2)}\\n`,\n        );\n      }\n\n      const reconciliationActive = reconciliation !== null && !chainUnsafe;\n      const journalRebuildContent =\n        reconciliationActive && reconciliation.appended.length > 0\n          ? buildMergedJournal(projectDir, source.root, workspace, reconciliation.appended)\n          : null;\n      const journalChanged =\n        journalRebuildContent !== null &&\n        journalRebuildContent !== readFileSync(join(projectDir, chainJournalPath), \"utf-8\");\n\n      const reconciliationOverwrites: Array<{ upstreamPath: string; localPath: string }> = [];\n      if (reconciliationActive) {\n        for (const [upstreamPath, localPath] of migrationRemap) {\n          const upstreamContent = readFileSync(join(source.root, upstreamPath), \"utf-8\");\n          if (\n            !existsSync(join(projectDir, localPath)) ||\n            readFileSync(join(projectDir, localPath), \"utf-8\") !== upstreamContent\n          ) {\n            reconciliationOverwrites.push({ upstreamPath, localPath });\n          }\n        }\n      }\n\n      const overwritePaths = [\n        ...updated.filter((path) => !isHeld(path)),\n        ...conflicts.map((conflict) => conflict.path).filter((path) => !isHeld(path)),\n        ...merged.filter(\n          (path) => mergeContents.get(path) !== readFileSync(join(projectDir, path), \"utf-8\"),\n        ),\n        ...(journalChanged ? [chainJournalPath] : []),\n        ...reconciliationOverwrites.map((write) => write.localPath),\n      ];\n      const backupDir = backupImportFiles(projectDir, overwritePaths);\n\n      const writeUpstream = (path: string) => {\n        const dest = safeProjectPath(projectDir, path);\n        mkdirSync(dirname(dest), { recursive: true });\n        copyFileSync(join(source.root, path), dest);\n      };\n\n      for (const path of added) {\n        if (!isHeld(path)) writeUpstream(path);\n      }\n      for (const path of updated) {\n        if (!isHeld(path)) writeUpstream(path);\n      }\n      for (const conflict of conflicts) {\n        if (!isHeld(conflict.path)) writeUpstream(conflict.path);\n      }\n      for (const path of merged) {\n        const content = mergeContents.get(path);\n        if (content === undefined || isHeld(path)) continue;\n        if (content === readFileSync(join(projectDir, path), \"utf-8\")) continue;\n        const dest = safeProjectPath(projectDir, path);\n        mkdirSync(dirname(dest), { recursive: true });\n        writeFileSync(dest, content);\n      }\n      for (const { upstreamPath, localPath } of reconciliationOverwrites) {\n        const dest = safeProjectPath(projectDir, localPath);\n        mkdirSync(dirname(dest), { recursive: true });\n        copyFileSync(join(source.root, upstreamPath), dest);\n      }\n      if (journalChanged && journalRebuildContent) {\n        const dest = safeProjectPath(projectDir, chainJournalPath);\n        mkdirSync(dirname(dest), { recursive: true });\n        writeFileSync(dest, journalRebuildContent);\n      }\n\n      const writtenPaths = [\n        ...added,\n        ...updated,\n        ...merged,\n        ...conflicts.map((conflict) => conflict.path),\n      ].filter((path) => !isHeld(path));\n      const recorded: Record<string, string> = {};\n      for (const path of writtenPaths) {\n        const hash = hashFile(projectDir, path);\n        if (hash) {\n          recorded[path] = hash;\n        }\n      }\n      if (journalChanged && journalRebuildContent) {\n        recorded[chainJournalPath] = computeSnapshotHash(journalRebuildContent);\n      }\n      for (const { localPath } of reconciliationOverwrites) {\n        const hash = hashFile(projectDir, localPath);\n        if (hash) {\n          recorded[localPath] = hash;\n        }\n      }\n      for (const path of [...unchanged, ...preservedLocalEdit]) {\n        const hash = upstreamHashByPath.get(path);\n        if (hash) {\n          recorded[path] = hash;\n        }\n      }\n\n      writeImportSnapshot(projectDir, {\n        workspaces: {\n          ...importSnapshot.workspaces,\n          [workspace]: {\n            from: fromLabel,\n            ref: source.ref,\n            timestamp: new Date().toISOString(),\n            files: recorded,\n          },\n        },\n      });\n\n      if (syncSnapshot) {\n        await writeSnapshot(projectDir, {\n          files: { ...syncSnapshot.files, ...recorded },\n        });\n      }\n\n      const reportPath = writeImportReport(\n        projectDir,\n        buildImportReport(analysis, { mode: \"applied\", backupDir }),\n      );\n\n      if (!options.noInstall) {\n        try {\n          await runPnpmInstall(findWorkspaceRoot(projectDir)?.dir ?? projectDir);\n          await runTypesGen(projectDir);\n        } catch (error) {\n          return {\n            status: \"error\",\n            ...resultBase,\n            backupDir,\n            reportPath,\n            error: `Import applied, but the post-install step failed: ${errorMessage(error)}`,\n          };\n        }\n      }\n\n      return { status: \"imported\", ...resultBase, backupDir, reportPath };\n    } finally {\n      await source.cleanup();\n    }\n  } catch (error) {\n    return errorResult(workspace, ref, errorMessage(error));\n  }\n}\n"],"mappings":"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"}