everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
1 lines • 88.4 kB
Source Map (JSON)
{"version":3,"file":"import.mjs","names":["tarExtract"],"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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"}