{"version":3,"file":"index7.cjs","sources":["../src/discovery/overcontext-discovery.ts"],"sourcesContent":["import {\n    discoverContextRoot,\n} from '@utilarium/overcontext';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as yaml from 'js-yaml';\nimport type {\n    ContextDiscoveryOptions,\n    DiscoveredContextDir,\n    HierarchicalContextResult,\n} from './types';\n\n/**\n * Discover configuration directories by walking up the directory tree.\n * Wrapper around overcontext's discovery.\n */\nexport const discoverConfigDirectories = async (\n    options: ContextDiscoveryOptions\n): Promise<DiscoveredContextDir[]> => {\n    const contextRoot = await discoverContextRoot({\n        startDir: options.startingDir || process.cwd(),\n        contextDirName: options.configDirName,\n        maxLevels: options.maxLevels || 10,\n    });\n  \n    return contextRoot.directories.map(dir => ({\n        path: dir.path,\n        level: dir.level,\n    }));\n};\n\n/**\n * Resolve context directory path based on configuration.\n * Priority:\n * 1. Explicit contextDirectory in config.yaml\n * 2. ./context/ at repository root (sibling to .protokoll/)\n * 3. .protokoll/context/ (backward compatibility)\n * \n * @param protokollDirPath - Path to the .protokoll directory\n * @param config - Parsed config.yaml content (if exists)\n */\nconst resolveContextDirectory = async (\n    protokollDirPath: string,\n    config: Record<string, unknown> | null\n): Promise<string | null> => {\n    // Get repository root (parent of .protokoll/)\n    const repoRoot = path.dirname(protokollDirPath);\n    \n    // If config specifies a contextDirectory, use it\n    if (config && typeof config.contextDirectory === 'string') {\n        const explicitPath = path.isAbsolute(config.contextDirectory)\n            ? config.contextDirectory\n            : path.resolve(repoRoot, config.contextDirectory);\n        \n        try {\n            const stat = await fs.stat(explicitPath);\n            if (stat.isDirectory()) {\n                return explicitPath;\n            }\n        } catch {\n            // Explicit path doesn't exist, continue to defaults\n        }\n    }\n    \n    // Default: Look for ./context/ at repository root (sibling to .protokoll/)\n    const rootContextDir = path.join(repoRoot, 'context');\n    \n    try {\n        const stat = await fs.stat(rootContextDir);\n        if (stat.isDirectory()) {\n            return rootContextDir;\n        }\n    } catch {\n        // Root context doesn't exist, try fallback\n    }\n    \n    // Fallback: .protokoll/context/ (backward compatibility)\n    const legacyContextDir = path.join(protokollDirPath, 'context');\n    \n    try {\n        const stat = await fs.stat(legacyContextDir);\n        if (stat.isDirectory()) {\n            return legacyContextDir;\n        }\n    } catch {\n        // No context directory found\n    }\n    \n    return null;\n};\n\n/**\n * Load and merge hierarchical configuration.\n * Wrapper around overcontext's discovery.\n */\nexport const loadHierarchicalConfig = async (\n    options: ContextDiscoveryOptions\n): Promise<HierarchicalContextResult> => {\n    const discovered = await discoverConfigDirectories(options);\n  \n    if (discovered.length === 0) {\n        return {\n            config: {},\n            discoveredDirs: [],\n            contextDirs: [],\n        };\n    }\n  \n    // Load config files and merge\n    const sortedDirs = [...discovered].sort((a, b) => b.level - a.level);\n    const configs: Record<string, unknown>[] = [];\n    const contextDirs: string[] = [];\n  \n    for (const dir of sortedDirs) {\n        const configPath = path.join(dir.path, options.configFileName);\n        let parsedConfig: Record<string, unknown> | null = null;\n    \n        try {\n            const content = await fs.readFile(configPath, 'utf-8');\n            const parsed = yaml.load(content);\n            if (parsed && typeof parsed === 'object') {\n                parsedConfig = parsed as Record<string, unknown>;\n                configs.push(parsedConfig);\n            }\n        } catch {\n            // No config file\n        }\n    \n        // Resolve context directory using new logic\n        const contextDir = await resolveContextDirectory(dir.path, parsedConfig);\n        if (contextDir) {\n            contextDirs.push(contextDir);\n        }\n    }\n  \n    // Merge configs\n    const mergedConfig = configs.reduce(\n        (acc, curr) => ({ ...acc, ...curr }),\n    {} as Record<string, unknown>\n    );\n  \n    return {\n        config: mergedConfig,\n        discoveredDirs: discovered,\n        contextDirs,\n    };\n};\n"],"names":["discoverContextRoot","path","fs","yaml"],"mappings":"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"}