{"version":3,"file":"active-BQopLul8.mjs","names":[],"sources":["../src/workspace/active.ts"],"sourcesContent":["import fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\ninterface WorkspaceConfig {\n  schema?: string\n  workspace_root?: string\n  artifacts_dir?: string\n  domain_hints?: unknown\n}\n\nexport interface ActiveWorkspace {\n  root: string\n  metadataDir: string\n  artifactsRoot: string\n  domainHints: string[]\n}\n\nfunction workspaceFromRoot(rootCandidate: string): ActiveWorkspace | null {\n  const root = path.resolve(rootCandidate)\n  const metadataDir = path.join(root, '.chain-insights')\n  const markerPath = path.join(metadataDir, 'workspace.json')\n  if (!fs.existsSync(markerPath)) return null\n\n  const parsed = JSON.parse(fs.readFileSync(markerPath, 'utf8')) as WorkspaceConfig\n  if (parsed.schema !== 'chain-insights.workspace.v1') return null\n\n  const workspaceRoot = path.resolve(parsed.workspace_root ?? root)\n  const artifactsDir = parsed.artifacts_dir ?? 'artifacts'\n  const domainHints = Array.isArray(parsed.domain_hints)\n    ? parsed.domain_hints.filter((value): value is string => typeof value === 'string' && value.trim().length > 0)\n    : []\n  return {\n    root: workspaceRoot,\n    metadataDir: path.join(workspaceRoot, '.chain-insights'),\n    artifactsRoot: path.resolve(workspaceRoot, artifactsDir),\n    domainHints,\n  }\n}\n\nexport function findActiveWorkspace(startDir = process.cwd()): ActiveWorkspace | null {\n  const envWorkspace = process.env['CHAIN_INSIGHTS_WORKSPACE']?.trim()\n  if (envWorkspace) {\n    const active = workspaceFromRoot(envWorkspace)\n    if (active) return active\n  }\n\n  let current = path.resolve(startDir)\n  while (true) {\n    const active = workspaceFromRoot(current)\n    if (active) return active\n\n    const parent = path.dirname(current)\n    if (parent === current) return null\n    current = parent\n  }\n}\n\nexport function activeMetadataDir(): string {\n  return findActiveWorkspace()?.metadataDir ?? path.join(os.homedir(), '.chain-insights')\n}\n\nexport function activeArtifactsRoot(): string {\n  return findActiveWorkspace()?.artifactsRoot ?? path.join(os.homedir(), '.chain-insights', 'artifacts')\n}\n\nexport function activeDataDir(fallbackDataDir?: string): string {\n  return findActiveWorkspace()?.root ?? fallbackDataDir ?? path.join(os.homedir(), '.chain-insights')\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAS,kBAAkB,eAA+C;CACxE,MAAM,OAAO,KAAK,QAAQ,aAAa;CACvC,MAAM,cAAc,KAAK,KAAK,MAAM,iBAAiB;CACrD,MAAM,aAAa,KAAK,KAAK,aAAa,gBAAgB;CAC1D,IAAI,CAAC,GAAG,WAAW,UAAU,GAAG,OAAO;CAEvC,MAAM,SAAS,KAAK,MAAM,GAAG,aAAa,YAAY,MAAM,CAAC;CAC7D,IAAI,OAAO,WAAW,+BAA+B,OAAO;CAE5D,MAAM,gBAAgB,KAAK,QAAQ,OAAO,kBAAkB,IAAI;CAChE,MAAM,eAAe,OAAO,iBAAiB;CAC7C,MAAM,cAAc,MAAM,QAAQ,OAAO,YAAY,IACjD,OAAO,aAAa,QAAQ,UAA2B,OAAO,UAAU,YAAY,MAAM,KAAK,CAAC,CAAC,SAAS,CAAC,IAC3G,CAAC;CACL,OAAO;EACL,MAAM;EACN,aAAa,KAAK,KAAK,eAAe,iBAAiB;EACvD,eAAe,KAAK,QAAQ,eAAe,YAAY;EACvD;CACF;AACF;AAEA,SAAgB,oBAAoB,WAAW,QAAQ,IAAI,GAA2B;CACpF,MAAM,eAAe,QAAQ,IAAI,2BAA2B,EAAE,KAAK;CACnE,IAAI,cAAc;EAChB,MAAM,SAAS,kBAAkB,YAAY;EAC7C,IAAI,QAAQ,OAAO;CACrB;CAEA,IAAI,UAAU,KAAK,QAAQ,QAAQ;CACnC,OAAO,MAAM;EACX,MAAM,SAAS,kBAAkB,OAAO;EACxC,IAAI,QAAQ,OAAO;EAEnB,MAAM,SAAS,KAAK,QAAQ,OAAO;EACnC,IAAI,WAAW,SAAS,OAAO;EAC/B,UAAU;CACZ;AACF;AAUA,SAAgB,cAAc,iBAAkC;CAC9D,OAAO,oBAAoB,CAAC,EAAE,QAAQ,mBAAmB,KAAK,KAAK,GAAG,QAAQ,GAAG,iBAAiB;AACpG"}